blob: 1768a6d3d0a5453b608d70a427253a32d004f107 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Tim Peters59c9a642001-09-13 05:38:56 +00003from test_support import verify, verbose, TestFailed, TESTFN
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
5
Guido van Rossum4bb1e362001-09-28 23:49:48 +00006def vereq(a, b):
Guido van Rossum45704552001-10-08 16:35:45 +00007 if not (a == b):
8 raise TestFailed, "%r == %r" % (a, b)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00009
Guido van Rossum875eeaa2001-10-11 18:33:53 +000010def veris(a, b):
11 if a is not b:
12 raise TestFailed, "%r is %r" % (a, b)
13
Tim Peters6d6c1a32001-08-02 04:15:00 +000014def testunop(a, res, expr="len(a)", meth="__len__"):
15 if verbose: print "checking", expr
16 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000017 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000018 t = type(a)
19 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000020 vereq(m, t.__dict__[meth])
21 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000022 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000024
25def testbinop(a, b, res, expr="a+b", meth="__add__"):
26 if verbose: print "checking", expr
27 dict = {'a': a, 'b': b}
Guido van Rossum45704552001-10-08 16:35:45 +000028 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000029 t = type(a)
30 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000031 vereq(m, t.__dict__[meth])
32 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000033 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000034 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000035
36def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
37 if verbose: print "checking", expr
38 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000039 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000040 t = type(a)
41 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000042 vereq(m, t.__dict__[meth])
43 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000045 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046
47def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
48 if verbose: print "checking", stmt
49 dict = {'a': deepcopy(a), 'b': b}
50 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000051 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052 t = type(a)
53 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000054 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000055 dict['a'] = deepcopy(a)
56 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058 dict['a'] = deepcopy(a)
59 bm = getattr(dict['a'], meth)
60 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000061 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000062
63def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
64 if verbose: print "checking", stmt
65 dict = {'a': deepcopy(a), 'b': b, 'c': c}
66 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000067 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000068 t = type(a)
69 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000070 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000071 dict['a'] = deepcopy(a)
72 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000073 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000074 dict['a'] = deepcopy(a)
75 bm = getattr(dict['a'], meth)
76 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000077 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000078
79def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
80 if verbose: print "checking", stmt
81 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
82 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000083 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000084 t = type(a)
85 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 dict['a'] = deepcopy(a)
88 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict['a'] = deepcopy(a)
91 bm = getattr(dict['a'], meth)
92 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094
Tim Peters2f93e282001-10-04 05:27:00 +000095def class_docstrings():
96 class Classic:
97 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +000098 vereq(Classic.__doc__, "A classic docstring.")
99 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000100
101 class Classic2:
102 pass
103 verify(Classic2.__doc__ is None)
104
Tim Peters4fb1fe82001-10-04 05:48:13 +0000105 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000106 "Another docstring."
107 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000108 vereq(NewStatic.__doc__, "Another docstring.")
109 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000110
Tim Peters4fb1fe82001-10-04 05:48:13 +0000111 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000112 __dynamic__ = 0
113 pass
114 verify(NewStatic2.__doc__ is None)
115
Tim Peters4fb1fe82001-10-04 05:48:13 +0000116 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000117 "Another docstring."
118 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000119 vereq(NewDynamic.__doc__, "Another docstring.")
120 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000121
Tim Peters4fb1fe82001-10-04 05:48:13 +0000122 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000123 __dynamic__ = 1
124 pass
125 verify(NewDynamic2.__doc__ is None)
126
Tim Peters6d6c1a32001-08-02 04:15:00 +0000127def lists():
128 if verbose: print "Testing list operations..."
129 testbinop([1], [2], [1,2], "a+b", "__add__")
130 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
131 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
132 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
133 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
134 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
135 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
136 testunop([1,2,3], 3, "len(a)", "__len__")
137 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
138 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
139 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
140 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
141
142def dicts():
143 if verbose: print "Testing dict operations..."
144 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
145 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
146 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
147 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
148 d = {1:2,3:4}
149 l1 = []
150 for i in d.keys(): l1.append(i)
151 l = []
152 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000153 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000154 l = []
155 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000156 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000157 l = []
158 for i in dictionary.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000159 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000160 d = {1:2, 3:4}
161 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000162 vereq(eval(repr(d), {}), d)
163 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
165
Tim Peters25786c02001-09-02 08:22:48 +0000166def dict_constructor():
167 if verbose:
168 print "Testing dictionary constructor ..."
169 d = dictionary()
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000171 d = dictionary({})
Guido van Rossum45704552001-10-08 16:35:45 +0000172 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000173 d = dictionary(mapping={})
Guido van Rossum45704552001-10-08 16:35:45 +0000174 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000175 d = dictionary({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(d, {1: 2, 'a': 'b'})
Tim Peters25786c02001-09-02 08:22:48 +0000177 for badarg in 0, 0L, 0j, "0", [0], (0,):
178 try:
179 dictionary(badarg)
180 except TypeError:
181 pass
182 else:
183 raise TestFailed("no TypeError from dictionary(%r)" % badarg)
184 try:
185 dictionary(senseless={})
186 except TypeError:
187 pass
188 else:
189 raise TestFailed("no TypeError from dictionary(senseless={}")
190
191 try:
192 dictionary({}, {})
193 except TypeError:
194 pass
195 else:
196 raise TestFailed("no TypeError from dictionary({}, {})")
197
198 class Mapping:
199 dict = {1:2, 3:4, 'a':1j}
200
201 def __getitem__(self, i):
202 return self.dict[i]
203
204 try:
205 dictionary(Mapping())
206 except TypeError:
207 pass
208 else:
209 raise TestFailed("no TypeError from dictionary(incomplete mapping)")
210
211 Mapping.keys = lambda self: self.dict.keys()
212 d = dictionary(mapping=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000213 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000214
Tim Peters5d2b77c2001-09-03 05:47:38 +0000215def test_dir():
216 if verbose:
217 print "Testing dir() ..."
218 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000219 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000220 del junk
221
222 # Just make sure these don't blow up!
223 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
224 dir(arg)
225
Tim Peters37a309d2001-09-04 01:20:04 +0000226 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000227 class C:
228 Cdata = 1
229 def Cmethod(self): pass
230
231 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000232 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000233 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000234
235 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000236 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000237
238 c.cdata = 2
239 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000240 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000241 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000242
243 class A(C):
244 Adata = 1
245 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000246
Tim Peters37a309d2001-09-04 01:20:04 +0000247 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000248 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000249 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000250 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000251 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000252 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000253 a.adata = 42
254 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000255 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000256
257 # The same, but with new-style classes. Since these have object as a
258 # base class, a lot more gets sucked in.
259 def interesting(strings):
260 return [s for s in strings if not s.startswith('_')]
261
Tim Peters5d2b77c2001-09-03 05:47:38 +0000262 class C(object):
263 Cdata = 1
264 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000265
266 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000267 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000268
269 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000270 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000271 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000272
273 c.cdata = 2
274 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000275 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000276 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000277
Tim Peters5d2b77c2001-09-03 05:47:38 +0000278 class A(C):
279 Adata = 1
280 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000281
282 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000284 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000285 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000286 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000287 a.adata = 42
288 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000289 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000290 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291
Tim Peterscaaff8d2001-09-10 23:12:14 +0000292 # Try a module subclass.
293 import sys
294 class M(type(sys)):
295 pass
296 minstance = M()
297 minstance.b = 2
298 minstance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(dir(minstance), ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000300
301 class M2(M):
302 def getdict(self):
303 return "Not a dict!"
304 __dict__ = property(getdict)
305
306 m2instance = M2()
307 m2instance.b = 2
308 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000309 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000310 try:
311 dir(m2instance)
312 except TypeError:
313 pass
314
Tim Peters6d6c1a32001-08-02 04:15:00 +0000315binops = {
316 'add': '+',
317 'sub': '-',
318 'mul': '*',
319 'div': '/',
320 'mod': '%',
321 'divmod': 'divmod',
322 'pow': '**',
323 'lshift': '<<',
324 'rshift': '>>',
325 'and': '&',
326 'xor': '^',
327 'or': '|',
328 'cmp': 'cmp',
329 'lt': '<',
330 'le': '<=',
331 'eq': '==',
332 'ne': '!=',
333 'gt': '>',
334 'ge': '>=',
335 }
336
337for name, expr in binops.items():
338 if expr.islower():
339 expr = expr + "(a, b)"
340 else:
341 expr = 'a %s b' % expr
342 binops[name] = expr
343
344unops = {
345 'pos': '+',
346 'neg': '-',
347 'abs': 'abs',
348 'invert': '~',
349 'int': 'int',
350 'long': 'long',
351 'float': 'float',
352 'oct': 'oct',
353 'hex': 'hex',
354 }
355
356for name, expr in unops.items():
357 if expr.islower():
358 expr = expr + "(a)"
359 else:
360 expr = '%s a' % expr
361 unops[name] = expr
362
363def numops(a, b, skip=[]):
364 dict = {'a': a, 'b': b}
365 for name, expr in binops.items():
366 if name not in skip:
367 name = "__%s__" % name
368 if hasattr(a, name):
369 res = eval(expr, dict)
370 testbinop(a, b, res, expr, name)
371 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000372 if name not in skip:
373 name = "__%s__" % name
374 if hasattr(a, name):
375 res = eval(expr, dict)
376 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000377
378def ints():
379 if verbose: print "Testing int operations..."
380 numops(100, 3)
381
382def longs():
383 if verbose: print "Testing long operations..."
384 numops(100L, 3L)
385
386def floats():
387 if verbose: print "Testing float operations..."
388 numops(100.0, 3.0)
389
390def complexes():
391 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000392 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000393 class Number(complex):
394 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000395 def __new__(cls, *args, **kwds):
396 result = complex.__new__(cls, *args)
397 result.prec = kwds.get('prec', 12)
398 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000399 def __repr__(self):
400 prec = self.prec
401 if self.imag == 0.0:
402 return "%.*g" % (prec, self.real)
403 if self.real == 0.0:
404 return "%.*gj" % (prec, self.imag)
405 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
406 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000407
Tim Peters6d6c1a32001-08-02 04:15:00 +0000408 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000409 vereq(`a`, "3.14")
410 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000411
Tim Peters3f996e72001-09-13 19:18:27 +0000412 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000413 vereq(`a`, "3.1")
414 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000415
416 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000417 vereq(`a`, "234.5")
418 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000419
Tim Peters6d6c1a32001-08-02 04:15:00 +0000420def spamlists():
421 if verbose: print "Testing spamlist operations..."
422 import copy, xxsubtype as spam
423 def spamlist(l, memo=None):
424 import xxsubtype as spam
425 return spam.spamlist(l)
426 # This is an ugly hack:
427 copy._deepcopy_dispatch[spam.spamlist] = spamlist
428
429 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
430 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
431 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
432 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
433 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
434 "a[b:c]", "__getslice__")
435 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
436 "a+=b", "__iadd__")
437 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
438 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
439 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
440 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
441 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
442 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
443 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
444 # Test subclassing
445 class C(spam.spamlist):
446 def foo(self): return 1
447 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000448 vereq(a, [])
449 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000451 vereq(a, [100])
452 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000453 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000454 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000455
456def spamdicts():
457 if verbose: print "Testing spamdict operations..."
458 import copy, xxsubtype as spam
459 def spamdict(d, memo=None):
460 import xxsubtype as spam
461 sd = spam.spamdict()
462 for k, v in d.items(): sd[k] = v
463 return sd
464 # This is an ugly hack:
465 copy._deepcopy_dispatch[spam.spamdict] = spamdict
466
467 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
468 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
469 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
470 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
471 d = spamdict({1:2,3:4})
472 l1 = []
473 for i in d.keys(): l1.append(i)
474 l = []
475 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000476 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000477 l = []
478 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000479 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000480 l = []
481 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000482 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 straightd = {1:2, 3:4}
484 spamd = spamdict(straightd)
485 testunop(spamd, 2, "len(a)", "__len__")
486 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
487 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
488 "a[b]=c", "__setitem__")
489 # Test subclassing
490 class C(spam.spamdict):
491 def foo(self): return 1
492 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000493 vereq(a.items(), [])
494 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000496 vereq(a.items(), [('foo', 'bar')])
497 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000498 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000500
501def pydicts():
502 if verbose: print "Testing Python subclass of dict..."
503 verify(issubclass(dictionary, dictionary))
504 verify(isinstance({}, dictionary))
505 d = dictionary()
Guido van Rossum45704552001-10-08 16:35:45 +0000506 vereq(d, {})
Tim Peters6d6c1a32001-08-02 04:15:00 +0000507 verify(d.__class__ is dictionary)
508 verify(isinstance(d, dictionary))
509 class C(dictionary):
510 state = -1
511 def __init__(self, *a, **kw):
512 if a:
513 assert len(a) == 1
514 self.state = a[0]
515 if kw:
516 for k, v in kw.items(): self[v] = k
517 def __getitem__(self, key):
518 return self.get(key, 0)
519 def __setitem__(self, key, value):
520 assert isinstance(key, type(0))
521 dictionary.__setitem__(self, key, value)
522 def setstate(self, state):
523 self.state = state
524 def getstate(self):
525 return self.state
526 verify(issubclass(C, dictionary))
527 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000528 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000529 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000532 vereq(a.state, -1)
533 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000534 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000535 vereq(a.state, 0)
536 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000537 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000538 vereq(a.state, 10)
539 vereq(a.getstate(), 10)
540 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000541 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000542 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000543 if verbose: print "pydict stress test ..."
544 N = 50
545 for i in range(N):
546 a[i] = C()
547 for j in range(N):
548 a[i][j] = i*j
549 for i in range(N):
550 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000551 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000552
553def pylists():
554 if verbose: print "Testing Python subclass of list..."
555 class C(list):
556 def __getitem__(self, i):
557 return list.__getitem__(self, i) + 100
558 def __getslice__(self, i, j):
559 return (i, j)
560 a = C()
561 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000562 vereq(a[0], 100)
563 vereq(a[1], 101)
564 vereq(a[2], 102)
565 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566
567def metaclass():
568 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000569 class C:
570 __metaclass__ = type
571 def __init__(self):
572 self.__state = 0
573 def getstate(self):
574 return self.__state
575 def setstate(self, state):
576 self.__state = state
577 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000578 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000579 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000581 class D:
582 class __metaclass__(type):
583 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000584 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000585 d = D()
586 verify(d.__class__ is D)
587 class M1(type):
588 def __new__(cls, name, bases, dict):
589 dict['__spam__'] = 1
590 return type.__new__(cls, name, bases, dict)
591 class C:
592 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000594 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000595 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000596
Guido van Rossum309b5662001-08-17 11:43:17 +0000597 class _instance(object):
598 pass
599 class M2(object):
600 def __new__(cls, name, bases, dict):
601 self = object.__new__(cls)
602 self.name = name
603 self.bases = bases
604 self.dict = dict
605 return self
606 __new__ = staticmethod(__new__)
607 def __call__(self):
608 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000609 # Early binding of methods
610 for key in self.dict:
611 if key.startswith("__"):
612 continue
613 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000614 return it
615 class C:
616 __metaclass__ = M2
617 def spam(self):
618 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000619 vereq(C.name, 'C')
620 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000621 verify('spam' in C.dict)
622 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000623 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624
Guido van Rossum91ee7982001-08-30 20:52:40 +0000625 # More metaclass examples
626
627 class autosuper(type):
628 # Automatically add __super to the class
629 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000630 def __new__(metaclass, name, bases, dict):
Guido van Rossum875eeaa2001-10-11 18:33:53 +0000631 assert dict.get("__dynamic__", 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000632 cls = super(autosuper, metaclass).__new__(metaclass,
633 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000634 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000635 while name[:1] == "_":
636 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000637 if name:
638 name = "_%s__super" % name
639 else:
640 name = "__super"
641 setattr(cls, name, super(cls))
642 return cls
643 class A:
644 __metaclass__ = autosuper
645 def meth(self):
646 return "A"
647 class B(A):
648 def meth(self):
649 return "B" + self.__super.meth()
650 class C(A):
651 def meth(self):
652 return "C" + self.__super.meth()
653 class D(C, B):
654 def meth(self):
655 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000656 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000657 class E(B, C):
658 def meth(self):
659 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000660 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000661
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000662 class autoproperty(type):
663 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000664 # named _get_x and/or _set_x are found
665 def __new__(metaclass, name, bases, dict):
666 hits = {}
667 for key, val in dict.iteritems():
668 if key.startswith("_get_"):
669 key = key[5:]
670 get, set = hits.get(key, (None, None))
671 get = val
672 hits[key] = get, set
673 elif key.startswith("_set_"):
674 key = key[5:]
675 get, set = hits.get(key, (None, None))
676 set = val
677 hits[key] = get, set
678 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000679 dict[key] = property(get, set)
680 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 name, bases, dict)
682 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000683 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000684 def _get_x(self):
685 return -self.__x
686 def _set_x(self, x):
687 self.__x = -x
688 a = A()
689 verify(not hasattr(a, "x"))
690 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000691 vereq(a.x, 12)
692 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000693
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000694 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000695 # Merge of multiple cooperating metaclasses
696 pass
697 class A:
698 __metaclass__ = multimetaclass
699 def _get_x(self):
700 return "A"
701 class B(A):
702 def _get_x(self):
703 return "B" + self.__super._get_x()
704 class C(A):
705 def _get_x(self):
706 return "C" + self.__super._get_x()
707 class D(C, B):
708 def _get_x(self):
709 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000710 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000711
Tim Peters6d6c1a32001-08-02 04:15:00 +0000712def pymods():
713 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000714 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000715 import sys
716 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000717 class MM(MT):
718 def __init__(self):
719 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000720 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000722 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000723 def __setattr__(self, name, value):
724 log.append(("setattr", name, value))
725 MT.__setattr__(self, name, value)
726 def __delattr__(self, name):
727 log.append(("delattr", name))
728 MT.__delattr__(self, name)
729 a = MM()
730 a.foo = 12
731 x = a.foo
732 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000733 vereq(log, [("setattr", "foo", 12),
734 ("getattr", "foo"),
735 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000736
737def multi():
738 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000739 class C(object):
740 def __init__(self):
741 self.__state = 0
742 def getstate(self):
743 return self.__state
744 def setstate(self, state):
745 self.__state = state
746 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000747 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000748 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000749 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000750 class D(dictionary, C):
751 def __init__(self):
752 type({}).__init__(self)
753 C.__init__(self)
754 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000755 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000756 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000757 vereq(d.items(), [("hello", "world")])
758 vereq(d["hello"], "world")
759 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000760 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000761 vereq(d.getstate(), 10)
762 vereq(D.__mro__, (D, dictionary, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000763
Guido van Rossume45763a2001-08-10 21:28:46 +0000764 # SF bug #442833
765 class Node(object):
766 def __int__(self):
767 return int(self.foo())
768 def foo(self):
769 return "23"
770 class Frag(Node, list):
771 def foo(self):
772 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000773 vereq(Node().__int__(), 23)
774 vereq(int(Node()), 23)
775 vereq(Frag().__int__(), 42)
776 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000777
Tim Peters6d6c1a32001-08-02 04:15:00 +0000778def diamond():
779 if verbose: print "Testing multiple inheritance special cases..."
780 class A(object):
781 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000782 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000783 class B(A):
784 def boo(self): return "B"
785 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000786 vereq(B().spam(), "B")
787 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000788 class C(A):
789 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000790 vereq(C().spam(), "A")
791 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000792 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000793 vereq(D().spam(), "B")
794 vereq(D().boo(), "B")
795 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000796 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000797 vereq(E().spam(), "B")
798 vereq(E().boo(), "C")
799 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000800 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000801 vereq(F().spam(), "B")
802 vereq(F().boo(), "B")
803 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000805 vereq(G().spam(), "B")
806 vereq(G().boo(), "C")
807 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000808
Guido van Rossum37202612001-08-09 19:45:21 +0000809def objects():
810 if verbose: print "Testing object class..."
811 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000812 vereq(a.__class__, object)
813 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000814 b = object()
815 verify(a is not b)
816 verify(not hasattr(a, "foo"))
817 try:
818 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000819 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000820 pass
821 else:
822 verify(0, "object() should not allow setting a foo attribute")
823 verify(not hasattr(object(), "__dict__"))
824
825 class Cdict(object):
826 pass
827 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000828 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000829 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000830 vereq(x.foo, 1)
831 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000832
Tim Peters6d6c1a32001-08-02 04:15:00 +0000833def slots():
834 if verbose: print "Testing __slots__..."
835 class C0(object):
836 __slots__ = []
837 x = C0()
838 verify(not hasattr(x, "__dict__"))
839 verify(not hasattr(x, "foo"))
840
841 class C1(object):
842 __slots__ = ['a']
843 x = C1()
844 verify(not hasattr(x, "__dict__"))
Guido van Rossum45704552001-10-08 16:35:45 +0000845 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000846 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000847 vereq(x.a, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848 del x.a
Guido van Rossum45704552001-10-08 16:35:45 +0000849 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850
851 class C3(object):
852 __slots__ = ['a', 'b', 'c']
853 x = C3()
854 verify(not hasattr(x, "__dict__"))
855 verify(x.a is None)
856 verify(x.b is None)
857 verify(x.c is None)
858 x.a = 1
859 x.b = 2
860 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +0000861 vereq(x.a, 1)
862 vereq(x.b, 2)
863 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864
865def dynamics():
866 if verbose: print "Testing __dynamic__..."
Guido van Rossum45704552001-10-08 16:35:45 +0000867 vereq(object.__dynamic__, 0)
868 vereq(list.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000869 class S1:
870 __metaclass__ = type
Guido van Rossum751c4c82001-09-29 00:40:25 +0000871 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000872 vereq(S1.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000873 class S(object):
Guido van Rossum751c4c82001-09-29 00:40:25 +0000874 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000875 vereq(S.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000876 class D(object):
877 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000878 vereq(D.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879 class E(D, S):
880 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000881 vereq(E.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000882 class F(S, D):
883 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000884 vereq(F.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000885 try:
886 S.foo = 1
887 except (AttributeError, TypeError):
888 pass
889 else:
890 verify(0, "assignment to a static class attribute should be illegal")
891 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000892 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000893 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +0000894 vereq(E.foo, 1)
895 vereq(F.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000896 class SS(D):
897 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000898 vereq(SS.__dynamic__, 0)
899 vereq(SS.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000900 try:
901 SS.foo = 1
902 except (AttributeError, TypeError):
903 pass
904 else:
905 verify(0, "assignment to SS.foo should be illegal")
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000906 # Test dynamic instances
907 class C(object):
908 __dynamic__ = 1
Guido van Rossum4a5a2bc2001-10-03 13:59:54 +0000909 # XXX Ideally the following def shouldn't be necessary,
910 # but it's too much of a performance burden.
911 # See XXX comment in slot_tp_getattr_hook.
912 def __getattr__(self, name):
913 raise AttributeError, name
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000914 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000915 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000916 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +0000917 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000918 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +0000919 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000920 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +0000921 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000922 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +0000923 vereq(int(a), 100)
924 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +0000925 verify(not hasattr(a, "spam"))
926 def mygetattr(self, name):
927 if name == "spam":
928 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +0000929 raise AttributeError
930 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +0000931 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +0000932 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000933 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +0000934 def mysetattr(self, name, value):
935 if name == "spam":
936 raise AttributeError
937 return object.__setattr__(self, name, value)
938 C.__setattr__ = mysetattr
939 try:
940 a.spam = "not spam"
941 except AttributeError:
942 pass
943 else:
944 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +0000945 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000946 class D(C):
947 pass
948 d = D()
949 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000950 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000951
Guido van Rossum7e35d572001-09-15 03:14:32 +0000952 # Test handling of int*seq and seq*int
953 class I(int):
Guido van Rossum875eeaa2001-10-11 18:33:53 +0000954 __dynamic__ = 1 # XXX why?
Guido van Rossum45704552001-10-08 16:35:45 +0000955 vereq("a"*I(2), "aa")
956 vereq(I(2)*"a", "aa")
957 vereq(2*I(3), 6)
958 vereq(I(3)*2, 6)
959 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000960
961 # Test handling of long*seq and seq*long
962 class L(long):
Guido van Rossum875eeaa2001-10-11 18:33:53 +0000963 __dynamic__ = 1 # XXX why?
Guido van Rossum45704552001-10-08 16:35:45 +0000964 vereq("a"*L(2L), "aa")
965 vereq(L(2L)*"a", "aa")
966 vereq(2*L(3), 6)
967 vereq(L(3)*2, 6)
968 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000969
Guido van Rossum3d45d8f2001-09-24 18:47:40 +0000970 # Test comparison of classes with dynamic metaclasses
971 class dynamicmetaclass(type):
Guido van Rossum875eeaa2001-10-11 18:33:53 +0000972 __dynamic__ = 1 # XXX ???
Guido van Rossum3d45d8f2001-09-24 18:47:40 +0000973 class someclass:
974 __metaclass__ = dynamicmetaclass
975 verify(someclass != object)
976
Tim Peters6d6c1a32001-08-02 04:15:00 +0000977def errors():
978 if verbose: print "Testing errors..."
979
980 try:
981 class C(list, dictionary):
982 pass
983 except TypeError:
984 pass
985 else:
986 verify(0, "inheritance from both list and dict should be illegal")
987
988 try:
989 class C(object, None):
990 pass
991 except TypeError:
992 pass
993 else:
994 verify(0, "inheritance from non-type should be illegal")
995 class Classic:
996 pass
997
998 try:
999 class C(object, Classic):
1000 pass
1001 except TypeError:
1002 pass
1003 else:
1004 verify(0, "inheritance from object and Classic should be illegal")
1005
1006 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001007 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008 pass
1009 except TypeError:
1010 pass
1011 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001012 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013
1014 try:
1015 class C(object):
1016 __slots__ = 1
1017 except TypeError:
1018 pass
1019 else:
1020 verify(0, "__slots__ = 1 should be illegal")
1021
1022 try:
1023 class C(object):
1024 __slots__ = [1]
1025 except TypeError:
1026 pass
1027 else:
1028 verify(0, "__slots__ = [1] should be illegal")
1029
1030def classmethods():
1031 if verbose: print "Testing class methods..."
1032 class C(object):
1033 def foo(*a): return a
1034 goo = classmethod(foo)
1035 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001036 vereq(C.goo(1), (C, 1))
1037 vereq(c.goo(1), (C, 1))
1038 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001039 class D(C):
1040 pass
1041 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001042 vereq(D.goo(1), (D, 1))
1043 vereq(d.goo(1), (D, 1))
1044 vereq(d.foo(1), (d, 1))
1045 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001046
1047def staticmethods():
1048 if verbose: print "Testing static methods..."
1049 class C(object):
1050 def foo(*a): return a
1051 goo = staticmethod(foo)
1052 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001053 vereq(C.goo(1), (1,))
1054 vereq(c.goo(1), (1,))
1055 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056 class D(C):
1057 pass
1058 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001059 vereq(D.goo(1), (1,))
1060 vereq(d.goo(1), (1,))
1061 vereq(d.foo(1), (d, 1))
1062 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001063
1064def classic():
1065 if verbose: print "Testing classic classes..."
1066 class C:
1067 def foo(*a): return a
1068 goo = classmethod(foo)
1069 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001070 vereq(C.goo(1), (C, 1))
1071 vereq(c.goo(1), (C, 1))
1072 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001073 class D(C):
1074 pass
1075 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001076 vereq(D.goo(1), (D, 1))
1077 vereq(d.goo(1), (D, 1))
1078 vereq(d.foo(1), (d, 1))
1079 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001080 class E: # *not* subclassing from C
1081 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001082 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001083 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001084
1085def compattr():
1086 if verbose: print "Testing computed attributes..."
1087 class C(object):
1088 class computed_attribute(object):
1089 def __init__(self, get, set=None):
1090 self.__get = get
1091 self.__set = set
1092 def __get__(self, obj, type=None):
1093 return self.__get(obj)
1094 def __set__(self, obj, value):
1095 return self.__set(obj, value)
1096 def __init__(self):
1097 self.__x = 0
1098 def __get_x(self):
1099 x = self.__x
1100 self.__x = x+1
1101 return x
1102 def __set_x(self, x):
1103 self.__x = x
1104 x = computed_attribute(__get_x, __set_x)
1105 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001106 vereq(a.x, 0)
1107 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001108 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001109 vereq(a.x, 10)
1110 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001111
1112def newslot():
1113 if verbose: print "Testing __new__ slot override..."
1114 class C(list):
1115 def __new__(cls):
1116 self = list.__new__(cls)
1117 self.foo = 1
1118 return self
1119 def __init__(self):
1120 self.foo = self.foo + 2
1121 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001122 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001123 verify(a.__class__ is C)
1124 class D(C):
1125 pass
1126 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001127 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001128 verify(b.__class__ is D)
1129
Tim Peters6d6c1a32001-08-02 04:15:00 +00001130def altmro():
1131 if verbose: print "Testing mro() and overriding it..."
1132 class A(object):
1133 def f(self): return "A"
1134 class B(A):
1135 pass
1136 class C(A):
1137 def f(self): return "C"
1138 class D(B, C):
1139 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001140 vereq(D.mro(), [D, B, C, A, object])
1141 vereq(D.__mro__, (D, B, C, A, object))
1142 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001143 class PerverseMetaType(type):
1144 def mro(cls):
1145 L = type.mro(cls)
1146 L.reverse()
1147 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001148 class X(A,B,C,D):
1149 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001150 vereq(X.__mro__, (object, A, C, B, D, X))
1151 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001152
1153def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001154 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155
1156 class B(object):
1157 "Intermediate class because object doesn't have a __setattr__"
1158
1159 class C(B):
1160
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001161 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001162 if name == "foo":
1163 return ("getattr", name)
1164 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001165 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001166 def __setattr__(self, name, value):
1167 if name == "foo":
1168 self.setattr = (name, value)
1169 else:
1170 return B.__setattr__(self, name, value)
1171 def __delattr__(self, name):
1172 if name == "foo":
1173 self.delattr = name
1174 else:
1175 return B.__delattr__(self, name)
1176
1177 def __getitem__(self, key):
1178 return ("getitem", key)
1179 def __setitem__(self, key, value):
1180 self.setitem = (key, value)
1181 def __delitem__(self, key):
1182 self.delitem = key
1183
1184 def __getslice__(self, i, j):
1185 return ("getslice", i, j)
1186 def __setslice__(self, i, j, value):
1187 self.setslice = (i, j, value)
1188 def __delslice__(self, i, j):
1189 self.delslice = (i, j)
1190
1191 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001192 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001193 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001194 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001195 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001196 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001197
Guido van Rossum45704552001-10-08 16:35:45 +00001198 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001200 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001201 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001202 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001203
Guido van Rossum45704552001-10-08 16:35:45 +00001204 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001206 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001207 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001208 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001209
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001210def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001211 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001212 class C(object):
1213 def __init__(self, x):
1214 self.x = x
1215 def foo(self):
1216 return self.x
1217 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001218 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001219 class D(C):
1220 boo = C.foo
1221 goo = c1.foo
1222 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001223 vereq(d2.foo(), 2)
1224 vereq(d2.boo(), 2)
1225 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001226 class E(object):
1227 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001228 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001229 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001230
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001231def specials():
1232 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001233 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001234 # Test the default behavior for static classes
1235 class C(object):
1236 def __getitem__(self, i):
1237 if 0 <= i < 10: return i
1238 raise IndexError
1239 c1 = C()
1240 c2 = C()
1241 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001242 vereq(hash(c1), id(c1))
1243 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1244 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001245 verify(c1 != c2)
1246 verify(not c1 != c1)
1247 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001248 # Note that the module name appears in str/repr, and that varies
1249 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001250 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001251 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001252 verify(-1 not in c1)
1253 for i in range(10):
1254 verify(i in c1)
1255 verify(10 not in c1)
1256 # Test the default behavior for dynamic classes
1257 class D(object):
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001258 __dynamic__ = 1 # XXX why?
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001259 def __getitem__(self, i):
1260 if 0 <= i < 10: return i
1261 raise IndexError
1262 d1 = D()
1263 d2 = D()
1264 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001265 vereq(hash(d1), id(d1))
1266 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1267 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001268 verify(d1 != d2)
1269 verify(not d1 != d1)
1270 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001271 # Note that the module name appears in str/repr, and that varies
1272 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001273 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001274 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001275 verify(-1 not in d1)
1276 for i in range(10):
1277 verify(i in d1)
1278 verify(10 not in d1)
1279 # Test overridden behavior for static classes
1280 class Proxy(object):
1281 def __init__(self, x):
1282 self.x = x
1283 def __nonzero__(self):
1284 return not not self.x
1285 def __hash__(self):
1286 return hash(self.x)
1287 def __eq__(self, other):
1288 return self.x == other
1289 def __ne__(self, other):
1290 return self.x != other
1291 def __cmp__(self, other):
1292 return cmp(self.x, other.x)
1293 def __str__(self):
1294 return "Proxy:%s" % self.x
1295 def __repr__(self):
1296 return "Proxy(%r)" % self.x
1297 def __contains__(self, value):
1298 return value in self.x
1299 p0 = Proxy(0)
1300 p1 = Proxy(1)
1301 p_1 = Proxy(-1)
1302 verify(not p0)
1303 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001304 vereq(hash(p0), hash(0))
1305 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001306 verify(p0 != p1)
1307 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001308 vereq(not p0, p1)
1309 vereq(cmp(p0, p1), -1)
1310 vereq(cmp(p0, p0), 0)
1311 vereq(cmp(p0, p_1), 1)
1312 vereq(str(p0), "Proxy:0")
1313 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001314 p10 = Proxy(range(10))
1315 verify(-1 not in p10)
1316 for i in range(10):
1317 verify(i in p10)
1318 verify(10 not in p10)
1319 # Test overridden behavior for dynamic classes
1320 class DProxy(object):
1321 __dynamic__ = 1
1322 def __init__(self, x):
1323 self.x = x
1324 def __nonzero__(self):
1325 return not not self.x
1326 def __hash__(self):
1327 return hash(self.x)
1328 def __eq__(self, other):
1329 return self.x == other
1330 def __ne__(self, other):
1331 return self.x != other
1332 def __cmp__(self, other):
1333 return cmp(self.x, other.x)
1334 def __str__(self):
1335 return "DProxy:%s" % self.x
1336 def __repr__(self):
1337 return "DProxy(%r)" % self.x
1338 def __contains__(self, value):
1339 return value in self.x
1340 p0 = DProxy(0)
1341 p1 = DProxy(1)
1342 p_1 = DProxy(-1)
1343 verify(not p0)
1344 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001345 vereq(hash(p0), hash(0))
1346 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001347 verify(p0 != p1)
1348 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001349 vereq(not p0, p1)
1350 vereq(cmp(p0, p1), -1)
1351 vereq(cmp(p0, p0), 0)
1352 vereq(cmp(p0, p_1), 1)
1353 vereq(str(p0), "DProxy:0")
1354 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001355 p10 = DProxy(range(10))
1356 verify(-1 not in p10)
1357 for i in range(10):
1358 verify(i in p10)
1359 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001360 # Safety test for __cmp__
1361 def unsafecmp(a, b):
1362 try:
1363 a.__class__.__cmp__(a, b)
1364 except TypeError:
1365 pass
1366 else:
1367 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1368 a.__class__, a, b)
1369 unsafecmp(u"123", "123")
1370 unsafecmp("123", u"123")
1371 unsafecmp(1, 1.0)
1372 unsafecmp(1.0, 1)
1373 unsafecmp(1, 1L)
1374 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001375
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001376def weakrefs():
1377 if verbose: print "Testing weak references..."
1378 import weakref
1379 class C(object):
1380 pass
1381 c = C()
1382 r = weakref.ref(c)
1383 verify(r() is c)
1384 del c
1385 verify(r() is None)
1386 del r
1387 class NoWeak(object):
1388 __slots__ = ['foo']
1389 no = NoWeak()
1390 try:
1391 weakref.ref(no)
1392 except TypeError, msg:
1393 verify(str(msg).find("weakly") >= 0)
1394 else:
1395 verify(0, "weakref.ref(no) should be illegal")
1396 class Weak(object):
1397 __slots__ = ['foo', '__weakref__']
1398 yes = Weak()
1399 r = weakref.ref(yes)
1400 verify(r() is yes)
1401 del yes
1402 verify(r() is None)
1403 del r
1404
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001405def properties():
1406 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001407 class C(object):
1408 def getx(self):
1409 return self.__x
1410 def setx(self, value):
1411 self.__x = value
1412 def delx(self):
1413 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001414 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001415 a = C()
1416 verify(not hasattr(a, "x"))
1417 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001418 vereq(a._C__x, 42)
1419 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001420 del a.x
1421 verify(not hasattr(a, "x"))
1422 verify(not hasattr(a, "_C__x"))
1423 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001424 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001425## C.x.__set__(a)
1426## verify(not hasattr(a, "x"))
1427
Tim Peters66c1a522001-09-24 21:17:50 +00001428 raw = C.__dict__['x']
1429 verify(isinstance(raw, property))
1430
1431 attrs = dir(raw)
1432 verify("__doc__" in attrs)
1433 verify("fget" in attrs)
1434 verify("fset" in attrs)
1435 verify("fdel" in attrs)
1436
Guido van Rossum45704552001-10-08 16:35:45 +00001437 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001438 verify(raw.fget is C.__dict__['getx'])
1439 verify(raw.fset is C.__dict__['setx'])
1440 verify(raw.fdel is C.__dict__['delx'])
1441
1442 for attr in "__doc__", "fget", "fset", "fdel":
1443 try:
1444 setattr(raw, attr, 42)
1445 except TypeError, msg:
1446 if str(msg).find('readonly') < 0:
1447 raise TestFailed("when setting readonly attr %r on a "
1448 "property, got unexpected TypeError "
1449 "msg %r" % (attr, str(msg)))
1450 else:
1451 raise TestFailed("expected TypeError from trying to set "
1452 "readonly %r attr on a property" % attr)
1453
Guido van Rossumc4a18802001-08-24 16:55:27 +00001454def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001455 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001456
1457 class A(object):
1458 def meth(self, a):
1459 return "A(%r)" % a
1460
Guido van Rossum45704552001-10-08 16:35:45 +00001461 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001462
1463 class B(A):
1464 def __init__(self):
1465 self.__super = super(B, self)
1466 def meth(self, a):
1467 return "B(%r)" % a + self.__super.meth(a)
1468
Guido van Rossum45704552001-10-08 16:35:45 +00001469 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001470
1471 class C(A):
1472 __dynamic__ = 1
1473 def meth(self, a):
1474 return "C(%r)" % a + self.__super.meth(a)
1475 C._C__super = super(C)
1476
Guido van Rossum45704552001-10-08 16:35:45 +00001477 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001478
1479 class D(C, B):
1480 def meth(self, a):
1481 return "D(%r)" % a + super(D, self).meth(a)
1482
1483 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1484
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001485def inherits():
1486 if verbose: print "Testing inheritance from basic types..."
1487
1488 class hexint(int):
1489 def __repr__(self):
1490 return hex(self)
1491 def __add__(self, other):
1492 return hexint(int.__add__(self, other))
1493 # (Note that overriding __radd__ doesn't work,
1494 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(repr(hexint(7) + 9), "0x10")
1496 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001497 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001498 vereq(a, 12345)
1499 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001500 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001501 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001502 verify((+a).__class__ is int)
1503 verify((a >> 0).__class__ is int)
1504 verify((a << 0).__class__ is int)
1505 verify((hexint(0) << 12).__class__ is int)
1506 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001507
1508 class octlong(long):
1509 __slots__ = []
1510 def __str__(self):
1511 s = oct(self)
1512 if s[-1] == 'L':
1513 s = s[:-1]
1514 return s
1515 def __add__(self, other):
1516 return self.__class__(super(octlong, self).__add__(other))
1517 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001518 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001519 # (Note that overriding __radd__ here only seems to work
1520 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001521 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001522 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001523 vereq(a, 12345L)
1524 vereq(long(a), 12345L)
1525 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001526 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001527 verify((+a).__class__ is long)
1528 verify((-a).__class__ is long)
1529 verify((-octlong(0)).__class__ is long)
1530 verify((a >> 0).__class__ is long)
1531 verify((a << 0).__class__ is long)
1532 verify((a - 0).__class__ is long)
1533 verify((a * 1).__class__ is long)
1534 verify((a ** 1).__class__ is long)
1535 verify((a // 1).__class__ is long)
1536 verify((1 * a).__class__ is long)
1537 verify((a | 0).__class__ is long)
1538 verify((a ^ 0).__class__ is long)
1539 verify((a & -1L).__class__ is long)
1540 verify((octlong(0) << 12).__class__ is long)
1541 verify((octlong(0) >> 12).__class__ is long)
1542 verify(abs(octlong(0)).__class__ is long)
1543
1544 # Because octlong overrides __add__, we can't check the absence of +0
1545 # optimizations using octlong.
1546 class longclone(long):
1547 pass
1548 a = longclone(1)
1549 verify((a + 0).__class__ is long)
1550 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001551
1552 class precfloat(float):
1553 __slots__ = ['prec']
1554 def __init__(self, value=0.0, prec=12):
1555 self.prec = int(prec)
1556 float.__init__(value)
1557 def __repr__(self):
1558 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001559 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001560 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001561 vereq(a, 12345.0)
1562 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001563 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001564 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001565 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001566
Tim Peters2400fa42001-09-12 19:12:49 +00001567 class madcomplex(complex):
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001568 __dynamic__ = 0 # XXX Shouldn't be necessary
Tim Peters2400fa42001-09-12 19:12:49 +00001569 def __repr__(self):
1570 return "%.17gj%+.17g" % (self.imag, self.real)
1571 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001572 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001573 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001574 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001575 vereq(a, base)
1576 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001577 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001578 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001579 vereq(repr(a), "4j-3")
1580 vereq(a, base)
1581 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001582 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001584 veris((+a).__class__, complex)
1585 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001586 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001587 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001588 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001589 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001590 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001591 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001592 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001593
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001594 class madtuple(tuple):
1595 _rev = None
1596 def rev(self):
1597 if self._rev is not None:
1598 return self._rev
1599 L = list(self)
1600 L.reverse()
1601 self._rev = self.__class__(L)
1602 return self._rev
1603 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001604 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1605 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1606 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001607 for i in range(512):
1608 t = madtuple(range(i))
1609 u = t.rev()
1610 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001611 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001612 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001613 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001614 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001615 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001616 verify(a[:].__class__ is tuple)
1617 verify((a * 1).__class__ is tuple)
1618 verify((a * 0).__class__ is tuple)
1619 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001620 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001621 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001622 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001623 verify((a + a).__class__ is tuple)
1624 verify((a * 0).__class__ is tuple)
1625 verify((a * 1).__class__ is tuple)
1626 verify((a * 2).__class__ is tuple)
1627 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001628
1629 class madstring(str):
1630 _rev = None
1631 def rev(self):
1632 if self._rev is not None:
1633 return self._rev
1634 L = list(self)
1635 L.reverse()
1636 self._rev = self.__class__("".join(L))
1637 return self._rev
1638 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001639 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1640 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1641 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001642 for i in range(256):
1643 s = madstring("".join(map(chr, range(i))))
1644 t = s.rev()
1645 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001646 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001647 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001648 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001649 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001650
Tim Peters8fa5dd02001-09-12 02:18:30 +00001651 base = "\x00" * 5
1652 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(s, base)
1654 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001655 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001656 vereq(hash(s), hash(base))
1657 vereq({s: 1}[base], 1)
1658 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001659 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001661 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001663 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001664 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001665 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001667 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001668 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001669 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001670 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001671 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001672 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001673 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001674 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001675 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001676 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001677 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001678 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001679 identitytab = ''.join([chr(i) for i in range(256)])
1680 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001682 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq(s.translate(identitytab, "x"), base)
1684 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001685 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001686 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001687 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001688 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001689 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001690 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001691 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001692 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001693 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001694 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001695
Tim Peters111f6092001-09-12 07:54:51 +00001696 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001697 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001698 verify(intern(s).__class__ is str)
1699 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001700 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001701
1702 i = intern("y x")
1703 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001704 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001705 verify(intern(s).__class__ is str)
1706 verify(intern(s) is i)
1707
1708 s = madstring(i)
1709 verify(intern(s).__class__ is str)
1710 verify(intern(s) is i)
1711
Guido van Rossum91ee7982001-08-30 20:52:40 +00001712 class madunicode(unicode):
1713 _rev = None
1714 def rev(self):
1715 if self._rev is not None:
1716 return self._rev
1717 L = list(self)
1718 L.reverse()
1719 self._rev = self.__class__(u"".join(L))
1720 return self._rev
1721 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001722 vereq(u, u"ABCDEF")
1723 vereq(u.rev(), madunicode(u"FEDCBA"))
1724 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001725 base = u"12345"
1726 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001727 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001728 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001729 vereq(hash(u), hash(base))
1730 vereq({u: 1}[base], 1)
1731 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001732 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001733 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001734 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001735 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001736 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001737 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001738 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001739 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001740 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001741 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001742 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001743 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001744 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001745 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001746 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001747 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001748 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001749 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001750 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001751 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001752 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001753 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001754 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001755 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001756 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001757 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001758 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001759 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001760 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001761 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001762 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001763 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001764 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001765 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001766 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001767 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001768 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001769 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001770
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001771 class sublist(list):
1772 pass
1773 a = sublist(range(5))
1774 vereq(a, range(5))
1775 a.append("hello")
1776 vereq(a, range(5) + ["hello"])
1777 a[5] = 5
1778 vereq(a, range(6))
1779 a.extend(range(6, 20))
1780 vereq(a, range(20))
1781 a[-5:] = []
1782 vereq(a, range(15))
1783 del a[10:15]
1784 vereq(len(a), 10)
1785 vereq(a, range(10))
1786 vereq(list(a), range(10))
1787 vereq(a[0], 0)
1788 vereq(a[9], 9)
1789 vereq(a[-10], 0)
1790 vereq(a[-1], 9)
1791 vereq(a[:5], range(5))
1792
Tim Peters59c9a642001-09-13 05:38:56 +00001793 class CountedInput(file):
1794 """Counts lines read by self.readline().
1795
1796 self.lineno is the 0-based ordinal of the last line read, up to
1797 a maximum of one greater than the number of lines in the file.
1798
1799 self.ateof is true if and only if the final "" line has been read,
1800 at which point self.lineno stops incrementing, and further calls
1801 to readline() continue to return "".
1802 """
1803
1804 lineno = 0
1805 ateof = 0
1806 def readline(self):
1807 if self.ateof:
1808 return ""
1809 s = file.readline(self)
1810 # Next line works too.
1811 # s = super(CountedInput, self).readline()
1812 self.lineno += 1
1813 if s == "":
1814 self.ateof = 1
1815 return s
1816
Tim Peters561f8992001-09-13 19:36:36 +00001817 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001818 lines = ['a\n', 'b\n', 'c\n']
1819 try:
1820 f.writelines(lines)
1821 f.close()
1822 f = CountedInput(TESTFN)
1823 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1824 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00001825 vereq(expected, got)
1826 vereq(f.lineno, i)
1827 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00001828 f.close()
1829 finally:
1830 try:
1831 f.close()
1832 except:
1833 pass
1834 try:
1835 import os
1836 os.unlink(TESTFN)
1837 except:
1838 pass
1839
Tim Peters808b94e2001-09-13 19:33:07 +00001840def keywords():
1841 if verbose:
1842 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00001843 vereq(int(x=1), 1)
1844 vereq(float(x=2), 2.0)
1845 vereq(long(x=3), 3L)
1846 vereq(complex(imag=42, real=666), complex(666, 42))
1847 vereq(str(object=500), '500')
1848 vereq(unicode(string='abc', errors='strict'), u'abc')
1849 vereq(tuple(sequence=range(3)), (0, 1, 2))
1850 vereq(list(sequence=(0, 1, 2)), range(3))
1851 vereq(dictionary(mapping={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00001852
1853 for constructor in (int, float, long, complex, str, unicode,
1854 tuple, list, dictionary, file):
1855 try:
1856 constructor(bogus_keyword_arg=1)
1857 except TypeError:
1858 pass
1859 else:
1860 raise TestFailed("expected TypeError from bogus keyword "
1861 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001862
Tim Peters8fa45672001-09-13 21:01:29 +00001863def restricted():
1864 import rexec
1865 if verbose:
1866 print "Testing interaction with restricted execution ..."
1867
1868 sandbox = rexec.RExec()
1869
1870 code1 = """f = open(%r, 'w')""" % TESTFN
1871 code2 = """f = file(%r, 'w')""" % TESTFN
1872 code3 = """\
1873f = open(%r)
1874t = type(f) # a sneaky way to get the file() constructor
1875f.close()
1876f = t(%r, 'w') # rexec can't catch this by itself
1877""" % (TESTFN, TESTFN)
1878
1879 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1880 f.close()
1881
1882 try:
1883 for code in code1, code2, code3:
1884 try:
1885 sandbox.r_exec(code)
1886 except IOError, msg:
1887 if str(msg).find("restricted") >= 0:
1888 outcome = "OK"
1889 else:
1890 outcome = "got an exception, but not an expected one"
1891 else:
1892 outcome = "expected a restricted-execution exception"
1893
1894 if outcome != "OK":
1895 raise TestFailed("%s, in %r" % (outcome, code))
1896
1897 finally:
1898 try:
1899 import os
1900 os.unlink(TESTFN)
1901 except:
1902 pass
1903
Tim Peters0ab085c2001-09-14 00:25:33 +00001904def str_subclass_as_dict_key():
1905 if verbose:
1906 print "Testing a str subclass used as dict key .."
1907
1908 class cistr(str):
1909 """Sublcass of str that computes __eq__ case-insensitively.
1910
1911 Also computes a hash code of the string in canonical form.
1912 """
1913
1914 def __init__(self, value):
1915 self.canonical = value.lower()
1916 self.hashcode = hash(self.canonical)
1917
1918 def __eq__(self, other):
1919 if not isinstance(other, cistr):
1920 other = cistr(other)
1921 return self.canonical == other.canonical
1922
1923 def __hash__(self):
1924 return self.hashcode
1925
Guido van Rossum45704552001-10-08 16:35:45 +00001926 vereq(cistr('ABC'), 'abc')
1927 vereq('aBc', cistr('ABC'))
1928 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00001929
1930 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00001931 vereq(d[cistr('one')], 1)
1932 vereq(d[cistr('tWo')], 2)
1933 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001934 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001936
Guido van Rossumab3b0342001-09-18 20:38:53 +00001937def classic_comparisons():
1938 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00001939 class classic:
1940 pass
1941 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00001942 if verbose: print " (base = %s)" % base
1943 class C(base):
1944 def __init__(self, value):
1945 self.value = int(value)
1946 def __cmp__(self, other):
1947 if isinstance(other, C):
1948 return cmp(self.value, other.value)
1949 if isinstance(other, int) or isinstance(other, long):
1950 return cmp(self.value, other)
1951 return NotImplemented
1952 c1 = C(1)
1953 c2 = C(2)
1954 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00001955 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00001956 c = {1: c1, 2: c2, 3: c3}
1957 for x in 1, 2, 3:
1958 for y in 1, 2, 3:
1959 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1960 for op in "<", "<=", "==", "!=", ">", ">=":
1961 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
1962 "x=%d, y=%d" % (x, y))
1963 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
1964 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1965
Guido van Rossum0639f592001-09-18 21:06:04 +00001966def rich_comparisons():
1967 if verbose:
1968 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00001969 class Z(complex):
Guido van Rossum751c4c82001-09-29 00:40:25 +00001970 __dynamic__ = 0
Guido van Rossum22056422001-09-24 17:52:04 +00001971 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001972 vereq(z, 1+0j)
1973 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00001974 class ZZ(complex):
Guido van Rossum751c4c82001-09-29 00:40:25 +00001975 __dynamic__ = 0
Guido van Rossum22056422001-09-24 17:52:04 +00001976 def __eq__(self, other):
1977 try:
1978 return abs(self - other) <= 1e-6
1979 except:
1980 return NotImplemented
1981 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00001982 vereq(zz, 1+0j)
1983 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00001984
Guido van Rossum0639f592001-09-18 21:06:04 +00001985 class classic:
1986 pass
1987 for base in (classic, int, object, list):
1988 if verbose: print " (base = %s)" % base
1989 class C(base):
1990 def __init__(self, value):
1991 self.value = int(value)
1992 def __cmp__(self, other):
1993 raise TestFailed, "shouldn't call __cmp__"
1994 def __eq__(self, other):
1995 if isinstance(other, C):
1996 return self.value == other.value
1997 if isinstance(other, int) or isinstance(other, long):
1998 return self.value == other
1999 return NotImplemented
2000 def __ne__(self, other):
2001 if isinstance(other, C):
2002 return self.value != other.value
2003 if isinstance(other, int) or isinstance(other, long):
2004 return self.value != other
2005 return NotImplemented
2006 def __lt__(self, other):
2007 if isinstance(other, C):
2008 return self.value < other.value
2009 if isinstance(other, int) or isinstance(other, long):
2010 return self.value < other
2011 return NotImplemented
2012 def __le__(self, other):
2013 if isinstance(other, C):
2014 return self.value <= other.value
2015 if isinstance(other, int) or isinstance(other, long):
2016 return self.value <= other
2017 return NotImplemented
2018 def __gt__(self, other):
2019 if isinstance(other, C):
2020 return self.value > other.value
2021 if isinstance(other, int) or isinstance(other, long):
2022 return self.value > other
2023 return NotImplemented
2024 def __ge__(self, other):
2025 if isinstance(other, C):
2026 return self.value >= other.value
2027 if isinstance(other, int) or isinstance(other, long):
2028 return self.value >= other
2029 return NotImplemented
2030 c1 = C(1)
2031 c2 = C(2)
2032 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002033 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002034 c = {1: c1, 2: c2, 3: c3}
2035 for x in 1, 2, 3:
2036 for y in 1, 2, 3:
2037 for op in "<", "<=", "==", "!=", ">", ">=":
2038 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2039 "x=%d, y=%d" % (x, y))
2040 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2041 "x=%d, y=%d" % (x, y))
2042 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2043 "x=%d, y=%d" % (x, y))
2044
Guido van Rossum1952e382001-09-19 01:25:16 +00002045def coercions():
2046 if verbose: print "Testing coercions..."
2047 class I(int): pass
2048 coerce(I(0), 0)
2049 coerce(0, I(0))
2050 class L(long): pass
2051 coerce(L(0), 0)
2052 coerce(L(0), 0L)
2053 coerce(0, L(0))
2054 coerce(0L, L(0))
2055 class F(float): pass
2056 coerce(F(0), 0)
2057 coerce(F(0), 0L)
2058 coerce(F(0), 0.)
2059 coerce(0, F(0))
2060 coerce(0L, F(0))
2061 coerce(0., F(0))
Guido van Rossum751c4c82001-09-29 00:40:25 +00002062 class C(complex):
2063 __dynamic__ = 0
Guido van Rossum1952e382001-09-19 01:25:16 +00002064 coerce(C(0), 0)
2065 coerce(C(0), 0L)
2066 coerce(C(0), 0.)
2067 coerce(C(0), 0j)
2068 coerce(0, C(0))
2069 coerce(0L, C(0))
2070 coerce(0., C(0))
2071 coerce(0j, C(0))
2072
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002073def descrdoc():
2074 if verbose: print "Testing descriptor doc strings..."
2075 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002076 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002077 check(file.closed, "flag set if the file is closed") # getset descriptor
2078 check(file.name, "file name") # member descriptor
2079
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002080def setclass():
2081 if verbose: print "Testing __class__ assignment..."
2082 class C(object): pass
2083 class D(object): pass
2084 class E(object): pass
2085 class F(D, E): pass
2086 for cls in C, D, E, F:
2087 for cls2 in C, D, E, F:
2088 x = cls()
2089 x.__class__ = cls2
2090 verify(x.__class__ is cls2)
2091 x.__class__ = cls
2092 verify(x.__class__ is cls)
2093 def cant(x, C):
2094 try:
2095 x.__class__ = C
2096 except TypeError:
2097 pass
2098 else:
2099 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2100 cant(C(), list)
2101 cant(list(), C)
2102 cant(C(), 1)
2103 cant(C(), object)
2104 cant(object(), list)
2105 cant(list(), object)
2106
Guido van Rossum3926a632001-09-25 16:25:58 +00002107def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002108 if verbose:
2109 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002110 import pickle, cPickle
2111
2112 def sorteditems(d):
2113 L = d.items()
2114 L.sort()
2115 return L
2116
2117 global C
2118 class C(object):
2119 def __init__(self, a, b):
2120 super(C, self).__init__()
2121 self.a = a
2122 self.b = b
2123 def __repr__(self):
2124 return "C(%r, %r)" % (self.a, self.b)
2125
2126 global C1
2127 class C1(list):
2128 def __new__(cls, a, b):
2129 return super(C1, cls).__new__(cls)
2130 def __init__(self, a, b):
2131 self.a = a
2132 self.b = b
2133 def __repr__(self):
2134 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2135
2136 global C2
2137 class C2(int):
2138 def __new__(cls, a, b, val=0):
2139 return super(C2, cls).__new__(cls, val)
2140 def __init__(self, a, b, val=0):
2141 self.a = a
2142 self.b = b
2143 def __repr__(self):
2144 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2145
2146 for p in pickle, cPickle:
2147 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002148 if verbose:
2149 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002150
2151 for cls in C, C1, C2:
2152 s = p.dumps(cls, bin)
2153 cls2 = p.loads(s)
2154 verify(cls2 is cls)
2155
2156 a = C1(1, 2); a.append(42); a.append(24)
2157 b = C2("hello", "world", 42)
2158 s = p.dumps((a, b), bin)
2159 x, y = p.loads(s)
2160 assert x.__class__ == a.__class__
2161 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2162 assert y.__class__ == b.__class__
2163 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2164 assert `x` == `a`
2165 assert `y` == `b`
2166 if verbose:
2167 print "a = x =", a
2168 print "b = y =", b
2169
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002170 # Testing copy.deepcopy()
2171 if verbose:
2172 print "deepcopy"
2173 import copy
2174 for cls in C, C1, C2:
2175 cls2 = copy.deepcopy(cls)
2176 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002177
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002178 a = C1(1, 2); a.append(42); a.append(24)
2179 b = C2("hello", "world", 42)
2180 x, y = copy.deepcopy((a, b))
2181 assert x.__class__ == a.__class__
2182 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2183 assert y.__class__ == b.__class__
2184 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2185 assert `x` == `a`
2186 assert `y` == `b`
2187 if verbose:
2188 print "a = x =", a
2189 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002190
2191def copies():
2192 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2193 import copy
2194 class C(object):
2195 pass
2196
2197 a = C()
2198 a.foo = 12
2199 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002201
2202 a.bar = [1,2,3]
2203 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002204 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002205 verify(c.bar is a.bar)
2206
2207 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002208 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002209 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002210 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002211
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002212def binopoverride():
2213 if verbose: print "Testing overrides of binary operations..."
2214 class I(int):
2215 def __repr__(self):
2216 return "I(%r)" % int(self)
2217 def __add__(self, other):
2218 return I(int(self) + int(other))
2219 __radd__ = __add__
2220 def __pow__(self, other, mod=None):
2221 if mod is None:
2222 return I(pow(int(self), int(other)))
2223 else:
2224 return I(pow(int(self), int(other), int(mod)))
2225 def __rpow__(self, other, mod=None):
2226 if mod is None:
2227 return I(pow(int(other), int(self), mod))
2228 else:
2229 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002230
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002231 vereq(`I(1) + I(2)`, "I(3)")
2232 vereq(`I(1) + 2`, "I(3)")
2233 vereq(`1 + I(2)`, "I(3)")
2234 vereq(`I(2) ** I(3)`, "I(8)")
2235 vereq(`2 ** I(3)`, "I(8)")
2236 vereq(`I(2) ** 3`, "I(8)")
2237 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2238 class S(str):
2239 def __eq__(self, other):
2240 return self.lower() == other.lower()
2241
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002242def subclasspropagation():
2243 if verbose: print "Testing propagation of slot functions to subclasses..."
2244 class A(object):
2245 pass
2246 class B(A):
2247 pass
2248 class C(A):
2249 pass
2250 class D(B, C):
2251 pass
2252 d = D()
2253 vereq(hash(d), id(d))
2254 A.__hash__ = lambda self: 42
2255 vereq(hash(d), 42)
2256 C.__hash__ = lambda self: 314
2257 vereq(hash(d), 314)
2258 B.__hash__ = lambda self: 144
2259 vereq(hash(d), 144)
2260 D.__hash__ = lambda self: 100
2261 vereq(hash(d), 100)
2262 del D.__hash__
2263 vereq(hash(d), 144)
2264 del B.__hash__
2265 vereq(hash(d), 314)
2266 del C.__hash__
2267 vereq(hash(d), 42)
2268 del A.__hash__
2269 vereq(hash(d), id(d))
2270 d.foo = 42
2271 d.bar = 42
2272 vereq(d.foo, 42)
2273 vereq(d.bar, 42)
2274 def __getattribute__(self, name):
2275 if name == "foo":
2276 return 24
2277 return object.__getattribute__(self, name)
2278 A.__getattribute__ = __getattribute__
2279 vereq(d.foo, 24)
2280 vereq(d.bar, 42)
2281 def __getattr__(self, name):
2282 if name in ("spam", "foo", "bar"):
2283 return "hello"
2284 raise AttributeError, name
2285 B.__getattr__ = __getattr__
2286 vereq(d.spam, "hello")
2287 vereq(d.foo, 24)
2288 vereq(d.bar, 42)
2289 del A.__getattribute__
2290 vereq(d.foo, 42)
2291 del d.foo
2292 vereq(d.foo, "hello")
2293 vereq(d.bar, 42)
2294 del B.__getattr__
2295 try:
2296 d.foo
2297 except AttributeError:
2298 pass
2299 else:
2300 raise TestFailed, "d.foo should be undefined now"
2301
Tim Peters0ab085c2001-09-14 00:25:33 +00002302
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002303def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002304 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002305 lists()
2306 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002307 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002308 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002309 ints()
2310 longs()
2311 floats()
2312 complexes()
2313 spamlists()
2314 spamdicts()
2315 pydicts()
2316 pylists()
2317 metaclass()
2318 pymods()
2319 multi()
2320 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002321 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002322 slots()
2323 dynamics()
2324 errors()
2325 classmethods()
2326 staticmethods()
2327 classic()
2328 compattr()
2329 newslot()
2330 altmro()
2331 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002332 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002333 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002334 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002335 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002336 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002337 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002338 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002339 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002340 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002341 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002342 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002343 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002344 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002345 setclass()
Guido van Rossum3926a632001-09-25 16:25:58 +00002346 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002347 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002348 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002349 subclasspropagation()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002350 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002351
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002352if __name__ == "__main__":
2353 test_main()