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