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