blob: c9235c8b0e5aa65eee9285cf77795c2a03cbc8d9 [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 Rossum2f3ca6e2001-10-15 21:05:10 +000020 while meth not in t.__dict__:
21 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000022 vereq(m, t.__dict__[meth])
23 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000024 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000025 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000026
27def testbinop(a, b, res, expr="a+b", meth="__add__"):
28 if verbose: print "checking", expr
29 dict = {'a': a, 'b': b}
Guido van Rossum45704552001-10-08 16:35:45 +000030 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000031 t = type(a)
32 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000033 while meth not in t.__dict__:
34 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000035 vereq(m, t.__dict__[meth])
36 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000038 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039
40def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
41 if verbose: print "checking", expr
42 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000043 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 t = type(a)
45 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000046 while meth not in t.__dict__:
47 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000048 vereq(m, t.__dict__[meth])
49 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000051 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052
53def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
54 if verbose: print "checking", stmt
55 dict = {'a': deepcopy(a), 'b': b}
56 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058 t = type(a)
59 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000060 while meth not in t.__dict__:
61 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000062 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000063 dict['a'] = deepcopy(a)
64 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000065 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066 dict['a'] = deepcopy(a)
67 bm = getattr(dict['a'], meth)
68 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000069 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000070
71def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
72 if verbose: print "checking", stmt
73 dict = {'a': deepcopy(a), 'b': b, 'c': c}
74 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076 t = type(a)
77 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000078 while meth not in t.__dict__:
79 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000080 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000081 dict['a'] = deepcopy(a)
82 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000083 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000084 dict['a'] = deepcopy(a)
85 bm = getattr(dict['a'], meth)
86 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000087 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000088
89def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
90 if verbose: print "checking", stmt
91 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
92 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000095 while meth not in t.__dict__:
96 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000097 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000098 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000099 dict['a'] = deepcopy(a)
100 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000101 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000102 dict['a'] = deepcopy(a)
103 bm = getattr(dict['a'], meth)
104 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000105 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106
Tim Peters2f93e282001-10-04 05:27:00 +0000107def class_docstrings():
108 class Classic:
109 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000110 vereq(Classic.__doc__, "A classic docstring.")
111 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000112
113 class Classic2:
114 pass
115 verify(Classic2.__doc__ is None)
116
Tim Peters4fb1fe82001-10-04 05:48:13 +0000117 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000118 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000119 vereq(NewStatic.__doc__, "Another docstring.")
120 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000121
Tim Peters4fb1fe82001-10-04 05:48:13 +0000122 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000123 pass
124 verify(NewStatic2.__doc__ is None)
125
Tim Peters4fb1fe82001-10-04 05:48:13 +0000126 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000127 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000128 vereq(NewDynamic.__doc__, "Another docstring.")
129 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000130
Tim Peters4fb1fe82001-10-04 05:48:13 +0000131 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000132 pass
133 verify(NewDynamic2.__doc__ is None)
134
Tim Peters6d6c1a32001-08-02 04:15:00 +0000135def lists():
136 if verbose: print "Testing list operations..."
137 testbinop([1], [2], [1,2], "a+b", "__add__")
138 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
139 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
140 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
141 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
142 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
143 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
144 testunop([1,2,3], 3, "len(a)", "__len__")
145 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
146 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
147 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
148 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
149
150def dicts():
151 if verbose: print "Testing dict operations..."
152 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
153 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
154 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
155 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
156 d = {1:2,3:4}
157 l1 = []
158 for i in d.keys(): l1.append(i)
159 l = []
160 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000161 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000162 l = []
163 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000164 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000165 l = []
166 for i in dictionary.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 d = {1:2, 3:4}
169 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(eval(repr(d), {}), d)
171 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000172 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
173
Tim Peters25786c02001-09-02 08:22:48 +0000174def dict_constructor():
175 if verbose:
176 print "Testing dictionary constructor ..."
177 d = dictionary()
Guido van Rossum45704552001-10-08 16:35:45 +0000178 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000179 d = dictionary({})
Guido van Rossum45704552001-10-08 16:35:45 +0000180 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000181 d = dictionary(mapping={})
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000183 d = dictionary({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {1: 2, 'a': 'b'})
Tim Peters25786c02001-09-02 08:22:48 +0000185 for badarg in 0, 0L, 0j, "0", [0], (0,):
186 try:
187 dictionary(badarg)
188 except TypeError:
189 pass
190 else:
191 raise TestFailed("no TypeError from dictionary(%r)" % badarg)
192 try:
193 dictionary(senseless={})
194 except TypeError:
195 pass
196 else:
197 raise TestFailed("no TypeError from dictionary(senseless={}")
198
199 try:
200 dictionary({}, {})
201 except TypeError:
202 pass
203 else:
204 raise TestFailed("no TypeError from dictionary({}, {})")
205
206 class Mapping:
207 dict = {1:2, 3:4, 'a':1j}
208
209 def __getitem__(self, i):
210 return self.dict[i]
211
212 try:
213 dictionary(Mapping())
214 except TypeError:
215 pass
216 else:
217 raise TestFailed("no TypeError from dictionary(incomplete mapping)")
218
219 Mapping.keys = lambda self: self.dict.keys()
220 d = dictionary(mapping=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000221 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000222
Tim Peters5d2b77c2001-09-03 05:47:38 +0000223def test_dir():
224 if verbose:
225 print "Testing dir() ..."
226 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000227 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000228 del junk
229
230 # Just make sure these don't blow up!
231 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
232 dir(arg)
233
Tim Peters37a309d2001-09-04 01:20:04 +0000234 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000235 class C:
236 Cdata = 1
237 def Cmethod(self): pass
238
239 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000240 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000241 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000242
243 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000244 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000245
246 c.cdata = 2
247 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000248 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000249 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000250
251 class A(C):
252 Adata = 1
253 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000254
Tim Peters37a309d2001-09-04 01:20:04 +0000255 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000256 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000257 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000258 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000259 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000260 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000261 a.adata = 42
262 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000263 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000264
265 # The same, but with new-style classes. Since these have object as a
266 # base class, a lot more gets sucked in.
267 def interesting(strings):
268 return [s for s in strings if not s.startswith('_')]
269
Tim Peters5d2b77c2001-09-03 05:47:38 +0000270 class C(object):
271 Cdata = 1
272 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000273
274 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000275 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000276
277 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000278 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000279 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000280
281 c.cdata = 2
282 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000284 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000285
Tim Peters5d2b77c2001-09-03 05:47:38 +0000286 class A(C):
287 Adata = 1
288 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000289
290 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000291 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000292 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000293 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000294 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000295 a.adata = 42
296 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000297 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000298 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000299
Tim Peterscaaff8d2001-09-10 23:12:14 +0000300 # Try a module subclass.
301 import sys
302 class M(type(sys)):
303 pass
304 minstance = M()
305 minstance.b = 2
306 minstance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000307 vereq(dir(minstance), ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000308
309 class M2(M):
310 def getdict(self):
311 return "Not a dict!"
312 __dict__ = property(getdict)
313
314 m2instance = M2()
315 m2instance.b = 2
316 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000317 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000318 try:
319 dir(m2instance)
320 except TypeError:
321 pass
322
Tim Peters6d6c1a32001-08-02 04:15:00 +0000323binops = {
324 'add': '+',
325 'sub': '-',
326 'mul': '*',
327 'div': '/',
328 'mod': '%',
329 'divmod': 'divmod',
330 'pow': '**',
331 'lshift': '<<',
332 'rshift': '>>',
333 'and': '&',
334 'xor': '^',
335 'or': '|',
336 'cmp': 'cmp',
337 'lt': '<',
338 'le': '<=',
339 'eq': '==',
340 'ne': '!=',
341 'gt': '>',
342 'ge': '>=',
343 }
344
345for name, expr in binops.items():
346 if expr.islower():
347 expr = expr + "(a, b)"
348 else:
349 expr = 'a %s b' % expr
350 binops[name] = expr
351
352unops = {
353 'pos': '+',
354 'neg': '-',
355 'abs': 'abs',
356 'invert': '~',
357 'int': 'int',
358 'long': 'long',
359 'float': 'float',
360 'oct': 'oct',
361 'hex': 'hex',
362 }
363
364for name, expr in unops.items():
365 if expr.islower():
366 expr = expr + "(a)"
367 else:
368 expr = '%s a' % expr
369 unops[name] = expr
370
371def numops(a, b, skip=[]):
372 dict = {'a': a, 'b': b}
373 for name, expr in binops.items():
374 if name not in skip:
375 name = "__%s__" % name
376 if hasattr(a, name):
377 res = eval(expr, dict)
378 testbinop(a, b, res, expr, name)
379 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000380 if name not in skip:
381 name = "__%s__" % name
382 if hasattr(a, name):
383 res = eval(expr, dict)
384 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000385
386def ints():
387 if verbose: print "Testing int operations..."
388 numops(100, 3)
389
390def longs():
391 if verbose: print "Testing long operations..."
392 numops(100L, 3L)
393
394def floats():
395 if verbose: print "Testing float operations..."
396 numops(100.0, 3.0)
397
398def complexes():
399 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000400 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000401 class Number(complex):
402 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000403 def __new__(cls, *args, **kwds):
404 result = complex.__new__(cls, *args)
405 result.prec = kwds.get('prec', 12)
406 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000407 def __repr__(self):
408 prec = self.prec
409 if self.imag == 0.0:
410 return "%.*g" % (prec, self.real)
411 if self.real == 0.0:
412 return "%.*gj" % (prec, self.imag)
413 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
414 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000415
Tim Peters6d6c1a32001-08-02 04:15:00 +0000416 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000417 vereq(`a`, "3.14")
418 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000419
Tim Peters3f996e72001-09-13 19:18:27 +0000420 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000421 vereq(`a`, "3.1")
422 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000423
424 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000425 vereq(`a`, "234.5")
426 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000427
Tim Peters6d6c1a32001-08-02 04:15:00 +0000428def spamlists():
429 if verbose: print "Testing spamlist operations..."
430 import copy, xxsubtype as spam
431 def spamlist(l, memo=None):
432 import xxsubtype as spam
433 return spam.spamlist(l)
434 # This is an ugly hack:
435 copy._deepcopy_dispatch[spam.spamlist] = spamlist
436
437 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
438 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
439 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
440 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
441 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
442 "a[b:c]", "__getslice__")
443 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
444 "a+=b", "__iadd__")
445 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
446 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
447 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
448 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
449 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
450 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
451 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
452 # Test subclassing
453 class C(spam.spamlist):
454 def foo(self): return 1
455 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000456 vereq(a, [])
457 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000458 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000459 vereq(a, [100])
460 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000461 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000462 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463
464def spamdicts():
465 if verbose: print "Testing spamdict operations..."
466 import copy, xxsubtype as spam
467 def spamdict(d, memo=None):
468 import xxsubtype as spam
469 sd = spam.spamdict()
470 for k, v in d.items(): sd[k] = v
471 return sd
472 # This is an ugly hack:
473 copy._deepcopy_dispatch[spam.spamdict] = spamdict
474
475 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
476 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
477 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
478 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
479 d = spamdict({1:2,3:4})
480 l1 = []
481 for i in d.keys(): l1.append(i)
482 l = []
483 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000484 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000485 l = []
486 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000487 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000488 l = []
489 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000490 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000491 straightd = {1:2, 3:4}
492 spamd = spamdict(straightd)
493 testunop(spamd, 2, "len(a)", "__len__")
494 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
495 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
496 "a[b]=c", "__setitem__")
497 # Test subclassing
498 class C(spam.spamdict):
499 def foo(self): return 1
500 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000501 vereq(a.items(), [])
502 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000503 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000504 vereq(a.items(), [('foo', 'bar')])
505 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000507 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000508
509def pydicts():
510 if verbose: print "Testing Python subclass of dict..."
511 verify(issubclass(dictionary, dictionary))
512 verify(isinstance({}, dictionary))
513 d = dictionary()
Guido van Rossum45704552001-10-08 16:35:45 +0000514 vereq(d, {})
Tim Peters6d6c1a32001-08-02 04:15:00 +0000515 verify(d.__class__ is dictionary)
516 verify(isinstance(d, dictionary))
517 class C(dictionary):
518 state = -1
519 def __init__(self, *a, **kw):
520 if a:
521 assert len(a) == 1
522 self.state = a[0]
523 if kw:
524 for k, v in kw.items(): self[v] = k
525 def __getitem__(self, key):
526 return self.get(key, 0)
527 def __setitem__(self, key, value):
528 assert isinstance(key, type(0))
529 dictionary.__setitem__(self, key, value)
530 def setstate(self, state):
531 self.state = state
532 def getstate(self):
533 return self.state
534 verify(issubclass(C, dictionary))
535 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000536 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000537 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000538 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000539 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000540 vereq(a.state, -1)
541 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000542 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000543 vereq(a.state, 0)
544 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000545 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000546 vereq(a.state, 10)
547 vereq(a.getstate(), 10)
548 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551 if verbose: print "pydict stress test ..."
552 N = 50
553 for i in range(N):
554 a[i] = C()
555 for j in range(N):
556 a[i][j] = i*j
557 for i in range(N):
558 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000559 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000560
561def pylists():
562 if verbose: print "Testing Python subclass of list..."
563 class C(list):
564 def __getitem__(self, i):
565 return list.__getitem__(self, i) + 100
566 def __getslice__(self, i, j):
567 return (i, j)
568 a = C()
569 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000570 vereq(a[0], 100)
571 vereq(a[1], 101)
572 vereq(a[2], 102)
573 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574
575def metaclass():
576 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 class C:
578 __metaclass__ = type
579 def __init__(self):
580 self.__state = 0
581 def getstate(self):
582 return self.__state
583 def setstate(self, state):
584 self.__state = state
585 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000587 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000588 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 class D:
590 class __metaclass__(type):
591 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000592 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000593 d = D()
594 verify(d.__class__ is D)
595 class M1(type):
596 def __new__(cls, name, bases, dict):
597 dict['__spam__'] = 1
598 return type.__new__(cls, name, bases, dict)
599 class C:
600 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000601 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000602 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000603 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000604
Guido van Rossum309b5662001-08-17 11:43:17 +0000605 class _instance(object):
606 pass
607 class M2(object):
608 def __new__(cls, name, bases, dict):
609 self = object.__new__(cls)
610 self.name = name
611 self.bases = bases
612 self.dict = dict
613 return self
614 __new__ = staticmethod(__new__)
615 def __call__(self):
616 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000617 # Early binding of methods
618 for key in self.dict:
619 if key.startswith("__"):
620 continue
621 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000622 return it
623 class C:
624 __metaclass__ = M2
625 def spam(self):
626 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000627 vereq(C.name, 'C')
628 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000629 verify('spam' in C.dict)
630 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000631 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000632
Guido van Rossum91ee7982001-08-30 20:52:40 +0000633 # More metaclass examples
634
635 class autosuper(type):
636 # Automatically add __super to the class
637 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000638 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000639 cls = super(autosuper, metaclass).__new__(metaclass,
640 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000641 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000642 while name[:1] == "_":
643 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000644 if name:
645 name = "_%s__super" % name
646 else:
647 name = "__super"
648 setattr(cls, name, super(cls))
649 return cls
650 class A:
651 __metaclass__ = autosuper
652 def meth(self):
653 return "A"
654 class B(A):
655 def meth(self):
656 return "B" + self.__super.meth()
657 class C(A):
658 def meth(self):
659 return "C" + self.__super.meth()
660 class D(C, B):
661 def meth(self):
662 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000663 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000664 class E(B, C):
665 def meth(self):
666 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000667 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000668
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000669 class autoproperty(type):
670 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000671 # named _get_x and/or _set_x are found
672 def __new__(metaclass, name, bases, dict):
673 hits = {}
674 for key, val in dict.iteritems():
675 if key.startswith("_get_"):
676 key = key[5:]
677 get, set = hits.get(key, (None, None))
678 get = val
679 hits[key] = get, set
680 elif key.startswith("_set_"):
681 key = key[5:]
682 get, set = hits.get(key, (None, None))
683 set = val
684 hits[key] = get, set
685 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000686 dict[key] = property(get, set)
687 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000688 name, bases, dict)
689 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000690 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000691 def _get_x(self):
692 return -self.__x
693 def _set_x(self, x):
694 self.__x = -x
695 a = A()
696 verify(not hasattr(a, "x"))
697 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000698 vereq(a.x, 12)
699 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000700
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000701 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000702 # Merge of multiple cooperating metaclasses
703 pass
704 class A:
705 __metaclass__ = multimetaclass
706 def _get_x(self):
707 return "A"
708 class B(A):
709 def _get_x(self):
710 return "B" + self.__super._get_x()
711 class C(A):
712 def _get_x(self):
713 return "C" + self.__super._get_x()
714 class D(C, B):
715 def _get_x(self):
716 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000717 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000718
Tim Peters6d6c1a32001-08-02 04:15:00 +0000719def pymods():
720 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000722 import sys
723 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000724 class MM(MT):
725 def __init__(self):
726 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000727 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000728 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000729 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000730 def __setattr__(self, name, value):
731 log.append(("setattr", name, value))
732 MT.__setattr__(self, name, value)
733 def __delattr__(self, name):
734 log.append(("delattr", name))
735 MT.__delattr__(self, name)
736 a = MM()
737 a.foo = 12
738 x = a.foo
739 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000740 vereq(log, [("setattr", "foo", 12),
741 ("getattr", "foo"),
742 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000743
744def multi():
745 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000746 class C(object):
747 def __init__(self):
748 self.__state = 0
749 def getstate(self):
750 return self.__state
751 def setstate(self, state):
752 self.__state = state
753 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000754 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000755 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000756 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000757 class D(dictionary, C):
758 def __init__(self):
759 type({}).__init__(self)
760 C.__init__(self)
761 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000762 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000763 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000764 vereq(d.items(), [("hello", "world")])
765 vereq(d["hello"], "world")
766 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000767 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000768 vereq(d.getstate(), 10)
769 vereq(D.__mro__, (D, dictionary, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000770
Guido van Rossume45763a2001-08-10 21:28:46 +0000771 # SF bug #442833
772 class Node(object):
773 def __int__(self):
774 return int(self.foo())
775 def foo(self):
776 return "23"
777 class Frag(Node, list):
778 def foo(self):
779 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000780 vereq(Node().__int__(), 23)
781 vereq(int(Node()), 23)
782 vereq(Frag().__int__(), 42)
783 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000784
Tim Peters6d6c1a32001-08-02 04:15:00 +0000785def diamond():
786 if verbose: print "Testing multiple inheritance special cases..."
787 class A(object):
788 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000789 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790 class B(A):
791 def boo(self): return "B"
792 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000793 vereq(B().spam(), "B")
794 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795 class C(A):
796 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000797 vereq(C().spam(), "A")
798 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000800 vereq(D().spam(), "B")
801 vereq(D().boo(), "B")
802 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000804 vereq(E().spam(), "B")
805 vereq(E().boo(), "C")
806 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000808 vereq(F().spam(), "B")
809 vereq(F().boo(), "B")
810 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000811 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000812 vereq(G().spam(), "B")
813 vereq(G().boo(), "C")
814 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000815
Guido van Rossum37202612001-08-09 19:45:21 +0000816def objects():
817 if verbose: print "Testing object class..."
818 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000819 vereq(a.__class__, object)
820 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000821 b = object()
822 verify(a is not b)
823 verify(not hasattr(a, "foo"))
824 try:
825 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000826 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000827 pass
828 else:
829 verify(0, "object() should not allow setting a foo attribute")
830 verify(not hasattr(object(), "__dict__"))
831
832 class Cdict(object):
833 pass
834 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000835 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000836 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000837 vereq(x.foo, 1)
838 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000839
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840def slots():
841 if verbose: print "Testing __slots__..."
842 class C0(object):
843 __slots__ = []
844 x = C0()
845 verify(not hasattr(x, "__dict__"))
846 verify(not hasattr(x, "foo"))
847
848 class C1(object):
849 __slots__ = ['a']
850 x = C1()
851 verify(not hasattr(x, "__dict__"))
Guido van Rossum45704552001-10-08 16:35:45 +0000852 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000854 vereq(x.a, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855 del x.a
Guido van Rossum45704552001-10-08 16:35:45 +0000856 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000857
858 class C3(object):
859 __slots__ = ['a', 'b', 'c']
860 x = C3()
861 verify(not hasattr(x, "__dict__"))
862 verify(x.a is None)
863 verify(x.b is None)
864 verify(x.c is None)
865 x.a = 1
866 x.b = 2
867 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +0000868 vereq(x.a, 1)
869 vereq(x.b, 2)
870 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000871
872def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000873 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000876 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000877 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000878 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +0000880 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000881 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000882 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +0000883 vereq(E.foo, 1)
884 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000885 # Test dynamic instances
886 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000887 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000888 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000889 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000890 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +0000891 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000892 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +0000893 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000894 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +0000895 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000896 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +0000897 vereq(int(a), 100)
898 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +0000899 verify(not hasattr(a, "spam"))
900 def mygetattr(self, name):
901 if name == "spam":
902 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +0000903 raise AttributeError
904 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +0000905 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +0000906 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000907 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +0000908 def mysetattr(self, name, value):
909 if name == "spam":
910 raise AttributeError
911 return object.__setattr__(self, name, value)
912 C.__setattr__ = mysetattr
913 try:
914 a.spam = "not spam"
915 except AttributeError:
916 pass
917 else:
918 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +0000919 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000920 class D(C):
921 pass
922 d = D()
923 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000924 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000925
Guido van Rossum7e35d572001-09-15 03:14:32 +0000926 # Test handling of int*seq and seq*int
927 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000928 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000929 vereq("a"*I(2), "aa")
930 vereq(I(2)*"a", "aa")
931 vereq(2*I(3), 6)
932 vereq(I(3)*2, 6)
933 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000934
935 # Test handling of long*seq and seq*long
936 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000937 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000938 vereq("a"*L(2L), "aa")
939 vereq(L(2L)*"a", "aa")
940 vereq(2*L(3), 6)
941 vereq(L(3)*2, 6)
942 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000943
Guido van Rossum3d45d8f2001-09-24 18:47:40 +0000944 # Test comparison of classes with dynamic metaclasses
945 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000946 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +0000947 class someclass:
948 __metaclass__ = dynamicmetaclass
949 verify(someclass != object)
950
Tim Peters6d6c1a32001-08-02 04:15:00 +0000951def errors():
952 if verbose: print "Testing errors..."
953
954 try:
955 class C(list, dictionary):
956 pass
957 except TypeError:
958 pass
959 else:
960 verify(0, "inheritance from both list and dict should be illegal")
961
962 try:
963 class C(object, None):
964 pass
965 except TypeError:
966 pass
967 else:
968 verify(0, "inheritance from non-type should be illegal")
969 class Classic:
970 pass
971
972 try:
973 class C(object, Classic):
974 pass
975 except TypeError:
976 pass
977 else:
978 verify(0, "inheritance from object and Classic should be illegal")
979
980 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000981 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000982 pass
983 except TypeError:
984 pass
985 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000986 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987
988 try:
989 class C(object):
990 __slots__ = 1
991 except TypeError:
992 pass
993 else:
994 verify(0, "__slots__ = 1 should be illegal")
995
996 try:
997 class C(object):
998 __slots__ = [1]
999 except TypeError:
1000 pass
1001 else:
1002 verify(0, "__slots__ = [1] should be illegal")
1003
1004def classmethods():
1005 if verbose: print "Testing class methods..."
1006 class C(object):
1007 def foo(*a): return a
1008 goo = classmethod(foo)
1009 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001010 vereq(C.goo(1), (C, 1))
1011 vereq(c.goo(1), (C, 1))
1012 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013 class D(C):
1014 pass
1015 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001016 vereq(D.goo(1), (D, 1))
1017 vereq(d.goo(1), (D, 1))
1018 vereq(d.foo(1), (d, 1))
1019 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020
1021def staticmethods():
1022 if verbose: print "Testing static methods..."
1023 class C(object):
1024 def foo(*a): return a
1025 goo = staticmethod(foo)
1026 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001027 vereq(C.goo(1), (1,))
1028 vereq(c.goo(1), (1,))
1029 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001030 class D(C):
1031 pass
1032 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001033 vereq(D.goo(1), (1,))
1034 vereq(d.goo(1), (1,))
1035 vereq(d.foo(1), (d, 1))
1036 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001037
1038def classic():
1039 if verbose: print "Testing classic classes..."
1040 class C:
1041 def foo(*a): return a
1042 goo = classmethod(foo)
1043 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001044 vereq(C.goo(1), (C, 1))
1045 vereq(c.goo(1), (C, 1))
1046 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001047 class D(C):
1048 pass
1049 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001050 vereq(D.goo(1), (D, 1))
1051 vereq(d.goo(1), (D, 1))
1052 vereq(d.foo(1), (d, 1))
1053 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001054 class E: # *not* subclassing from C
1055 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001056 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001057 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001058
1059def compattr():
1060 if verbose: print "Testing computed attributes..."
1061 class C(object):
1062 class computed_attribute(object):
1063 def __init__(self, get, set=None):
1064 self.__get = get
1065 self.__set = set
1066 def __get__(self, obj, type=None):
1067 return self.__get(obj)
1068 def __set__(self, obj, value):
1069 return self.__set(obj, value)
1070 def __init__(self):
1071 self.__x = 0
1072 def __get_x(self):
1073 x = self.__x
1074 self.__x = x+1
1075 return x
1076 def __set_x(self, x):
1077 self.__x = x
1078 x = computed_attribute(__get_x, __set_x)
1079 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001080 vereq(a.x, 0)
1081 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001082 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001083 vereq(a.x, 10)
1084 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001085
1086def newslot():
1087 if verbose: print "Testing __new__ slot override..."
1088 class C(list):
1089 def __new__(cls):
1090 self = list.__new__(cls)
1091 self.foo = 1
1092 return self
1093 def __init__(self):
1094 self.foo = self.foo + 2
1095 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001096 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001097 verify(a.__class__ is C)
1098 class D(C):
1099 pass
1100 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001101 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001102 verify(b.__class__ is D)
1103
Tim Peters6d6c1a32001-08-02 04:15:00 +00001104def altmro():
1105 if verbose: print "Testing mro() and overriding it..."
1106 class A(object):
1107 def f(self): return "A"
1108 class B(A):
1109 pass
1110 class C(A):
1111 def f(self): return "C"
1112 class D(B, C):
1113 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001114 vereq(D.mro(), [D, B, C, A, object])
1115 vereq(D.__mro__, (D, B, C, A, object))
1116 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001117 class PerverseMetaType(type):
1118 def mro(cls):
1119 L = type.mro(cls)
1120 L.reverse()
1121 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001122 class X(A,B,C,D):
1123 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001124 vereq(X.__mro__, (object, A, C, B, D, X))
1125 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001126
1127def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001128 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001129
1130 class B(object):
1131 "Intermediate class because object doesn't have a __setattr__"
1132
1133 class C(B):
1134
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001135 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001136 if name == "foo":
1137 return ("getattr", name)
1138 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001139 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001140 def __setattr__(self, name, value):
1141 if name == "foo":
1142 self.setattr = (name, value)
1143 else:
1144 return B.__setattr__(self, name, value)
1145 def __delattr__(self, name):
1146 if name == "foo":
1147 self.delattr = name
1148 else:
1149 return B.__delattr__(self, name)
1150
1151 def __getitem__(self, key):
1152 return ("getitem", key)
1153 def __setitem__(self, key, value):
1154 self.setitem = (key, value)
1155 def __delitem__(self, key):
1156 self.delitem = key
1157
1158 def __getslice__(self, i, j):
1159 return ("getslice", i, j)
1160 def __setslice__(self, i, j, value):
1161 self.setslice = (i, j, value)
1162 def __delslice__(self, i, j):
1163 self.delslice = (i, j)
1164
1165 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001166 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001167 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001168 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001169 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001170 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001171
Guido van Rossum45704552001-10-08 16:35:45 +00001172 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001173 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001174 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001175 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001176 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001177
Guido van Rossum45704552001-10-08 16:35:45 +00001178 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001179 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001180 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001181 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001182 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001183
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001184def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001185 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001186 class C(object):
1187 def __init__(self, x):
1188 self.x = x
1189 def foo(self):
1190 return self.x
1191 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001192 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001193 class D(C):
1194 boo = C.foo
1195 goo = c1.foo
1196 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001197 vereq(d2.foo(), 2)
1198 vereq(d2.boo(), 2)
1199 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001200 class E(object):
1201 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001202 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001203 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001204
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001205def specials():
1206 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001207 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001208 # Test the default behavior for static classes
1209 class C(object):
1210 def __getitem__(self, i):
1211 if 0 <= i < 10: return i
1212 raise IndexError
1213 c1 = C()
1214 c2 = C()
1215 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001216 vereq(hash(c1), id(c1))
1217 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1218 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001219 verify(c1 != c2)
1220 verify(not c1 != c1)
1221 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001222 # Note that the module name appears in str/repr, and that varies
1223 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001224 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001225 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001226 verify(-1 not in c1)
1227 for i in range(10):
1228 verify(i in c1)
1229 verify(10 not in c1)
1230 # Test the default behavior for dynamic classes
1231 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001232 def __getitem__(self, i):
1233 if 0 <= i < 10: return i
1234 raise IndexError
1235 d1 = D()
1236 d2 = D()
1237 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001238 vereq(hash(d1), id(d1))
1239 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1240 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001241 verify(d1 != d2)
1242 verify(not d1 != d1)
1243 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001244 # Note that the module name appears in str/repr, and that varies
1245 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001246 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001247 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001248 verify(-1 not in d1)
1249 for i in range(10):
1250 verify(i in d1)
1251 verify(10 not in d1)
1252 # Test overridden behavior for static classes
1253 class Proxy(object):
1254 def __init__(self, x):
1255 self.x = x
1256 def __nonzero__(self):
1257 return not not self.x
1258 def __hash__(self):
1259 return hash(self.x)
1260 def __eq__(self, other):
1261 return self.x == other
1262 def __ne__(self, other):
1263 return self.x != other
1264 def __cmp__(self, other):
1265 return cmp(self.x, other.x)
1266 def __str__(self):
1267 return "Proxy:%s" % self.x
1268 def __repr__(self):
1269 return "Proxy(%r)" % self.x
1270 def __contains__(self, value):
1271 return value in self.x
1272 p0 = Proxy(0)
1273 p1 = Proxy(1)
1274 p_1 = Proxy(-1)
1275 verify(not p0)
1276 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001277 vereq(hash(p0), hash(0))
1278 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001279 verify(p0 != p1)
1280 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001281 vereq(not p0, p1)
1282 vereq(cmp(p0, p1), -1)
1283 vereq(cmp(p0, p0), 0)
1284 vereq(cmp(p0, p_1), 1)
1285 vereq(str(p0), "Proxy:0")
1286 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001287 p10 = Proxy(range(10))
1288 verify(-1 not in p10)
1289 for i in range(10):
1290 verify(i in p10)
1291 verify(10 not in p10)
1292 # Test overridden behavior for dynamic classes
1293 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001294 def __init__(self, x):
1295 self.x = x
1296 def __nonzero__(self):
1297 return not not self.x
1298 def __hash__(self):
1299 return hash(self.x)
1300 def __eq__(self, other):
1301 return self.x == other
1302 def __ne__(self, other):
1303 return self.x != other
1304 def __cmp__(self, other):
1305 return cmp(self.x, other.x)
1306 def __str__(self):
1307 return "DProxy:%s" % self.x
1308 def __repr__(self):
1309 return "DProxy(%r)" % self.x
1310 def __contains__(self, value):
1311 return value in self.x
1312 p0 = DProxy(0)
1313 p1 = DProxy(1)
1314 p_1 = DProxy(-1)
1315 verify(not p0)
1316 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001317 vereq(hash(p0), hash(0))
1318 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001319 verify(p0 != p1)
1320 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001321 vereq(not p0, p1)
1322 vereq(cmp(p0, p1), -1)
1323 vereq(cmp(p0, p0), 0)
1324 vereq(cmp(p0, p_1), 1)
1325 vereq(str(p0), "DProxy:0")
1326 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001327 p10 = DProxy(range(10))
1328 verify(-1 not in p10)
1329 for i in range(10):
1330 verify(i in p10)
1331 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001332 # Safety test for __cmp__
1333 def unsafecmp(a, b):
1334 try:
1335 a.__class__.__cmp__(a, b)
1336 except TypeError:
1337 pass
1338 else:
1339 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1340 a.__class__, a, b)
1341 unsafecmp(u"123", "123")
1342 unsafecmp("123", u"123")
1343 unsafecmp(1, 1.0)
1344 unsafecmp(1.0, 1)
1345 unsafecmp(1, 1L)
1346 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001347
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001348def weakrefs():
1349 if verbose: print "Testing weak references..."
1350 import weakref
1351 class C(object):
1352 pass
1353 c = C()
1354 r = weakref.ref(c)
1355 verify(r() is c)
1356 del c
1357 verify(r() is None)
1358 del r
1359 class NoWeak(object):
1360 __slots__ = ['foo']
1361 no = NoWeak()
1362 try:
1363 weakref.ref(no)
1364 except TypeError, msg:
1365 verify(str(msg).find("weakly") >= 0)
1366 else:
1367 verify(0, "weakref.ref(no) should be illegal")
1368 class Weak(object):
1369 __slots__ = ['foo', '__weakref__']
1370 yes = Weak()
1371 r = weakref.ref(yes)
1372 verify(r() is yes)
1373 del yes
1374 verify(r() is None)
1375 del r
1376
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001377def properties():
1378 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001379 class C(object):
1380 def getx(self):
1381 return self.__x
1382 def setx(self, value):
1383 self.__x = value
1384 def delx(self):
1385 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001386 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001387 a = C()
1388 verify(not hasattr(a, "x"))
1389 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001390 vereq(a._C__x, 42)
1391 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001392 del a.x
1393 verify(not hasattr(a, "x"))
1394 verify(not hasattr(a, "_C__x"))
1395 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001396 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001397## C.x.__set__(a)
1398## verify(not hasattr(a, "x"))
1399
Tim Peters66c1a522001-09-24 21:17:50 +00001400 raw = C.__dict__['x']
1401 verify(isinstance(raw, property))
1402
1403 attrs = dir(raw)
1404 verify("__doc__" in attrs)
1405 verify("fget" in attrs)
1406 verify("fset" in attrs)
1407 verify("fdel" in attrs)
1408
Guido van Rossum45704552001-10-08 16:35:45 +00001409 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001410 verify(raw.fget is C.__dict__['getx'])
1411 verify(raw.fset is C.__dict__['setx'])
1412 verify(raw.fdel is C.__dict__['delx'])
1413
1414 for attr in "__doc__", "fget", "fset", "fdel":
1415 try:
1416 setattr(raw, attr, 42)
1417 except TypeError, msg:
1418 if str(msg).find('readonly') < 0:
1419 raise TestFailed("when setting readonly attr %r on a "
1420 "property, got unexpected TypeError "
1421 "msg %r" % (attr, str(msg)))
1422 else:
1423 raise TestFailed("expected TypeError from trying to set "
1424 "readonly %r attr on a property" % attr)
1425
Guido van Rossumc4a18802001-08-24 16:55:27 +00001426def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001427 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001428
1429 class A(object):
1430 def meth(self, a):
1431 return "A(%r)" % a
1432
Guido van Rossum45704552001-10-08 16:35:45 +00001433 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001434
1435 class B(A):
1436 def __init__(self):
1437 self.__super = super(B, self)
1438 def meth(self, a):
1439 return "B(%r)" % a + self.__super.meth(a)
1440
Guido van Rossum45704552001-10-08 16:35:45 +00001441 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001442
1443 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001444 def meth(self, a):
1445 return "C(%r)" % a + self.__super.meth(a)
1446 C._C__super = super(C)
1447
Guido van Rossum45704552001-10-08 16:35:45 +00001448 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001449
1450 class D(C, B):
1451 def meth(self, a):
1452 return "D(%r)" % a + super(D, self).meth(a)
1453
1454 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1455
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001456def inherits():
1457 if verbose: print "Testing inheritance from basic types..."
1458
1459 class hexint(int):
1460 def __repr__(self):
1461 return hex(self)
1462 def __add__(self, other):
1463 return hexint(int.__add__(self, other))
1464 # (Note that overriding __radd__ doesn't work,
1465 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001466 vereq(repr(hexint(7) + 9), "0x10")
1467 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001468 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001469 vereq(a, 12345)
1470 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001471 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001472 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001473 verify((+a).__class__ is int)
1474 verify((a >> 0).__class__ is int)
1475 verify((a << 0).__class__ is int)
1476 verify((hexint(0) << 12).__class__ is int)
1477 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001478
1479 class octlong(long):
1480 __slots__ = []
1481 def __str__(self):
1482 s = oct(self)
1483 if s[-1] == 'L':
1484 s = s[:-1]
1485 return s
1486 def __add__(self, other):
1487 return self.__class__(super(octlong, self).__add__(other))
1488 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001489 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001490 # (Note that overriding __radd__ here only seems to work
1491 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001492 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001493 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001494 vereq(a, 12345L)
1495 vereq(long(a), 12345L)
1496 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001497 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001498 verify((+a).__class__ is long)
1499 verify((-a).__class__ is long)
1500 verify((-octlong(0)).__class__ is long)
1501 verify((a >> 0).__class__ is long)
1502 verify((a << 0).__class__ is long)
1503 verify((a - 0).__class__ is long)
1504 verify((a * 1).__class__ is long)
1505 verify((a ** 1).__class__ is long)
1506 verify((a // 1).__class__ is long)
1507 verify((1 * a).__class__ is long)
1508 verify((a | 0).__class__ is long)
1509 verify((a ^ 0).__class__ is long)
1510 verify((a & -1L).__class__ is long)
1511 verify((octlong(0) << 12).__class__ is long)
1512 verify((octlong(0) >> 12).__class__ is long)
1513 verify(abs(octlong(0)).__class__ is long)
1514
1515 # Because octlong overrides __add__, we can't check the absence of +0
1516 # optimizations using octlong.
1517 class longclone(long):
1518 pass
1519 a = longclone(1)
1520 verify((a + 0).__class__ is long)
1521 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001522
1523 class precfloat(float):
1524 __slots__ = ['prec']
1525 def __init__(self, value=0.0, prec=12):
1526 self.prec = int(prec)
1527 float.__init__(value)
1528 def __repr__(self):
1529 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001530 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001531 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001532 vereq(a, 12345.0)
1533 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001534 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001535 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001536 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001537
Tim Peters2400fa42001-09-12 19:12:49 +00001538 class madcomplex(complex):
1539 def __repr__(self):
1540 return "%.17gj%+.17g" % (self.imag, self.real)
1541 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001542 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001543 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001544 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001545 vereq(a, base)
1546 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001547 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001548 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001549 vereq(repr(a), "4j-3")
1550 vereq(a, base)
1551 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001552 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001553 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001554 veris((+a).__class__, complex)
1555 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001556 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001557 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001558 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001559 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001560 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001561 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001562 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001563
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001564 class madtuple(tuple):
1565 _rev = None
1566 def rev(self):
1567 if self._rev is not None:
1568 return self._rev
1569 L = list(self)
1570 L.reverse()
1571 self._rev = self.__class__(L)
1572 return self._rev
1573 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001574 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1575 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1576 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001577 for i in range(512):
1578 t = madtuple(range(i))
1579 u = t.rev()
1580 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001581 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001582 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001584 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001585 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001586 verify(a[:].__class__ is tuple)
1587 verify((a * 1).__class__ is tuple)
1588 verify((a * 0).__class__ is tuple)
1589 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001590 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001591 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001592 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001593 verify((a + a).__class__ is tuple)
1594 verify((a * 0).__class__ is tuple)
1595 verify((a * 1).__class__ is tuple)
1596 verify((a * 2).__class__ is tuple)
1597 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001598
1599 class madstring(str):
1600 _rev = None
1601 def rev(self):
1602 if self._rev is not None:
1603 return self._rev
1604 L = list(self)
1605 L.reverse()
1606 self._rev = self.__class__("".join(L))
1607 return self._rev
1608 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001609 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1610 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1611 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001612 for i in range(256):
1613 s = madstring("".join(map(chr, range(i))))
1614 t = s.rev()
1615 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001616 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001617 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001618 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001619 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001620
Tim Peters8fa5dd02001-09-12 02:18:30 +00001621 base = "\x00" * 5
1622 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001623 vereq(s, base)
1624 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001625 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001626 vereq(hash(s), hash(base))
1627 vereq({s: 1}[base], 1)
1628 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001629 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001630 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001631 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001632 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001633 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001634 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001635 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001636 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001637 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001638 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001639 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001640 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001641 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001642 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001643 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001645 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001646 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001647 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001648 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001649 identitytab = ''.join([chr(i) for i in range(256)])
1650 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001651 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001652 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(s.translate(identitytab, "x"), base)
1654 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001655 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001656 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001657 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001658 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001659 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001661 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001663 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001664 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001665
Tim Peters111f6092001-09-12 07:54:51 +00001666 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001668 verify(intern(s).__class__ is str)
1669 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001670 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001671
1672 i = intern("y x")
1673 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001674 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001675 verify(intern(s).__class__ is str)
1676 verify(intern(s) is i)
1677
1678 s = madstring(i)
1679 verify(intern(s).__class__ is str)
1680 verify(intern(s) is i)
1681
Guido van Rossum91ee7982001-08-30 20:52:40 +00001682 class madunicode(unicode):
1683 _rev = None
1684 def rev(self):
1685 if self._rev is not None:
1686 return self._rev
1687 L = list(self)
1688 L.reverse()
1689 self._rev = self.__class__(u"".join(L))
1690 return self._rev
1691 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001692 vereq(u, u"ABCDEF")
1693 vereq(u.rev(), madunicode(u"FEDCBA"))
1694 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001695 base = u"12345"
1696 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001697 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001698 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001699 vereq(hash(u), hash(base))
1700 vereq({u: 1}[base], 1)
1701 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001702 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001703 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001704 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001705 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001706 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001707 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001708 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001709 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001710 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001711 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001712 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001713 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001714 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001715 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001716 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001717 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001718 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001719 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001720 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001721 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001722 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001723 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001724 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001725 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001726 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001727 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001728 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001729 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001730 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001731 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001732 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001733 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001734 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001735 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001736 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001737 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001738 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001739 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001740
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001741 class sublist(list):
1742 pass
1743 a = sublist(range(5))
1744 vereq(a, range(5))
1745 a.append("hello")
1746 vereq(a, range(5) + ["hello"])
1747 a[5] = 5
1748 vereq(a, range(6))
1749 a.extend(range(6, 20))
1750 vereq(a, range(20))
1751 a[-5:] = []
1752 vereq(a, range(15))
1753 del a[10:15]
1754 vereq(len(a), 10)
1755 vereq(a, range(10))
1756 vereq(list(a), range(10))
1757 vereq(a[0], 0)
1758 vereq(a[9], 9)
1759 vereq(a[-10], 0)
1760 vereq(a[-1], 9)
1761 vereq(a[:5], range(5))
1762
Tim Peters59c9a642001-09-13 05:38:56 +00001763 class CountedInput(file):
1764 """Counts lines read by self.readline().
1765
1766 self.lineno is the 0-based ordinal of the last line read, up to
1767 a maximum of one greater than the number of lines in the file.
1768
1769 self.ateof is true if and only if the final "" line has been read,
1770 at which point self.lineno stops incrementing, and further calls
1771 to readline() continue to return "".
1772 """
1773
1774 lineno = 0
1775 ateof = 0
1776 def readline(self):
1777 if self.ateof:
1778 return ""
1779 s = file.readline(self)
1780 # Next line works too.
1781 # s = super(CountedInput, self).readline()
1782 self.lineno += 1
1783 if s == "":
1784 self.ateof = 1
1785 return s
1786
Tim Peters561f8992001-09-13 19:36:36 +00001787 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001788 lines = ['a\n', 'b\n', 'c\n']
1789 try:
1790 f.writelines(lines)
1791 f.close()
1792 f = CountedInput(TESTFN)
1793 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1794 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00001795 vereq(expected, got)
1796 vereq(f.lineno, i)
1797 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00001798 f.close()
1799 finally:
1800 try:
1801 f.close()
1802 except:
1803 pass
1804 try:
1805 import os
1806 os.unlink(TESTFN)
1807 except:
1808 pass
1809
Tim Peters808b94e2001-09-13 19:33:07 +00001810def keywords():
1811 if verbose:
1812 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(int(x=1), 1)
1814 vereq(float(x=2), 2.0)
1815 vereq(long(x=3), 3L)
1816 vereq(complex(imag=42, real=666), complex(666, 42))
1817 vereq(str(object=500), '500')
1818 vereq(unicode(string='abc', errors='strict'), u'abc')
1819 vereq(tuple(sequence=range(3)), (0, 1, 2))
1820 vereq(list(sequence=(0, 1, 2)), range(3))
1821 vereq(dictionary(mapping={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00001822
1823 for constructor in (int, float, long, complex, str, unicode,
1824 tuple, list, dictionary, file):
1825 try:
1826 constructor(bogus_keyword_arg=1)
1827 except TypeError:
1828 pass
1829 else:
1830 raise TestFailed("expected TypeError from bogus keyword "
1831 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001832
Tim Peters8fa45672001-09-13 21:01:29 +00001833def restricted():
1834 import rexec
1835 if verbose:
1836 print "Testing interaction with restricted execution ..."
1837
1838 sandbox = rexec.RExec()
1839
1840 code1 = """f = open(%r, 'w')""" % TESTFN
1841 code2 = """f = file(%r, 'w')""" % TESTFN
1842 code3 = """\
1843f = open(%r)
1844t = type(f) # a sneaky way to get the file() constructor
1845f.close()
1846f = t(%r, 'w') # rexec can't catch this by itself
1847""" % (TESTFN, TESTFN)
1848
1849 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1850 f.close()
1851
1852 try:
1853 for code in code1, code2, code3:
1854 try:
1855 sandbox.r_exec(code)
1856 except IOError, msg:
1857 if str(msg).find("restricted") >= 0:
1858 outcome = "OK"
1859 else:
1860 outcome = "got an exception, but not an expected one"
1861 else:
1862 outcome = "expected a restricted-execution exception"
1863
1864 if outcome != "OK":
1865 raise TestFailed("%s, in %r" % (outcome, code))
1866
1867 finally:
1868 try:
1869 import os
1870 os.unlink(TESTFN)
1871 except:
1872 pass
1873
Tim Peters0ab085c2001-09-14 00:25:33 +00001874def str_subclass_as_dict_key():
1875 if verbose:
1876 print "Testing a str subclass used as dict key .."
1877
1878 class cistr(str):
1879 """Sublcass of str that computes __eq__ case-insensitively.
1880
1881 Also computes a hash code of the string in canonical form.
1882 """
1883
1884 def __init__(self, value):
1885 self.canonical = value.lower()
1886 self.hashcode = hash(self.canonical)
1887
1888 def __eq__(self, other):
1889 if not isinstance(other, cistr):
1890 other = cistr(other)
1891 return self.canonical == other.canonical
1892
1893 def __hash__(self):
1894 return self.hashcode
1895
Guido van Rossum45704552001-10-08 16:35:45 +00001896 vereq(cistr('ABC'), 'abc')
1897 vereq('aBc', cistr('ABC'))
1898 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00001899
1900 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00001901 vereq(d[cistr('one')], 1)
1902 vereq(d[cistr('tWo')], 2)
1903 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001904 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00001905 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001906
Guido van Rossumab3b0342001-09-18 20:38:53 +00001907def classic_comparisons():
1908 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00001909 class classic:
1910 pass
1911 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00001912 if verbose: print " (base = %s)" % base
1913 class C(base):
1914 def __init__(self, value):
1915 self.value = int(value)
1916 def __cmp__(self, other):
1917 if isinstance(other, C):
1918 return cmp(self.value, other.value)
1919 if isinstance(other, int) or isinstance(other, long):
1920 return cmp(self.value, other)
1921 return NotImplemented
1922 c1 = C(1)
1923 c2 = C(2)
1924 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00001925 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00001926 c = {1: c1, 2: c2, 3: c3}
1927 for x in 1, 2, 3:
1928 for y in 1, 2, 3:
1929 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1930 for op in "<", "<=", "==", "!=", ">", ">=":
1931 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
1932 "x=%d, y=%d" % (x, y))
1933 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
1934 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1935
Guido van Rossum0639f592001-09-18 21:06:04 +00001936def rich_comparisons():
1937 if verbose:
1938 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00001939 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001940 pass
Guido van Rossum22056422001-09-24 17:52:04 +00001941 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001942 vereq(z, 1+0j)
1943 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00001944 class ZZ(complex):
1945 def __eq__(self, other):
1946 try:
1947 return abs(self - other) <= 1e-6
1948 except:
1949 return NotImplemented
1950 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00001951 vereq(zz, 1+0j)
1952 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00001953
Guido van Rossum0639f592001-09-18 21:06:04 +00001954 class classic:
1955 pass
1956 for base in (classic, int, object, list):
1957 if verbose: print " (base = %s)" % base
1958 class C(base):
1959 def __init__(self, value):
1960 self.value = int(value)
1961 def __cmp__(self, other):
1962 raise TestFailed, "shouldn't call __cmp__"
1963 def __eq__(self, other):
1964 if isinstance(other, C):
1965 return self.value == other.value
1966 if isinstance(other, int) or isinstance(other, long):
1967 return self.value == other
1968 return NotImplemented
1969 def __ne__(self, other):
1970 if isinstance(other, C):
1971 return self.value != other.value
1972 if isinstance(other, int) or isinstance(other, long):
1973 return self.value != other
1974 return NotImplemented
1975 def __lt__(self, other):
1976 if isinstance(other, C):
1977 return self.value < other.value
1978 if isinstance(other, int) or isinstance(other, long):
1979 return self.value < other
1980 return NotImplemented
1981 def __le__(self, other):
1982 if isinstance(other, C):
1983 return self.value <= other.value
1984 if isinstance(other, int) or isinstance(other, long):
1985 return self.value <= other
1986 return NotImplemented
1987 def __gt__(self, other):
1988 if isinstance(other, C):
1989 return self.value > other.value
1990 if isinstance(other, int) or isinstance(other, long):
1991 return self.value > other
1992 return NotImplemented
1993 def __ge__(self, other):
1994 if isinstance(other, C):
1995 return self.value >= other.value
1996 if isinstance(other, int) or isinstance(other, long):
1997 return self.value >= other
1998 return NotImplemented
1999 c1 = C(1)
2000 c2 = C(2)
2001 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002002 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002003 c = {1: c1, 2: c2, 3: c3}
2004 for x in 1, 2, 3:
2005 for y in 1, 2, 3:
2006 for op in "<", "<=", "==", "!=", ">", ">=":
2007 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2008 "x=%d, y=%d" % (x, y))
2009 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2010 "x=%d, y=%d" % (x, y))
2011 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2012 "x=%d, y=%d" % (x, y))
2013
Guido van Rossum1952e382001-09-19 01:25:16 +00002014def coercions():
2015 if verbose: print "Testing coercions..."
2016 class I(int): pass
2017 coerce(I(0), 0)
2018 coerce(0, I(0))
2019 class L(long): pass
2020 coerce(L(0), 0)
2021 coerce(L(0), 0L)
2022 coerce(0, L(0))
2023 coerce(0L, L(0))
2024 class F(float): pass
2025 coerce(F(0), 0)
2026 coerce(F(0), 0L)
2027 coerce(F(0), 0.)
2028 coerce(0, F(0))
2029 coerce(0L, F(0))
2030 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002031 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002032 coerce(C(0), 0)
2033 coerce(C(0), 0L)
2034 coerce(C(0), 0.)
2035 coerce(C(0), 0j)
2036 coerce(0, C(0))
2037 coerce(0L, C(0))
2038 coerce(0., C(0))
2039 coerce(0j, C(0))
2040
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002041def descrdoc():
2042 if verbose: print "Testing descriptor doc strings..."
2043 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002044 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002045 check(file.closed, "flag set if the file is closed") # getset descriptor
2046 check(file.name, "file name") # member descriptor
2047
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002048def setclass():
2049 if verbose: print "Testing __class__ assignment..."
2050 class C(object): pass
2051 class D(object): pass
2052 class E(object): pass
2053 class F(D, E): pass
2054 for cls in C, D, E, F:
2055 for cls2 in C, D, E, F:
2056 x = cls()
2057 x.__class__ = cls2
2058 verify(x.__class__ is cls2)
2059 x.__class__ = cls
2060 verify(x.__class__ is cls)
2061 def cant(x, C):
2062 try:
2063 x.__class__ = C
2064 except TypeError:
2065 pass
2066 else:
2067 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2068 cant(C(), list)
2069 cant(list(), C)
2070 cant(C(), 1)
2071 cant(C(), object)
2072 cant(object(), list)
2073 cant(list(), object)
2074
Guido van Rossum3926a632001-09-25 16:25:58 +00002075def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002076 if verbose:
2077 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002078 import pickle, cPickle
2079
2080 def sorteditems(d):
2081 L = d.items()
2082 L.sort()
2083 return L
2084
2085 global C
2086 class C(object):
2087 def __init__(self, a, b):
2088 super(C, self).__init__()
2089 self.a = a
2090 self.b = b
2091 def __repr__(self):
2092 return "C(%r, %r)" % (self.a, self.b)
2093
2094 global C1
2095 class C1(list):
2096 def __new__(cls, a, b):
2097 return super(C1, cls).__new__(cls)
2098 def __init__(self, a, b):
2099 self.a = a
2100 self.b = b
2101 def __repr__(self):
2102 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2103
2104 global C2
2105 class C2(int):
2106 def __new__(cls, a, b, val=0):
2107 return super(C2, cls).__new__(cls, val)
2108 def __init__(self, a, b, val=0):
2109 self.a = a
2110 self.b = b
2111 def __repr__(self):
2112 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2113
2114 for p in pickle, cPickle:
2115 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002116 if verbose:
2117 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002118
2119 for cls in C, C1, C2:
2120 s = p.dumps(cls, bin)
2121 cls2 = p.loads(s)
2122 verify(cls2 is cls)
2123
2124 a = C1(1, 2); a.append(42); a.append(24)
2125 b = C2("hello", "world", 42)
2126 s = p.dumps((a, b), bin)
2127 x, y = p.loads(s)
2128 assert x.__class__ == a.__class__
2129 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2130 assert y.__class__ == b.__class__
2131 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2132 assert `x` == `a`
2133 assert `y` == `b`
2134 if verbose:
2135 print "a = x =", a
2136 print "b = y =", b
2137
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002138 # Testing copy.deepcopy()
2139 if verbose:
2140 print "deepcopy"
2141 import copy
2142 for cls in C, C1, C2:
2143 cls2 = copy.deepcopy(cls)
2144 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002145
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002146 a = C1(1, 2); a.append(42); a.append(24)
2147 b = C2("hello", "world", 42)
2148 x, y = copy.deepcopy((a, b))
2149 assert x.__class__ == a.__class__
2150 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2151 assert y.__class__ == b.__class__
2152 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2153 assert `x` == `a`
2154 assert `y` == `b`
2155 if verbose:
2156 print "a = x =", a
2157 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002158
2159def copies():
2160 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2161 import copy
2162 class C(object):
2163 pass
2164
2165 a = C()
2166 a.foo = 12
2167 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002168 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002169
2170 a.bar = [1,2,3]
2171 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002172 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002173 verify(c.bar is a.bar)
2174
2175 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002176 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002177 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002179
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002180def binopoverride():
2181 if verbose: print "Testing overrides of binary operations..."
2182 class I(int):
2183 def __repr__(self):
2184 return "I(%r)" % int(self)
2185 def __add__(self, other):
2186 return I(int(self) + int(other))
2187 __radd__ = __add__
2188 def __pow__(self, other, mod=None):
2189 if mod is None:
2190 return I(pow(int(self), int(other)))
2191 else:
2192 return I(pow(int(self), int(other), int(mod)))
2193 def __rpow__(self, other, mod=None):
2194 if mod is None:
2195 return I(pow(int(other), int(self), mod))
2196 else:
2197 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002198
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002199 vereq(`I(1) + I(2)`, "I(3)")
2200 vereq(`I(1) + 2`, "I(3)")
2201 vereq(`1 + I(2)`, "I(3)")
2202 vereq(`I(2) ** I(3)`, "I(8)")
2203 vereq(`2 ** I(3)`, "I(8)")
2204 vereq(`I(2) ** 3`, "I(8)")
2205 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2206 class S(str):
2207 def __eq__(self, other):
2208 return self.lower() == other.lower()
2209
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002210def subclasspropagation():
2211 if verbose: print "Testing propagation of slot functions to subclasses..."
2212 class A(object):
2213 pass
2214 class B(A):
2215 pass
2216 class C(A):
2217 pass
2218 class D(B, C):
2219 pass
2220 d = D()
2221 vereq(hash(d), id(d))
2222 A.__hash__ = lambda self: 42
2223 vereq(hash(d), 42)
2224 C.__hash__ = lambda self: 314
2225 vereq(hash(d), 314)
2226 B.__hash__ = lambda self: 144
2227 vereq(hash(d), 144)
2228 D.__hash__ = lambda self: 100
2229 vereq(hash(d), 100)
2230 del D.__hash__
2231 vereq(hash(d), 144)
2232 del B.__hash__
2233 vereq(hash(d), 314)
2234 del C.__hash__
2235 vereq(hash(d), 42)
2236 del A.__hash__
2237 vereq(hash(d), id(d))
2238 d.foo = 42
2239 d.bar = 42
2240 vereq(d.foo, 42)
2241 vereq(d.bar, 42)
2242 def __getattribute__(self, name):
2243 if name == "foo":
2244 return 24
2245 return object.__getattribute__(self, name)
2246 A.__getattribute__ = __getattribute__
2247 vereq(d.foo, 24)
2248 vereq(d.bar, 42)
2249 def __getattr__(self, name):
2250 if name in ("spam", "foo", "bar"):
2251 return "hello"
2252 raise AttributeError, name
2253 B.__getattr__ = __getattr__
2254 vereq(d.spam, "hello")
2255 vereq(d.foo, 24)
2256 vereq(d.bar, 42)
2257 del A.__getattribute__
2258 vereq(d.foo, 42)
2259 del d.foo
2260 vereq(d.foo, "hello")
2261 vereq(d.bar, 42)
2262 del B.__getattr__
2263 try:
2264 d.foo
2265 except AttributeError:
2266 pass
2267 else:
2268 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002269
2270def buffer_inherit():
2271 import binascii
2272 # SF bug [#470040] ParseTuple t# vs subclasses.
2273 if verbose:
2274 print "Testing that buffer interface is inherited ..."
2275
2276 class MyStr(str):
2277 pass
2278 base = 'abc'
2279 m = MyStr(base)
2280 # b2a_hex uses the buffer interface to get its argument's value, via
2281 # PyArg_ParseTuple 't#' code.
2282 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2283
2284 # It's not clear that unicode will continue to support the character
2285 # buffer interface, and this test will fail if that's taken away.
2286 class MyUni(unicode):
2287 pass
2288 base = u'abc'
2289 m = MyUni(base)
2290 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2291
2292 class MyInt(int):
2293 pass
2294 m = MyInt(42)
2295 try:
2296 binascii.b2a_hex(m)
2297 raise TestFailed('subclass of int should not have a buffer interface')
2298 except TypeError:
2299 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002300
Tim Petersc9933152001-10-16 20:18:24 +00002301def str_of_str_subclass():
2302 import binascii
2303 import cStringIO
2304
2305 if verbose:
2306 print "Testing __str__ defined in subclass of str ..."
2307
2308 class octetstring(str):
2309 def __str__(self):
2310 return binascii.b2a_hex(self)
2311 def __repr__(self):
2312 return self + " repr"
2313
2314 o = octetstring('A')
2315 vereq(type(o), octetstring)
2316 vereq(type(str(o)), str)
2317 vereq(type(repr(o)), str)
2318 vereq(ord(o), 0x41)
2319 vereq(str(o), '41')
2320 vereq(repr(o), 'A repr')
2321 vereq(o.__str__(), '41')
2322 vereq(o.__repr__(), 'A repr')
2323
2324 capture = cStringIO.StringIO()
2325 # Calling str() or not exercises different internal paths.
2326 print >> capture, o
2327 print >> capture, str(o)
2328 vereq(capture.getvalue(), '41\n41\n')
2329 capture.close()
2330
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002331def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002332 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002333 lists()
2334 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002335 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002336 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002337 ints()
2338 longs()
2339 floats()
2340 complexes()
2341 spamlists()
2342 spamdicts()
2343 pydicts()
2344 pylists()
2345 metaclass()
2346 pymods()
2347 multi()
2348 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002349 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002350 slots()
2351 dynamics()
2352 errors()
2353 classmethods()
2354 staticmethods()
2355 classic()
2356 compattr()
2357 newslot()
2358 altmro()
2359 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002360 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002361 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002362 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002363 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002364 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002365 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002366 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002367 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002368 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002369 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002370 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002371 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002372 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002373 setclass()
Guido van Rossum3926a632001-09-25 16:25:58 +00002374 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002375 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002376 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002377 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002378 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002379 str_of_str_subclass()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002380 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002381
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002382if __name__ == "__main__":
2383 test_main()