~ubuntu-branches/ubuntu/karmic/pypy/karmic

« back to all changes in this revision

Viewing changes to lib-python/2.4.1/test/test_descr.py

  • Committer: Bazaar Package Importer
  • Author(s): Alexandre Fayolle
  • Date: 2007-04-13 09:33:09 UTC
  • Revision ID: james.westby@ubuntu.com-20070413093309-yoojh4jcoocu2krz
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

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