10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport __builtin__
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport gc
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport sys
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport types
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport unittest
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiimport weakref
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom copy import deepcopy
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom test import test_support
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass OperatorsTest(unittest.TestCase):
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def __init__(self, *args, **kwargs):
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        unittest.TestCase.__init__(self, *args, **kwargs)
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binops = {
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'add': '+',
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'sub': '-',
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'mul': '*',
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'div': '/',
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'divmod': 'divmod',
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'pow': '**',
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'lshift': '<<',
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'rshift': '>>',
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'and': '&',
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'xor': '^',
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'or': '|',
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'cmp': 'cmp',
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'lt': '<',
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'le': '<=',
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'eq': '==',
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'ne': '!=',
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'gt': '>',
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'ge': '>=',
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        }
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for name, expr in self.binops.items():
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if expr.islower():
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                expr = expr + "(a, b)"
400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                expr = 'a %s b' % expr
420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.binops[name] = expr
430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.unops = {
450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'pos': '+',
460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'neg': '-',
470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'abs': 'abs',
480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'invert': '~',
490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'int': 'int',
500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'long': 'long',
510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'float': 'float',
520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'oct': 'oct',
530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            'hex': 'hex',
540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        }
550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for name, expr in self.unops.items():
570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if expr.islower():
580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                expr = expr + "(a)"
590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                expr = '%s a' % expr
610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.unops[name] = expr
620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def unop_test(self, a, res, expr="len(a)", meth="__len__"):
640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {'a': a}
650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(eval(expr, d), res)
660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = type(a)
670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = getattr(t, meth)
680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Find method in parent class
700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        while meth not in t.__dict__:
710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            t = t.__bases__[0]
720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # method object; the getattr() below obtains its underlying function.
740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m(a), res)
760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm = getattr(a, meth)
770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(bm(), res)
780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def binop_test(self, a, b, res, expr="a+b", meth="__add__"):
800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {'a': a, 'b': b}
810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # XXX Hack so this passes before 2.3 when -Qnew is specified.
830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if meth == "__div__" and 1/2 == 0.5:
840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            meth = "__truediv__"
850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if meth == '__divmod__': pass
870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(eval(expr, d), res)
890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = type(a)
900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = getattr(t, meth)
910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        while meth not in t.__dict__:
920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            t = t.__bases__[0]
930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # method object; the getattr() below obtains its underlying function.
950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m(a, b), res)
970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm = getattr(a, meth)
980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(bm(b), res)
990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def ternop_test(self, a, b, c, res, expr="a[b:c]", meth="__getslice__"):
1010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {'a': a, 'b': b, 'c': c}
1020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(eval(expr, d), res)
1030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = type(a)
1040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = getattr(t, meth)
1050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        while meth not in t.__dict__:
1060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            t = t.__bases__[0]
1070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
1080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # method object; the getattr() below obtains its underlying function.
1090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
1100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m(a, b, c), res)
1110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm = getattr(a, meth)
1120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(bm(b, c), res)
1130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setop_test(self, a, b, res, stmt="a+=b", meth="__iadd__"):
1150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {'a': deepcopy(a), 'b': b}
1160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        exec stmt in d
1170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d['a'], res)
1180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = type(a)
1190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = getattr(t, meth)
1200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        while meth not in t.__dict__:
1210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            t = t.__bases__[0]
1220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
1230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # method object; the getattr() below obtains its underlying function.
1240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
1250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d['a'] = deepcopy(a)
1260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m(d['a'], b)
1270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d['a'], res)
1280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d['a'] = deepcopy(a)
1290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm = getattr(d['a'], meth)
1300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm(b)
1310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d['a'], res)
1320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def set2op_test(self, a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
1340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {'a': deepcopy(a), 'b': b, 'c': c}
1350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        exec stmt in d
1360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d['a'], res)
1370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = type(a)
1380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = getattr(t, meth)
1390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        while meth not in t.__dict__:
1400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            t = t.__bases__[0]
1410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
1420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # method object; the getattr() below obtains its underlying function.
1430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
1440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d['a'] = deepcopy(a)
1450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m(d['a'], b, c)
1460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d['a'], res)
1470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d['a'] = deepcopy(a)
1480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm = getattr(d['a'], meth)
1490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm(b, c)
1500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d['a'], res)
1510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def set3op_test(self, a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
1530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dictionary = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
1540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        exec stmt in dictionary
1550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dictionary['a'], res)
1560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = type(a)
1570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        while meth not in t.__dict__:
1580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            t = t.__bases__[0]
1590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = getattr(t, meth)
1600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # in some implementations (e.g. PyPy), 'm' can be a regular unbound
1610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # method object; the getattr() below obtains its underlying function.
1620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(getattr(m, 'im_func', m), t.__dict__[meth])
1630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dictionary['a'] = deepcopy(a)
1640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m(dictionary['a'], b, c, d)
1650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dictionary['a'], res)
1660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dictionary['a'] = deepcopy(a)
1670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm = getattr(dictionary['a'], meth)
1680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        bm(b, c, d)
1690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dictionary['a'], res)
1700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_lists(self):
1720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing list operations...
1730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Asserts are within individual test methods
1740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test([1], [2], [1,2], "a+b", "__add__")
1750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test([1,2,3], 2, 1, "b in a", "__contains__")
1760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test([1,2,3], 4, 0, "b in a", "__contains__")
1770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test([1,2,3], 1, 2, "a[b]", "__getitem__")
1780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.ternop_test([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
1790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.setop_test([1], [2], [1,2], "a+=b", "__iadd__")
1800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.setop_test([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
1810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.unop_test([1,2,3], 3, "len(a)", "__len__")
1820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
1830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
1840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.set2op_test([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
1850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.set3op_test([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
1860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "__setslice__")
1870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_dicts(self):
1890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing dict operations...
1900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if hasattr(dict, '__cmp__'):   # PyPy has only rich comparison on dicts
1910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.binop_test({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
1920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
1930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.binop_test({1:2}, {2:1}, True, "a < b", "__lt__")
1940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test({1:2,3:4}, 1, 1, "b in a", "__contains__")
1950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test({1:2,3:4}, 2, 0, "b in a", "__contains__")
1960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
1970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
1980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {1:2, 3:4}
1990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l1 = []
2000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in d.keys():
2010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l1.append(i)
2020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l = []
2030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in iter(d):
2040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l.append(i)
2050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l, l1)
2060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l = []
2070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in d.__iter__():
2080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l.append(i)
2090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l, l1)
2100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l = []
2110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in dict.__iter__(d):
2120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l.append(i)
2130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l, l1)
2140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {1:2, 3:4}
2150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.unop_test(d, 2, "len(a)", "__len__")
2160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(eval(repr(d), {}), d)
2170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(eval(d.__repr__(), {}), d)
2180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.set2op_test({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c",
2190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "__setitem__")
2200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # Tests for unary and binary operators
2220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def number_operators(self, a, b, skip=[]):
2230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dict = {'a': a, 'b': b}
2240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for name, expr in self.binops.items():
2260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if name not in skip:
2270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                name = "__%s__" % name
2280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if hasattr(a, name):
2290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    res = eval(expr, dict)
2300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.binop_test(a, b, res, expr, name)
2310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for name, expr in self.unops.items():
2330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if name not in skip:
2340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                name = "__%s__" % name
2350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if hasattr(a, name):
2360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    res = eval(expr, dict)
2370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.unop_test(a, res, expr, name)
2380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_ints(self):
2400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing int operations...
2410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.number_operators(100, 3)
2420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The following crashes in Python 2.2
2430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((1).__nonzero__(), 1)
2440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((0).__nonzero__(), 0)
2450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # This returns 'NotImplemented' in Python 2.2
2460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(int):
2470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __add__(self, other):
2480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return NotImplemented
2490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C(5L), 5)
2500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
2510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            C() + ""
2520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
2530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
2540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
2550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("NotImplemented should have caused TypeError")
2560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
2570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            C(sys.maxint+1)
2580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except OverflowError:
2590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
2600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
2610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("should have raised OverflowError")
2620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_longs(self):
2640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing long operations...
2650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.number_operators(100L, 3L)
2660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_floats(self):
2680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing float operations...
2690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.number_operators(100.0, 3.0)
2700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_complexes(self):
2720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing complex operations...
2730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.number_operators(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge',
2740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                                  'int', 'long', 'float'])
2750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Number(complex):
2770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['prec']
2780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(cls, *args, **kwds):
2790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                result = complex.__new__(cls, *args)
2800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                result.prec = kwds.get('prec', 12)
2810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return result
2820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
2830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                prec = self.prec
2840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if self.imag == 0.0:
2850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return "%.*g" % (prec, self.real)
2860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if self.real == 0.0:
2870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return "%.*gj" % (prec, self.imag)
2880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
2890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __str__ = __repr__
2900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = Number(3.14, prec=6)
2920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(a), "3.14")
2930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.prec, 6)
2940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = Number(a, prec=2)
2960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(a), "3.1")
2970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.prec, 2)
2980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
2990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = Number(234.5)
3000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(a), "234.5")
3010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.prec, 12)
3020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @test_support.impl_detail("the module 'xxsubtype' is internal")
3040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_spam_lists(self):
3050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing spamlist operations...
3060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import copy, xxsubtype as spam
3070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def spamlist(l, memo=None):
3090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            import xxsubtype as spam
3100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return spam.spamlist(l)
3110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # This is an ugly hack:
3130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        copy._deepcopy_dispatch[spam.spamlist] = spamlist
3140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b",
3160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       "__add__")
3170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
3180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
3190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
3200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.ternop_test(spamlist([1,2,3]), 0, 2, spamlist([1,2]), "a[b:c]",
3210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "__getslice__")
3220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.setop_test(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+=b",
3230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       "__iadd__")
3240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.setop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b",
3250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       "__imul__")
3260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.unop_test(spamlist([1,2,3]), 3, "len(a)", "__len__")
3270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b",
3280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       "__mul__")
3290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a",
3300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       "__rmul__")
3310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.set2op_test(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c",
3320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "__setitem__")
3330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.set3op_test(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
3340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                   spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
3350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test subclassing
3360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(spam.spamlist):
3370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self): return 1
3380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
3390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, [])
3400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.foo(), 1)
3410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.append(100)
3420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, [100])
3430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 0)
3440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.setstate(42)
3450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 42)
3460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @test_support.impl_detail("the module 'xxsubtype' is internal")
3480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_spam_dicts(self):
3490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing spamdict operations...
3500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import copy, xxsubtype as spam
3510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def spamdict(d, memo=None):
3520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            import xxsubtype as spam
3530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            sd = spam.spamdict()
3540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for k, v in d.items():
3550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                sd[k] = v
3560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return sd
3570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # This is an ugly hack:
3580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        copy._deepcopy_dispatch[spam.spamdict] = spamdict
3590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)",
3610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                       "__cmp__")
3620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
3630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
3640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.binop_test(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
3650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = spamdict({1:2,3:4})
3660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l1 = []
3670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in d.keys():
3680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l1.append(i)
3690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l = []
3700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in iter(d):
3710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l.append(i)
3720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l, l1)
3730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l = []
3740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in d.__iter__():
3750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l.append(i)
3760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l, l1)
3770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l = []
3780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in type(spamdict({})).__iter__(d):
3790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            l.append(i)
3800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l, l1)
3810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        straightd = {1:2, 3:4}
3820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        spamd = spamdict(straightd)
3830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.unop_test(spamd, 2, "len(a)", "__len__")
3840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.unop_test(spamd, repr(straightd), "repr(a)", "__repr__")
3850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.set2op_test(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
3860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                   "a[b]=c", "__setitem__")
3870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test subclassing
3880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(spam.spamdict):
3890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self): return 1
3900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
3910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.items(), [])
3920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.foo(), 1)
3930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a['foo'] = 'bar'
3940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.items(), [('foo', 'bar')])
3950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 0)
3960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.setstate(100)
3970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 100)
3980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
3990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass ClassPropertiesAndMethods(unittest.TestCase):
4000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_python_dicts(self):
4020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing Python subclass of dict...
4030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(issubclass(dict, dict))
4040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance({}, dict)
4050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = dict()
4060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, {})
4070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(d.__class__ is dict)
4080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(d, dict)
4090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(dict):
4100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            state = -1
4110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self_local, *a, **kw):
4120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if a:
4130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.assertEqual(len(a), 1)
4140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self_local.state = a[0]
4150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if kw:
4160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    for k, v in kw.items():
4170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        self_local[v] = k
4180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, key):
4190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.get(key, 0)
4200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __setitem__(self_local, key, value):
4210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertIsInstance(key, type(0))
4220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                dict.__setitem__(self_local, key, value)
4230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def setstate(self, state):
4240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.state = state
4250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getstate(self):
4260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.state
4270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(issubclass(C, dict))
4280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a1 = C(12)
4290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a1.state, 12)
4300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a2 = C(foo=1, bar=2)
4310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a2[1] == 'foo' and a2[2], 'bar')
4320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
4330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.state, -1)
4340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), -1)
4350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.setstate(0)
4360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.state, 0)
4370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 0)
4380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.setstate(10)
4390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.state, 10)
4400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 10)
4410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[42], 0)
4420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a[42] = 24
4430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[42], 24)
4440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        N = 50
4450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(N):
4460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            a[i] = C()
4470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for j in range(N):
4480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                a[i][j] = i*j
4490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(N):
4500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for j in range(N):
4510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(a[i][j], i*j)
4520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_python_lists(self):
4540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing Python subclass of list...
4550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(list):
4560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, i):
4570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return list.__getitem__(self, i) + 100
4580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getslice__(self, i, j):
4590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return (i, j)
4600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
4610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.extend([0,1,2])
4620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[0], 100)
4630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[1], 101)
4640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[2], 102)
4650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[100:200], (100,200))
4660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_metaclass(self):
4680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __metaclass__...
4690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
4700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = type
4710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
4720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__state = 0
4730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getstate(self):
4740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.__state
4750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def setstate(self, state):
4760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__state = state
4770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
4780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 0)
4790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.setstate(10)
4800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 10)
4810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D:
4820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class __metaclass__(type):
4830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def myself(cls): return cls
4840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.myself(), D)
4850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
4860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.__class__, D)
4870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M1(type):
4880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(cls, name, bases, dict):
4890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                dict['__spam__'] = 1
4900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return type.__new__(cls, name, bases, dict)
4910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
4920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = M1
4930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.__spam__, 1)
4940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
4950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.__spam__, 1)
4960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
4970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class _instance(object):
4980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
4990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M2(object):
5000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @staticmethod
5010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(cls, name, bases, dict):
5020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self = object.__new__(cls)
5030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.name = name
5040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.bases = bases
5050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.dict = dict
5060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self
5070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __call__(self):
5080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                it = _instance()
5090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # Early binding of methods
5100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for key in self.dict:
5110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if key.startswith("__"):
5120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        continue
5130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    setattr(it, key, self.dict[key].__get__(it, self))
5140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return it
5150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
5160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = M2
5170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def spam(self):
5180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 42
5190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.name, 'C')
5200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.bases, ())
5210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('spam', C.dict)
5220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
5230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.spam(), 42)
5240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # More metaclass examples
5260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class autosuper(type):
5280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Automatically add __super to the class
5290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # This trick only works for dynamic classes
5300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(metaclass, name, bases, dict):
5310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                cls = super(autosuper, metaclass).__new__(metaclass,
5320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                                          name, bases, dict)
5330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # Name mangling for __super removes leading underscores
5340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                while name[:1] == "_":
5350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    name = name[1:]
5360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if name:
5370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    name = "_%s__super" % name
5380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
5390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    name = "__super"
5400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                setattr(cls, name, super(cls))
5410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return cls
5420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A:
5430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = autosuper
5440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self):
5450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "A"
5460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A):
5470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self):
5480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "B" + self.__super.meth()
5490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A):
5500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self):
5510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C" + self.__super.meth()
5520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C, B):
5530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self):
5540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "D" + self.__super.meth()
5550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D().meth(), "DCBA")
5560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(B, C):
5570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self):
5580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "E" + self.__super.meth()
5590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E().meth(), "EBCA")
5600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class autoproperty(type):
5620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Automatically create property attributes when methods
5630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # named _get_x and/or _set_x are found
5640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(metaclass, name, bases, dict):
5650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                hits = {}
5660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for key, val in dict.iteritems():
5670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if key.startswith("_get_"):
5680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        key = key[5:]
5690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        get, set = hits.get(key, (None, None))
5700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        get = val
5710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        hits[key] = get, set
5720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    elif key.startswith("_set_"):
5730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        key = key[5:]
5740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        get, set = hits.get(key, (None, None))
5750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        set = val
5760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        hits[key] = get, set
5770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for key, (get, set) in hits.iteritems():
5780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    dict[key] = property(get, set)
5790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return super(autoproperty, metaclass).__new__(metaclass,
5800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                                            name, bases, dict)
5810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A:
5820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = autoproperty
5830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _get_x(self):
5840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return -self.__x
5850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _set_x(self, x):
5860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__x = -x
5870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = A()
5880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not hasattr(a, "x"))
5890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.x = 12
5900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.x, 12)
5910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a._A__x, -12)
5920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
5930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class multimetaclass(autoproperty, autosuper):
5940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Merge of multiple cooperating metaclasses
5950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
5960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A:
5970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = multimetaclass
5980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _get_x(self):
5990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "A"
6000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A):
6010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _get_x(self):
6020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "B" + self.__super._get_x()
6030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A):
6040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _get_x(self):
6050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C" + self.__super._get_x()
6060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C, B):
6070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def _get_x(self):
6080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "D" + self.__super._get_x()
6090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D().x, "DCBA")
6100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Make sure type(x) doesn't call x.__class__.__init__
6120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class T(type):
6130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            counter = 0
6140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, *args):
6150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                T.counter += 1
6160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
6170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = T
6180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(T.counter, 1)
6190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
6200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(a), C)
6210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(T.counter, 1)
6220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object): pass
6240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
6250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: c()
6260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError: pass
6270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("calling object w/o call method should raise "
6280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        "TypeError")
6290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing code to find most derived baseclass
6310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(type):
6320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(*args, **kwargs):
6330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return type.__new__(*args, **kwargs)
6340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object):
6360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
6370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
6390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = A
6400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The most derived metaclass of D is A rather than type.
6420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(B, C):
6430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
6440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_module_subclasses(self):
6460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing Python subclass of module...
6470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        log = []
6480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        MT = type(sys)
6490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class MM(MT):
6500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, name):
6510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                MT.__init__(self, name)
6520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattribute__(self, name):
6530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                log.append(("getattr", name))
6540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return MT.__getattribute__(self, name)
6550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __setattr__(self, name, value):
6560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                log.append(("setattr", name, value))
6570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                MT.__setattr__(self, name, value)
6580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __delattr__(self, name):
6590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                log.append(("delattr", name))
6600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                MT.__delattr__(self, name)
6610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = MM("a")
6620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.foo = 12
6630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = a.foo
6640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del a.foo
6650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(log, [("setattr", "foo", 12),
6660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                               ("getattr", "foo"),
6670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                               ("delattr", "foo")])
6680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # http://python.org/sf/1174712
6700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
6710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class Module(types.ModuleType, str):
6720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
6730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
6740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
6750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
6760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("inheriting from ModuleType and str at the same time "
6770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                      "should fail")
6780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
6790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_multiple_inheritence(self):
6800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing multiple inheritance...
6810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
6820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
6830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__state = 0
6840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getstate(self):
6850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.__state
6860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def setstate(self, state):
6870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__state = state
6880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
6890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 0)
6900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.setstate(10)
6910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getstate(), 10)
6920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(dict, C):
6930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
6940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                type({}).__init__(self)
6950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                C.__init__(self)
6960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
6970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.keys(), [])
6980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d["hello"] = "world"
6990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.items(), [("hello", "world")])
7000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d["hello"], "world")
7010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.getstate(), 0)
7020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d.setstate(10)
7030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.getstate(), 10)
7040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.__mro__, (D, dict, C, object))
7050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF bug #442833
7070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Node(object):
7080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __int__(self):
7090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return int(self.foo())
7100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self):
7110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "23"
7120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Frag(Node, list):
7130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self):
7140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "42"
7150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Node().__int__(), 23)
7160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(int(Node()), 23)
7170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Frag().__int__(), 42)
7180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(int(Frag()), 42)
7190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # MI mixing classic and new-style classes.
7210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A:
7230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = 1
7240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A):
7260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
7270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A):
7290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = 2
7300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(B, C):
7320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
7330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.x, 1)
7340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Classic MRO is preserved for a classic base class.
7360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(D, object):
7370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
7380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E.__mro__, (E, D, B, A, C, object))
7390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E.x, 1)
7400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # But with a mix of classic bases, their MROs are combined using
7420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # new-style MRO.
7430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class F(B, C, object):
7440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
7450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(F.__mro__, (F, B, C, A, object))
7460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(F.x, 2)
7470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Try something else.
7490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
7500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def cmethod(self):
7510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C a"
7520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def all_method(self):
7530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C b"
7540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M1(C, object):
7560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def m1method(self):
7570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "M1 a"
7580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def all_method(self):
7590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "M1 b"
7600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(M1.__mro__, (M1, C, object))
7620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = M1()
7630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.cmethod(), "C a")
7640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.m1method(), "M1 a")
7650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.all_method(), "M1 b")
7660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
7680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def dmethod(self):
7690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "D a"
7700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def all_method(self):
7710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "D b"
7720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M2(D, object):
7740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def m2method(self):
7750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "M2 a"
7760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def all_method(self):
7770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "M2 b"
7780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(M2.__mro__, (M2, D, C, object))
7800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = M2()
7810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.cmethod(), "C a")
7820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.dmethod(), "D a")
7830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.m2method(), "M2 a")
7840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.all_method(), "M2 b")
7850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
7860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M3(M1, M2, object):
7870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def m3method(self):
7880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "M3 a"
7890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def all_method(self):
7900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "M3 b"
7910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(M3.__mro__, (M3, M1, M2, D, C, object))
7920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = M3()
7930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.cmethod(), "C a")
7940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.dmethod(), "D a")
7950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.m1method(), "M1 a")
7960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.m2method(), "M2 a")
7970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.m3method(), "M3 a")
7980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.all_method(), "M3 b")
7990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Classic:
8010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
8020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
8030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class New(Classic):
8040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __metaclass__ = type
8050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
8060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
8070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
8080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("new class with only classic bases - shouldn't be")
8090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_diamond_inheritence(self):
8110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing multiple inheritance special cases...
8120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
8130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def spam(self): return "A"
8140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(A().spam(), "A")
8150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A):
8160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def boo(self): return "B"
8170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def spam(self): return "B"
8180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(B().spam(), "B")
8190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(B().boo(), "B")
8200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A):
8210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def boo(self): return "C"
8220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C().spam(), "A")
8230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C().boo(), "C")
8240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(B, C): pass
8250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D().spam(), "B")
8260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D().boo(), "B")
8270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.__mro__, (D, B, C, A, object))
8280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(C, B): pass
8290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E().spam(), "B")
8300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E().boo(), "C")
8310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E.__mro__, (E, C, B, A, object))
8320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # MRO order disagreement
8330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
8340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class F(D, E): pass
8350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
8360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
8370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
8380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("expected MRO order disagreement (F)")
8390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
8400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class G(E, D): pass
8410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
8420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
8430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
8440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("expected MRO order disagreement (G)")
8450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # see thread python-dev/2002-October/029035.html
8470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_ex5_from_c3_switch(self):
8480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing ex5 from C3 switch discussion...
8490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object): pass
8500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object): pass
8510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object): pass
8520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(A): pass
8530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Y(A): pass
8540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Z(X,B,Y,C): pass
8550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Z.__mro__, (Z, X, B, Y, A, C, object))
8560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # see "A Monotonic Superclass Linearization for Dylan",
8580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # by Kim Barrett et al. (OOPSLA 1996)
8590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_monotonicity(self):
8600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing MRO monotonicity...
8610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Boat(object): pass
8620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class DayBoat(Boat): pass
8630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class WheelBoat(Boat): pass
8640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class EngineLess(DayBoat): pass
8650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class SmallMultihull(DayBoat): pass
8660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class PedalWheelBoat(EngineLess,WheelBoat): pass
8670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class SmallCatamaran(SmallMultihull): pass
8680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Pedalo(PedalWheelBoat,SmallCatamaran): pass
8690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(PedalWheelBoat.__mro__,
8710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, object))
8720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(SmallCatamaran.__mro__,
8730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
8740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Pedalo.__mro__,
8750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
8760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               SmallMultihull, DayBoat, WheelBoat, Boat, object))
8770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # see "A Monotonic Superclass Linearization for Dylan",
8790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # by Kim Barrett et al. (OOPSLA 1996)
8800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_consistency_with_epg(self):
8810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing consistency with EPG...
8820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Pane(object): pass
8830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class ScrollingMixin(object): pass
8840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class EditingMixin(object): pass
8850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class ScrollablePane(Pane,ScrollingMixin): pass
8860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class EditablePane(Pane,EditingMixin): pass
8870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class EditableScrollablePane(ScrollablePane,EditablePane): pass
8880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(EditableScrollablePane.__mro__,
8900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi              (EditableScrollablePane, ScrollablePane, EditablePane, Pane,
8910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                ScrollingMixin, EditingMixin, object))
8920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_mro_disagreement(self):
8940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing error messages for MRO disagreement...
8950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        mro_err_msg = """Cannot create a consistent method resolution
8960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiorder (MRO) for bases """
8970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
8980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def raises(exc, expected, callable, *args):
8990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
9000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                callable(*args)
9010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except exc, msg:
9020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # the exact msg is generally considered an impl detail
9030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if test_support.check_impl_detail():
9040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if not str(msg).startswith(expected):
9050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        self.fail("Message %r, expected %r" %
9060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  (str(msg), expected))
9070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
9080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("Expected %s" % exc)
9090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object): pass
9110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A): pass
9120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object): pass
9130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test some very simple errors
9150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(TypeError, "duplicate base class A",
9160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               type, "X", (A, A), {})
9170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(TypeError, mro_err_msg,
9180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               type, "X", (A, B), {})
9190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(TypeError, mro_err_msg,
9200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               type, "X", (A, C, B), {})
9210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test a slightly more complex error
9220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class GridLayout(object): pass
9230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class HorizontalGrid(GridLayout): pass
9240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class VerticalGrid(GridLayout): pass
9250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class HVGrid(HorizontalGrid, VerticalGrid): pass
9260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class VHGrid(VerticalGrid, HorizontalGrid): pass
9270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raises(TypeError, mro_err_msg,
9280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi               type, "ConfusedGrid", (HVGrid, VHGrid), {})
9290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_object_class(self):
9310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing object class...
9320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = object()
9330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.__class__, object)
9340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(a), object)
9350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        b = object()
9360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(a, b)
9370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "foo"))
9380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
9390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            a.foo = 12
9400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except (AttributeError, TypeError):
9410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
9420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
9430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("object() should not allow setting a foo attribute")
9440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(object(), "__dict__"))
9450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Cdict(object):
9470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
9480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = Cdict()
9490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.__dict__, {})
9500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.foo = 1
9510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.foo, 1)
9520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.__dict__, {'foo': 1})
9530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_slots(self):
9550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __slots__...
9560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C0(object):
9570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = []
9580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = C0()
9590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, "__dict__"))
9600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, "foo"))
9610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C1(object):
9630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['a']
9640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = C1()
9650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, "__dict__"))
9660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, "a"))
9670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.a = 1
9680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.a, 1)
9690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.a = None
9700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.a, None)
9710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del x.a
9720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, "a"))
9730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C3(object):
9750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['a', 'b', 'c']
9760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = C3()
9770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, "__dict__"))
9780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, 'a'))
9790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, 'b'))
9800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, 'c'))
9810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.a = 1
9820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.b = 2
9830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.c = 3
9840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.a, 1)
9850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.b, 2)
9860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.c, 3)
9870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
9880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C4(object):
9890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """Validate name mangling"""
9900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['__a']
9910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, value):
9920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__a = value
9930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def get(self):
9940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.__a
9950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = C4(5)
9960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, '__dict__'))
9970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(x, '__a'))
9980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.get(), 5)
9990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
10000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.__a = 6
10010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except AttributeError:
10020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
10030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
10040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("Double underscored names not mangled")
10050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Make sure slot names are proper identifiers
10070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
10080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
10090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = [None]
10100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
10110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
10120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
10130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("[None] slots not caught")
10140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
10150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
10160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = ["foo bar"]
10170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
10180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
10190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
10200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("['foo bar'] slots not caught")
10210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
10220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
10230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = ["foo\0bar"]
10240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
10250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
10260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
10270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("['foo\\0bar'] slots not caught")
10280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
10290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
10300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = ["1"]
10310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
10320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
10330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
10340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("['1'] slots not caught")
10350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
10360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
10370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = [""]
10380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
10390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
10400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
10410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("[''] slots not caught")
10420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
10430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
10440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # XXX(nnorwitz): was there supposed to be something tested
10450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # from the class above?
10460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test a single string is not expanded as a sequence.
10480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
10490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = "abc"
10500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
10510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c.abc = 5
10520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.abc, 5)
10530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test unicode slot names
10550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
10560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            unicode
10570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except NameError:
10580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
10590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
10600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Test a single unicode string is not expanded as a sequence.
10610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
10620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = unicode("abc")
10630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c = C()
10640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c.abc = 5
10650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(c.abc, 5)
10660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # _unicode_to_string used to modify slots in certain circumstances
10680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            slots = (unicode("foo"), unicode("bar"))
10690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
10700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = slots
10710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = C()
10720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.foo = 5
10730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(x.foo, 5)
10740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(type(slots[0]), unicode)
10750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # this used to leak references
10760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
10770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                class C(object):
10780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    __slots__ = [unichr(128)]
10790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except (TypeError, UnicodeEncodeError):
10800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
10810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
10820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("[unichr(128)] slots not caught")
10830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
10840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test leaks
10850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Counted(object):
10860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            counter = 0    # counts the number of instances alive
10870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
10880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                Counted.counter += 1
10890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __del__(self):
10900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                Counted.counter -= 1
10910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
10920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['a', 'b', 'c']
10930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = C()
10940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.a = Counted()
10950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.b = Counted()
10960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.c = Counted()
10970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Counted.counter, 3)
10980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del x
10990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
11000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Counted.counter, 0)
11010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
11020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
11030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = D()
11040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.a = Counted()
11050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.z = Counted()
11060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Counted.counter, 2)
11070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del x
11080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
11090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Counted.counter, 0)
11100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(D):
11110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['e']
11120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = E()
11130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.a = Counted()
11140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.z = Counted()
11150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.e = Counted()
11160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Counted.counter, 3)
11170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del x
11180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
11190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Counted.counter, 0)
11200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test cyclical leaks [SF bug 519621]
11220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class F(object):
11230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['a', 'b']
11240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = F()
11250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s.a = [Counted(), s]
11260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Counted.counter, 1)
11270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = None
11280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
11290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Counted.counter, 0)
11300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test lookup leaks [SF bug 572567]
11320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if hasattr(gc, 'get_objects'):
11330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class G(object):
11340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __cmp__(self, other):
11350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return 0
11360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __hash__ = None # Silence Py3k warning
11370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            g = G()
11380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            orig_objects = len(gc.get_objects())
11390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for i in xrange(10):
11400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                g==g
11410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            new_objects = len(gc.get_objects())
11420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(orig_objects, new_objects)
11430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class H(object):
11450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['a', 'b']
11460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
11470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.a = 1
11480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.b = 2
11490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __del__(self_):
11500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(self_.a, 1)
11510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(self_.b, 2)
11520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with test_support.captured_output('stderr') as s:
11530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            h = H()
11540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            del h
11550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.getvalue(), '')
11560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(object):
11580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = "a"
11590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with self.assertRaises(AttributeError):
11600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            del X().a
11610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_slots_special(self):
11630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __dict__ and __weakref__ in __slots__...
11640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(object):
11650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["__dict__"]
11660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = D()
11670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(a, "__dict__"))
11680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "__weakref__"))
11690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.foo = 42
11700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.__dict__, {"foo": 42})
11710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class W(object):
11730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["__weakref__"]
11740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = W()
11750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(a, "__weakref__"))
11760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "__dict__"))
11770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
11780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            a.foo = 42
11790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except AttributeError:
11800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
11810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
11820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't be allowed to set a.foo")
11830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C1(W, D):
11850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = []
11860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C1()
11870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(a, "__dict__"))
11880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(a, "__weakref__"))
11890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.foo = 42
11900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.__dict__, {"foo": 42})
11910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
11920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C2(D, W):
11930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = []
11940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C2()
11950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(a, "__dict__"))
11960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(a, "__weakref__"))
11970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.foo = 42
11980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.__dict__, {"foo": 42})
11990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_slots_descriptor(self):
12010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Issue2115: slot descriptors did not correctly check
12020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # the type of the given object
12030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import abc
12040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class MyABC:
12050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = abc.ABCMeta
12060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = "a"
12070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Unrelated(object):
12090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        MyABC.register(Unrelated)
12110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        u = Unrelated()
12130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(u, MyABC)
12140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # This used to crash
12160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, MyABC.a.__set__, u, 3)
12170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_metaclass_cmp(self):
12190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # See bug 7491.
12200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M(type):
12210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __cmp__(self, other):
12220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return -1
12230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(object):
12240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = M
12250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(X < M)
12260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_dynamics(self):
12280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing class attribute propagation...
12290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(object):
12300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(D):
12320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class F(D):
12340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D.foo = 1
12360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.foo, 1)
12370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test that dynamic attributes are inherited
12380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E.foo, 1)
12390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(F.foo, 1)
12400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test dynamic instances
12410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
12420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
12440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "foobar"))
12450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.foobar = 2
12460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.foobar, 2)
12470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.method = lambda self: 42
12480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.method(), 42)
12490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__repr__ = lambda self: "C()"
12500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(a), "C()")
12510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__int__ = lambda self: 100
12520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(int(a), 100)
12530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.foobar, 2)
12540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "spam"))
12550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def mygetattr(self, name):
12560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if name == "spam":
12570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "spam"
12580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise AttributeError
12590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__getattr__ = mygetattr
12600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.spam, "spam")
12610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.new = 12
12620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.new, 12)
12630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def mysetattr(self, name, value):
12640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if name == "spam":
12650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise AttributeError
12660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return object.__setattr__(self, name, value)
12670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__setattr__ = mysetattr
12680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
12690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            a.spam = "not spam"
12700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except AttributeError:
12710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
12730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("expected AttributeError")
12740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.spam, "spam")
12750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
12760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
12780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d.foo = 1
12790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, 1)
12800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test handling of int*seq and seq*int
12820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class I(int):
12830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual("a"*I(2), "aa")
12850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(I(2)*"a", "aa")
12860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(2*I(3), 6)
12870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(I(3)*2, 6)
12880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(I(3)*I(2), 6)
12890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test handling of long*seq and seq*long
12910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class L(long):
12920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
12930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual("a"*L(2L), "aa")
12940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(L(2L)*"a", "aa")
12950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(2*L(3), 6)
12960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(L(3)*2, 6)
12970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(L(3)*L(2), 6)
12980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
12990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test comparison of classes with dynamic metaclasses
13000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class dynamicmetaclass(type):
13010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class someclass:
13030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = dynamicmetaclass
13040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(someclass, object)
13050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_errors(self):
13070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing errors...
13080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
13090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(list, dict):
13100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
13110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
13120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
13140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("inheritance from both list and dict should be illegal")
13150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
13170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object, None):
13180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
13190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
13200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
13220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("inheritance from non-type should be illegal")
13230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Classic:
13240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
13270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(type(len)):
13280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
13290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
13300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
13320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("inheritance from CFunction should be illegal")
13330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
13350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
13360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = 1
13370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
13380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
13400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("__slots__ = 1 should be illegal")
13410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
13430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(object):
13440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = [1]
13450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
13460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
13480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("__slots__ = [1] should be illegal")
13490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M1(type):
13510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M2(type):
13530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A1(object):
13550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = M1
13560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A2(object):
13570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = M2
13580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
13590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class B(A1, A2):
13600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
13610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
13620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
13640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("finding the most derived metaclass should have failed")
13650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_classmethods(self):
13670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing class methods...
13680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
13690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(*a): return a
13700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            goo = classmethod(foo)
13710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
13720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.goo(1), (C, 1))
13730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.goo(1), (C, 1))
13740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.foo(1), (c, 1))
13750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
13760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
13770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
13780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.goo(1), (D, 1))
13790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.goo(1), (D, 1))
13800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo(1), (d, 1))
13810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.foo(d, 1), (d, 1))
13820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test for a specific crash (SF bug 528132)
13830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def f(cls, arg): return (cls, arg)
13840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        ff = classmethod(f)
13850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(ff.__get__(0, int)(42), (int, 42))
13860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(ff.__get__(0)(42), (int, 42))
13870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test super() with classmethods (SF bug 535444)
13890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.goo.im_self, C)
13900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.goo.im_self, D)
13910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(super(D,D).goo.im_self, D)
13920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(super(D,d).goo.im_self, D)
13930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(super(D,D).goo(), (D,))
13940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(super(D,d).goo(), (D,))
13950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
13960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Verify that a non-callable will raise
13970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        meth = classmethod(1).__get__(1)
13980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, meth)
13990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Verify that classmethod() doesn't allow keyword args
14010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
14020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            classmethod(f, kw=1)
14030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
14040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
14050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
14060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("classmethod shouldn't accept keyword args")
14070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @test_support.impl_detail("the module 'xxsubtype' is internal")
14090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_classmethods_in_c(self):
14100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing C-based class methods...
14110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import xxsubtype as spam
14120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = (1, 2, 3)
14130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {'abc': 123}
14140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x, a1, d1 = spam.spamlist.classmeth(*a, **d)
14150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x, spam.spamlist)
14160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, a1)
14170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, d1)
14180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x, a1, d1 = spam.spamlist().classmeth(*a, **d)
14190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x, spam.spamlist)
14200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, a1)
14210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, d1)
14220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        spam_cm = spam.spamlist.__dict__['classmeth']
14230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x2, a2, d2 = spam_cm(spam.spamlist, *a, **d)
14240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x2, spam.spamlist)
14250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a2, a1)
14260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d2, d1)
14270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class SubSpam(spam.spamlist): pass
14280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x2, a2, d2 = spam_cm(SubSpam, *a, **d)
14290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x2, SubSpam)
14300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a2, a1)
14310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d2, d1)
14320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with self.assertRaises(TypeError):
14330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            spam_cm()
14340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with self.assertRaises(TypeError):
14350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            spam_cm(spam.spamlist())
14360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with self.assertRaises(TypeError):
14370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            spam_cm(list)
14380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_staticmethods(self):
14400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing static methods...
14410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
14420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(*a): return a
14430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            goo = staticmethod(foo)
14440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
14450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.goo(1), (1,))
14460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.goo(1), (1,))
14470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.foo(1), (c, 1,))
14480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
14490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
14500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
14510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.goo(1), (1,))
14520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.goo(1), (1,))
14530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo(1), (d, 1))
14540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.foo(d, 1), (d, 1))
14550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @test_support.impl_detail("the module 'xxsubtype' is internal")
14570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_staticmethods_in_c(self):
14580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing C-based static methods...
14590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import xxsubtype as spam
14600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = (1, 2, 3)
14610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {"abc": 123}
14620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
14630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x, None)
14640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, a1)
14650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, d1)
14660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
14670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x, None)
14680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, a1)
14690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, d1)
14700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_classic(self):
14720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing classic classes...
14730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
14740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(*a): return a
14750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            goo = classmethod(foo)
14760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
14770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.goo(1), (C, 1))
14780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.goo(1), (C, 1))
14790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.foo(1), (c, 1))
14800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
14810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
14820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
14830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.goo(1), (D, 1))
14840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.goo(1), (D, 1))
14850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo(1), (d, 1))
14860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.foo(d, 1), (d, 1))
14870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E: # *not* subclassing from C
14880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            foo = C.foo
14890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E().foo, C.foo) # i.e., unbound
14900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(repr(C.foo.__get__(C())).startswith("<bound method "))
14910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
14920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_compattr(self):
14930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing computed attributes...
14940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
14950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class computed_attribute(object):
14960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __init__(self, get, set=None, delete=None):
14970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.__get = get
14980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.__set = set
14990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.__delete = delete
15000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __get__(self, obj, type=None):
15010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return self.__get(obj)
15020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __set__(self, obj, value):
15030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return self.__set(obj, value)
15040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __delete__(self, obj):
15050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return self.__delete(obj)
15060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
15070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__x = 0
15080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __get_x(self):
15090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                x = self.__x
15100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__x = x+1
15110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return x
15120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __set_x(self, x):
15130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__x = x
15140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __delete_x(self):
15150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del self.__x
15160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = computed_attribute(__get_x, __set_x, __delete_x)
15170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
15180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.x, 0)
15190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.x, 1)
15200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.x = 10
15210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.x, 10)
15220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.x, 11)
15230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del a.x
15240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hasattr(a, 'x'), 0)
15250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_newslots(self):
15270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __new__ slot override...
15280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(list):
15290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(cls):
15300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self = list.__new__(cls)
15310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.foo = 1
15320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self
15330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
15340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.foo = self.foo + 2
15350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
15360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.foo, 3)
15370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.__class__, C)
15380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
15390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
15400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        b = D()
15410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(b.foo, 3)
15420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(b.__class__, D)
15430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_altmro(self):
15450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing mro() and overriding it...
15460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
15470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def f(self): return "A"
15480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A):
15490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
15500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A):
15510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def f(self): return "C"
15520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(B, C):
15530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
15540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.mro(), [D, B, C, A, object])
15550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D.__mro__, (D, B, C, A, object))
15560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D().f(), "C")
15570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class PerverseMetaType(type):
15590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def mro(cls):
15600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                L = type.mro(cls)
15610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                L.reverse()
15620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return L
15630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(D,B,C,A):
15640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = PerverseMetaType
15650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(X.__mro__, (object, A, C, B, D, X))
15660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(X().f(), "A")
15670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
15690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class X(object):
15700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                class __metaclass__(type):
15710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    def mro(self):
15720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return [self, dict, object]
15730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # In CPython, the class creation above already raises
15740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # TypeError, as a protection against the fact that
15750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # instances of X would segfault it.  In other Python
15760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # implementations it would be ok to let the class X
15770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # be created, but instead get a clean TypeError on the
15780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # __setitem__ below.
15790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = object.__new__(X)
15800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x[5] = 6
15810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
15820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
15830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
15840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("devious mro() return not caught")
15850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
15870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class X(object):
15880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                class __metaclass__(type):
15890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    def mro(self):
15900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return [1]
15910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
15920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
15930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
15940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("non-class mro() return not caught")
15950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
15960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
15970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class X(object):
15980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                class __metaclass__(type):
15990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    def mro(self):
16000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return 1
16010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
16020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
16030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
16040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("non-sequence mro() return not caught")
16050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_overloading(self):
16070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing operator overloading...
16080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object):
16100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            "Intermediate class because object doesn't have a __setattr__"
16110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(B):
16130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattr__(self, name):
16140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if name == "foo":
16150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return ("getattr", name)
16160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
16170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    raise AttributeError
16180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __setattr__(self, name, value):
16190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if name == "foo":
16200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.setattr = (name, value)
16210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
16220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return B.__setattr__(self, name, value)
16230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __delattr__(self, name):
16240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if name == "foo":
16250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.delattr = name
16260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
16270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return B.__delattr__(self, name)
16280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, key):
16300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return ("getitem", key)
16310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __setitem__(self, key, value):
16320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.setitem = (key, value)
16330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __delitem__(self, key):
16340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.delitem = key
16350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getslice__(self, i, j):
16370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return ("getslice", i, j)
16380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __setslice__(self, i, j, value):
16390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.setslice = (i, j, value)
16400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __delslice__(self, i, j):
16410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.delslice = (i, j)
16420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
16440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.foo, ("getattr", "foo"))
16450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.foo = 12
16460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.setattr, ("foo", 12))
16470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del a.foo
16480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.delattr, "foo")
16490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[12], ("getitem", 12))
16510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a[12] = 21
16520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.setitem, (12, 21))
16530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del a[12]
16540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.delitem, 12)
16550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[0:10], ("getslice", 0, 10))
16570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a[0:10] = "foo"
16580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.setslice, (0, 10, "foo"))
16590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del a[0:10]
16600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.delslice, (0, 10))
16610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_methods(self):
16630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing methods...
16640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
16650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, x):
16660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.x = x
16670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self):
16680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.x
16690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c1 = C(1)
16700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c1.foo(), 1)
16710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
16720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            boo = C.foo
16730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            goo = c1.foo
16740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d2 = D(2)
16750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d2.foo(), 2)
16760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d2.boo(), 2)
16770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d2.goo(), 1)
16780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(object):
16790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            foo = C.foo
16800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E().foo, C.foo) # i.e., unbound
16810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(repr(C.foo.__get__(C(1))).startswith("<bound method "))
16820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_special_method_lookup(self):
16840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The lookup of special methods bypasses __getattr__ and
16850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # __getattribute__, but they still can be descriptors.
16860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
16870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def run_context(manager):
16880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            with manager:
16890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
16900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def iden(self):
16910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return self
16920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def hello(self):
16930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return "hello"
16940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def empty_seq(self):
16950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return []
16960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def zero(self):
16970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return 0
16980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def complex_num(self):
16990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return 1j
17000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def stop(self):
17010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise StopIteration
17020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def return_true(self, thing=None):
17030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return True
17040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def do_isinstance(obj):
17050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return isinstance(int, obj)
17060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def do_issubclass(obj):
17070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return issubclass(int, obj)
17080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def swallow(*args):
17090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
17100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def do_dict_missing(checker):
17110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class DictSub(checker.__class__, dict):
17120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
17130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(DictSub()["hi"], 4)
17140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def some_number(self_, key):
17150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(key, "hi")
17160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return 4
17170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def format_impl(self, spec):
17180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return "hello"
17190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # It would be nice to have every special method tested here, but I'm
17210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # only listing the ones I can remember outside of typeobject.c, since it
17220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # does it right.
17230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        specials = [
17240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__unicode__", unicode, hello, set(), {}),
17250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__reversed__", reversed, empty_seq, set(), {}),
17260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__length_hint__", list, zero, set(),
17270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             {"__iter__" : iden, "next" : stop}),
17280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__sizeof__", sys.getsizeof, zero, set(), {}),
17290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__instancecheck__", do_isinstance, return_true, set(), {}),
17300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__missing__", do_dict_missing, some_number,
17310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             set(("__class__",)), {}),
17320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__subclasscheck__", do_issubclass, return_true,
17330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi             set(("__bases__",)), {}),
17340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__enter__", run_context, iden, set(), {"__exit__" : swallow}),
17350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__exit__", run_context, swallow, set(), {"__enter__" : iden}),
17360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__complex__", complex, complex_num, set(), {}),
17370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__format__", format, format_impl, set(), {}),
17380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("__dir__", dir, empty_seq, set(), {}),
17390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ]
17400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Checker(object):
17420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattr__(self, attr, test=self):
17430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                test.fail("__getattr__ called with {0}".format(attr))
17440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattribute__(self, attr, test=self):
17450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if attr not in ok:
17460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    test.fail("__getattribute__ called with {0}".format(attr))
17470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return object.__getattribute__(self, attr)
17480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class SpecialDescr(object):
17490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, impl):
17500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.impl = impl
17510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __get__(self, obj, owner):
17520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                record.append(1)
17530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.impl.__get__(obj, owner)
17540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class MyException(Exception):
17550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
17560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class ErrDescr(object):
17570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __get__(self, obj, owner):
17580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise MyException
17590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for name, runner, meth_impl, ok, env in specials:
17610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class X(Checker):
17620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
17630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for attr, obj in env.iteritems():
17640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                setattr(X, attr, obj)
17650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            setattr(X, name, meth_impl)
17660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            runner(X())
17670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            record = []
17690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class X(Checker):
17700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
17710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for attr, obj in env.iteritems():
17720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                setattr(X, attr, obj)
17730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            setattr(X, name, SpecialDescr(meth_impl))
17740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            runner(X())
17750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(record, [1], name)
17760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class X(Checker):
17780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
17790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for attr, obj in env.iteritems():
17800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                setattr(X, attr, obj)
17810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            setattr(X, name, ErrDescr())
17820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
17830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                runner(X())
17840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except MyException:
17850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
17860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
17870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("{0!r} didn't raise".format(name))
17880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_specials(self):
17900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing special operators...
17910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test operators like __hash__ for which a built-in default exists
17920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
17930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test the default behavior for static classes
17940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
17950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, i):
17960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if 0 <= i < 10: return i
17970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise IndexError
17980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c1 = C()
17990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c2 = C()
18000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not not c1) # What?
18010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(id(c1), id(c2))
18020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        hash(c1)
18030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        hash(c2)
18040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cmp(c1, c2), cmp(id(c1), id(c2)))
18050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c1, c1)
18060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(c1 != c2)
18070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not c1 != c1)
18080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not c1 == c2)
18090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Note that the module name appears in str/repr, and that varies
18100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # depending on whether this test is run standalone or from a framework.
18110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(str(c1).find('C object at ') >= 0)
18120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(c1), repr(c1))
18130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(-1, c1)
18140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(10):
18150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIn(i, c1)
18160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(10, c1)
18170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test the default behavior for dynamic classes
18180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(object):
18190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, i):
18200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if 0 <= i < 10: return i
18210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise IndexError
18220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d1 = D()
18230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d2 = D()
18240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not not d1)
18250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(id(d1), id(d2))
18260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        hash(d1)
18270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        hash(d2)
18280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cmp(d1, d2), cmp(id(d1), id(d2)))
18290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d1, d1)
18300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(d1, d2)
18310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not d1 != d1)
18320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not d1 == d2)
18330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Note that the module name appears in str/repr, and that varies
18340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # depending on whether this test is run standalone or from a framework.
18350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(str(d1).find('D object at ') >= 0)
18360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(d1), repr(d1))
18370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(-1, d1)
18380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(10):
18390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIn(i, d1)
18400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(10, d1)
18410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test overridden behavior for static classes
18420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Proxy(object):
18430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, x):
18440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.x = x
18450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __nonzero__(self):
18460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return not not self.x
18470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __hash__(self):
18480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return hash(self.x)
18490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __eq__(self, other):
18500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.x == other
18510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __ne__(self, other):
18520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.x != other
18530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __cmp__(self, other):
18540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return cmp(self.x, other.x)
18550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __str__(self):
18560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "Proxy:%s" % self.x
18570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
18580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "Proxy(%r)" % self.x
18590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __contains__(self, value):
18600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return value in self.x
18610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p0 = Proxy(0)
18620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p1 = Proxy(1)
18630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p_1 = Proxy(-1)
18640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(p0)
18650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not not p1)
18660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(p0), hash(0))
18670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(p0, p0)
18680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(p0, p1)
18690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not p0 != p0)
18700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(not p0, p1)
18710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cmp(p0, p1), -1)
18720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cmp(p0, p0), 0)
18730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cmp(p0, p_1), 1)
18740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(p0), "Proxy:0")
18750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(p0), "Proxy(0)")
18760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p10 = Proxy(range(10))
18770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(-1, p10)
18780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(10):
18790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIn(i, p10)
18800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(10, p10)
18810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test overridden behavior for dynamic classes
18820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class DProxy(object):
18830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, x):
18840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.x = x
18850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __nonzero__(self):
18860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return not not self.x
18870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __hash__(self):
18880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return hash(self.x)
18890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __eq__(self, other):
18900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.x == other
18910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __ne__(self, other):
18920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.x != other
18930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __cmp__(self, other):
18940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return cmp(self.x, other.x)
18950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __str__(self):
18960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "DProxy:%s" % self.x
18970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
18980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "DProxy(%r)" % self.x
18990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __contains__(self, value):
19000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return value in self.x
19010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p0 = DProxy(0)
19020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p1 = DProxy(1)
19030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p_1 = DProxy(-1)
19040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(p0)
19050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(not not p1)
19060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(p0), hash(0))
19070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(p0, p0)
19080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(p0, p1)
19090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotEqual(not p0, p0)
19100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(not p0, p1)
19110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cmp(p0, p1), -1)
19120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cmp(p0, p0), 0)
19130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cmp(p0, p_1), 1)
19140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(p0), "DProxy:0")
19150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(p0), "DProxy(0)")
19160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p10 = DProxy(range(10))
19170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(-1, p10)
19180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(10):
19190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIn(i, p10)
19200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertNotIn(10, p10)
19210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Safety test for __cmp__
19230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def unsafecmp(a, b):
19240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if not hasattr(a, '__cmp__'):
19250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return   # some types don't have a __cmp__ any more (so the
19260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         # test doesn't make sense any more), or maybe they
19270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         # never had a __cmp__ at all, e.g. in PyPy
19280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
19290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                a.__class__.__cmp__(a, b)
19300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
19310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
19320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
19330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("shouldn't allow %s.__cmp__(%r, %r)" % (
19340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    a.__class__, a, b))
19350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        unsafecmp(u"123", "123")
19370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        unsafecmp("123", u"123")
19380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        unsafecmp(1, 1.0)
19390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        unsafecmp(1.0, 1)
19400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        unsafecmp(1, 1L)
19410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        unsafecmp(1L, 1)
19420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @test_support.impl_detail("custom logic for printing to real file objects")
19440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_recursions_1(self):
19450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing recursion checks ...
19460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Letter(str):
19470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(cls, letter):
19480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if letter == 'EPS':
19490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return str.__new__(cls)
19500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return str.__new__(cls, letter)
19510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __str__(self):
19520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if not self:
19530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return 'EPS'
19540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self
19550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # sys.stdout needs to be the original to trigger the recursion bug
19560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_stdout = sys.stdout
19570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        sys.stdout = test_support.get_original_stdout()
19580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
19590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # nothing should actually be printed, this should raise an exception
19600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            print Letter('w')
19610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except RuntimeError:
19620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
19630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
19640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("expected a RuntimeError for print recursion")
19650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        finally:
19660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            sys.stdout = test_stdout
19670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_recursions_2(self):
19690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Bug #1202533.
19700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
19710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
19720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
19730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
19740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            A()*2
19750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except RuntimeError:
19760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
19770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
19780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("expected a RuntimeError")
19790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
19800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_weakrefs(self):
19810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing weak references...
19820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import weakref
19830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
19840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
19850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
19860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        r = weakref.ref(c)
19870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(r(), c)
19880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del c
19890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
19900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(r(), None)
19910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del r
19920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class NoWeak(object):
19930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['foo']
19940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        no = NoWeak()
19950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
19960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            weakref.ref(no)
19970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError, msg:
19980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(str(msg).find("weak reference") >= 0)
19990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
20000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("weakref.ref(no) should be illegal")
20010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Weak(object):
20020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['foo', '__weakref__']
20030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        yes = Weak()
20040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        r = weakref.ref(yes)
20050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(r(), yes)
20060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del yes
20070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
20080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(r(), None)
20090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del r
20100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_properties(self):
20120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing property...
20130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
20140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getx(self):
20150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.__x
20160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def setx(self, value):
20170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__x = value
20180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def delx(self):
20190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del self.__x
20200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = property(getx, setx, delx, doc="I'm the x property.")
20210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
20220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "x"))
20230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.x = 42
20240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a._C__x, 42)
20250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.x, 42)
20260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del a.x
20270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "x"))
20280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "_C__x"))
20290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.x.__set__(a, 100)
20300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.x.__get__(a), 100)
20310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.x.__delete__(a)
20320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(a, "x"))
20330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        raw = C.__dict__['x']
20350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(raw, property)
20360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        attrs = dir(raw)
20380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn("__doc__", attrs)
20390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn("fget", attrs)
20400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn("fset", attrs)
20410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn("fdel", attrs)
20420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(raw.__doc__, "I'm the x property.")
20440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(raw.fget is C.__dict__['getx'])
20450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(raw.fset is C.__dict__['setx'])
20460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(raw.fdel is C.__dict__['delx'])
20470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for attr in "__doc__", "fget", "fset", "fdel":
20490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
20500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                setattr(raw, attr, 42)
20510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError, msg:
20520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if str(msg).find('readonly') < 0:
20530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.fail("when setting readonly attr %r on a property, "
20540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                     "got unexpected TypeError msg %r" % (attr, str(msg)))
20550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
20560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("expected TypeError from trying to set readonly %r "
20570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                 "attr on a property" % attr)
20580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(object):
20600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __getitem__ = property(lambda s: 1/0)
20610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
20630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
20640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for i in d:
20650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                str(i)
20660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ZeroDivisionError:
20670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
20680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
20690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("expected ZeroDivisionError from bad property")
20700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @unittest.skipIf(sys.flags.optimize >= 2,
20720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                     "Docstrings are omitted with -O2 and above")
20730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_properties_doc_attrib(self):
20740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(object):
20750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getter(self):
20760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                "getter method"
20770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 0
20780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def setter(self_, value):
20790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                "setter method"
20800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
20810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            prop = property(getter)
20820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(prop.__doc__, "getter method")
20830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            prop2 = property(fset=setter)
20840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(prop2.__doc__, None)
20850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_testcapi_no_segfault(self):
20870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # this segfaulted in 2.5b2
20880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
20890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            import _testcapi
20900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ImportError:
20910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
20920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
20930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class X(object):
20940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                p = property(_testcapi.test_with_docstring)
20950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
20960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_properties_plus(self):
20970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
20980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            foo = property(doc="hello")
20990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @foo.getter
21000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self):
21010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self._foo
21020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @foo.setter
21030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self, value):
21040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._foo = abs(value)
21050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @foo.deleter
21060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self):
21070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del self._foo
21080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
21090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.foo.__doc__, "hello")
21100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(c, "foo"))
21110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c.foo = -42
21120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(c, '_foo'))
21130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c._foo, 42)
21140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.foo, 42)
21150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del c.foo
21160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(c, '_foo'))
21170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(hasattr(c, "foo"))
21180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
21200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @C.foo.deleter
21210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self):
21220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                try:
21230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    del self._foo
21240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                except AttributeError:
21250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    pass
21260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
21270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d.foo = 24
21280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, 24)
21290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del d.foo
21300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del d.foo
21310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(object):
21330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @property
21340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self):
21350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self._foo
21360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @foo.setter
21370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self, value):
21380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise RuntimeError
21390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @foo.setter
21400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self, value):
21410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._foo = abs(value)
21420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @foo.deleter
21430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self, value=None):
21440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del self._foo
21450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e = E()
21470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e.foo = -42
21480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e.foo, 42)
21490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del e.foo
21500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class F(E):
21520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @E.foo.deleter
21530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self):
21540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del self._foo
21550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @foo.setter
21560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def foo(self, value):
21570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._foo = max(0, value)
21580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f = F()
21590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f.foo = -10
21600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(f.foo, 0)
21610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del f.foo
21620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_dict_constructors(self):
21640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing dict constructor ...
21650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = dict()
21660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, {})
21670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = dict({})
21680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, {})
21690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = dict({1: 2, 'a': 'b'})
21700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, {1: 2, 'a': 'b'})
21710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict(d.items()))
21720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict(d.iteritems()))
21730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = dict({'one':1, 'two':2})
21740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict(one=1, two=2))
21750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict(**d))
21760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict({"one": 1}, two=2))
21770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict([("two", 2)], one=1))
21780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict([("one", 100), ("two", 200)], **d))
21790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict(**d))
21800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for badarg in 0, 0L, 0j, "0", [0], (0,):
21820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
21830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                dict(badarg)
21840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
21850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
21860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except ValueError:
21870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if badarg == "0":
21880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    # It's a sequence, and its elements are also sequences (gotta
21890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    # love strings <wink>), but they aren't of length 2, so this
21900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    # one seemed better as a ValueError than a TypeError.
21910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    pass
21920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
21930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.fail("no TypeError from dict(%r)" % badarg)
21940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
21950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("no TypeError from dict(%r)" % badarg)
21960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
21970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
21980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dict({}, {})
21990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
22000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
22010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
22020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("no TypeError from dict({}, {})")
22030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Mapping:
22050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Lacks a .keys() method; will be added later.
22060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dict = {1:2, 3:4, 'a':1j}
22070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
22090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dict(Mapping())
22100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
22110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
22120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
22130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("no TypeError from dict(incomplete mapping)")
22140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Mapping.keys = lambda self: self.dict.keys()
22160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Mapping.__getitem__ = lambda self, i: self.dict[i]
22170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = dict(Mapping())
22180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, Mapping.dict)
22190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Init from sequence of iterable objects, each producing a 2-sequence.
22210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class AddressBookEntry:
22220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, first, last):
22230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.first = first
22240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.last = last
22250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __iter__(self):
22260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return iter([self.first, self.last])
22270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = dict([AddressBookEntry('Tim', 'Warsaw'),
22290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                  AddressBookEntry('Barry', 'Peters'),
22300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                  AddressBookEntry('Tim', 'Peters'),
22310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                  AddressBookEntry('Barry', 'Warsaw')])
22320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
22330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = dict(zip(range(4), range(1, 5)))
22350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d, dict([(i, i+1) for i in range(4)]))
22360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Bad sequence lengths.
22380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
22390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
22400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                dict(bad)
22410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except ValueError:
22420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
22430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
22440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("no ValueError from dict(%r)" % bad)
22450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_dir(self):
22470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing dir() ...
22480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        junk = 12
22490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dir(), ['junk', 'self'])
22500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del junk
22510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Just make sure these don't blow up!
22530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, self.test_dir:
22540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dir(arg)
22550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Try classic classes.
22570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
22580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Cdata = 1
22590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def Cmethod(self): pass
22600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
22620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dir(C), cstuff)
22630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('im_self', dir(C.Cmethod))
22640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()  # c.__doc__ is an odd thing to see here; ditto c.__module__.
22660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dir(c), cstuff)
22670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c.cdata = 2
22690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c.cmethod = lambda self: 0
22700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dir(c), cstuff + ['cdata', 'cmethod'])
22710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('im_self', dir(c.Cmethod))
22720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(C):
22740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Adata = 1
22750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def Amethod(self): pass
22760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        astuff = ['Adata', 'Amethod'] + cstuff
22780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dir(A), astuff)
22790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('im_self', dir(A.Amethod))
22800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = A()
22810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dir(a), astuff)
22820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('im_self', dir(a.Amethod))
22830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.adata = 42
22840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.amethod = lambda self: 3
22850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dir(a), astuff + ['adata', 'amethod'])
22860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The same, but with new-style classes.  Since these have object as a
22880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # base class, a lot more gets sucked in.
22890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def interesting(strings):
22900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return [s for s in strings if not s.startswith('_')]
22910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
22930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Cdata = 1
22940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def Cmethod(self): pass
22950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cstuff = ['Cdata', 'Cmethod']
22970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(interesting(dir(C)), cstuff)
22980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
22990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
23000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(interesting(dir(c)), cstuff)
23010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('im_self', dir(C.Cmethod))
23020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c.cdata = 2
23040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c.cmethod = lambda self: 0
23050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
23060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('im_self', dir(c.Cmethod))
23070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(C):
23090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Adata = 1
23100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def Amethod(self): pass
23110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        astuff = ['Adata', 'Amethod'] + cstuff
23130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(interesting(dir(A)), astuff)
23140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('im_self', dir(A.Amethod))
23150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = A()
23160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(interesting(dir(a)), astuff)
23170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.adata = 42
23180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.amethod = lambda self: 3
23190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(interesting(dir(a)), astuff + ['adata', 'amethod'])
23200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('im_self', dir(a.Amethod))
23210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Try a module subclass.
23230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M(type(sys)):
23240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
23250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        minstance = M("m")
23260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        minstance.b = 2
23270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        minstance.a = 1
23280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
23290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(names, ['a', 'b'])
23300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M2(M):
23320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getdict(self):
23330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "Not a dict!"
23340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __dict__ = property(getdict)
23350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m2instance = M2("m2")
23370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m2instance.b = 2
23380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m2instance.a = 1
23390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m2instance.__dict__, "Not a dict!")
23400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
23410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dir(m2instance)
23420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
23430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
23440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Two essentially featureless objects, just inheriting stuff from
23460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # object.
23470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dir(NotImplemented), dir(Ellipsis))
23480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if test_support.check_impl_detail():
23490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # None differs in PyPy: it has a __nonzero__
23500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(dir(None), dir(Ellipsis))
23510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Nasty test case for proxied objects
23530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Wrapper(object):
23540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, obj):
23550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__obj = obj
23560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
23570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "Wrapper(%s)" % repr(self.__obj)
23580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, key):
23590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return Wrapper(self.__obj[key])
23600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __len__(self):
23610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return len(self.__obj)
23620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattr__(self, name):
23630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return Wrapper(getattr(self.__obj, name))
23640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
23660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getclass(self):
23670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return Wrapper(type(self))
23680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __class__ = property(__getclass)
23690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dir(C()) # This used to segfault
23710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_supers(self):
23730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing super...
23740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
23760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self, a):
23770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "A(%r)" % a
23780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(A().meth(1), "A(1)")
23800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A):
23820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
23830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__super = super(B, self)
23840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self, a):
23850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "B(%r)" % a + self.__super.meth(a)
23860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(B().meth(2), "B(2)A(2)")
23880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A):
23900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self, a):
23910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C(%r)" % a + self.__super.meth(a)
23920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C._C__super = super(C)
23930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C().meth(3), "C(3)A(3)")
23950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
23960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C, B):
23970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self, a):
23980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "D(%r)" % a + super(D, self).meth(a)
23990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D().meth(4), "D(4)C(4)B(4)A(4)")
24010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test for subclassing super
24030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class mysuper(super):
24050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, *args):
24060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return super(mysuper, self).__init__(*args)
24070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(D):
24090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self, a):
24100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "E(%r)" % a + mysuper(E, self).meth(a)
24110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
24130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class F(E):
24150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self, a):
24160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                s = self.__super # == mysuper(F, self)
24170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
24180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        F._F__super = mysuper(F)
24190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
24210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Make sure certain errors are raised
24230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
24250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            super(D, 42)
24260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
24270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
24280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
24290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't allow super(D, 42)")
24300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
24320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            super(D, C())
24330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
24340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
24350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
24360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't allow super(D, C())")
24370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
24390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            super(D).__get__(12)
24400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
24410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
24420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
24430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't allow super(D).__get__(12)")
24440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
24460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            super(D).__get__(C())
24470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
24480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
24490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
24500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't allow super(D).__get__(C())")
24510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Make sure data descriptors can be overridden and accessed via super
24530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # (new feature in Python 2.3)
24540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class DDbase(object):
24560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getx(self): return 42
24570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = property(getx)
24580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class DDsub(DDbase):
24600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getx(self): return "hello"
24610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = property(getx)
24620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        dd = DDsub()
24640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dd.x, "hello")
24650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(super(DDsub, dd).x, 42)
24660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Ensure that super() lookup of descriptor from classmethod
24680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # works (SF ID# 743627)
24690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Base(object):
24710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            aProp = property(lambda self: "foo")
24720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Sub(Base):
24740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            @classmethod
24750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def test(klass):
24760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return super(Sub,klass).aProp
24770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(Sub.test(), Base.aProp)
24790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Verify that super() doesn't allow keyword args
24810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
24820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            super(Base, kw=1)
24830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
24840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
24850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
24860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual("super shouldn't accept keyword args")
24870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_basic_inheritance(self):
24890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing inheritance from basic types...
24900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
24910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class hexint(int):
24920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
24930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return hex(self)
24940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __add__(self, other):
24950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return hexint(int.__add__(self, other))
24960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # (Note that overriding __radd__ doesn't work,
24970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # because the int type gets first dibs.)
24980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(hexint(7) + 9), "0x10")
24990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(hexint(1000) + 7), "0x3ef")
25000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = hexint(12345)
25010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, 12345)
25020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(int(a), 12345)
25030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(int(a).__class__ is int)
25040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(a), hash(12345))
25050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((+a).__class__ is int)
25060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a >> 0).__class__ is int)
25070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a << 0).__class__ is int)
25080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((hexint(0) << 12).__class__ is int)
25090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((hexint(0) >> 12).__class__ is int)
25100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class octlong(long):
25120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = []
25130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __str__(self):
25140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                s = oct(self)
25150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if s[-1] == 'L':
25160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    s = s[:-1]
25170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return s
25180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __add__(self, other):
25190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.__class__(super(octlong, self).__add__(other))
25200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __radd__ = __add__
25210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(octlong(3) + 5), "010")
25220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # (Note that overriding __radd__ here only seems to work
25230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # because the example uses a short int left argument.)
25240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(5 + octlong(3000)), "05675")
25250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = octlong(12345)
25260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, 12345L)
25270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(long(a), 12345L)
25280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(a), hash(12345L))
25290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(long(a).__class__ is long)
25300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((+a).__class__ is long)
25310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((-a).__class__ is long)
25320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((-octlong(0)).__class__ is long)
25330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a >> 0).__class__ is long)
25340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a << 0).__class__ is long)
25350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a - 0).__class__ is long)
25360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a * 1).__class__ is long)
25370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a ** 1).__class__ is long)
25380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a // 1).__class__ is long)
25390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((1 * a).__class__ is long)
25400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a | 0).__class__ is long)
25410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a ^ 0).__class__ is long)
25420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a & -1L).__class__ is long)
25430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((octlong(0) << 12).__class__ is long)
25440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((octlong(0) >> 12).__class__ is long)
25450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(abs(octlong(0)).__class__ is long)
25460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Because octlong overrides __add__, we can't check the absence of +0
25480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # optimizations using octlong.
25490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class longclone(long):
25500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
25510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = longclone(1)
25520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a + 0).__class__ is long)
25530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((0 + a).__class__ is long)
25540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Check that negative clones don't segfault
25560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = longclone(-1)
25570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.__dict__, {})
25580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(long(a), -1)  # self.assertTrue PyNumber_Long() copies the sign bit
25590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class precfloat(float):
25610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['prec']
25620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, value=0.0, prec=12):
25630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.prec = int(prec)
25640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
25650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "%.*g" % (self.prec, self)
25660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(precfloat(1.1)), "1.1")
25670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = precfloat(12345)
25680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, 12345.0)
25690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(float(a), 12345.0)
25700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(float(a).__class__ is float)
25710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(a), hash(12345.0))
25720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((+a).__class__ is float)
25730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
25740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class madcomplex(complex):
25750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
25760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "%.17gj%+.17g" % (self.imag, self.real)
25770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = madcomplex(-3, 4)
25780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(a), "4j-3")
25790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        base = complex(-3, 4)
25800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(base.__class__, complex)
25810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, base)
25820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(complex(a), base)
25830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(complex(a).__class__, complex)
25840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = madcomplex(a)  # just trying another form of the constructor
25850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(a), "4j-3")
25860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, base)
25870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(complex(a), base)
25880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(complex(a).__class__, complex)
25890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(a), hash(base))
25900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((+a).__class__, complex)
25910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((a + 0).__class__, complex)
25920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a + 0, base)
25930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((a - 0).__class__, complex)
25940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a - 0, base)
25950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((a * 1).__class__, complex)
25960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a * 1, base)
25970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((a / 1).__class__, complex)
25980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a / 1, base)
25990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class madtuple(tuple):
26010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _rev = None
26020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def rev(self):
26030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if self._rev is not None:
26040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return self._rev
26050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                L = list(self)
26060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                L.reverse()
26070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._rev = self.__class__(L)
26080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self._rev
26090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = madtuple((1,2,3,4,5,6,7,8,9,0))
26100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, (1,2,3,4,5,6,7,8,9,0))
26110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
26120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
26130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(512):
26140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            t = madtuple(range(i))
26150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            u = t.rev()
26160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            v = u.rev()
26170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(v, t)
26180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = madtuple((1,2,3,4,5))
26190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(tuple(a), (1,2,3,4,5))
26200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(tuple(a).__class__ is tuple)
26210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(a), hash((1,2,3,4,5)))
26220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(a[:].__class__ is tuple)
26230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a * 1).__class__ is tuple)
26240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a * 0).__class__ is tuple)
26250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a + ()).__class__ is tuple)
26260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = madtuple(())
26270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(tuple(a), ())
26280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(tuple(a).__class__ is tuple)
26290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a + a).__class__ is tuple)
26300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a * 0).__class__ is tuple)
26310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a * 1).__class__ is tuple)
26320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((a * 2).__class__ is tuple)
26330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(a[:].__class__ is tuple)
26340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class madstring(str):
26360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _rev = None
26370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def rev(self):
26380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if self._rev is not None:
26390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return self._rev
26400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                L = list(self)
26410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                L.reverse()
26420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._rev = self.__class__("".join(L))
26430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self._rev
26440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = madstring("abcdefghijklmnopqrstuvwxyz")
26450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, "abcdefghijklmnopqrstuvwxyz")
26460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
26470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
26480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in range(256):
26490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            s = madstring("".join(map(chr, range(i))))
26500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            t = s.rev()
26510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            u = t.rev()
26520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(u, s)
26530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = madstring("12345")
26540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(s), "12345")
26550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(str(s).__class__ is str)
26560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
26570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        base = "\x00" * 5
26580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        s = madstring(base)
26590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s, base)
26600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(s), base)
26610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(str(s).__class__ is str)
26620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(s), hash(base))
26630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual({s: 1}[base], 1)
26640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual({base: 1}[s], 1)
26650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((s + "").__class__ is str)
26660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s + "", base)
26670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(("" + s).__class__ is str)
26680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual("" + s, base)
26690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((s * 0).__class__ is str)
26700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s * 0, "")
26710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((s * 1).__class__ is str)
26720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s * 1, base)
26730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((s * 2).__class__ is str)
26740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s * 2, base + base)
26750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s[:].__class__ is str)
26760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s[:], base)
26770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s[0:0].__class__ is str)
26780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s[0:0], "")
26790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.strip().__class__ is str)
26800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.strip(), base)
26810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.lstrip().__class__ is str)
26820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.lstrip(), base)
26830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.rstrip().__class__ is str)
26840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.rstrip(), base)
26850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        identitytab = ''.join([chr(i) for i in range(256)])
26860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.translate(identitytab).__class__ is str)
26870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.translate(identitytab), base)
26880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.translate(identitytab, "x").__class__ is str)
26890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.translate(identitytab, "x"), base)
26900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.translate(identitytab, "\x00"), "")
26910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.replace("x", "x").__class__ is str)
26920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.replace("x", "x"), base)
26930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.ljust(len(s)).__class__ is str)
26940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.ljust(len(s)), base)
26950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.rjust(len(s)).__class__ is str)
26960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.rjust(len(s)), base)
26970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.center(len(s)).__class__ is str)
26980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.center(len(s)), base)
26990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(s.lower().__class__ is str)
27000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(s.lower(), base)
27010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class madunicode(unicode):
27030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            _rev = None
27040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def rev(self):
27050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if self._rev is not None:
27060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return self._rev
27070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                L = list(self)
27080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                L.reverse()
27090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self._rev = self.__class__(u"".join(L))
27100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self._rev
27110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        u = madunicode("ABCDEF")
27120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u, u"ABCDEF")
27130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.rev(), madunicode(u"FEDCBA"))
27140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.rev().rev(), madunicode(u"ABCDEF"))
27150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        base = u"12345"
27160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        u = madunicode(base)
27170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(unicode(u), base)
27180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(unicode(u).__class__ is unicode)
27190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(u), hash(base))
27200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual({u: 1}[base], 1)
27210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual({base: 1}[u], 1)
27220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.strip().__class__ is unicode)
27230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.strip(), base)
27240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.lstrip().__class__ is unicode)
27250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.lstrip(), base)
27260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.rstrip().__class__ is unicode)
27270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.rstrip(), base)
27280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.replace(u"x", u"x").__class__ is unicode)
27290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.replace(u"x", u"x"), base)
27300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.replace(u"xy", u"xy").__class__ is unicode)
27310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.replace(u"xy", u"xy"), base)
27320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.center(len(u)).__class__ is unicode)
27330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.center(len(u)), base)
27340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.ljust(len(u)).__class__ is unicode)
27350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.ljust(len(u)), base)
27360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.rjust(len(u)).__class__ is unicode)
27370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.rjust(len(u)), base)
27380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.lower().__class__ is unicode)
27390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.lower(), base)
27400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.upper().__class__ is unicode)
27410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.upper(), base)
27420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.capitalize().__class__ is unicode)
27430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.capitalize(), base)
27440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u.title().__class__ is unicode)
27450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u.title(), base)
27460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((u + u"").__class__ is unicode)
27470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u + u"", base)
27480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((u"" + u).__class__ is unicode)
27490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u"" + u, base)
27500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((u * 0).__class__ is unicode)
27510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u * 0, u"")
27520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((u * 1).__class__ is unicode)
27530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u * 1, base)
27540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue((u * 2).__class__ is unicode)
27550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u * 2, base + base)
27560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u[:].__class__ is unicode)
27570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u[:], base)
27580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(u[0:0].__class__ is unicode)
27590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(u[0:0], u"")
27600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class sublist(list):
27620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
27630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = sublist(range(5))
27640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, range(5))
27650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.append("hello")
27660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, range(5) + ["hello"])
27670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a[5] = 5
27680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, range(6))
27690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.extend(range(6, 20))
27700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, range(20))
27710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a[-5:] = []
27720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, range(15))
27730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del a[10:15]
27740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(a), 10)
27750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, range(10))
27760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(list(a), range(10))
27770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[0], 0)
27780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[9], 9)
27790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[-10], 0)
27800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[-1], 9)
27810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a[:5], range(5))
27820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class CountedInput(file):
27840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """Counts lines read by self.readline().
27850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.lineno is the 0-based ordinal of the last line read, up to
27870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            a maximum of one greater than the number of lines in the file.
27880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.ateof is true if and only if the final "" line has been read,
27900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            at which point self.lineno stops incrementing, and further calls
27910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            to readline() continue to return "".
27920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """
27930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
27940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            lineno = 0
27950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ateof = 0
27960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def readline(self):
27970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if self.ateof:
27980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return ""
27990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                s = file.readline(self)
28000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # Next line works too.
28010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # s = super(CountedInput, self).readline()
28020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.lineno += 1
28030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if s == "":
28040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.ateof = 1
28050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return s
28060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f = file(name=test_support.TESTFN, mode='w')
28080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        lines = ['a\n', 'b\n', 'c\n']
28090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
28100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            f.writelines(lines)
28110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            f.close()
28120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            f = CountedInput(test_support.TESTFN)
28130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
28140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                got = f.readline()
28150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(expected, got)
28160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(f.lineno, i)
28170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(f.ateof, (i > len(lines)))
28180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            f.close()
28190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        finally:
28200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
28210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                f.close()
28220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except:
28230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
28240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            test_support.unlink(test_support.TESTFN)
28250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_keywords(self):
28270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing keyword args to basic type constructors ...
28280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(int(x=1), 1)
28290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(float(x=2), 2.0)
28300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(long(x=3), 3L)
28310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(complex(imag=42, real=666), complex(666, 42))
28320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(object=500), '500')
28330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(unicode(string='abc', errors='strict'), u'abc')
28340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(tuple(sequence=range(3)), (0, 1, 2))
28350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(list(sequence=(0, 1, 2)), range(3))
28360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # note: as of Python 2.3, dict() no longer has an "items" keyword arg
28370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for constructor in (int, float, long, complex, str, unicode,
28390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            tuple, list, file):
28400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
28410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                constructor(bogus_keyword_arg=1)
28420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
28430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
28440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
28450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("expected TypeError from bogus keyword argument to %r"
28460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            % constructor)
28470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_str_subclass_as_dict_key(self):
28490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing a str subclass used as dict key ..
28500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class cistr(str):
28520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """Sublcass of str that computes __eq__ case-insensitively.
28530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Also computes a hash code of the string in canonical form.
28550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """
28560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, value):
28580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.canonical = value.lower()
28590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.hashcode = hash(self.canonical)
28600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __eq__(self, other):
28620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if not isinstance(other, cistr):
28630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    other = cistr(other)
28640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.canonical == other.canonical
28650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __hash__(self):
28670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.hashcode
28680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(cistr('ABC'), 'abc')
28700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('aBc', cistr('ABC'))
28710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(cistr('ABC')), 'ABC')
28720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
28740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d[cistr('one')], 1)
28750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d[cistr('tWo')], 2)
28760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d[cistr('THrEE')], 3)
28770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn(cistr('ONe'), d)
28780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.get(cistr('thrEE')), 3)
28790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_classic_comparisons(self):
28810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing classic comparisons...
28820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class classic:
28830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
28840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for base in (classic, int, object):
28860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(base):
28870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __init__(self, value):
28880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.value = int(value)
28890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __cmp__(self, other):
28900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, C):
28910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return cmp(self.value, other.value)
28920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, int) or isinstance(other, long):
28930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return cmp(self.value, other)
28940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return NotImplemented
28950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __hash__ = None # Silence Py3k warning
28960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
28970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c1 = C(1)
28980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c2 = C(2)
28990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c3 = C(3)
29000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(c1, 1)
29010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c = {1: c1, 2: c2, 3: c3}
29020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for x in 1, 2, 3:
29030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for y in 1, 2, 3:
29040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.assertTrue(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
29050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    for op in "<", "<=", "==", "!=", ">", ">=":
29060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
29070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                               "x=%d, y=%d" % (x, y))
29080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.assertTrue(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
29090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.assertTrue(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
29100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_rich_comparisons(self):
29120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing rich comparisons...
29130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Z(complex):
29140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
29150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        z = Z(1)
29160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(z, 1+0j)
29170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(1+0j, z)
29180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class ZZ(complex):
29190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __eq__(self, other):
29200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                try:
29210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return abs(self - other) <= 1e-6
29220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                except:
29230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return NotImplemented
29240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __hash__ = None # Silence Py3k warning
29250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        zz = ZZ(1.0000003)
29260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(zz, 1+0j)
29270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(1+0j, zz)
29280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class classic:
29300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
29310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for base in (classic, int, object, list):
29320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(base):
29330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __init__(self, value):
29340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.value = int(value)
29350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __cmp__(self_, other):
29360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.fail("shouldn't call __cmp__")
29370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __hash__ = None # Silence Py3k warning
29380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __eq__(self, other):
29390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, C):
29400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value == other.value
29410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, int) or isinstance(other, long):
29420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value == other
29430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return NotImplemented
29440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __ne__(self, other):
29450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, C):
29460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value != other.value
29470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, int) or isinstance(other, long):
29480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value != other
29490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return NotImplemented
29500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __lt__(self, other):
29510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, C):
29520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value < other.value
29530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, int) or isinstance(other, long):
29540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value < other
29550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return NotImplemented
29560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __le__(self, other):
29570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, C):
29580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value <= other.value
29590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, int) or isinstance(other, long):
29600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value <= other
29610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return NotImplemented
29620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __gt__(self, other):
29630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, C):
29640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value > other.value
29650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, int) or isinstance(other, long):
29660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value > other
29670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return NotImplemented
29680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __ge__(self, other):
29690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, C):
29700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value >= other.value
29710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if isinstance(other, int) or isinstance(other, long):
29720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        return self.value >= other
29730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return NotImplemented
29740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c1 = C(1)
29750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c2 = C(2)
29760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c3 = C(3)
29770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(c1, 1)
29780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            c = {1: c1, 2: c2, 3: c3}
29790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for x in 1, 2, 3:
29800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for y in 1, 2, 3:
29810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    for op in "<", "<=", "==", "!=", ">", ">=":
29820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        self.assertTrue(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
29830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                               "x=%d, y=%d" % (x, y))
29840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        self.assertTrue(eval("c[x] %s y" % op) == eval("x %s y" % op),
29850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                               "x=%d, y=%d" % (x, y))
29860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        self.assertTrue(eval("x %s c[y]" % op) == eval("x %s y" % op),
29870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                               "x=%d, y=%d" % (x, y))
29880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
29890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_coercions(self):
29900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing coercions...
29910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class I(int): pass
29920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(I(0), 0)
29930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0, I(0))
29940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class L(long): pass
29950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(L(0), 0)
29960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(L(0), 0L)
29970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0, L(0))
29980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0L, L(0))
29990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class F(float): pass
30000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(F(0), 0)
30010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(F(0), 0L)
30020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(F(0), 0.)
30030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0, F(0))
30040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0L, F(0))
30050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0., F(0))
30060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(complex): pass
30070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(C(0), 0)
30080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(C(0), 0L)
30090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(C(0), 0.)
30100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(C(0), 0j)
30110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0, C(0))
30120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0L, C(0))
30130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0., C(0))
30140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        coerce(0j, C(0))
30150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_descrdoc(self):
30170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing descriptor doc strings...
30180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def check(descr, what):
30190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(descr.__doc__, what)
30200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        check(file.closed, "True if the file is closed") # getset descriptor
30210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        check(file.name, "file name") # member descriptor
30220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_doc_descriptor(self):
30240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __doc__ descriptor...
30250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF bug 542984
30260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class DocDescr(object):
30270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __get__(self, object, otype):
30280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if object:
30290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    object = object.__class__.__name__ + ' instance'
30300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if otype:
30310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    otype = otype.__name__
30320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 'object=%s; type=%s' % (object, otype)
30330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class OldClass:
30340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __doc__ = DocDescr()
30350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class NewClass(object):
30360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __doc__ = DocDescr()
30370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(OldClass.__doc__, 'object=None; type=OldClass')
30380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
30390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NewClass.__doc__, 'object=None; type=NewClass')
30400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
30410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_class(self):
30430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __class__ assignment...
30440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object): pass
30450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(object): pass
30460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(object): pass
30470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class F(D, E): pass
30480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for cls in C, D, E, F:
30490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for cls2 in C, D, E, F:
30500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                x = cls()
30510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                x.__class__ = cls2
30520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertTrue(x.__class__ is cls2)
30530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                x.__class__ = cls
30540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertTrue(x.__class__ is cls)
30550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def cant(x, C):
30560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
30570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                x.__class__ = C
30580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
30590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
30600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
30610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("shouldn't allow %r.__class__ = %r" % (x, C))
30620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
30630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                delattr(x, "__class__")
30640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except (TypeError, AttributeError):
30650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
30660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
30670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("shouldn't allow del %r.__class__" % x)
30680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(C(), list)
30690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(list(), C)
30700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(C(), 1)
30710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(C(), object)
30720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(object(), list)
30730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(list(), object)
30740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Int(int): __slots__ = []
30750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(2, Int)
30760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(Int(), int)
30770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(True, int)
30780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(2, bool)
30790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        o = object()
30800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(o, type(1))
30810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(o, type(None))
30820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del o
30830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class G(object):
30840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["a", "b"]
30850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class H(object):
30860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["b", "a"]
30870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
30880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            unicode
30890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except NameError:
30900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class I(object):
30910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = ["a", "b"]
30920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
30930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class I(object):
30940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = [unicode("a"), unicode("b")]
30950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class J(object):
30960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["c", "b"]
30970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class K(object):
30980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["a", "b", "d"]
30990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class L(H):
31000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["e"]
31010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M(I):
31020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["e"]
31030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class N(J):
31040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["__weakref__"]
31050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class P(J):
31060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["__dict__"]
31070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Q(J):
31080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
31090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class R(J):
31100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ["__dict__", "__weakref__"]
31110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
31130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = cls()
31140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.a = 1
31150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.__class__ = cls2
31160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(x.__class__ is cls2,
31170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                   "assigning %r as __class__ for %r silently failed" % (cls2, x))
31180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(x.a, 1)
31190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.__class__ = cls
31200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(x.__class__ is cls,
31210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                   "assigning %r as __class__ for %r silently failed" % (cls, x))
31220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(x.a, 1)
31230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for cls in G, J, K, L, M, N, P, R, list, Int:
31240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for cls2 in G, J, K, L, M, N, P, R, list, Int:
31250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if cls is cls2:
31260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    continue
31270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                cant(cls(), cls2)
31280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Issue5283: when __class__ changes in __del__, the wrong
31300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # type gets DECREF'd.
31310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class O(object):
31320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
31330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
31340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __del__(self):
31350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__class__ = O
31360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l = [A() for x in range(100)]
31370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del l
31380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_dict(self):
31400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __dict__ assignment...
31410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object): pass
31420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
31430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.__dict__ = {'b': 1}
31440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.b, 1)
31450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def cant(x, dict):
31460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
31470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                x.__dict__ = dict
31480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except (AttributeError, TypeError):
31490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
31500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
31510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("shouldn't allow %r.__dict__ = %r" % (x, dict))
31520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(a, None)
31530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(a, [])
31540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        cant(a, 1)
31550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del a.__dict__ # Deleting __dict__ is allowed
31560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Base(object):
31580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
31590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def verify_dict_readonly(x):
31600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """
31610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x has to be an instance of a class inheriting from Base.
31620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            """
31630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cant(x, {})
31640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
31650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del x.__dict__
31660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except (AttributeError, TypeError):
31670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
31680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
31690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("shouldn't allow del %r.__dict__" % x)
31700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            dict_descr = Base.__dict__["__dict__"]
31710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
31720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                dict_descr.__set__(x, {})
31730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except (AttributeError, TypeError):
31740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
31750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
31760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("dict_descr allowed access to %r's dict" % x)
31770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Classes don't allow __dict__ assignment and have readonly dicts
31790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Meta1(type, Base):
31800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
31810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Meta2(Base, type):
31820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
31830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(object):
31840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = Meta1
31850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(object):
31860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = Meta2
31870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for cls in C, D, E:
31880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            verify_dict_readonly(cls)
31890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class_dict = cls.__dict__
31900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
31910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                class_dict["spam"] = "eggs"
31920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
31930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
31940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
31950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("%r's __dict__ can be modified" % cls)
31960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
31970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Modules also disallow __dict__ assignment
31980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Module1(types.ModuleType, Base):
31990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
32000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Module2(Base, types.ModuleType):
32010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
32020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for ModuleType in Module1, Module2:
32030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            mod = ModuleType("spam")
32040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            verify_dict_readonly(mod)
32050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            mod.__dict__["spam"] = "eggs"
32060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Exception's __dict__ can be replaced, but not deleted
32080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # (at least not any more than regular exception's __dict__ can
32090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # be deleted; on CPython it is not the case, whereas on PyPy they
32100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # can, just like any other new-style instance's __dict__.)
32110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def can_delete_dict(e):
32120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
32130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del e.__dict__
32140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except (TypeError, AttributeError):
32150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return False
32160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
32170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return True
32180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Exception1(Exception, Base):
32190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
32200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Exception2(Base, Exception):
32210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
32220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for ExceptionType in Exception, Exception1, Exception2:
32230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            e = ExceptionType()
32240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            e.__dict__ = {"a": 1}
32250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(e.a, 1)
32260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(can_delete_dict(e), can_delete_dict(ValueError()))
32270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_pickles(self):
32290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing pickling and copying new-style classes and objects...
32300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle, cPickle
32310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def sorteditems(d):
32330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            L = d.items()
32340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            L.sort()
32350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return L
32360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        global C
32380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
32390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, a, b):
32400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                super(C, self).__init__()
32410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.a = a
32420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.b = b
32430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
32440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C(%r, %r)" % (self.a, self.b)
32450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        global C1
32470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C1(list):
32480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(cls, a, b):
32490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return super(C1, cls).__new__(cls)
32500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getnewargs__(self):
32510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return (self.a, self.b)
32520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, a, b):
32530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.a = a
32540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.b = b
32550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
32560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
32570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        global C2
32590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C2(int):
32600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(cls, a, b, val=0):
32610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return super(C2, cls).__new__(cls, val)
32620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getnewargs__(self):
32630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return (self.a, self.b, int(self))
32640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, a, b, val=0):
32650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.a = a
32660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.b = b
32670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
32680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
32690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        global C3
32710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C3(object):
32720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, foo):
32730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.foo = foo
32740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getstate__(self):
32750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.foo
32760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __setstate__(self, foo):
32770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.foo = foo
32780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        global C4classic, C4
32800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C4classic: # classic
32810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
32820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C4(C4classic, object): # mixed inheritance
32830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
32840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for p in pickle, cPickle:
32860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for bin in 0, 1:
32870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for cls in C, C1, C2:
32880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    s = p.dumps(cls, bin)
32890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    cls2 = p.loads(s)
32900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.assertTrue(cls2 is cls)
32910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
32920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                a = C1(1, 2); a.append(42); a.append(24)
32930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                b = C2("hello", "world", 42)
32940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                s = p.dumps((a, b), bin)
32950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                x, y = p.loads(s)
32960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(x.__class__, a.__class__)
32970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
32980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(y.__class__, b.__class__)
32990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
33000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(repr(x), repr(a))
33010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(repr(y), repr(b))
33020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # Test for __getstate__ and __setstate__ on new style class
33030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                u = C3(42)
33040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                s = p.dumps(u, bin)
33050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = p.loads(s)
33060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(u.__class__, v.__class__)
33070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(u.foo, v.foo)
33080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # Test for picklability of hybrid class
33090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                u = C4()
33100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                u.foo = 42
33110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                s = p.dumps(u, bin)
33120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                v = p.loads(s)
33130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(u.__class__, v.__class__)
33140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(u.foo, v.foo)
33150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing copy.deepcopy()
33170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import copy
33180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for cls in C, C1, C2:
33190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            cls2 = copy.deepcopy(cls)
33200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(cls2 is cls)
33210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C1(1, 2); a.append(42); a.append(24)
33230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        b = C2("hello", "world", 42)
33240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x, y = copy.deepcopy((a, b))
33250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.__class__, a.__class__)
33260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(sorteditems(x.__dict__), sorteditems(a.__dict__))
33270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(y.__class__, b.__class__)
33280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(sorteditems(y.__dict__), sorteditems(b.__dict__))
33290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(x), repr(a))
33300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(y), repr(b))
33310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
33320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_pickle_slots(self):
33330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing pickling of classes with __slots__ ...
33340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import pickle, cPickle
33350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Pickling of classes with __slots__ but without __getstate__ should fail
33360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        global B, C, D, E
33370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object):
33380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
33390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for base in [object, B]:
33400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(base):
33410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = ['a']
33420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class D(C):
33430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
33440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
33450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pickle.dumps(C())
33460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
33470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
33480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
33490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("should fail: pickle C instance - %s" % base)
33500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
33510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                cPickle.dumps(C())
33520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
33530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
33540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
33550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("should fail: cPickle C instance - %s" % base)
33560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
33570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pickle.dumps(C())
33580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
33590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
33600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
33610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("should fail: pickle D instance - %s" % base)
33620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
33630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                cPickle.dumps(D())
33640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
33650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
33660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
33670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("should fail: cPickle D instance - %s" % base)
33680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Give C a nice generic __getstate__ and __setstate__
33690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class C(base):
33700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = ['a']
33710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __getstate__(self):
33720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    try:
33730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        d = self.__dict__.copy()
33740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    except AttributeError:
33750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        d = {}
33760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    for cls in self.__class__.__mro__:
33770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        for sn in cls.__dict__.get('__slots__', ()):
33780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            try:
33790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                d[sn] = getattr(self, sn)
33800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                            except AttributeError:
33810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                pass
33820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return d
33830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def __setstate__(self, d):
33840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    for k, v in d.items():
33850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        setattr(self, k, v)
33860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class D(C):
33870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
33880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Now it should work
33890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = C()
33900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            y = pickle.loads(pickle.dumps(x))
33910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(hasattr(y, 'a'), 0)
33920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            y = cPickle.loads(cPickle.dumps(x))
33930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(hasattr(y, 'a'), 0)
33940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.a = 42
33950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            y = pickle.loads(pickle.dumps(x))
33960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(y.a, 42)
33970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            y = cPickle.loads(cPickle.dumps(x))
33980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(y.a, 42)
33990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = D()
34000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.a = 42
34010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.b = 100
34020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            y = pickle.loads(pickle.dumps(x))
34030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(y.a + y.b, 142)
34040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            y = cPickle.loads(cPickle.dumps(x))
34050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(y.a + y.b, 142)
34060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # A subclass that adds a slot should also work
34070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            class E(C):
34080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                __slots__ = ['b']
34090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x = E()
34100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.a = 42
34110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            x.b = "foo"
34120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            y = pickle.loads(pickle.dumps(x))
34130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(y.a, x.a)
34140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(y.b, x.b)
34150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            y = cPickle.loads(cPickle.dumps(x))
34160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(y.a, x.a)
34170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(y.b, x.b)
34180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_binary_operator_override(self):
34200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing overrides of binary operations...
34210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class I(int):
34220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
34230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "I(%r)" % int(self)
34240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __add__(self, other):
34250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return I(int(self) + int(other))
34260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __radd__ = __add__
34270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __pow__(self, other, mod=None):
34280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if mod is None:
34290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return I(pow(int(self), int(other)))
34300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
34310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return I(pow(int(self), int(other), int(mod)))
34320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __rpow__(self, other, mod=None):
34330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if mod is None:
34340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return I(pow(int(other), int(self), mod))
34350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
34360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return I(pow(int(other), int(self), int(mod)))
34370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(I(1) + I(2)), "I(3)")
34390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(I(1) + 2), "I(3)")
34400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(1 + I(2)), "I(3)")
34410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(I(2) ** I(3)), "I(8)")
34420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(2 ** I(3)), "I(8)")
34430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(I(2) ** 3), "I(8)")
34440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(pow(I(2), I(3), I(5))), "I(3)")
34450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class S(str):
34460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __eq__(self, other):
34470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.lower() == other.lower()
34480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __hash__ = None # Silence Py3k warning
34490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
34500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subclass_propagation(self):
34510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing propagation of slot functions to subclasses...
34520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
34530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
34540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A):
34550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
34560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A):
34570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
34580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(B, C):
34590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
34600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
34610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        orig_hash = hash(d) # related to id(d) in platform-dependent ways
34620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        A.__hash__ = lambda self: 42
34630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(d), 42)
34640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__hash__ = lambda self: 314
34650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(d), 314)
34660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        B.__hash__ = lambda self: 144
34670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(d), 144)
34680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D.__hash__ = lambda self: 100
34690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(d), 100)
34700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D.__hash__ = None
34710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, hash, d)
34720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del D.__hash__
34730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(d), 144)
34740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        B.__hash__ = None
34750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, hash, d)
34760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del B.__hash__
34770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(d), 314)
34780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__hash__ = None
34790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, hash, d)
34800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del C.__hash__
34810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(d), 42)
34820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        A.__hash__ = None
34830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, hash, d)
34840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del A.__hash__
34850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(d), orig_hash)
34860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d.foo = 42
34870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d.bar = 42
34880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, 42)
34890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.bar, 42)
34900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __getattribute__(self, name):
34910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if name == "foo":
34920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 24
34930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return object.__getattribute__(self, name)
34940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        A.__getattribute__ = __getattribute__
34950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, 24)
34960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.bar, 42)
34970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def __getattr__(self, name):
34980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if name in ("spam", "foo", "bar"):
34990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "hello"
35000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            raise AttributeError, name
35010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        B.__getattr__ = __getattr__
35020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.spam, "hello")
35030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, 24)
35040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.bar, 42)
35050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del A.__getattribute__
35060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, 42)
35070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del d.foo
35080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, "hello")
35090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.bar, 42)
35100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del B.__getattr__
35110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
35120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            d.foo
35130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except AttributeError:
35140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
35150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
35160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("d.foo should be undefined now")
35170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test a nasty bug in recurse_down_subclasses()
35190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
35200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
35210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(A):
35220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
35230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del B
35240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
35250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        A.__setitem__ = lambda *a: None # crash
35260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_buffer_inheritance(self):
35280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing that buffer interface is inherited ...
35290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import binascii
35310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF bug [#470040] ParseTuple t# vs subclasses.
35320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class MyStr(str):
35340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
35350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        base = 'abc'
35360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = MyStr(base)
35370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # b2a_hex uses the buffer interface to get its argument's value, via
35380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # PyArg_ParseTuple 't#' code.
35390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
35400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # It's not clear that unicode will continue to support the character
35420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # buffer interface, and this test will fail if that's taken away.
35430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class MyUni(unicode):
35440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
35450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        base = u'abc'
35460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = MyUni(base)
35470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(binascii.b2a_hex(m), binascii.b2a_hex(base))
35480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class MyInt(int):
35500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
35510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = MyInt(42)
35520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
35530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            binascii.b2a_hex(m)
35540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail('subclass of int should not have a buffer interface')
35550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
35560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
35570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_str_of_str_subclass(self):
35590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __str__ defined in subclass of str ...
35600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import binascii
35610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import cStringIO
35620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class octetstring(str):
35640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __str__(self):
35650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return binascii.b2a_hex(self)
35660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __repr__(self):
35670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self + " repr"
35680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        o = octetstring('A')
35700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(o), octetstring)
35710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(str(o)), str)
35720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(repr(o)), str)
35730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(ord(o), 0x41)
35740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str(o), '41')
35750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(repr(o), 'A repr')
35760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(o.__str__(), '41')
35770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(o.__repr__(), 'A repr')
35780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        capture = cStringIO.StringIO()
35800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Calling str() or not exercises different internal paths.
35810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        print >> capture, o
35820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        print >> capture, str(o)
35830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(capture.getvalue(), '41\n41\n')
35840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        capture.close()
35850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_keyword_arguments(self):
35870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing keyword arguments to __init__, __call__...
35880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def f(a): return a
35890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(f.__call__(a=42), 42)
35900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = []
35910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        list.__init__(a, sequence=[0, 1, 2])
35920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, [0, 1, 2])
35930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_recursive_call(self):
35950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing recursive __call__() by setting to instance of class...
35960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
35970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
35980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
35990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        A.__call__ = A()
36000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
36010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            A()()
36020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except RuntimeError:
36030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
36040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
36050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("Recursion limit should have been reached for __call__()")
36060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_delete_hook(self):
36080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __del__ hook...
36090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        log = []
36100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
36110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __del__(self):
36120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                log.append(1)
36130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
36140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(log, [])
36150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del c
36160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
36170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(log, [1])
36180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(object): pass
36200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
36210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: del d[0]
36220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError: pass
36230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("invalid del() didn't raise TypeError")
36240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_hash_inheritance(self):
36260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing hash of mutable subclasses...
36270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class mydict(dict):
36290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
36300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = mydict()
36310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
36320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            hash(d)
36330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
36340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
36350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
36360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("hash() of dict subclass should fail")
36370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class mylist(list):
36390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
36400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = mylist()
36410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
36420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            hash(d)
36430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
36440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
36450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
36460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("hash() of list subclass should fail")
36470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_str_operations(self):
36490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: 'a' + 5
36500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError: pass
36510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("'' + 5 doesn't raise TypeError")
36520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: ''.split('')
36540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ValueError: pass
36550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("''.split('') doesn't raise ValueError")
36560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: ''.join([0])
36580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError: pass
36590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("''.join([0]) doesn't raise TypeError")
36600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: ''.rindex('5')
36620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ValueError: pass
36630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("''.rindex('5') doesn't raise ValueError")
36640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: '%(n)s' % None
36660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError: pass
36670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("'%(n)s' % None doesn't raise TypeError")
36680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: '%(n' % {}
36700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ValueError: pass
36710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("'%(n' % {} '' doesn't raise ValueError")
36720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: '%*s' % ('abc')
36740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError: pass
36750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("'%*s' % ('abc') doesn't raise TypeError")
36760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: '%*.*s' % ('abc', 5)
36780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError: pass
36790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("'%*.*s' % ('abc', 5) doesn't raise TypeError")
36800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: '%s' % (1, 2)
36820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError: pass
36830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("'%s' % (1, 2) doesn't raise TypeError")
36840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try: '%' % None
36860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except ValueError: pass
36870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else: self.fail("'%' % None doesn't raise ValueError")
36880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('534253'.isdigit(), 1)
36900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('534253x'.isdigit(), 0)
36910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('%c' % 5, '\x05')
36920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual('%c' % '5', '5')
36930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
36940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_deepcopy_recursive(self):
36950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing deepcopy of recursive objects...
36960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Node:
36970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
36980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = Node()
36990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        b = Node()
37000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.b = b
37010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        b.a = a
37020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        z = deepcopy(a) # This blew up before
37030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_unintialized_modules(self):
37050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing uninitialized module objects...
37060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        from types import ModuleType as M
37070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m = M.__new__(M)
37080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        str(m)
37090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hasattr(m, "__name__"), 0)
37100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hasattr(m, "__file__"), 0)
37110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hasattr(m, "foo"), 0)
37120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertFalse(m.__dict__)   # None or {} are both reasonable answers
37130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        m.foo = 1
37140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(m.__dict__, {"foo": 1})
37150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_funny_new(self):
37170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __new__ returning something unexpected...
37180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
37190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(cls, arg):
37200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if isinstance(arg, str): return [1, 2, 3]
37210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                elif isinstance(arg, int): return object.__new__(D)
37220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else: return object.__new__(cls)
37230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
37240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, arg):
37250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.foo = arg
37260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C("1"), [1, 2, 3])
37270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D("1"), [1, 2, 3])
37280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D(None)
37290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, None)
37300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = C(1)
37310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(isinstance(d, D), True)
37320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, 1)
37330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D(1)
37340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(isinstance(d, D), True)
37350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.foo, 1)
37360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_imul_bug(self):
37380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing for __imul__ problems...
37390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF bug 544647
37400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
37410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __imul__(self, other):
37420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return (self, other)
37430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = C()
37440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y = x
37450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y *= 1.0
37460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(y, (x, 1.0))
37470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y = x
37480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y *= 2
37490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(y, (x, 2))
37500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y = x
37510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y *= 3L
37520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(y, (x, 3L))
37530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y = x
37540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y *= 1L<<100
37550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(y, (x, 1L<<100))
37560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y = x
37570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y *= None
37580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(y, (x, None))
37590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y = x
37600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        y *= "foo"
37610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(y, (x, "foo"))
37620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_copy_setstate(self):
37640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing that copy.*copy() correctly uses __setstate__...
37650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import copy
37660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
37670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, foo=None):
37680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.foo = foo
37690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__foo = foo
37700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def setfoo(self, foo=None):
37710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.foo = foo
37720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def getfoo(self):
37730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return self.__foo
37740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getstate__(self):
37750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return [self.foo]
37760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __setstate__(self_, lst):
37770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(len(lst), 1)
37780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self_.__foo = self_.foo = lst[0]
37790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C(42)
37800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.setfoo(24)
37810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.foo, 24)
37820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a.getfoo(), 42)
37830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        b = copy.copy(a)
37840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(b.foo, 24)
37850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(b.getfoo(), 24)
37860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        b = copy.deepcopy(a)
37870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(b.foo, 24)
37880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(b.getfoo(), 24)
37890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_slices(self):
37910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing cases with slices and overridden __getitem__ ...
37920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
37930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Strings
37940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual("hello"[:4], "hell")
37950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual("hello"[slice(4)], "hell")
37960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(str.__getitem__("hello", slice(4)), "hell")
37970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class S(str):
37980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, x):
37990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return str.__getitem__(self, x)
38000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(S("hello")[:4], "hell")
38010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(S("hello")[slice(4)], "hell")
38020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(S("hello").__getitem__(slice(4)), "hell")
38030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Tuples
38040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((1,2,3)[:2], (1,2))
38050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((1,2,3)[slice(2)], (1,2))
38060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(tuple.__getitem__((1,2,3), slice(2)), (1,2))
38070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class T(tuple):
38080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, x):
38090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return tuple.__getitem__(self, x)
38100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(T((1,2,3))[:2], (1,2))
38110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(T((1,2,3))[slice(2)], (1,2))
38120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(T((1,2,3)).__getitem__(slice(2)), (1,2))
38130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Lists
38140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual([1,2,3][:2], [1,2])
38150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual([1,2,3][slice(2)], [1,2])
38160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(list.__getitem__([1,2,3], slice(2)), [1,2])
38170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class L(list):
38180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getitem__(self, x):
38190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return list.__getitem__(self, x)
38200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(L([1,2,3])[:2], [1,2])
38210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(L([1,2,3])[slice(2)], [1,2])
38220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(L([1,2,3]).__getitem__(slice(2)), [1,2])
38230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Now do lists and __setitem__
38240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = L([1,2,3])
38250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a[slice(1, 3)] = [3,2]
38260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, [1,3,2])
38270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a[slice(0, 2, 1)] = [3,1]
38280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, [3,1,2])
38290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.__setitem__(slice(1, 3), [2,1])
38300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, [3,2,1])
38310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a.__setitem__(slice(0, 2, 1), [2,3])
38320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a, [2,3,1])
38330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subtype_resurrection(self):
38350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing resurrection of new-style instance...
38360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
38380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            container = []
38390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __del__(self):
38410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # resurrect the instance
38420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                C.container.append(self)
38430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
38450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c.attr = 42
38460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # The most interesting thing here is whether this blows up, due to
38480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # flawed GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1
38490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # bug).
38500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del c
38510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # If that didn't blow up, it's also interesting to see whether clearing
38530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # the last container slot works: that will attempt to delete c again,
38540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # which will cause c to get appended back to the container again
38550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # "during" the del.  (On non-CPython implementations, however, __del__
38560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # is typically not called again.)
38570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
38580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(C.container), 1)
38590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del C.container[-1]
38600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if test_support.check_impl_detail():
38610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            test_support.gc_collect()
38620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(len(C.container), 1)
38630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(C.container[-1].attr, 42)
38640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Make c mortal again, so that the test framework with -l doesn't report
38660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # it as a leak.
38670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del C.__del__
38680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_slots_trash(self):
38700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing slot trash...
38710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Deallocating deeply nested slotted trash caused stack overflows
38720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class trash(object):
38730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__ = ['x']
38740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, x):
38750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.x = x
38760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        o = None
38770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in xrange(50000):
38780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            o = trash(o)
38790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del o
38800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_slots_multiple_inheritance(self):
38820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF bug 575229, multiple inheritance w/ slots dumps core
38830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
38840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__=()
38850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object):
38860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
38870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A,B) :
38880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __slots__=()
38890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if test_support.check_impl_detail():
38900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(C.__basicsize__, B.__basicsize__)
38910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(C, '__dict__'))
38920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(hasattr(C, '__weakref__'))
38930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C().x = 2
38940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
38950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_rmul(self):
38960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing correct invocation of __rmul__...
38970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF patch 592646
38980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
38990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __mul__(self, other):
39000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "mul"
39010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __rmul__(self, other):
39020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "rmul"
39030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
39040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a*2, "mul")
39050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(a*2.2, "mul")
39060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(2*a, "rmul")
39070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(2.2*a, "rmul")
39080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_ipow(self):
39100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing correct invocation of __ipow__...
39110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # [SF bug 620179]
39120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
39130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __ipow__(self, other):
39140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
39150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
39160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a **= 2
39170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_mutable_bases(self):
39190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing mutable bases...
39200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # stuff that should work:
39220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
39230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
39240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C2(object):
39250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattribute__(self, attr):
39260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if attr == 'a':
39270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return 2
39280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
39290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return super(C2, self).__getattribute__(attr)
39300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self):
39310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 1
39320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
39330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
39340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(D):
39350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
39360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        d = D()
39370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        e = E()
39380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D.__bases__ = (C,)
39390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D.__bases__ = (C2,)
39400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.meth(), 1)
39410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e.meth(), 1)
39420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.a, 2)
39430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e.a, 2)
39440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C2.__subclasses__(), [D])
39450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
39470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            del D.__bases__
39480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except (TypeError, AttributeError):
39490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
39500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
39510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't be able to delete .__bases__")
39520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
39540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            D.__bases__ = ()
39550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError, msg:
39560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if str(msg) == "a new-style class can't have only classic bases":
39570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("wrong error message for .__bases__ = ()")
39580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
39590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't be able to set .__bases__ to ()")
39600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
39620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            D.__bases__ = (D,)
39630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
39640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
39650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
39660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # actually, we'll have crashed by here...
39670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't be able to create inheritance cycles")
39680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
39700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            D.__bases__ = (C, C)
39710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
39720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
39730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
39740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("didn't detect repeated base classes")
39750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
39770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            D.__bases__ = (E,)
39780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
39790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
39800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
39810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't be able to create inheritance cycles")
39820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # let's throw a classic class into the mix:
39840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Classic:
39850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth2(self):
39860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 3
39870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D.__bases__ = (C, Classic)
39890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(d.meth2(), 3)
39910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(e.meth2(), 3)
39920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
39930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            d.a
39940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except AttributeError:
39950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
39960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
39970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("attribute should have vanished")
39980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
39990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
40000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            D.__bases__ = (Classic,)
40010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
40020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
40040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("new-style class must have a new-style base")
40050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_builtin_bases(self):
40070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Make sure all the builtin types can have their base queried without
40080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # segfaulting. See issue #5787.
40090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        builtin_types = [tp for tp in __builtin__.__dict__.itervalues()
40100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                         if isinstance(tp, type)]
40110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for tp in builtin_types:
40120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            object.__getattribute__(tp, "__bases__")
40130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if tp is not object:
40140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.assertEqual(len(tp.__bases__), 1, tp)
40150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class L(list):
40170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
40200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
40230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
40260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            L.__bases__ = (dict,)
40270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
40280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
40300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't turn list subclass into dict subclass")
40310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
40330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            list.__bases__ = (dict,)
40340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
40350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
40370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't be able to assign to list.__bases__")
40380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
40400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            D.__bases__ = (C, list)
40410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
40420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
40440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            assert 0, "best_base calculation found wanting"
40450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_mutable_bases_with_failing_mro(self):
40480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing mutable bases with failing mro...
40490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class WorkOnce(type):
40500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __new__(self, name, bases, ns):
40510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.flag = 0
40520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
40530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def mro(self):
40540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if self.flag > 0:
40550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    raise RuntimeError, "bozo"
40560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
40570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.flag += 1
40580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return type.mro(self)
40590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class WorkAlways(type):
40610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def mro(self):
40620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # this is here to make sure that .mro()s aren't called
40630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # with an exception set (which was possible at one point).
40640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # An error message will be printed in a debug build.
40650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                # What's a good way to test for this?
40660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return type.mro(self)
40670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
40690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C2(object):
40720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
40750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(D):
40780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
40790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class F(D):
40810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = WorkOnce
40820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class G(D):
40840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = WorkAlways
40850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Immediate subclasses have their mro's adjusted in alphabetical
40870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # order, so E's will get adjusted before adjusting F's fails.  We
40880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # check here that E's gets restored.
40890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        E_mro_before = E.__mro__
40910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        D_mro_before = D.__mro__
40920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
40930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
40940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            D.__bases__ = (C2,)
40950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except RuntimeError:
40960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(E.__mro__, E_mro_before)
40970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertEqual(D.__mro__, D_mro_before)
40980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
40990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("exception not propagated")
41000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_mutable_bases_catch_mro_conflict(self):
41020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing mutable bases catch mro conflict...
41030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
41040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object):
41070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(A, B):
41100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(A, B):
41130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(C, D):
41160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
41190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            C.__bases__ = (B, A)
41200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
41210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
41230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("didn't catch MRO conflict")
41240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_mutable_names(self):
41260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing mutable names...
41270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
41280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # C.__module__ could be 'test_descr' or '__main__'
41310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        mod = C.__module__
41320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__name__ = 'D'
41340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((C.__module__, C.__name__), (mod, 'D'))
41350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__name__ = 'D.E'
41370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual((C.__module__, C.__name__), (mod, 'D.E'))
41380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_evil_type_name(self):
41400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # A badly placed Py_DECREF in type_set_name led to arbitrary code
41410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # execution while the type structure was not in a sane state, and a
41420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # possible segmentation fault as a result.  See bug #16447.
41430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Nasty(str):
41440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __del__(self):
41450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                C.__name__ = "other"
41460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
41480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__name__ = Nasty("abc")
41510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        C.__name__ = "normal"
41520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_subclass_right_op(self):
41540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing correct dispatch of subclass overloading __r<op>__...
41550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # This code tests various cases where right-dispatch of a subclass
41570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # should be preferred over left-dispatch of a base class.
41580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
41600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(int):
41620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __floordiv__(self, other):
41630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "B.__floordiv__"
41640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __rfloordiv__(self, other):
41650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "B.__rfloordiv__"
41660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(B(1) // 1, "B.__floordiv__")
41680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(1 // B(1), "B.__rfloordiv__")
41690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Case 2: subclass of object; this is just the baseline for case 3
41710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
41730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __floordiv__(self, other):
41740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C.__floordiv__"
41750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __rfloordiv__(self, other):
41760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "C.__rfloordiv__"
41770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C() // 1, "C.__floordiv__")
41790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(1 // C(), "C.__rfloordiv__")
41800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Case 3: subclass of new-style class; here it gets interesting
41820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
41840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __floordiv__(self, other):
41850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "D.__floordiv__"
41860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __rfloordiv__(self, other):
41870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "D.__rfloordiv__"
41880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(D() // C(), "D.__floordiv__")
41900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C() // D(), "D.__rfloordiv__")
41910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Case 4: this didn't work right in 2.2.2 and 2.3a1
41930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class E(C):
41950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
41960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E.__rfloordiv__, C.__rfloordiv__)
41980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
41990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E() // 1, "C.__floordiv__")
42000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(1 // E(), "C.__rfloordiv__")
42010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(E() // C(), "C.__floordiv__")
42020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C() // E(), "C.__floordiv__") # This one would fail
42030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    @test_support.impl_detail("testing an internal kind of method object")
42050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_meth_class_get(self):
42060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing __get__ method of METH_CLASS C methods...
42070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Full coverage of descrobject.c::classmethod_get()
42080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Baseline
42100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        arg = [1, 2, 3]
42110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        res = {1: None, 2: None, 3: None}
42120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(dict.fromkeys(arg), res)
42130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual({}.fromkeys(arg), res)
42140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Now get the descriptor
42160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        descr = dict.__dict__["fromkeys"]
42170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # More baseline using the descriptor directly
42190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(descr.__get__(None, dict)(arg), res)
42200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(descr.__get__({})(arg), res)
42210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Now check various error cases
42230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
42240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            descr.__get__(None, None)
42250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
42260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
42270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
42280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't have allowed descr.__get__(None, None)")
42290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
42300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            descr.__get__(42)
42310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
42320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
42330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
42340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't have allowed descr.__get__(42)")
42350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
42360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            descr.__get__(None, 42)
42370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
42380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
42390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
42400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't have allowed descr.__get__(None, 42)")
42410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
42420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            descr.__get__(None, int)
42430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
42440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
42450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
42460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("shouldn't have allowed descr.__get__(None, int)")
42470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_isinst_isclass(self):
42490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing proxy isinstance() and isclass()...
42500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Proxy(object):
42510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, obj):
42520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__obj = obj
42530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattribute__(self, name):
42540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if name.startswith("_Proxy__"):
42550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return object.__getattribute__(self, name)
42560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
42570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return getattr(self.__obj, name)
42580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test with a classic class
42590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
42600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
42610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
42620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pa = Proxy(a)
42630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(a, C)  # Baseline
42640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(pa, C) # Test
42650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test with a classic subclass
42660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
42670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
42680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = D()
42690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pa = Proxy(a)
42700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(a, C)  # Baseline
42710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(pa, C) # Test
42720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test with a new-style class
42730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
42740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
42750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = C()
42760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pa = Proxy(a)
42770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(a, C)  # Baseline
42780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(pa, C) # Test
42790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Test with a new-style subclass
42800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class D(C):
42810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
42820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        a = D()
42830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        pa = Proxy(a)
42840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(a, C)  # Baseline
42850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsInstance(pa, C) # Test
42860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_proxy_super(self):
42880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing super() for a proxy object...
42890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Proxy(object):
42900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, obj):
42910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__obj = obj
42920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattribute__(self, name):
42930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if name.startswith("_Proxy__"):
42940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return object.__getattribute__(self, name)
42950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
42960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    return getattr(self.__obj, name)
42970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
42980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object):
42990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def f(self):
43000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return "B.f"
43010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(B):
43030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def f(self):
43040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return super(C, self).f() + "->C.f"
43050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        obj = C()
43070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        p = Proxy(obj)
43080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(C.__dict__["f"](p), "B.f->C.f")
43090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_carloverre(self):
43110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing prohibition of Carlo Verre's hack...
43120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
43130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            object.__setattr__(str, "foo", 42)
43140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
43150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
43160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
43170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("Carlo Verre __setattr__ succeeded!")
43180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
43190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            object.__delattr__(str, "lower")
43200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
43210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
43220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
43230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("Carlo Verre __delattr__ succeeded!")
43240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_weakref_segfault(self):
43260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing weakref segfault...
43270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF 742911
43280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import weakref
43290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Provoker:
43310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, referrent):
43320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.ref = weakref.ref(referrent)
43330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __del__(self):
43350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                x = self.ref()
43360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Oops(object):
43380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
43390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        o = Oops()
43410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        o.whatever = Provoker(o)
43420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del o
43430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_wrapper_segfault(self):
43450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF 927248: deeply nested wrappers could cause stack overflow
43460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f = lambda:None
43470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for i in xrange(1000000):
43480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            f = f.__call__
43490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        f = None
43500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_file_fault(self):
43520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing sys.stdout is changed in getattr...
43530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_stdout = sys.stdout
43540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class StdoutGuard:
43550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattr__(self, attr):
43560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                sys.stdout = sys.__stdout__
43570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise RuntimeError("Premature access to sys.stdout.%s" % attr)
43580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        sys.stdout = StdoutGuard()
43590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
43600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            print "Oops!"
43610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except RuntimeError:
43620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
43630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        finally:
43640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            sys.stdout = test_stdout
43650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_vicious_descriptor_nonsense(self):
43670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing vicious_descriptor_nonsense...
43680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # A potential segfault spotted by Thomas Wouters in mail to
43700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # python-dev 2003-04-17, turned into an example & fixed by Michael
43710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Hudson just less than four months later...
43720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Evil(object):
43740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __hash__(self):
43750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return hash('attr')
43760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __eq__(self, other):
43770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del C.attr
43780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 0
43790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Descr(object):
43810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __get__(self, ob, type=None):
43820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 1
43830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
43850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            attr = Descr()
43860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
43880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c.__dict__[Evil()] = 0
43890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.attr, 1)
43910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # this makes a crash more likely:
43920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
43930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hasattr(c, 'attr'), False)
43940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
43950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_init(self):
43960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # SF 1155938
43970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Foo(object):
43980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
43990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return 10
44000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
44010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            Foo()
44020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
44030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
44040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
44050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("did not test __init__() for None return")
44060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_method_wrapper(self):
44080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing method-wrapper objects...
44090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # <type 'method-wrapper'> did not support any reflection before 2.5
44100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        l = []
44120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l.__add__, l.__add__)
44130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l.__add__, [].__add__)
44140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(l.__add__ != [5].__add__)
44150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(l.__add__ != l.__mul__)
44160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(l.__add__.__name__ == '__add__')
44170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        if hasattr(l.__add__, '__self__'):
44180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # CPython
44190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(l.__add__.__self__ is l)
44200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(l.__add__.__objclass__ is list)
44210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
44220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # Python implementations where [].__add__ is a normal bound method
44230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(l.__add__.im_self is l)
44240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertTrue(l.__add__.im_class is list)
44250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(l.__add__.__doc__, list.__add__.__doc__)
44260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
44270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            hash(l.__add__)
44280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except TypeError:
44290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
44300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        else:
44310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.fail("no TypeError from hash([].__add__)")
44320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t = ()
44340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        t += (7,)
44350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(t.__add__, (7,).__add__)
44360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(hash(t.__add__), hash((7,).__add__))
44370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_not_implemented(self):
44390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing NotImplemented...
44400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # all binary methods should be able to return a NotImplemented
44410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        import operator
44420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def specialmethod(self, other):
44440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            return NotImplemented
44450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        def check(expr, x, y):
44470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            try:
44480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                exec expr in {'x': x, 'y': y, 'operator': operator}
44490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            except TypeError:
44500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
44510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
44520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.fail("no TypeError from %r" % (expr,))
44530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
44540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        N1 = sys.maxint + 1L    # might trigger OverflowErrors instead of
44550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                # TypeErrors
44560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        N2 = sys.maxint         # if sizeof(int) < sizeof(long), might trigger
44570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                #   ValueErrors instead of TypeErrors
44580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for metaclass in [type, types.ClassType]:
44590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            for name, expr, iexpr in [
44600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__add__',      'x + y',                   'x += y'),
44610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__sub__',      'x - y',                   'x -= y'),
44620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__mul__',      'x * y',                   'x *= y'),
44630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__truediv__',  'operator.truediv(x, y)',  None),
44640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__floordiv__', 'operator.floordiv(x, y)', None),
44650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__div__',      'x / y',                   'x /= y'),
44660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__mod__',      'x % y',                   'x %= y'),
44670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__divmod__',   'divmod(x, y)',            None),
44680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__pow__',      'x ** y',                  'x **= y'),
44690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__lshift__',   'x << y',                  'x <<= y'),
44700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__rshift__',   'x >> y',                  'x >>= y'),
44710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__and__',      'x & y',                   'x &= y'),
44720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__or__',       'x | y',                   'x |= y'),
44730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__xor__',      'x ^ y',                   'x ^= y'),
44740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    ('__coerce__',   'coerce(x, y)',            None)]:
44750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if name == '__coerce__':
44760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    rname = name
44770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                else:
44780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    rname = '__r' + name[2:]
44790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                A = metaclass('A', (), {name: specialmethod})
44800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                B = metaclass('B', (), {rname: specialmethod})
44810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                a = A()
44820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                b = B()
44830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                check(expr, a, a)
44840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                check(expr, a, b)
44850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                check(expr, b, a)
44860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                check(expr, b, b)
44870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                check(expr, a, N1)
44880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                check(expr, a, N2)
44890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                check(expr, N1, b)
44900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                check(expr, N2, b)
44910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if iexpr:
44920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, a, a)
44930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, a, b)
44940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, b, a)
44950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, b, b)
44960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, a, N1)
44970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, a, N2)
44980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    iname = '__i' + name[2:]
44990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    C = metaclass('C', (), {iname: specialmethod})
45000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    c = C()
45010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, c, a)
45020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, c, b)
45030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, c, N1)
45040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    check(iexpr, c, N2)
45050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_assign_slice(self):
45070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # ceval.c's assign_slice used to check for
45080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # tp->tp_as_sequence->sq_slice instead of
45090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # tp->tp_as_sequence->sq_ass_slice
45100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
45120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __setslice__(self, start, stop, value):
45130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.value = value
45140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c = C()
45160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        c[1:2] = 3
45170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(c.value, 3)
45180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_set_and_no_get(self):
45200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # See
45210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # http://mail.python.org/pipermail/python-dev/2010-January/095637.html
45220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Descr(object):
45230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self, name):
45250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.name = name
45260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __set__(self, obj, value):
45280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                obj.__dict__[self.name] = value
45290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        descr = Descr("a")
45300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(object):
45320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            a = descr
45330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = X()
45350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIs(x.a, descr)
45360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.a = 42
45370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x.a, 42)
45380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Also check type_getattro for correctness.
45400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Meta(type):
45410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
45420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(object):
45430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = Meta
45440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        X.a = 42
45450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Meta.a = Descr("a")
45460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(X.a, 42)
45470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_getattr_hooks(self):
45490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # issue 4230
45500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Descriptor(object):
45520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            counter = 0
45530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __get__(self, obj, objtype=None):
45540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                def getter(name):
45550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    self.counter += 1
45560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    raise AttributeError(name)
45570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                return getter
45580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        descr = Descriptor()
45600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class A(object):
45610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __getattribute__ = descr
45620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object):
45630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __getattr__ = descr
45640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
45650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __getattribute__ = descr
45660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __getattr__ = descr
45670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(AttributeError, getattr, A(), "attr")
45690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(descr.counter, 1)
45700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(AttributeError, getattr, B(), "attr")
45710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(descr.counter, 2)
45720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(AttributeError, getattr, C(), "attr")
45730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(descr.counter, 4)
45740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class EvilGetattribute(object):
45760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # This used to segfault
45770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattr__(self, name):
45780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise AttributeError(name)
45790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __getattribute__(self, name):
45800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                del EvilGetattribute.__getattr__
45810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                for i in range(5):
45820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    gc.collect()
45830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                raise AttributeError(name)
45840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(AttributeError, getattr, EvilGetattribute(), "attr")
45860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_type___getattribute__(self):
45880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(TypeError, type.__getattribute__, list, type)
45890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
45900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_abstractmethods(self):
45910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # type pretends not to have __abstractmethods__.
45920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(AttributeError, getattr, type, "__abstractmethods__")
45930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class meta(type):
45940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
45950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(AttributeError, getattr, meta, "__abstractmethods__")
45960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(object):
45970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
45980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with self.assertRaises(AttributeError):
45990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            del X.__abstractmethods__
46000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_proxy_call(self):
46020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class FakeStr(object):
46030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __class__ = str
46040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        fake_str = FakeStr()
46060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # isinstance() reads __class__ on new style classes
46070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertTrue(isinstance(fake_str, str))
46080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # call a method descriptor
46100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with self.assertRaises(TypeError):
46110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            str.split(fake_str)
46120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # call a slot wrapper descriptor
46140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        with self.assertRaises(TypeError):
46150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            str.__add__(fake_str, "abc")
46160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_repr_as_str(self):
46180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Issue #11603: crash or infinite loop when rebinding __str__ as
46190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # __repr__.
46200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class Foo(object):
46210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
46220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        Foo.__repr__ = Foo.__str__
46230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        foo = Foo()
46240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(RuntimeError, str, foo)
46250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertRaises(RuntimeError, repr, foo)
46260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_mixing_slot_wrappers(self):
46280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(dict):
46290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __setattr__ = dict.__setitem__
46300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = X()
46310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.y = 42
46320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(x["y"], 42)
46330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_cycle_through_dict(self):
46350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # See bug #1469629
46360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class X(dict):
46370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __init__(self):
46380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                dict.__init__(self)
46390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                self.__dict__ = self
46400c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x = X()
46410c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        x.attr = 42
46420c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        wr = weakref.ref(x)
46430c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        del x
46440c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.gc_collect()
46450c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIsNone(wr())
46460c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for o in gc.get_objects():
46470c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            self.assertIsNot(type(o), X)
46480c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46490c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass DictProxyTests(unittest.TestCase):
46500c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def setUp(self):
46510c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C(object):
46520c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def meth(self):
46530c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
46540c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.C = C
46550c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46560c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_repr(self):
46570c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn('dict_proxy({', repr(vars(self.C)))
46580c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertIn("'meth':", repr(vars(self.C)))
46590c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46600c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_iter_keys(self):
46610c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing dict-proxy iterkeys...
46620c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        keys = [ key for key in self.C.__dict__.iterkeys() ]
46630c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        keys.sort()
46640c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
46650c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '__weakref__', 'meth'])
46660c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46670c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_iter_values(self):
46680c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing dict-proxy itervalues...
46690c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        values = [ values for values in self.C.__dict__.itervalues() ]
46700c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(len(values), 5)
46710c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46720c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_iter_items(self):
46730c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing dict-proxy iteritems...
46740c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        keys = [ key for (key, value) in self.C.__dict__.iteritems() ]
46750c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        keys.sort()
46760c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(keys, ['__dict__', '__doc__', '__module__',
46770c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            '__weakref__', 'meth'])
46780c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46790c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_dict_type_with_metaclass(self):
46800c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing type of __dict__ when __metaclass__ set...
46810c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class B(object):
46820c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
46830c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class M(type):
46840c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
46850c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class C:
46860c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
46870c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            __metaclass__ = M
46880c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        self.assertEqual(type(C.__dict__), type(B.__dict__))
46890c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46900c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46910c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass PTypesLongInitTest(unittest.TestCase):
46920c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    # This is in its own TestCase so that it can be run before any other tests.
46930c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def test_pytype_long_ready(self):
46940c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Testing SF bug 551412 ...
46950c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
46960c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # This dumps core when SF bug 551412 isn't fixed --
46970c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # but only when test_descr.py is run separately.
46980c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # (That can't be helped -- as soon as PyType_Ready()
46990c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # is called for PyLong_Type, the bug is gone.)
47000c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        class UserLong(object):
47010c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            def __pow__(self, *args):
47020c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                pass
47030c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        try:
47040c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pow(0L, UserLong(), 0L)
47050c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        except:
47060c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            pass
47070c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47080c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Another segfault only when run early
47090c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # (before PyType_Ready(tuple) is called)
47100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        type.mro(tuple)
47110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yidef test_main():
47140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    deprecations = [(r'complex divmod\(\), // and % are deprecated$',
47150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                     DeprecationWarning)]
47160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    if sys.py3kwarning:
47170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        deprecations += [
47180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("classic (int|long) division", DeprecationWarning),
47190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            ("coerce.. not supported", DeprecationWarning),
47200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            (".+__(get|set|del)slice__ has been removed", DeprecationWarning)]
47210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    with test_support.check_warnings(*deprecations):
47220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        # Run all local test cases, with PTypesLongInitTest first.
47230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        test_support.run_unittest(PTypesLongInitTest, OperatorsTest,
47240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                                  ClassPropertiesAndMethods, DictProxyTests)
47250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
47260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiif __name__ == "__main__":
47270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    test_main()
4728