blob: 5f0bb9629622e22348729af8d158750ab4daf32f [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
Tim Peters6d6c1a32001-08-02 04:15:00 +000010def testunop(a, res, expr="len(a)", meth="__len__"):
11 if verbose: print "checking", expr
12 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000013 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000014 t = type(a)
15 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000016 vereq(m, t.__dict__[meth])
17 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000018 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000019 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000020
21def testbinop(a, b, res, expr="a+b", meth="__add__"):
22 if verbose: print "checking", expr
23 dict = {'a': a, 'b': b}
Guido van Rossum45704552001-10-08 16:35:45 +000024 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 t = type(a)
26 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000027 vereq(m, t.__dict__[meth])
28 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000029 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000030 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000031
32def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
33 if verbose: print "checking", expr
34 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000035 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000036 t = type(a)
37 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000038 vereq(m, t.__dict__[meth])
39 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000040 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000041 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000042
43def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
44 if verbose: print "checking", stmt
45 dict = {'a': deepcopy(a), 'b': b}
46 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000047 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000048 t = type(a)
49 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000050 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000051 dict['a'] = deepcopy(a)
52 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000053 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054 dict['a'] = deepcopy(a)
55 bm = getattr(dict['a'], meth)
56 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058
59def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
60 if verbose: print "checking", stmt
61 dict = {'a': deepcopy(a), 'b': b, 'c': c}
62 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 t = type(a)
65 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000066 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000067 dict['a'] = deepcopy(a)
68 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000069 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000070 dict['a'] = deepcopy(a)
71 bm = getattr(dict['a'], meth)
72 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000073 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000074
75def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
76 if verbose: print "checking", stmt
77 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
78 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000079 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000080 t = type(a)
81 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000082 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000083 dict['a'] = deepcopy(a)
84 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +000085 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000086 dict['a'] = deepcopy(a)
87 bm = getattr(dict['a'], meth)
88 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090
Tim Peters2f93e282001-10-04 05:27:00 +000091def class_docstrings():
92 class Classic:
93 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +000094 vereq(Classic.__doc__, "A classic docstring.")
95 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +000096
97 class Classic2:
98 pass
99 verify(Classic2.__doc__ is None)
100
Tim Peters4fb1fe82001-10-04 05:48:13 +0000101 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000102 "Another docstring."
103 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(NewStatic.__doc__, "Another docstring.")
105 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000106
Tim Peters4fb1fe82001-10-04 05:48:13 +0000107 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000108 __dynamic__ = 0
109 pass
110 verify(NewStatic2.__doc__ is None)
111
Tim Peters4fb1fe82001-10-04 05:48:13 +0000112 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000113 "Another docstring."
114 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000115 vereq(NewDynamic.__doc__, "Another docstring.")
116 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000117
Tim Peters4fb1fe82001-10-04 05:48:13 +0000118 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000119 __dynamic__ = 1
120 pass
121 verify(NewDynamic2.__doc__ is None)
122
Tim Peters6d6c1a32001-08-02 04:15:00 +0000123def lists():
124 if verbose: print "Testing list operations..."
125 testbinop([1], [2], [1,2], "a+b", "__add__")
126 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
127 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
128 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
129 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
130 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
131 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
132 testunop([1,2,3], 3, "len(a)", "__len__")
133 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
134 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
135 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
136 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
137
138def dicts():
139 if verbose: print "Testing dict operations..."
140 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
141 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
142 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
143 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
144 d = {1:2,3:4}
145 l1 = []
146 for i in d.keys(): l1.append(i)
147 l = []
148 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000149 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000150 l = []
151 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000152 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000153 l = []
154 for i in dictionary.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000155 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000156 d = {1:2, 3:4}
157 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000158 vereq(eval(repr(d), {}), d)
159 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000160 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
161
Tim Peters25786c02001-09-02 08:22:48 +0000162def dict_constructor():
163 if verbose:
164 print "Testing dictionary constructor ..."
165 d = dictionary()
Guido van Rossum45704552001-10-08 16:35:45 +0000166 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000167 d = dictionary({})
Guido van Rossum45704552001-10-08 16:35:45 +0000168 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000169 d = dictionary(mapping={})
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(d, {})
Tim Peters25786c02001-09-02 08:22:48 +0000171 d = dictionary({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000172 vereq(d, {1: 2, 'a': 'b'})
Tim Peters25786c02001-09-02 08:22:48 +0000173 for badarg in 0, 0L, 0j, "0", [0], (0,):
174 try:
175 dictionary(badarg)
176 except TypeError:
177 pass
178 else:
179 raise TestFailed("no TypeError from dictionary(%r)" % badarg)
180 try:
181 dictionary(senseless={})
182 except TypeError:
183 pass
184 else:
185 raise TestFailed("no TypeError from dictionary(senseless={}")
186
187 try:
188 dictionary({}, {})
189 except TypeError:
190 pass
191 else:
192 raise TestFailed("no TypeError from dictionary({}, {})")
193
194 class Mapping:
195 dict = {1:2, 3:4, 'a':1j}
196
197 def __getitem__(self, i):
198 return self.dict[i]
199
200 try:
201 dictionary(Mapping())
202 except TypeError:
203 pass
204 else:
205 raise TestFailed("no TypeError from dictionary(incomplete mapping)")
206
207 Mapping.keys = lambda self: self.dict.keys()
208 d = dictionary(mapping=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000209 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000210
Tim Peters5d2b77c2001-09-03 05:47:38 +0000211def test_dir():
212 if verbose:
213 print "Testing dir() ..."
214 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000215 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000216 del junk
217
218 # Just make sure these don't blow up!
219 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
220 dir(arg)
221
Tim Peters37a309d2001-09-04 01:20:04 +0000222 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000223 class C:
224 Cdata = 1
225 def Cmethod(self): pass
226
227 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000228 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000229 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000230
231 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000232 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000233
234 c.cdata = 2
235 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000236 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000237 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000238
239 class A(C):
240 Adata = 1
241 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000242
Tim Peters37a309d2001-09-04 01:20:04 +0000243 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000244 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000245 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000246 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000247 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000248 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000249 a.adata = 42
250 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000251 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000252
253 # The same, but with new-style classes. Since these have object as a
254 # base class, a lot more gets sucked in.
255 def interesting(strings):
256 return [s for s in strings if not s.startswith('_')]
257
Tim Peters5d2b77c2001-09-03 05:47:38 +0000258 class C(object):
259 Cdata = 1
260 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000261
262 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000263 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000264
265 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000266 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000267 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000268
269 c.cdata = 2
270 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000271 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000272 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000273
Tim Peters5d2b77c2001-09-03 05:47:38 +0000274 class A(C):
275 Adata = 1
276 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000277
278 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000279 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000280 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000281 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000282 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000283 a.adata = 42
284 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000285 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000286 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000287
Tim Peterscaaff8d2001-09-10 23:12:14 +0000288 # Try a module subclass.
289 import sys
290 class M(type(sys)):
291 pass
292 minstance = M()
293 minstance.b = 2
294 minstance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000295 vereq(dir(minstance), ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000296
297 class M2(M):
298 def getdict(self):
299 return "Not a dict!"
300 __dict__ = property(getdict)
301
302 m2instance = M2()
303 m2instance.b = 2
304 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000305 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000306 try:
307 dir(m2instance)
308 except TypeError:
309 pass
310
Tim Peters6d6c1a32001-08-02 04:15:00 +0000311binops = {
312 'add': '+',
313 'sub': '-',
314 'mul': '*',
315 'div': '/',
316 'mod': '%',
317 'divmod': 'divmod',
318 'pow': '**',
319 'lshift': '<<',
320 'rshift': '>>',
321 'and': '&',
322 'xor': '^',
323 'or': '|',
324 'cmp': 'cmp',
325 'lt': '<',
326 'le': '<=',
327 'eq': '==',
328 'ne': '!=',
329 'gt': '>',
330 'ge': '>=',
331 }
332
333for name, expr in binops.items():
334 if expr.islower():
335 expr = expr + "(a, b)"
336 else:
337 expr = 'a %s b' % expr
338 binops[name] = expr
339
340unops = {
341 'pos': '+',
342 'neg': '-',
343 'abs': 'abs',
344 'invert': '~',
345 'int': 'int',
346 'long': 'long',
347 'float': 'float',
348 'oct': 'oct',
349 'hex': 'hex',
350 }
351
352for name, expr in unops.items():
353 if expr.islower():
354 expr = expr + "(a)"
355 else:
356 expr = '%s a' % expr
357 unops[name] = expr
358
359def numops(a, b, skip=[]):
360 dict = {'a': a, 'b': b}
361 for name, expr in binops.items():
362 if name not in skip:
363 name = "__%s__" % name
364 if hasattr(a, name):
365 res = eval(expr, dict)
366 testbinop(a, b, res, expr, name)
367 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000368 if name not in skip:
369 name = "__%s__" % name
370 if hasattr(a, name):
371 res = eval(expr, dict)
372 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000373
374def ints():
375 if verbose: print "Testing int operations..."
376 numops(100, 3)
377
378def longs():
379 if verbose: print "Testing long operations..."
380 numops(100L, 3L)
381
382def floats():
383 if verbose: print "Testing float operations..."
384 numops(100.0, 3.0)
385
386def complexes():
387 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000388 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000389 class Number(complex):
390 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000391 def __new__(cls, *args, **kwds):
392 result = complex.__new__(cls, *args)
393 result.prec = kwds.get('prec', 12)
394 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000395 def __repr__(self):
396 prec = self.prec
397 if self.imag == 0.0:
398 return "%.*g" % (prec, self.real)
399 if self.real == 0.0:
400 return "%.*gj" % (prec, self.imag)
401 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
402 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000403
Tim Peters6d6c1a32001-08-02 04:15:00 +0000404 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000405 vereq(`a`, "3.14")
406 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000407
Tim Peters3f996e72001-09-13 19:18:27 +0000408 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000409 vereq(`a`, "3.1")
410 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000411
412 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000413 vereq(`a`, "234.5")
414 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000415
Tim Peters6d6c1a32001-08-02 04:15:00 +0000416def spamlists():
417 if verbose: print "Testing spamlist operations..."
418 import copy, xxsubtype as spam
419 def spamlist(l, memo=None):
420 import xxsubtype as spam
421 return spam.spamlist(l)
422 # This is an ugly hack:
423 copy._deepcopy_dispatch[spam.spamlist] = spamlist
424
425 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
426 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
427 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
428 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
429 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
430 "a[b:c]", "__getslice__")
431 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
432 "a+=b", "__iadd__")
433 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
434 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
435 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
436 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
437 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
438 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
439 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
440 # Test subclassing
441 class C(spam.spamlist):
442 def foo(self): return 1
443 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000444 vereq(a, [])
445 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000446 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000447 vereq(a, [100])
448 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000449 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000450 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451
452def spamdicts():
453 if verbose: print "Testing spamdict operations..."
454 import copy, xxsubtype as spam
455 def spamdict(d, memo=None):
456 import xxsubtype as spam
457 sd = spam.spamdict()
458 for k, v in d.items(): sd[k] = v
459 return sd
460 # This is an ugly hack:
461 copy._deepcopy_dispatch[spam.spamdict] = spamdict
462
463 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
464 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
465 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
466 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
467 d = spamdict({1:2,3:4})
468 l1 = []
469 for i in d.keys(): l1.append(i)
470 l = []
471 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000472 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473 l = []
474 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000475 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000476 l = []
477 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000478 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000479 straightd = {1:2, 3:4}
480 spamd = spamdict(straightd)
481 testunop(spamd, 2, "len(a)", "__len__")
482 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
483 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
484 "a[b]=c", "__setitem__")
485 # Test subclassing
486 class C(spam.spamdict):
487 def foo(self): return 1
488 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000489 vereq(a.items(), [])
490 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000491 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000492 vereq(a.items(), [('foo', 'bar')])
493 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000495 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000496
497def pydicts():
498 if verbose: print "Testing Python subclass of dict..."
499 verify(issubclass(dictionary, dictionary))
500 verify(isinstance({}, dictionary))
501 d = dictionary()
Guido van Rossum45704552001-10-08 16:35:45 +0000502 vereq(d, {})
Tim Peters6d6c1a32001-08-02 04:15:00 +0000503 verify(d.__class__ is dictionary)
504 verify(isinstance(d, dictionary))
505 class C(dictionary):
506 state = -1
507 def __init__(self, *a, **kw):
508 if a:
509 assert len(a) == 1
510 self.state = a[0]
511 if kw:
512 for k, v in kw.items(): self[v] = k
513 def __getitem__(self, key):
514 return self.get(key, 0)
515 def __setitem__(self, key, value):
516 assert isinstance(key, type(0))
517 dictionary.__setitem__(self, key, value)
518 def setstate(self, state):
519 self.state = state
520 def getstate(self):
521 return self.state
522 verify(issubclass(C, dictionary))
523 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000524 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000525 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000526 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000527 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000528 vereq(a.state, -1)
529 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000530 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000531 vereq(a.state, 0)
532 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000533 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000534 vereq(a.state, 10)
535 vereq(a.getstate(), 10)
536 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000537 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000538 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000539 if verbose: print "pydict stress test ..."
540 N = 50
541 for i in range(N):
542 a[i] = C()
543 for j in range(N):
544 a[i][j] = i*j
545 for i in range(N):
546 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000547 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000548
549def pylists():
550 if verbose: print "Testing Python subclass of list..."
551 class C(list):
552 def __getitem__(self, i):
553 return list.__getitem__(self, i) + 100
554 def __getslice__(self, i, j):
555 return (i, j)
556 a = C()
557 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000558 vereq(a[0], 100)
559 vereq(a[1], 101)
560 vereq(a[2], 102)
561 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562
563def metaclass():
564 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565 class C:
566 __metaclass__ = type
567 def __init__(self):
568 self.__state = 0
569 def getstate(self):
570 return self.__state
571 def setstate(self, state):
572 self.__state = state
573 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000574 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000576 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 class D:
578 class __metaclass__(type):
579 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000581 d = D()
582 verify(d.__class__ is D)
583 class M1(type):
584 def __new__(cls, name, bases, dict):
585 dict['__spam__'] = 1
586 return type.__new__(cls, name, bases, dict)
587 class C:
588 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000590 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000591 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000592
Guido van Rossum309b5662001-08-17 11:43:17 +0000593 class _instance(object):
594 pass
595 class M2(object):
596 def __new__(cls, name, bases, dict):
597 self = object.__new__(cls)
598 self.name = name
599 self.bases = bases
600 self.dict = dict
601 return self
602 __new__ = staticmethod(__new__)
603 def __call__(self):
604 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000605 # Early binding of methods
606 for key in self.dict:
607 if key.startswith("__"):
608 continue
609 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000610 return it
611 class C:
612 __metaclass__ = M2
613 def spam(self):
614 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000615 vereq(C.name, 'C')
616 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000617 verify('spam' in C.dict)
618 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000619 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000620
Guido van Rossum91ee7982001-08-30 20:52:40 +0000621 # More metaclass examples
622
623 class autosuper(type):
624 # Automatically add __super to the class
625 # This trick only works for dynamic classes
626 # so we force __dynamic__ = 1
627 def __new__(metaclass, name, bases, dict):
628 # XXX Should check that name isn't already a base class name
629 dict["__dynamic__"] = 1
630 cls = super(autosuper, metaclass).__new__(metaclass,
631 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000632 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000633 while name[:1] == "_":
634 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000635 if name:
636 name = "_%s__super" % name
637 else:
638 name = "__super"
639 setattr(cls, name, super(cls))
640 return cls
641 class A:
642 __metaclass__ = autosuper
643 def meth(self):
644 return "A"
645 class B(A):
646 def meth(self):
647 return "B" + self.__super.meth()
648 class C(A):
649 def meth(self):
650 return "C" + self.__super.meth()
651 class D(C, B):
652 def meth(self):
653 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000654 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000655 class E(B, C):
656 def meth(self):
657 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000658 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000659
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000660 class autoproperty(type):
661 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000662 # named _get_x and/or _set_x are found
663 def __new__(metaclass, name, bases, dict):
664 hits = {}
665 for key, val in dict.iteritems():
666 if key.startswith("_get_"):
667 key = key[5:]
668 get, set = hits.get(key, (None, None))
669 get = val
670 hits[key] = get, set
671 elif key.startswith("_set_"):
672 key = key[5:]
673 get, set = hits.get(key, (None, None))
674 set = val
675 hits[key] = get, set
676 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000677 dict[key] = property(get, set)
678 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000679 name, bases, dict)
680 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000681 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 def _get_x(self):
683 return -self.__x
684 def _set_x(self, x):
685 self.__x = -x
686 a = A()
687 verify(not hasattr(a, "x"))
688 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000689 vereq(a.x, 12)
690 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000691
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000692 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000693 # Merge of multiple cooperating metaclasses
694 pass
695 class A:
696 __metaclass__ = multimetaclass
697 def _get_x(self):
698 return "A"
699 class B(A):
700 def _get_x(self):
701 return "B" + self.__super._get_x()
702 class C(A):
703 def _get_x(self):
704 return "C" + self.__super._get_x()
705 class D(C, B):
706 def _get_x(self):
707 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000708 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000709
Tim Peters6d6c1a32001-08-02 04:15:00 +0000710def pymods():
711 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000712 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000713 import sys
714 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000715 class MM(MT):
716 def __init__(self):
717 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000718 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000719 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000720 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721 def __setattr__(self, name, value):
722 log.append(("setattr", name, value))
723 MT.__setattr__(self, name, value)
724 def __delattr__(self, name):
725 log.append(("delattr", name))
726 MT.__delattr__(self, name)
727 a = MM()
728 a.foo = 12
729 x = a.foo
730 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000731 vereq(log, [("setattr", "foo", 12),
732 ("getattr", "foo"),
733 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000734
735def multi():
736 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000737 class C(object):
738 def __init__(self):
739 self.__state = 0
740 def getstate(self):
741 return self.__state
742 def setstate(self, state):
743 self.__state = state
744 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000745 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000746 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000747 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000748 class D(dictionary, C):
749 def __init__(self):
750 type({}).__init__(self)
751 C.__init__(self)
752 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000753 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000754 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000755 vereq(d.items(), [("hello", "world")])
756 vereq(d["hello"], "world")
757 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000758 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000759 vereq(d.getstate(), 10)
760 vereq(D.__mro__, (D, dictionary, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000761
Guido van Rossume45763a2001-08-10 21:28:46 +0000762 # SF bug #442833
763 class Node(object):
764 def __int__(self):
765 return int(self.foo())
766 def foo(self):
767 return "23"
768 class Frag(Node, list):
769 def foo(self):
770 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000771 vereq(Node().__int__(), 23)
772 vereq(int(Node()), 23)
773 vereq(Frag().__int__(), 42)
774 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000775
Tim Peters6d6c1a32001-08-02 04:15:00 +0000776def diamond():
777 if verbose: print "Testing multiple inheritance special cases..."
778 class A(object):
779 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000780 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000781 class B(A):
782 def boo(self): return "B"
783 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000784 vereq(B().spam(), "B")
785 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000786 class C(A):
787 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000788 vereq(C().spam(), "A")
789 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000791 vereq(D().spam(), "B")
792 vereq(D().boo(), "B")
793 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000794 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000795 vereq(E().spam(), "B")
796 vereq(E().boo(), "C")
797 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000799 vereq(F().spam(), "B")
800 vereq(F().boo(), "B")
801 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000803 vereq(G().spam(), "B")
804 vereq(G().boo(), "C")
805 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000806
Guido van Rossum37202612001-08-09 19:45:21 +0000807def objects():
808 if verbose: print "Testing object class..."
809 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000810 vereq(a.__class__, object)
811 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000812 b = object()
813 verify(a is not b)
814 verify(not hasattr(a, "foo"))
815 try:
816 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000817 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000818 pass
819 else:
820 verify(0, "object() should not allow setting a foo attribute")
821 verify(not hasattr(object(), "__dict__"))
822
823 class Cdict(object):
824 pass
825 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000826 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000827 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000828 vereq(x.foo, 1)
829 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000830
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831def slots():
832 if verbose: print "Testing __slots__..."
833 class C0(object):
834 __slots__ = []
835 x = C0()
836 verify(not hasattr(x, "__dict__"))
837 verify(not hasattr(x, "foo"))
838
839 class C1(object):
840 __slots__ = ['a']
841 x = C1()
842 verify(not hasattr(x, "__dict__"))
Guido van Rossum45704552001-10-08 16:35:45 +0000843 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000844 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000845 vereq(x.a, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000846 del x.a
Guido van Rossum45704552001-10-08 16:35:45 +0000847 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848
849 class C3(object):
850 __slots__ = ['a', 'b', 'c']
851 x = C3()
852 verify(not hasattr(x, "__dict__"))
853 verify(x.a is None)
854 verify(x.b is None)
855 verify(x.c is None)
856 x.a = 1
857 x.b = 2
858 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +0000859 vereq(x.a, 1)
860 vereq(x.b, 2)
861 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862
863def dynamics():
864 if verbose: print "Testing __dynamic__..."
Guido van Rossum45704552001-10-08 16:35:45 +0000865 vereq(object.__dynamic__, 0)
866 vereq(list.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867 class S1:
868 __metaclass__ = type
Guido van Rossum751c4c82001-09-29 00:40:25 +0000869 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000870 vereq(S1.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000871 class S(object):
Guido van Rossum751c4c82001-09-29 00:40:25 +0000872 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000873 vereq(S.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874 class D(object):
875 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000876 vereq(D.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000877 class E(D, S):
878 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000879 vereq(E.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000880 class F(S, D):
881 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000882 vereq(F.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000883 try:
884 S.foo = 1
885 except (AttributeError, TypeError):
886 pass
887 else:
888 verify(0, "assignment to a static class attribute should be illegal")
889 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000890 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +0000892 vereq(E.foo, 1)
893 vereq(F.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000894 class SS(D):
895 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000896 vereq(SS.__dynamic__, 0)
897 vereq(SS.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000898 try:
899 SS.foo = 1
900 except (AttributeError, TypeError):
901 pass
902 else:
903 verify(0, "assignment to SS.foo should be illegal")
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000904 # Test dynamic instances
905 class C(object):
906 __dynamic__ = 1
Guido van Rossum4a5a2bc2001-10-03 13:59:54 +0000907 # XXX Ideally the following def shouldn't be necessary,
908 # but it's too much of a performance burden.
909 # See XXX comment in slot_tp_getattr_hook.
910 def __getattr__(self, name):
911 raise AttributeError, name
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000912 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000913 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000914 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +0000915 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000916 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +0000917 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000918 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +0000919 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000920 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +0000921 vereq(int(a), 100)
922 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +0000923 verify(not hasattr(a, "spam"))
924 def mygetattr(self, name):
925 if name == "spam":
926 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +0000927 raise AttributeError
928 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +0000929 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +0000930 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000931 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +0000932 def mysetattr(self, name, value):
933 if name == "spam":
934 raise AttributeError
935 return object.__setattr__(self, name, value)
936 C.__setattr__ = mysetattr
937 try:
938 a.spam = "not spam"
939 except AttributeError:
940 pass
941 else:
942 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +0000943 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000944 class D(C):
945 pass
946 d = D()
947 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000948 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949
Guido van Rossum7e35d572001-09-15 03:14:32 +0000950 # Test handling of int*seq and seq*int
951 class I(int):
952 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000953 vereq("a"*I(2), "aa")
954 vereq(I(2)*"a", "aa")
955 vereq(2*I(3), 6)
956 vereq(I(3)*2, 6)
957 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000958
959 # Test handling of long*seq and seq*long
960 class L(long):
961 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000962 vereq("a"*L(2L), "aa")
963 vereq(L(2L)*"a", "aa")
964 vereq(2*L(3), 6)
965 vereq(L(3)*2, 6)
966 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000967
Guido van Rossum3d45d8f2001-09-24 18:47:40 +0000968 # Test comparison of classes with dynamic metaclasses
969 class dynamicmetaclass(type):
970 __dynamic__ = 1
971 class someclass:
972 __metaclass__ = dynamicmetaclass
973 verify(someclass != object)
974
Tim Peters6d6c1a32001-08-02 04:15:00 +0000975def errors():
976 if verbose: print "Testing errors..."
977
978 try:
979 class C(list, dictionary):
980 pass
981 except TypeError:
982 pass
983 else:
984 verify(0, "inheritance from both list and dict should be illegal")
985
986 try:
987 class C(object, None):
988 pass
989 except TypeError:
990 pass
991 else:
992 verify(0, "inheritance from non-type should be illegal")
993 class Classic:
994 pass
995
996 try:
997 class C(object, Classic):
998 pass
999 except TypeError:
1000 pass
1001 else:
1002 verify(0, "inheritance from object and Classic should be illegal")
1003
1004 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001005 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001006 pass
1007 except TypeError:
1008 pass
1009 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001010 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001011
1012 try:
1013 class C(object):
1014 __slots__ = 1
1015 except TypeError:
1016 pass
1017 else:
1018 verify(0, "__slots__ = 1 should be illegal")
1019
1020 try:
1021 class C(object):
1022 __slots__ = [1]
1023 except TypeError:
1024 pass
1025 else:
1026 verify(0, "__slots__ = [1] should be illegal")
1027
1028def classmethods():
1029 if verbose: print "Testing class methods..."
1030 class C(object):
1031 def foo(*a): return a
1032 goo = classmethod(foo)
1033 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001034 vereq(C.goo(1), (C, 1))
1035 vereq(c.goo(1), (C, 1))
1036 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001037 class D(C):
1038 pass
1039 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001040 vereq(D.goo(1), (D, 1))
1041 vereq(d.goo(1), (D, 1))
1042 vereq(d.foo(1), (d, 1))
1043 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001044
1045def staticmethods():
1046 if verbose: print "Testing static methods..."
1047 class C(object):
1048 def foo(*a): return a
1049 goo = staticmethod(foo)
1050 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001051 vereq(C.goo(1), (1,))
1052 vereq(c.goo(1), (1,))
1053 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001054 class D(C):
1055 pass
1056 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001057 vereq(D.goo(1), (1,))
1058 vereq(d.goo(1), (1,))
1059 vereq(d.foo(1), (d, 1))
1060 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001061
1062def classic():
1063 if verbose: print "Testing classic classes..."
1064 class C:
1065 def foo(*a): return a
1066 goo = classmethod(foo)
1067 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001068 vereq(C.goo(1), (C, 1))
1069 vereq(c.goo(1), (C, 1))
1070 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071 class D(C):
1072 pass
1073 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001074 vereq(D.goo(1), (D, 1))
1075 vereq(d.goo(1), (D, 1))
1076 vereq(d.foo(1), (d, 1))
1077 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001078 class E: # *not* subclassing from C
1079 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001080 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001081 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001082
1083def compattr():
1084 if verbose: print "Testing computed attributes..."
1085 class C(object):
1086 class computed_attribute(object):
1087 def __init__(self, get, set=None):
1088 self.__get = get
1089 self.__set = set
1090 def __get__(self, obj, type=None):
1091 return self.__get(obj)
1092 def __set__(self, obj, value):
1093 return self.__set(obj, value)
1094 def __init__(self):
1095 self.__x = 0
1096 def __get_x(self):
1097 x = self.__x
1098 self.__x = x+1
1099 return x
1100 def __set_x(self, x):
1101 self.__x = x
1102 x = computed_attribute(__get_x, __set_x)
1103 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001104 vereq(a.x, 0)
1105 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001106 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001107 vereq(a.x, 10)
1108 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001109
1110def newslot():
1111 if verbose: print "Testing __new__ slot override..."
1112 class C(list):
1113 def __new__(cls):
1114 self = list.__new__(cls)
1115 self.foo = 1
1116 return self
1117 def __init__(self):
1118 self.foo = self.foo + 2
1119 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001120 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001121 verify(a.__class__ is C)
1122 class D(C):
1123 pass
1124 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001125 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001126 verify(b.__class__ is D)
1127
Tim Peters6d6c1a32001-08-02 04:15:00 +00001128def altmro():
1129 if verbose: print "Testing mro() and overriding it..."
1130 class A(object):
1131 def f(self): return "A"
1132 class B(A):
1133 pass
1134 class C(A):
1135 def f(self): return "C"
1136 class D(B, C):
1137 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001138 vereq(D.mro(), [D, B, C, A, object])
1139 vereq(D.__mro__, (D, B, C, A, object))
1140 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001141 class PerverseMetaType(type):
1142 def mro(cls):
1143 L = type.mro(cls)
1144 L.reverse()
1145 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001146 class X(A,B,C,D):
1147 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001148 vereq(X.__mro__, (object, A, C, B, D, X))
1149 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150
1151def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001152 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001153
1154 class B(object):
1155 "Intermediate class because object doesn't have a __setattr__"
1156
1157 class C(B):
1158
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001159 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001160 if name == "foo":
1161 return ("getattr", name)
1162 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001163 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001164 def __setattr__(self, name, value):
1165 if name == "foo":
1166 self.setattr = (name, value)
1167 else:
1168 return B.__setattr__(self, name, value)
1169 def __delattr__(self, name):
1170 if name == "foo":
1171 self.delattr = name
1172 else:
1173 return B.__delattr__(self, name)
1174
1175 def __getitem__(self, key):
1176 return ("getitem", key)
1177 def __setitem__(self, key, value):
1178 self.setitem = (key, value)
1179 def __delitem__(self, key):
1180 self.delitem = key
1181
1182 def __getslice__(self, i, j):
1183 return ("getslice", i, j)
1184 def __setslice__(self, i, j, value):
1185 self.setslice = (i, j, value)
1186 def __delslice__(self, i, j):
1187 self.delslice = (i, j)
1188
1189 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001190 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001191 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001192 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001193 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001194 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001195
Guido van Rossum45704552001-10-08 16:35:45 +00001196 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001197 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001198 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001200 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001201
Guido van Rossum45704552001-10-08 16:35:45 +00001202 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001203 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001204 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001206 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001207
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001208def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001209 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001210 class C(object):
1211 def __init__(self, x):
1212 self.x = x
1213 def foo(self):
1214 return self.x
1215 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001216 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001217 class D(C):
1218 boo = C.foo
1219 goo = c1.foo
1220 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001221 vereq(d2.foo(), 2)
1222 vereq(d2.boo(), 2)
1223 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001224 class E(object):
1225 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001226 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001227 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001228
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001229def specials():
1230 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001231 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001232 # Test the default behavior for static classes
1233 class C(object):
1234 def __getitem__(self, i):
1235 if 0 <= i < 10: return i
1236 raise IndexError
1237 c1 = C()
1238 c2 = C()
1239 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001240 vereq(hash(c1), id(c1))
1241 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1242 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001243 verify(c1 != c2)
1244 verify(not c1 != c1)
1245 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001246 # Note that the module name appears in str/repr, and that varies
1247 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001248 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001249 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001250 verify(-1 not in c1)
1251 for i in range(10):
1252 verify(i in c1)
1253 verify(10 not in c1)
1254 # Test the default behavior for dynamic classes
1255 class D(object):
1256 __dynamic__ = 1
1257 def __getitem__(self, i):
1258 if 0 <= i < 10: return i
1259 raise IndexError
1260 d1 = D()
1261 d2 = D()
1262 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001263 vereq(hash(d1), id(d1))
1264 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1265 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001266 verify(d1 != d2)
1267 verify(not d1 != d1)
1268 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001269 # Note that the module name appears in str/repr, and that varies
1270 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001271 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001272 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001273 verify(-1 not in d1)
1274 for i in range(10):
1275 verify(i in d1)
1276 verify(10 not in d1)
1277 # Test overridden behavior for static classes
1278 class Proxy(object):
1279 def __init__(self, x):
1280 self.x = x
1281 def __nonzero__(self):
1282 return not not self.x
1283 def __hash__(self):
1284 return hash(self.x)
1285 def __eq__(self, other):
1286 return self.x == other
1287 def __ne__(self, other):
1288 return self.x != other
1289 def __cmp__(self, other):
1290 return cmp(self.x, other.x)
1291 def __str__(self):
1292 return "Proxy:%s" % self.x
1293 def __repr__(self):
1294 return "Proxy(%r)" % self.x
1295 def __contains__(self, value):
1296 return value in self.x
1297 p0 = Proxy(0)
1298 p1 = Proxy(1)
1299 p_1 = Proxy(-1)
1300 verify(not p0)
1301 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001302 vereq(hash(p0), hash(0))
1303 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001304 verify(p0 != p1)
1305 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001306 vereq(not p0, p1)
1307 vereq(cmp(p0, p1), -1)
1308 vereq(cmp(p0, p0), 0)
1309 vereq(cmp(p0, p_1), 1)
1310 vereq(str(p0), "Proxy:0")
1311 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001312 p10 = Proxy(range(10))
1313 verify(-1 not in p10)
1314 for i in range(10):
1315 verify(i in p10)
1316 verify(10 not in p10)
1317 # Test overridden behavior for dynamic classes
1318 class DProxy(object):
1319 __dynamic__ = 1
1320 def __init__(self, x):
1321 self.x = x
1322 def __nonzero__(self):
1323 return not not self.x
1324 def __hash__(self):
1325 return hash(self.x)
1326 def __eq__(self, other):
1327 return self.x == other
1328 def __ne__(self, other):
1329 return self.x != other
1330 def __cmp__(self, other):
1331 return cmp(self.x, other.x)
1332 def __str__(self):
1333 return "DProxy:%s" % self.x
1334 def __repr__(self):
1335 return "DProxy(%r)" % self.x
1336 def __contains__(self, value):
1337 return value in self.x
1338 p0 = DProxy(0)
1339 p1 = DProxy(1)
1340 p_1 = DProxy(-1)
1341 verify(not p0)
1342 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001343 vereq(hash(p0), hash(0))
1344 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001345 verify(p0 != p1)
1346 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001347 vereq(not p0, p1)
1348 vereq(cmp(p0, p1), -1)
1349 vereq(cmp(p0, p0), 0)
1350 vereq(cmp(p0, p_1), 1)
1351 vereq(str(p0), "DProxy:0")
1352 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001353 p10 = DProxy(range(10))
1354 verify(-1 not in p10)
1355 for i in range(10):
1356 verify(i in p10)
1357 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001358 # Safety test for __cmp__
1359 def unsafecmp(a, b):
1360 try:
1361 a.__class__.__cmp__(a, b)
1362 except TypeError:
1363 pass
1364 else:
1365 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1366 a.__class__, a, b)
1367 unsafecmp(u"123", "123")
1368 unsafecmp("123", u"123")
1369 unsafecmp(1, 1.0)
1370 unsafecmp(1.0, 1)
1371 unsafecmp(1, 1L)
1372 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001373
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001374def weakrefs():
1375 if verbose: print "Testing weak references..."
1376 import weakref
1377 class C(object):
1378 pass
1379 c = C()
1380 r = weakref.ref(c)
1381 verify(r() is c)
1382 del c
1383 verify(r() is None)
1384 del r
1385 class NoWeak(object):
1386 __slots__ = ['foo']
1387 no = NoWeak()
1388 try:
1389 weakref.ref(no)
1390 except TypeError, msg:
1391 verify(str(msg).find("weakly") >= 0)
1392 else:
1393 verify(0, "weakref.ref(no) should be illegal")
1394 class Weak(object):
1395 __slots__ = ['foo', '__weakref__']
1396 yes = Weak()
1397 r = weakref.ref(yes)
1398 verify(r() is yes)
1399 del yes
1400 verify(r() is None)
1401 del r
1402
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001403def properties():
1404 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001405 class C(object):
1406 def getx(self):
1407 return self.__x
1408 def setx(self, value):
1409 self.__x = value
1410 def delx(self):
1411 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001412 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001413 a = C()
1414 verify(not hasattr(a, "x"))
1415 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001416 vereq(a._C__x, 42)
1417 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001418 del a.x
1419 verify(not hasattr(a, "x"))
1420 verify(not hasattr(a, "_C__x"))
1421 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001422 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001423## C.x.__set__(a)
1424## verify(not hasattr(a, "x"))
1425
Tim Peters66c1a522001-09-24 21:17:50 +00001426 raw = C.__dict__['x']
1427 verify(isinstance(raw, property))
1428
1429 attrs = dir(raw)
1430 verify("__doc__" in attrs)
1431 verify("fget" in attrs)
1432 verify("fset" in attrs)
1433 verify("fdel" in attrs)
1434
Guido van Rossum45704552001-10-08 16:35:45 +00001435 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001436 verify(raw.fget is C.__dict__['getx'])
1437 verify(raw.fset is C.__dict__['setx'])
1438 verify(raw.fdel is C.__dict__['delx'])
1439
1440 for attr in "__doc__", "fget", "fset", "fdel":
1441 try:
1442 setattr(raw, attr, 42)
1443 except TypeError, msg:
1444 if str(msg).find('readonly') < 0:
1445 raise TestFailed("when setting readonly attr %r on a "
1446 "property, got unexpected TypeError "
1447 "msg %r" % (attr, str(msg)))
1448 else:
1449 raise TestFailed("expected TypeError from trying to set "
1450 "readonly %r attr on a property" % attr)
1451
Guido van Rossumc4a18802001-08-24 16:55:27 +00001452def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001453 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001454
1455 class A(object):
1456 def meth(self, a):
1457 return "A(%r)" % a
1458
Guido van Rossum45704552001-10-08 16:35:45 +00001459 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001460
1461 class B(A):
1462 def __init__(self):
1463 self.__super = super(B, self)
1464 def meth(self, a):
1465 return "B(%r)" % a + self.__super.meth(a)
1466
Guido van Rossum45704552001-10-08 16:35:45 +00001467 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001468
1469 class C(A):
1470 __dynamic__ = 1
1471 def meth(self, a):
1472 return "C(%r)" % a + self.__super.meth(a)
1473 C._C__super = super(C)
1474
Guido van Rossum45704552001-10-08 16:35:45 +00001475 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001476
1477 class D(C, B):
1478 def meth(self, a):
1479 return "D(%r)" % a + super(D, self).meth(a)
1480
1481 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1482
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001483def inherits():
1484 if verbose: print "Testing inheritance from basic types..."
1485
1486 class hexint(int):
1487 def __repr__(self):
1488 return hex(self)
1489 def __add__(self, other):
1490 return hexint(int.__add__(self, other))
1491 # (Note that overriding __radd__ doesn't work,
1492 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001493 vereq(repr(hexint(7) + 9), "0x10")
1494 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001495 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001496 vereq(a, 12345)
1497 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001498 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001499 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001500 verify((+a).__class__ is int)
1501 verify((a >> 0).__class__ is int)
1502 verify((a << 0).__class__ is int)
1503 verify((hexint(0) << 12).__class__ is int)
1504 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001505
1506 class octlong(long):
1507 __slots__ = []
1508 def __str__(self):
1509 s = oct(self)
1510 if s[-1] == 'L':
1511 s = s[:-1]
1512 return s
1513 def __add__(self, other):
1514 return self.__class__(super(octlong, self).__add__(other))
1515 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001516 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001517 # (Note that overriding __radd__ here only seems to work
1518 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001519 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001520 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001521 vereq(a, 12345L)
1522 vereq(long(a), 12345L)
1523 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001524 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001525 verify((+a).__class__ is long)
1526 verify((-a).__class__ is long)
1527 verify((-octlong(0)).__class__ is long)
1528 verify((a >> 0).__class__ is long)
1529 verify((a << 0).__class__ is long)
1530 verify((a - 0).__class__ is long)
1531 verify((a * 1).__class__ is long)
1532 verify((a ** 1).__class__ is long)
1533 verify((a // 1).__class__ is long)
1534 verify((1 * a).__class__ is long)
1535 verify((a | 0).__class__ is long)
1536 verify((a ^ 0).__class__ is long)
1537 verify((a & -1L).__class__ is long)
1538 verify((octlong(0) << 12).__class__ is long)
1539 verify((octlong(0) >> 12).__class__ is long)
1540 verify(abs(octlong(0)).__class__ is long)
1541
1542 # Because octlong overrides __add__, we can't check the absence of +0
1543 # optimizations using octlong.
1544 class longclone(long):
1545 pass
1546 a = longclone(1)
1547 verify((a + 0).__class__ is long)
1548 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001549
1550 class precfloat(float):
1551 __slots__ = ['prec']
1552 def __init__(self, value=0.0, prec=12):
1553 self.prec = int(prec)
1554 float.__init__(value)
1555 def __repr__(self):
1556 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001557 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001558 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001559 vereq(a, 12345.0)
1560 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001561 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001562 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001563 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001564
Tim Peters2400fa42001-09-12 19:12:49 +00001565 class madcomplex(complex):
Guido van Rossum751c4c82001-09-29 00:40:25 +00001566 __dynamic__ = 0
Tim Peters2400fa42001-09-12 19:12:49 +00001567 def __repr__(self):
1568 return "%.17gj%+.17g" % (self.imag, self.real)
1569 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001570 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001571 base = complex(-3, 4)
1572 verify(base.__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001573 vereq(a, base)
1574 vereq(complex(a), base)
Tim Peters2400fa42001-09-12 19:12:49 +00001575 verify(complex(a).__class__ is complex)
1576 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001577 vereq(repr(a), "4j-3")
1578 vereq(a, base)
1579 vereq(complex(a), base)
Tim Peters2400fa42001-09-12 19:12:49 +00001580 verify(complex(a).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001581 vereq(hash(a), hash(base))
Tim Peters2400fa42001-09-12 19:12:49 +00001582 verify((+a).__class__ is complex)
1583 verify((a + 0).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001584 vereq(a + 0, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001585 verify((a - 0).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001586 vereq(a - 0, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001587 verify((a * 1).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001588 vereq(a * 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001589 verify((a / 1).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001590 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001591
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001592 class madtuple(tuple):
1593 _rev = None
1594 def rev(self):
1595 if self._rev is not None:
1596 return self._rev
1597 L = list(self)
1598 L.reverse()
1599 self._rev = self.__class__(L)
1600 return self._rev
1601 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001602 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1603 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1604 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001605 for i in range(512):
1606 t = madtuple(range(i))
1607 u = t.rev()
1608 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001609 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001610 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001611 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001612 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001613 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001614 verify(a[:].__class__ is tuple)
1615 verify((a * 1).__class__ is tuple)
1616 verify((a * 0).__class__ is tuple)
1617 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001618 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001619 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001620 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001621 verify((a + a).__class__ is tuple)
1622 verify((a * 0).__class__ is tuple)
1623 verify((a * 1).__class__ is tuple)
1624 verify((a * 2).__class__ is tuple)
1625 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001626
1627 class madstring(str):
1628 _rev = None
1629 def rev(self):
1630 if self._rev is not None:
1631 return self._rev
1632 L = list(self)
1633 L.reverse()
1634 self._rev = self.__class__("".join(L))
1635 return self._rev
1636 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001637 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1638 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1639 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001640 for i in range(256):
1641 s = madstring("".join(map(chr, range(i))))
1642 t = s.rev()
1643 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001645 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001646 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001647 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001648
Tim Peters8fa5dd02001-09-12 02:18:30 +00001649 base = "\x00" * 5
1650 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001651 vereq(s, base)
1652 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001653 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001654 vereq(hash(s), hash(base))
1655 vereq({s: 1}[base], 1)
1656 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001657 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001658 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001659 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001661 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001663 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001664 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001665 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001667 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001668 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001669 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001670 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001671 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001672 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001673 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001674 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001675 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001676 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001677 identitytab = ''.join([chr(i) for i in range(256)])
1678 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001679 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001680 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(s.translate(identitytab, "x"), base)
1682 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001683 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001684 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001685 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001686 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001687 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001688 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001689 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001690 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001691 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001692 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001693
Tim Peters111f6092001-09-12 07:54:51 +00001694 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001695 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001696 verify(intern(s).__class__ is str)
1697 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001698 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001699
1700 i = intern("y x")
1701 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001702 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001703 verify(intern(s).__class__ is str)
1704 verify(intern(s) is i)
1705
1706 s = madstring(i)
1707 verify(intern(s).__class__ is str)
1708 verify(intern(s) is i)
1709
Guido van Rossum91ee7982001-08-30 20:52:40 +00001710 class madunicode(unicode):
1711 _rev = None
1712 def rev(self):
1713 if self._rev is not None:
1714 return self._rev
1715 L = list(self)
1716 L.reverse()
1717 self._rev = self.__class__(u"".join(L))
1718 return self._rev
1719 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001720 vereq(u, u"ABCDEF")
1721 vereq(u.rev(), madunicode(u"FEDCBA"))
1722 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001723 base = u"12345"
1724 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001725 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001726 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001727 vereq(hash(u), hash(base))
1728 vereq({u: 1}[base], 1)
1729 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001730 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001731 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001732 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001733 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001734 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001735 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001736 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001737 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001738 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001739 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001740 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001741 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001742 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001743 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001744 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001745 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001746 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001747 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001748 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001749 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001750 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001751 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001752 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001753 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001754 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001755 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001756 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001757 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001758 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001759 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001760 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001761 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001762 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001763 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001764 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001765 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001766 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001767 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001768
Tim Peters59c9a642001-09-13 05:38:56 +00001769 class CountedInput(file):
1770 """Counts lines read by self.readline().
1771
1772 self.lineno is the 0-based ordinal of the last line read, up to
1773 a maximum of one greater than the number of lines in the file.
1774
1775 self.ateof is true if and only if the final "" line has been read,
1776 at which point self.lineno stops incrementing, and further calls
1777 to readline() continue to return "".
1778 """
1779
1780 lineno = 0
1781 ateof = 0
1782 def readline(self):
1783 if self.ateof:
1784 return ""
1785 s = file.readline(self)
1786 # Next line works too.
1787 # s = super(CountedInput, self).readline()
1788 self.lineno += 1
1789 if s == "":
1790 self.ateof = 1
1791 return s
1792
Tim Peters561f8992001-09-13 19:36:36 +00001793 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001794 lines = ['a\n', 'b\n', 'c\n']
1795 try:
1796 f.writelines(lines)
1797 f.close()
1798 f = CountedInput(TESTFN)
1799 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1800 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00001801 vereq(expected, got)
1802 vereq(f.lineno, i)
1803 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00001804 f.close()
1805 finally:
1806 try:
1807 f.close()
1808 except:
1809 pass
1810 try:
1811 import os
1812 os.unlink(TESTFN)
1813 except:
1814 pass
1815
Tim Peters808b94e2001-09-13 19:33:07 +00001816def keywords():
1817 if verbose:
1818 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00001819 vereq(int(x=1), 1)
1820 vereq(float(x=2), 2.0)
1821 vereq(long(x=3), 3L)
1822 vereq(complex(imag=42, real=666), complex(666, 42))
1823 vereq(str(object=500), '500')
1824 vereq(unicode(string='abc', errors='strict'), u'abc')
1825 vereq(tuple(sequence=range(3)), (0, 1, 2))
1826 vereq(list(sequence=(0, 1, 2)), range(3))
1827 vereq(dictionary(mapping={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00001828
1829 for constructor in (int, float, long, complex, str, unicode,
1830 tuple, list, dictionary, file):
1831 try:
1832 constructor(bogus_keyword_arg=1)
1833 except TypeError:
1834 pass
1835 else:
1836 raise TestFailed("expected TypeError from bogus keyword "
1837 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001838
Tim Peters8fa45672001-09-13 21:01:29 +00001839def restricted():
1840 import rexec
1841 if verbose:
1842 print "Testing interaction with restricted execution ..."
1843
1844 sandbox = rexec.RExec()
1845
1846 code1 = """f = open(%r, 'w')""" % TESTFN
1847 code2 = """f = file(%r, 'w')""" % TESTFN
1848 code3 = """\
1849f = open(%r)
1850t = type(f) # a sneaky way to get the file() constructor
1851f.close()
1852f = t(%r, 'w') # rexec can't catch this by itself
1853""" % (TESTFN, TESTFN)
1854
1855 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1856 f.close()
1857
1858 try:
1859 for code in code1, code2, code3:
1860 try:
1861 sandbox.r_exec(code)
1862 except IOError, msg:
1863 if str(msg).find("restricted") >= 0:
1864 outcome = "OK"
1865 else:
1866 outcome = "got an exception, but not an expected one"
1867 else:
1868 outcome = "expected a restricted-execution exception"
1869
1870 if outcome != "OK":
1871 raise TestFailed("%s, in %r" % (outcome, code))
1872
1873 finally:
1874 try:
1875 import os
1876 os.unlink(TESTFN)
1877 except:
1878 pass
1879
Tim Peters0ab085c2001-09-14 00:25:33 +00001880def str_subclass_as_dict_key():
1881 if verbose:
1882 print "Testing a str subclass used as dict key .."
1883
1884 class cistr(str):
1885 """Sublcass of str that computes __eq__ case-insensitively.
1886
1887 Also computes a hash code of the string in canonical form.
1888 """
1889
1890 def __init__(self, value):
1891 self.canonical = value.lower()
1892 self.hashcode = hash(self.canonical)
1893
1894 def __eq__(self, other):
1895 if not isinstance(other, cistr):
1896 other = cistr(other)
1897 return self.canonical == other.canonical
1898
1899 def __hash__(self):
1900 return self.hashcode
1901
Guido van Rossum45704552001-10-08 16:35:45 +00001902 vereq(cistr('ABC'), 'abc')
1903 vereq('aBc', cistr('ABC'))
1904 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00001905
1906 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00001907 vereq(d[cistr('one')], 1)
1908 vereq(d[cistr('tWo')], 2)
1909 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001910 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00001911 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001912
Guido van Rossumab3b0342001-09-18 20:38:53 +00001913def classic_comparisons():
1914 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00001915 class classic:
1916 pass
1917 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00001918 if verbose: print " (base = %s)" % base
1919 class C(base):
1920 def __init__(self, value):
1921 self.value = int(value)
1922 def __cmp__(self, other):
1923 if isinstance(other, C):
1924 return cmp(self.value, other.value)
1925 if isinstance(other, int) or isinstance(other, long):
1926 return cmp(self.value, other)
1927 return NotImplemented
1928 c1 = C(1)
1929 c2 = C(2)
1930 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00001931 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00001932 c = {1: c1, 2: c2, 3: c3}
1933 for x in 1, 2, 3:
1934 for y in 1, 2, 3:
1935 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1936 for op in "<", "<=", "==", "!=", ">", ">=":
1937 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
1938 "x=%d, y=%d" % (x, y))
1939 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
1940 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1941
Guido van Rossum0639f592001-09-18 21:06:04 +00001942def rich_comparisons():
1943 if verbose:
1944 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00001945 class Z(complex):
Guido van Rossum751c4c82001-09-29 00:40:25 +00001946 __dynamic__ = 0
Guido van Rossum22056422001-09-24 17:52:04 +00001947 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001948 vereq(z, 1+0j)
1949 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00001950 class ZZ(complex):
Guido van Rossum751c4c82001-09-29 00:40:25 +00001951 __dynamic__ = 0
Guido van Rossum22056422001-09-24 17:52:04 +00001952 def __eq__(self, other):
1953 try:
1954 return abs(self - other) <= 1e-6
1955 except:
1956 return NotImplemented
1957 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00001958 vereq(zz, 1+0j)
1959 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00001960
Guido van Rossum0639f592001-09-18 21:06:04 +00001961 class classic:
1962 pass
1963 for base in (classic, int, object, list):
1964 if verbose: print " (base = %s)" % base
1965 class C(base):
1966 def __init__(self, value):
1967 self.value = int(value)
1968 def __cmp__(self, other):
1969 raise TestFailed, "shouldn't call __cmp__"
1970 def __eq__(self, other):
1971 if isinstance(other, C):
1972 return self.value == other.value
1973 if isinstance(other, int) or isinstance(other, long):
1974 return self.value == other
1975 return NotImplemented
1976 def __ne__(self, other):
1977 if isinstance(other, C):
1978 return self.value != other.value
1979 if isinstance(other, int) or isinstance(other, long):
1980 return self.value != other
1981 return NotImplemented
1982 def __lt__(self, other):
1983 if isinstance(other, C):
1984 return self.value < other.value
1985 if isinstance(other, int) or isinstance(other, long):
1986 return self.value < other
1987 return NotImplemented
1988 def __le__(self, other):
1989 if isinstance(other, C):
1990 return self.value <= other.value
1991 if isinstance(other, int) or isinstance(other, long):
1992 return self.value <= other
1993 return NotImplemented
1994 def __gt__(self, other):
1995 if isinstance(other, C):
1996 return self.value > other.value
1997 if isinstance(other, int) or isinstance(other, long):
1998 return self.value > other
1999 return NotImplemented
2000 def __ge__(self, other):
2001 if isinstance(other, C):
2002 return self.value >= other.value
2003 if isinstance(other, int) or isinstance(other, long):
2004 return self.value >= other
2005 return NotImplemented
2006 c1 = C(1)
2007 c2 = C(2)
2008 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002009 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002010 c = {1: c1, 2: c2, 3: c3}
2011 for x in 1, 2, 3:
2012 for y in 1, 2, 3:
2013 for op in "<", "<=", "==", "!=", ">", ">=":
2014 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2015 "x=%d, y=%d" % (x, y))
2016 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2017 "x=%d, y=%d" % (x, y))
2018 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2019 "x=%d, y=%d" % (x, y))
2020
Guido van Rossum1952e382001-09-19 01:25:16 +00002021def coercions():
2022 if verbose: print "Testing coercions..."
2023 class I(int): pass
2024 coerce(I(0), 0)
2025 coerce(0, I(0))
2026 class L(long): pass
2027 coerce(L(0), 0)
2028 coerce(L(0), 0L)
2029 coerce(0, L(0))
2030 coerce(0L, L(0))
2031 class F(float): pass
2032 coerce(F(0), 0)
2033 coerce(F(0), 0L)
2034 coerce(F(0), 0.)
2035 coerce(0, F(0))
2036 coerce(0L, F(0))
2037 coerce(0., F(0))
Guido van Rossum751c4c82001-09-29 00:40:25 +00002038 class C(complex):
2039 __dynamic__ = 0
Guido van Rossum1952e382001-09-19 01:25:16 +00002040 coerce(C(0), 0)
2041 coerce(C(0), 0L)
2042 coerce(C(0), 0.)
2043 coerce(C(0), 0j)
2044 coerce(0, C(0))
2045 coerce(0L, C(0))
2046 coerce(0., C(0))
2047 coerce(0j, C(0))
2048
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002049def descrdoc():
2050 if verbose: print "Testing descriptor doc strings..."
2051 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002052 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002053 check(file.closed, "flag set if the file is closed") # getset descriptor
2054 check(file.name, "file name") # member descriptor
2055
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002056def setclass():
2057 if verbose: print "Testing __class__ assignment..."
2058 class C(object): pass
2059 class D(object): pass
2060 class E(object): pass
2061 class F(D, E): pass
2062 for cls in C, D, E, F:
2063 for cls2 in C, D, E, F:
2064 x = cls()
2065 x.__class__ = cls2
2066 verify(x.__class__ is cls2)
2067 x.__class__ = cls
2068 verify(x.__class__ is cls)
2069 def cant(x, C):
2070 try:
2071 x.__class__ = C
2072 except TypeError:
2073 pass
2074 else:
2075 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2076 cant(C(), list)
2077 cant(list(), C)
2078 cant(C(), 1)
2079 cant(C(), object)
2080 cant(object(), list)
2081 cant(list(), object)
2082
Guido van Rossum3926a632001-09-25 16:25:58 +00002083def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002084 if verbose:
2085 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002086 import pickle, cPickle
2087
2088 def sorteditems(d):
2089 L = d.items()
2090 L.sort()
2091 return L
2092
2093 global C
2094 class C(object):
2095 def __init__(self, a, b):
2096 super(C, self).__init__()
2097 self.a = a
2098 self.b = b
2099 def __repr__(self):
2100 return "C(%r, %r)" % (self.a, self.b)
2101
2102 global C1
2103 class C1(list):
2104 def __new__(cls, a, b):
2105 return super(C1, cls).__new__(cls)
2106 def __init__(self, a, b):
2107 self.a = a
2108 self.b = b
2109 def __repr__(self):
2110 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2111
2112 global C2
2113 class C2(int):
2114 def __new__(cls, a, b, val=0):
2115 return super(C2, cls).__new__(cls, val)
2116 def __init__(self, a, b, val=0):
2117 self.a = a
2118 self.b = b
2119 def __repr__(self):
2120 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2121
2122 for p in pickle, cPickle:
2123 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002124 if verbose:
2125 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002126
2127 for cls in C, C1, C2:
2128 s = p.dumps(cls, bin)
2129 cls2 = p.loads(s)
2130 verify(cls2 is cls)
2131
2132 a = C1(1, 2); a.append(42); a.append(24)
2133 b = C2("hello", "world", 42)
2134 s = p.dumps((a, b), bin)
2135 x, y = p.loads(s)
2136 assert x.__class__ == a.__class__
2137 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2138 assert y.__class__ == b.__class__
2139 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2140 assert `x` == `a`
2141 assert `y` == `b`
2142 if verbose:
2143 print "a = x =", a
2144 print "b = y =", b
2145
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002146 # Testing copy.deepcopy()
2147 if verbose:
2148 print "deepcopy"
2149 import copy
2150 for cls in C, C1, C2:
2151 cls2 = copy.deepcopy(cls)
2152 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002153
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002154 a = C1(1, 2); a.append(42); a.append(24)
2155 b = C2("hello", "world", 42)
2156 x, y = copy.deepcopy((a, b))
2157 assert x.__class__ == a.__class__
2158 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2159 assert y.__class__ == b.__class__
2160 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2161 assert `x` == `a`
2162 assert `y` == `b`
2163 if verbose:
2164 print "a = x =", a
2165 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002166
2167def copies():
2168 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2169 import copy
2170 class C(object):
2171 pass
2172
2173 a = C()
2174 a.foo = 12
2175 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002176 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002177
2178 a.bar = [1,2,3]
2179 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002180 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002181 verify(c.bar is a.bar)
2182
2183 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002184 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002185 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002186 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002187
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002188def binopoverride():
2189 if verbose: print "Testing overrides of binary operations..."
2190 class I(int):
2191 def __repr__(self):
2192 return "I(%r)" % int(self)
2193 def __add__(self, other):
2194 return I(int(self) + int(other))
2195 __radd__ = __add__
2196 def __pow__(self, other, mod=None):
2197 if mod is None:
2198 return I(pow(int(self), int(other)))
2199 else:
2200 return I(pow(int(self), int(other), int(mod)))
2201 def __rpow__(self, other, mod=None):
2202 if mod is None:
2203 return I(pow(int(other), int(self), mod))
2204 else:
2205 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002206
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002207 vereq(`I(1) + I(2)`, "I(3)")
2208 vereq(`I(1) + 2`, "I(3)")
2209 vereq(`1 + I(2)`, "I(3)")
2210 vereq(`I(2) ** I(3)`, "I(8)")
2211 vereq(`2 ** I(3)`, "I(8)")
2212 vereq(`I(2) ** 3`, "I(8)")
2213 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2214 class S(str):
2215 def __eq__(self, other):
2216 return self.lower() == other.lower()
2217
Tim Peters0ab085c2001-09-14 00:25:33 +00002218
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002219def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002220 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002221 lists()
2222 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002223 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002224 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002225 ints()
2226 longs()
2227 floats()
2228 complexes()
2229 spamlists()
2230 spamdicts()
2231 pydicts()
2232 pylists()
2233 metaclass()
2234 pymods()
2235 multi()
2236 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002237 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002238 slots()
2239 dynamics()
2240 errors()
2241 classmethods()
2242 staticmethods()
2243 classic()
2244 compattr()
2245 newslot()
2246 altmro()
2247 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002248 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002249 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002250 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002251 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002252 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002253 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002254 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002255 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002256 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002257 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002258 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002259 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002260 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002261 setclass()
Guido van Rossum3926a632001-09-25 16:25:58 +00002262 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002263 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002264 binopoverride()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002265 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002266
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002267if __name__ == "__main__":
2268 test_main()