blob: 25232f357a66e9c31063c875b34896a5ed000487 [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():
368 name = "__%s__" % name
369 if hasattr(a, name):
370 res = eval(expr, dict)
371 testunop(a, res, expr, name)
372
373def ints():
374 if verbose: print "Testing int operations..."
375 numops(100, 3)
376
377def longs():
378 if verbose: print "Testing long operations..."
379 numops(100L, 3L)
380
381def floats():
382 if verbose: print "Testing float operations..."
383 numops(100.0, 3.0)
384
385def complexes():
386 if verbose: print "Testing complex operations..."
387 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge'])
388 class Number(complex):
389 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000390 def __new__(cls, *args, **kwds):
391 result = complex.__new__(cls, *args)
392 result.prec = kwds.get('prec', 12)
393 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000394 def __repr__(self):
395 prec = self.prec
396 if self.imag == 0.0:
397 return "%.*g" % (prec, self.real)
398 if self.real == 0.0:
399 return "%.*gj" % (prec, self.imag)
400 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
401 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000402
Tim Peters6d6c1a32001-08-02 04:15:00 +0000403 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000404 vereq(`a`, "3.14")
405 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000406
Tim Peters3f996e72001-09-13 19:18:27 +0000407 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000408 vereq(`a`, "3.1")
409 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000410
411 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000412 vereq(`a`, "234.5")
413 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000414
Tim Peters6d6c1a32001-08-02 04:15:00 +0000415def spamlists():
416 if verbose: print "Testing spamlist operations..."
417 import copy, xxsubtype as spam
418 def spamlist(l, memo=None):
419 import xxsubtype as spam
420 return spam.spamlist(l)
421 # This is an ugly hack:
422 copy._deepcopy_dispatch[spam.spamlist] = spamlist
423
424 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
425 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
426 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
427 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
428 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
429 "a[b:c]", "__getslice__")
430 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
431 "a+=b", "__iadd__")
432 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
433 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
434 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
435 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
436 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
437 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
438 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
439 # Test subclassing
440 class C(spam.spamlist):
441 def foo(self): return 1
442 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000443 vereq(a, [])
444 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000445 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000446 vereq(a, [100])
447 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000448 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000449 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450
451def spamdicts():
452 if verbose: print "Testing spamdict operations..."
453 import copy, xxsubtype as spam
454 def spamdict(d, memo=None):
455 import xxsubtype as spam
456 sd = spam.spamdict()
457 for k, v in d.items(): sd[k] = v
458 return sd
459 # This is an ugly hack:
460 copy._deepcopy_dispatch[spam.spamdict] = spamdict
461
462 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
463 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
464 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
465 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
466 d = spamdict({1:2,3:4})
467 l1 = []
468 for i in d.keys(): l1.append(i)
469 l = []
470 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000471 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472 l = []
473 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000474 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475 l = []
476 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000477 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000478 straightd = {1:2, 3:4}
479 spamd = spamdict(straightd)
480 testunop(spamd, 2, "len(a)", "__len__")
481 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
482 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
483 "a[b]=c", "__setitem__")
484 # Test subclassing
485 class C(spam.spamdict):
486 def foo(self): return 1
487 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000488 vereq(a.items(), [])
489 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000490 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000491 vereq(a.items(), [('foo', 'bar')])
492 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000494 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495
496def pydicts():
497 if verbose: print "Testing Python subclass of dict..."
498 verify(issubclass(dictionary, dictionary))
499 verify(isinstance({}, dictionary))
500 d = dictionary()
Guido van Rossum45704552001-10-08 16:35:45 +0000501 vereq(d, {})
Tim Peters6d6c1a32001-08-02 04:15:00 +0000502 verify(d.__class__ is dictionary)
503 verify(isinstance(d, dictionary))
504 class C(dictionary):
505 state = -1
506 def __init__(self, *a, **kw):
507 if a:
508 assert len(a) == 1
509 self.state = a[0]
510 if kw:
511 for k, v in kw.items(): self[v] = k
512 def __getitem__(self, key):
513 return self.get(key, 0)
514 def __setitem__(self, key, value):
515 assert isinstance(key, type(0))
516 dictionary.__setitem__(self, key, value)
517 def setstate(self, state):
518 self.state = state
519 def getstate(self):
520 return self.state
521 verify(issubclass(C, dictionary))
522 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000523 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000524 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000525 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000526 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000527 vereq(a.state, -1)
528 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000529 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(a.state, 0)
531 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000532 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000533 vereq(a.state, 10)
534 vereq(a.getstate(), 10)
535 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000536 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000537 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000538 if verbose: print "pydict stress test ..."
539 N = 50
540 for i in range(N):
541 a[i] = C()
542 for j in range(N):
543 a[i][j] = i*j
544 for i in range(N):
545 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000546 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547
548def pylists():
549 if verbose: print "Testing Python subclass of list..."
550 class C(list):
551 def __getitem__(self, i):
552 return list.__getitem__(self, i) + 100
553 def __getslice__(self, i, j):
554 return (i, j)
555 a = C()
556 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000557 vereq(a[0], 100)
558 vereq(a[1], 101)
559 vereq(a[2], 102)
560 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561
562def metaclass():
563 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000564 class C:
565 __metaclass__ = type
566 def __init__(self):
567 self.__state = 0
568 def getstate(self):
569 return self.__state
570 def setstate(self, state):
571 self.__state = state
572 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000573 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000575 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000576 class D:
577 class __metaclass__(type):
578 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000580 d = D()
581 verify(d.__class__ is D)
582 class M1(type):
583 def __new__(cls, name, bases, dict):
584 dict['__spam__'] = 1
585 return type.__new__(cls, name, bases, dict)
586 class C:
587 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000588 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000589 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000591
Guido van Rossum309b5662001-08-17 11:43:17 +0000592 class _instance(object):
593 pass
594 class M2(object):
595 def __new__(cls, name, bases, dict):
596 self = object.__new__(cls)
597 self.name = name
598 self.bases = bases
599 self.dict = dict
600 return self
601 __new__ = staticmethod(__new__)
602 def __call__(self):
603 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000604 # Early binding of methods
605 for key in self.dict:
606 if key.startswith("__"):
607 continue
608 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000609 return it
610 class C:
611 __metaclass__ = M2
612 def spam(self):
613 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000614 vereq(C.name, 'C')
615 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000616 verify('spam' in C.dict)
617 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000618 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000619
Guido van Rossum91ee7982001-08-30 20:52:40 +0000620 # More metaclass examples
621
622 class autosuper(type):
623 # Automatically add __super to the class
624 # This trick only works for dynamic classes
625 # so we force __dynamic__ = 1
626 def __new__(metaclass, name, bases, dict):
627 # XXX Should check that name isn't already a base class name
628 dict["__dynamic__"] = 1
629 cls = super(autosuper, metaclass).__new__(metaclass,
630 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000631 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000632 while name[:1] == "_":
633 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000634 if name:
635 name = "_%s__super" % name
636 else:
637 name = "__super"
638 setattr(cls, name, super(cls))
639 return cls
640 class A:
641 __metaclass__ = autosuper
642 def meth(self):
643 return "A"
644 class B(A):
645 def meth(self):
646 return "B" + self.__super.meth()
647 class C(A):
648 def meth(self):
649 return "C" + self.__super.meth()
650 class D(C, B):
651 def meth(self):
652 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000653 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000654 class E(B, C):
655 def meth(self):
656 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000657 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000658
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000659 class autoproperty(type):
660 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000661 # named _get_x and/or _set_x are found
662 def __new__(metaclass, name, bases, dict):
663 hits = {}
664 for key, val in dict.iteritems():
665 if key.startswith("_get_"):
666 key = key[5:]
667 get, set = hits.get(key, (None, None))
668 get = val
669 hits[key] = get, set
670 elif key.startswith("_set_"):
671 key = key[5:]
672 get, set = hits.get(key, (None, None))
673 set = val
674 hits[key] = get, set
675 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000676 dict[key] = property(get, set)
677 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000678 name, bases, dict)
679 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000680 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 def _get_x(self):
682 return -self.__x
683 def _set_x(self, x):
684 self.__x = -x
685 a = A()
686 verify(not hasattr(a, "x"))
687 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000688 vereq(a.x, 12)
689 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000690
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000691 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000692 # Merge of multiple cooperating metaclasses
693 pass
694 class A:
695 __metaclass__ = multimetaclass
696 def _get_x(self):
697 return "A"
698 class B(A):
699 def _get_x(self):
700 return "B" + self.__super._get_x()
701 class C(A):
702 def _get_x(self):
703 return "C" + self.__super._get_x()
704 class D(C, B):
705 def _get_x(self):
706 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000707 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000708
Tim Peters6d6c1a32001-08-02 04:15:00 +0000709def pymods():
710 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000711 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000712 import sys
713 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000714 class MM(MT):
715 def __init__(self):
716 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000717 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000718 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000719 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000720 def __setattr__(self, name, value):
721 log.append(("setattr", name, value))
722 MT.__setattr__(self, name, value)
723 def __delattr__(self, name):
724 log.append(("delattr", name))
725 MT.__delattr__(self, name)
726 a = MM()
727 a.foo = 12
728 x = a.foo
729 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000730 vereq(log, [("setattr", "foo", 12),
731 ("getattr", "foo"),
732 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000733
734def multi():
735 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000736 class C(object):
737 def __init__(self):
738 self.__state = 0
739 def getstate(self):
740 return self.__state
741 def setstate(self, state):
742 self.__state = state
743 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000744 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000745 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000746 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000747 class D(dictionary, C):
748 def __init__(self):
749 type({}).__init__(self)
750 C.__init__(self)
751 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000752 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000753 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000754 vereq(d.items(), [("hello", "world")])
755 vereq(d["hello"], "world")
756 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000757 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000758 vereq(d.getstate(), 10)
759 vereq(D.__mro__, (D, dictionary, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000760
Guido van Rossume45763a2001-08-10 21:28:46 +0000761 # SF bug #442833
762 class Node(object):
763 def __int__(self):
764 return int(self.foo())
765 def foo(self):
766 return "23"
767 class Frag(Node, list):
768 def foo(self):
769 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000770 vereq(Node().__int__(), 23)
771 vereq(int(Node()), 23)
772 vereq(Frag().__int__(), 42)
773 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000774
Tim Peters6d6c1a32001-08-02 04:15:00 +0000775def diamond():
776 if verbose: print "Testing multiple inheritance special cases..."
777 class A(object):
778 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000779 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000780 class B(A):
781 def boo(self): return "B"
782 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000783 vereq(B().spam(), "B")
784 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000785 class C(A):
786 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000787 vereq(C().spam(), "A")
788 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000789 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000790 vereq(D().spam(), "B")
791 vereq(D().boo(), "B")
792 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000793 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000794 vereq(E().spam(), "B")
795 vereq(E().boo(), "C")
796 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000797 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000798 vereq(F().spam(), "B")
799 vereq(F().boo(), "B")
800 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000802 vereq(G().spam(), "B")
803 vereq(G().boo(), "C")
804 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000805
Guido van Rossum37202612001-08-09 19:45:21 +0000806def objects():
807 if verbose: print "Testing object class..."
808 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000809 vereq(a.__class__, object)
810 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000811 b = object()
812 verify(a is not b)
813 verify(not hasattr(a, "foo"))
814 try:
815 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000816 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000817 pass
818 else:
819 verify(0, "object() should not allow setting a foo attribute")
820 verify(not hasattr(object(), "__dict__"))
821
822 class Cdict(object):
823 pass
824 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000825 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000826 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000827 vereq(x.foo, 1)
828 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000829
Tim Peters6d6c1a32001-08-02 04:15:00 +0000830def slots():
831 if verbose: print "Testing __slots__..."
832 class C0(object):
833 __slots__ = []
834 x = C0()
835 verify(not hasattr(x, "__dict__"))
836 verify(not hasattr(x, "foo"))
837
838 class C1(object):
839 __slots__ = ['a']
840 x = C1()
841 verify(not hasattr(x, "__dict__"))
Guido van Rossum45704552001-10-08 16:35:45 +0000842 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000844 vereq(x.a, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000845 del x.a
Guido van Rossum45704552001-10-08 16:35:45 +0000846 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847
848 class C3(object):
849 __slots__ = ['a', 'b', 'c']
850 x = C3()
851 verify(not hasattr(x, "__dict__"))
852 verify(x.a is None)
853 verify(x.b is None)
854 verify(x.c is None)
855 x.a = 1
856 x.b = 2
857 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +0000858 vereq(x.a, 1)
859 vereq(x.b, 2)
860 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000861
862def dynamics():
863 if verbose: print "Testing __dynamic__..."
Guido van Rossum45704552001-10-08 16:35:45 +0000864 vereq(object.__dynamic__, 0)
865 vereq(list.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000866 class S1:
867 __metaclass__ = type
Guido van Rossum751c4c82001-09-29 00:40:25 +0000868 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000869 vereq(S1.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000870 class S(object):
Guido van Rossum751c4c82001-09-29 00:40:25 +0000871 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000872 vereq(S.__dynamic__, 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000873 class D(object):
874 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000875 vereq(D.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000876 class E(D, S):
877 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000878 vereq(E.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879 class F(S, D):
880 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000881 vereq(F.__dynamic__, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000882 try:
883 S.foo = 1
884 except (AttributeError, TypeError):
885 pass
886 else:
887 verify(0, "assignment to a static class attribute should be illegal")
888 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000889 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000890 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +0000891 vereq(E.foo, 1)
892 vereq(F.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000893 class SS(D):
894 __dynamic__ = 0
Guido van Rossum45704552001-10-08 16:35:45 +0000895 vereq(SS.__dynamic__, 0)
896 vereq(SS.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000897 try:
898 SS.foo = 1
899 except (AttributeError, TypeError):
900 pass
901 else:
902 verify(0, "assignment to SS.foo should be illegal")
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000903 # Test dynamic instances
904 class C(object):
905 __dynamic__ = 1
Guido van Rossum4a5a2bc2001-10-03 13:59:54 +0000906 # XXX Ideally the following def shouldn't be necessary,
907 # but it's too much of a performance burden.
908 # See XXX comment in slot_tp_getattr_hook.
909 def __getattr__(self, name):
910 raise AttributeError, name
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000911 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000912 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000913 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +0000914 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000915 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +0000916 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000917 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +0000918 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000919 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +0000920 vereq(int(a), 100)
921 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +0000922 verify(not hasattr(a, "spam"))
923 def mygetattr(self, name):
924 if name == "spam":
925 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +0000926 raise AttributeError
927 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +0000928 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +0000929 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000930 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +0000931 def mysetattr(self, name, value):
932 if name == "spam":
933 raise AttributeError
934 return object.__setattr__(self, name, value)
935 C.__setattr__ = mysetattr
936 try:
937 a.spam = "not spam"
938 except AttributeError:
939 pass
940 else:
941 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +0000942 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000943 class D(C):
944 pass
945 d = D()
946 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000947 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000948
Guido van Rossum7e35d572001-09-15 03:14:32 +0000949 # Test handling of int*seq and seq*int
950 class I(int):
951 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000952 vereq("a"*I(2), "aa")
953 vereq(I(2)*"a", "aa")
954 vereq(2*I(3), 6)
955 vereq(I(3)*2, 6)
956 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000957
958 # Test handling of long*seq and seq*long
959 class L(long):
960 __dynamic__ = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000961 vereq("a"*L(2L), "aa")
962 vereq(L(2L)*"a", "aa")
963 vereq(2*L(3), 6)
964 vereq(L(3)*2, 6)
965 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000966
Guido van Rossum3d45d8f2001-09-24 18:47:40 +0000967 # Test comparison of classes with dynamic metaclasses
968 class dynamicmetaclass(type):
969 __dynamic__ = 1
970 class someclass:
971 __metaclass__ = dynamicmetaclass
972 verify(someclass != object)
973
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974def errors():
975 if verbose: print "Testing errors..."
976
977 try:
978 class C(list, dictionary):
979 pass
980 except TypeError:
981 pass
982 else:
983 verify(0, "inheritance from both list and dict should be illegal")
984
985 try:
986 class C(object, None):
987 pass
988 except TypeError:
989 pass
990 else:
991 verify(0, "inheritance from non-type should be illegal")
992 class Classic:
993 pass
994
995 try:
996 class C(object, Classic):
997 pass
998 except TypeError:
999 pass
1000 else:
1001 verify(0, "inheritance from object and Classic should be illegal")
1002
1003 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001004 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001005 pass
1006 except TypeError:
1007 pass
1008 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001009 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001010
1011 try:
1012 class C(object):
1013 __slots__ = 1
1014 except TypeError:
1015 pass
1016 else:
1017 verify(0, "__slots__ = 1 should be illegal")
1018
1019 try:
1020 class C(object):
1021 __slots__ = [1]
1022 except TypeError:
1023 pass
1024 else:
1025 verify(0, "__slots__ = [1] should be illegal")
1026
1027def classmethods():
1028 if verbose: print "Testing class methods..."
1029 class C(object):
1030 def foo(*a): return a
1031 goo = classmethod(foo)
1032 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001033 vereq(C.goo(1), (C, 1))
1034 vereq(c.goo(1), (C, 1))
1035 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001036 class D(C):
1037 pass
1038 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001039 vereq(D.goo(1), (D, 1))
1040 vereq(d.goo(1), (D, 1))
1041 vereq(d.foo(1), (d, 1))
1042 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001043
1044def staticmethods():
1045 if verbose: print "Testing static methods..."
1046 class C(object):
1047 def foo(*a): return a
1048 goo = staticmethod(foo)
1049 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001050 vereq(C.goo(1), (1,))
1051 vereq(c.goo(1), (1,))
1052 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001053 class D(C):
1054 pass
1055 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001056 vereq(D.goo(1), (1,))
1057 vereq(d.goo(1), (1,))
1058 vereq(d.foo(1), (d, 1))
1059 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001060
1061def classic():
1062 if verbose: print "Testing classic classes..."
1063 class C:
1064 def foo(*a): return a
1065 goo = classmethod(foo)
1066 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001067 vereq(C.goo(1), (C, 1))
1068 vereq(c.goo(1), (C, 1))
1069 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001070 class D(C):
1071 pass
1072 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001073 vereq(D.goo(1), (D, 1))
1074 vereq(d.goo(1), (D, 1))
1075 vereq(d.foo(1), (d, 1))
1076 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001077 class E: # *not* subclassing from C
1078 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001079 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001080 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001081
1082def compattr():
1083 if verbose: print "Testing computed attributes..."
1084 class C(object):
1085 class computed_attribute(object):
1086 def __init__(self, get, set=None):
1087 self.__get = get
1088 self.__set = set
1089 def __get__(self, obj, type=None):
1090 return self.__get(obj)
1091 def __set__(self, obj, value):
1092 return self.__set(obj, value)
1093 def __init__(self):
1094 self.__x = 0
1095 def __get_x(self):
1096 x = self.__x
1097 self.__x = x+1
1098 return x
1099 def __set_x(self, x):
1100 self.__x = x
1101 x = computed_attribute(__get_x, __set_x)
1102 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001103 vereq(a.x, 0)
1104 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001105 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001106 vereq(a.x, 10)
1107 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001108
1109def newslot():
1110 if verbose: print "Testing __new__ slot override..."
1111 class C(list):
1112 def __new__(cls):
1113 self = list.__new__(cls)
1114 self.foo = 1
1115 return self
1116 def __init__(self):
1117 self.foo = self.foo + 2
1118 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001119 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001120 verify(a.__class__ is C)
1121 class D(C):
1122 pass
1123 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001124 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001125 verify(b.__class__ is D)
1126
Tim Peters6d6c1a32001-08-02 04:15:00 +00001127def altmro():
1128 if verbose: print "Testing mro() and overriding it..."
1129 class A(object):
1130 def f(self): return "A"
1131 class B(A):
1132 pass
1133 class C(A):
1134 def f(self): return "C"
1135 class D(B, C):
1136 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001137 vereq(D.mro(), [D, B, C, A, object])
1138 vereq(D.__mro__, (D, B, C, A, object))
1139 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001140 class PerverseMetaType(type):
1141 def mro(cls):
1142 L = type.mro(cls)
1143 L.reverse()
1144 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001145 class X(A,B,C,D):
1146 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001147 vereq(X.__mro__, (object, A, C, B, D, X))
1148 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001149
1150def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001151 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001152
1153 class B(object):
1154 "Intermediate class because object doesn't have a __setattr__"
1155
1156 class C(B):
1157
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001158 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001159 if name == "foo":
1160 return ("getattr", name)
1161 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001162 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001163 def __setattr__(self, name, value):
1164 if name == "foo":
1165 self.setattr = (name, value)
1166 else:
1167 return B.__setattr__(self, name, value)
1168 def __delattr__(self, name):
1169 if name == "foo":
1170 self.delattr = name
1171 else:
1172 return B.__delattr__(self, name)
1173
1174 def __getitem__(self, key):
1175 return ("getitem", key)
1176 def __setitem__(self, key, value):
1177 self.setitem = (key, value)
1178 def __delitem__(self, key):
1179 self.delitem = key
1180
1181 def __getslice__(self, i, j):
1182 return ("getslice", i, j)
1183 def __setslice__(self, i, j, value):
1184 self.setslice = (i, j, value)
1185 def __delslice__(self, i, j):
1186 self.delslice = (i, j)
1187
1188 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001189 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001190 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001191 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001192 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001193 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001194
Guido van Rossum45704552001-10-08 16:35:45 +00001195 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001196 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001197 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001198 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001199 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001200
Guido van Rossum45704552001-10-08 16:35:45 +00001201 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001202 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001203 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001205 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001206
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001207def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001208 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001209 class C(object):
1210 def __init__(self, x):
1211 self.x = x
1212 def foo(self):
1213 return self.x
1214 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001215 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001216 class D(C):
1217 boo = C.foo
1218 goo = c1.foo
1219 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001220 vereq(d2.foo(), 2)
1221 vereq(d2.boo(), 2)
1222 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001223 class E(object):
1224 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001225 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001226 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001227
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001228def specials():
1229 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001230 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001231 # Test the default behavior for static classes
1232 class C(object):
1233 def __getitem__(self, i):
1234 if 0 <= i < 10: return i
1235 raise IndexError
1236 c1 = C()
1237 c2 = C()
1238 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001239 vereq(hash(c1), id(c1))
1240 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1241 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001242 verify(c1 != c2)
1243 verify(not c1 != c1)
1244 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001245 # Note that the module name appears in str/repr, and that varies
1246 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001247 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001248 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001249 verify(-1 not in c1)
1250 for i in range(10):
1251 verify(i in c1)
1252 verify(10 not in c1)
1253 # Test the default behavior for dynamic classes
1254 class D(object):
1255 __dynamic__ = 1
1256 def __getitem__(self, i):
1257 if 0 <= i < 10: return i
1258 raise IndexError
1259 d1 = D()
1260 d2 = D()
1261 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001262 vereq(hash(d1), id(d1))
1263 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1264 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001265 verify(d1 != d2)
1266 verify(not d1 != d1)
1267 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001268 # Note that the module name appears in str/repr, and that varies
1269 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001270 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001271 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001272 verify(-1 not in d1)
1273 for i in range(10):
1274 verify(i in d1)
1275 verify(10 not in d1)
1276 # Test overridden behavior for static classes
1277 class Proxy(object):
1278 def __init__(self, x):
1279 self.x = x
1280 def __nonzero__(self):
1281 return not not self.x
1282 def __hash__(self):
1283 return hash(self.x)
1284 def __eq__(self, other):
1285 return self.x == other
1286 def __ne__(self, other):
1287 return self.x != other
1288 def __cmp__(self, other):
1289 return cmp(self.x, other.x)
1290 def __str__(self):
1291 return "Proxy:%s" % self.x
1292 def __repr__(self):
1293 return "Proxy(%r)" % self.x
1294 def __contains__(self, value):
1295 return value in self.x
1296 p0 = Proxy(0)
1297 p1 = Proxy(1)
1298 p_1 = Proxy(-1)
1299 verify(not p0)
1300 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001301 vereq(hash(p0), hash(0))
1302 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001303 verify(p0 != p1)
1304 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001305 vereq(not p0, p1)
1306 vereq(cmp(p0, p1), -1)
1307 vereq(cmp(p0, p0), 0)
1308 vereq(cmp(p0, p_1), 1)
1309 vereq(str(p0), "Proxy:0")
1310 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001311 p10 = Proxy(range(10))
1312 verify(-1 not in p10)
1313 for i in range(10):
1314 verify(i in p10)
1315 verify(10 not in p10)
1316 # Test overridden behavior for dynamic classes
1317 class DProxy(object):
1318 __dynamic__ = 1
1319 def __init__(self, x):
1320 self.x = x
1321 def __nonzero__(self):
1322 return not not self.x
1323 def __hash__(self):
1324 return hash(self.x)
1325 def __eq__(self, other):
1326 return self.x == other
1327 def __ne__(self, other):
1328 return self.x != other
1329 def __cmp__(self, other):
1330 return cmp(self.x, other.x)
1331 def __str__(self):
1332 return "DProxy:%s" % self.x
1333 def __repr__(self):
1334 return "DProxy(%r)" % self.x
1335 def __contains__(self, value):
1336 return value in self.x
1337 p0 = DProxy(0)
1338 p1 = DProxy(1)
1339 p_1 = DProxy(-1)
1340 verify(not p0)
1341 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001342 vereq(hash(p0), hash(0))
1343 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001344 verify(p0 != p1)
1345 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001346 vereq(not p0, p1)
1347 vereq(cmp(p0, p1), -1)
1348 vereq(cmp(p0, p0), 0)
1349 vereq(cmp(p0, p_1), 1)
1350 vereq(str(p0), "DProxy:0")
1351 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001352 p10 = DProxy(range(10))
1353 verify(-1 not in p10)
1354 for i in range(10):
1355 verify(i in p10)
1356 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001357 # Safety test for __cmp__
1358 def unsafecmp(a, b):
1359 try:
1360 a.__class__.__cmp__(a, b)
1361 except TypeError:
1362 pass
1363 else:
1364 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1365 a.__class__, a, b)
1366 unsafecmp(u"123", "123")
1367 unsafecmp("123", u"123")
1368 unsafecmp(1, 1.0)
1369 unsafecmp(1.0, 1)
1370 unsafecmp(1, 1L)
1371 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001372
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001373def weakrefs():
1374 if verbose: print "Testing weak references..."
1375 import weakref
1376 class C(object):
1377 pass
1378 c = C()
1379 r = weakref.ref(c)
1380 verify(r() is c)
1381 del c
1382 verify(r() is None)
1383 del r
1384 class NoWeak(object):
1385 __slots__ = ['foo']
1386 no = NoWeak()
1387 try:
1388 weakref.ref(no)
1389 except TypeError, msg:
1390 verify(str(msg).find("weakly") >= 0)
1391 else:
1392 verify(0, "weakref.ref(no) should be illegal")
1393 class Weak(object):
1394 __slots__ = ['foo', '__weakref__']
1395 yes = Weak()
1396 r = weakref.ref(yes)
1397 verify(r() is yes)
1398 del yes
1399 verify(r() is None)
1400 del r
1401
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001402def properties():
1403 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001404 class C(object):
1405 def getx(self):
1406 return self.__x
1407 def setx(self, value):
1408 self.__x = value
1409 def delx(self):
1410 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001411 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001412 a = C()
1413 verify(not hasattr(a, "x"))
1414 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001415 vereq(a._C__x, 42)
1416 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001417 del a.x
1418 verify(not hasattr(a, "x"))
1419 verify(not hasattr(a, "_C__x"))
1420 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001421 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001422## C.x.__set__(a)
1423## verify(not hasattr(a, "x"))
1424
Tim Peters66c1a522001-09-24 21:17:50 +00001425 raw = C.__dict__['x']
1426 verify(isinstance(raw, property))
1427
1428 attrs = dir(raw)
1429 verify("__doc__" in attrs)
1430 verify("fget" in attrs)
1431 verify("fset" in attrs)
1432 verify("fdel" in attrs)
1433
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001435 verify(raw.fget is C.__dict__['getx'])
1436 verify(raw.fset is C.__dict__['setx'])
1437 verify(raw.fdel is C.__dict__['delx'])
1438
1439 for attr in "__doc__", "fget", "fset", "fdel":
1440 try:
1441 setattr(raw, attr, 42)
1442 except TypeError, msg:
1443 if str(msg).find('readonly') < 0:
1444 raise TestFailed("when setting readonly attr %r on a "
1445 "property, got unexpected TypeError "
1446 "msg %r" % (attr, str(msg)))
1447 else:
1448 raise TestFailed("expected TypeError from trying to set "
1449 "readonly %r attr on a property" % attr)
1450
Guido van Rossumc4a18802001-08-24 16:55:27 +00001451def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001452 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001453
1454 class A(object):
1455 def meth(self, a):
1456 return "A(%r)" % a
1457
Guido van Rossum45704552001-10-08 16:35:45 +00001458 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001459
1460 class B(A):
1461 def __init__(self):
1462 self.__super = super(B, self)
1463 def meth(self, a):
1464 return "B(%r)" % a + self.__super.meth(a)
1465
Guido van Rossum45704552001-10-08 16:35:45 +00001466 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001467
1468 class C(A):
1469 __dynamic__ = 1
1470 def meth(self, a):
1471 return "C(%r)" % a + self.__super.meth(a)
1472 C._C__super = super(C)
1473
Guido van Rossum45704552001-10-08 16:35:45 +00001474 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001475
1476 class D(C, B):
1477 def meth(self, a):
1478 return "D(%r)" % a + super(D, self).meth(a)
1479
1480 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1481
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001482def inherits():
1483 if verbose: print "Testing inheritance from basic types..."
1484
1485 class hexint(int):
1486 def __repr__(self):
1487 return hex(self)
1488 def __add__(self, other):
1489 return hexint(int.__add__(self, other))
1490 # (Note that overriding __radd__ doesn't work,
1491 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001492 vereq(repr(hexint(7) + 9), "0x10")
1493 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001494 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(a, 12345)
1496 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001497 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001498 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001499 verify((+a).__class__ is int)
1500 verify((a >> 0).__class__ is int)
1501 verify((a << 0).__class__ is int)
1502 verify((hexint(0) << 12).__class__ is int)
1503 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001504
1505 class octlong(long):
1506 __slots__ = []
1507 def __str__(self):
1508 s = oct(self)
1509 if s[-1] == 'L':
1510 s = s[:-1]
1511 return s
1512 def __add__(self, other):
1513 return self.__class__(super(octlong, self).__add__(other))
1514 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001515 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001516 # (Note that overriding __radd__ here only seems to work
1517 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001518 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001519 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001520 vereq(a, 12345L)
1521 vereq(long(a), 12345L)
1522 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001523 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001524 verify((+a).__class__ is long)
1525 verify((-a).__class__ is long)
1526 verify((-octlong(0)).__class__ is long)
1527 verify((a >> 0).__class__ is long)
1528 verify((a << 0).__class__ is long)
1529 verify((a - 0).__class__ is long)
1530 verify((a * 1).__class__ is long)
1531 verify((a ** 1).__class__ is long)
1532 verify((a // 1).__class__ is long)
1533 verify((1 * a).__class__ is long)
1534 verify((a | 0).__class__ is long)
1535 verify((a ^ 0).__class__ is long)
1536 verify((a & -1L).__class__ is long)
1537 verify((octlong(0) << 12).__class__ is long)
1538 verify((octlong(0) >> 12).__class__ is long)
1539 verify(abs(octlong(0)).__class__ is long)
1540
1541 # Because octlong overrides __add__, we can't check the absence of +0
1542 # optimizations using octlong.
1543 class longclone(long):
1544 pass
1545 a = longclone(1)
1546 verify((a + 0).__class__ is long)
1547 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001548
1549 class precfloat(float):
1550 __slots__ = ['prec']
1551 def __init__(self, value=0.0, prec=12):
1552 self.prec = int(prec)
1553 float.__init__(value)
1554 def __repr__(self):
1555 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001556 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001557 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001558 vereq(a, 12345.0)
1559 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001560 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001561 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001562 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001563
Tim Peters2400fa42001-09-12 19:12:49 +00001564 class madcomplex(complex):
Guido van Rossum751c4c82001-09-29 00:40:25 +00001565 __dynamic__ = 0
Tim Peters2400fa42001-09-12 19:12:49 +00001566 def __repr__(self):
1567 return "%.17gj%+.17g" % (self.imag, self.real)
1568 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001569 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001570 base = complex(-3, 4)
1571 verify(base.__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001572 vereq(a, base)
1573 vereq(complex(a), base)
Tim Peters2400fa42001-09-12 19:12:49 +00001574 verify(complex(a).__class__ is complex)
1575 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001576 vereq(repr(a), "4j-3")
1577 vereq(a, base)
1578 vereq(complex(a), base)
Tim Peters2400fa42001-09-12 19:12:49 +00001579 verify(complex(a).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001580 vereq(hash(a), hash(base))
Tim Peters2400fa42001-09-12 19:12:49 +00001581 verify((+a).__class__ is complex)
1582 verify((a + 0).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(a + 0, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001584 verify((a - 0).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001585 vereq(a - 0, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001586 verify((a * 1).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001587 vereq(a * 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001588 verify((a / 1).__class__ is complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001589 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001590
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001591 class madtuple(tuple):
1592 _rev = None
1593 def rev(self):
1594 if self._rev is not None:
1595 return self._rev
1596 L = list(self)
1597 L.reverse()
1598 self._rev = self.__class__(L)
1599 return self._rev
1600 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001601 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1602 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1603 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001604 for i in range(512):
1605 t = madtuple(range(i))
1606 u = t.rev()
1607 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001608 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001609 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001610 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001611 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001612 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001613 verify(a[:].__class__ is tuple)
1614 verify((a * 1).__class__ is tuple)
1615 verify((a * 0).__class__ is tuple)
1616 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001617 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001618 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001619 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001620 verify((a + a).__class__ is tuple)
1621 verify((a * 0).__class__ is tuple)
1622 verify((a * 1).__class__ is tuple)
1623 verify((a * 2).__class__ is tuple)
1624 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001625
1626 class madstring(str):
1627 _rev = None
1628 def rev(self):
1629 if self._rev is not None:
1630 return self._rev
1631 L = list(self)
1632 L.reverse()
1633 self._rev = self.__class__("".join(L))
1634 return self._rev
1635 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001636 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1637 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1638 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001639 for i in range(256):
1640 s = madstring("".join(map(chr, range(i))))
1641 t = s.rev()
1642 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001643 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001644 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001645 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001646 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001647
Tim Peters8fa5dd02001-09-12 02:18:30 +00001648 base = "\x00" * 5
1649 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001650 vereq(s, base)
1651 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001652 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(hash(s), hash(base))
1654 vereq({s: 1}[base], 1)
1655 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001656 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001657 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001658 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001659 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001660 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001661 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001662 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001663 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001664 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001665 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001666 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001668 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001669 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001670 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001671 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001672 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001673 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001674 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001675 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001676 identitytab = ''.join([chr(i) for i in range(256)])
1677 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001678 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001679 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001680 vereq(s.translate(identitytab, "x"), base)
1681 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001682 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001684 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001685 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001686 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001687 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001688 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001689 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001690 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001691 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001692
Tim Peters111f6092001-09-12 07:54:51 +00001693 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001694 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001695 verify(intern(s).__class__ is str)
1696 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001697 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001698
1699 i = intern("y x")
1700 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001701 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001702 verify(intern(s).__class__ is str)
1703 verify(intern(s) is i)
1704
1705 s = madstring(i)
1706 verify(intern(s).__class__ is str)
1707 verify(intern(s) is i)
1708
Guido van Rossum91ee7982001-08-30 20:52:40 +00001709 class madunicode(unicode):
1710 _rev = None
1711 def rev(self):
1712 if self._rev is not None:
1713 return self._rev
1714 L = list(self)
1715 L.reverse()
1716 self._rev = self.__class__(u"".join(L))
1717 return self._rev
1718 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001719 vereq(u, u"ABCDEF")
1720 vereq(u.rev(), madunicode(u"FEDCBA"))
1721 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001722 base = u"12345"
1723 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001724 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001725 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001726 vereq(hash(u), hash(base))
1727 vereq({u: 1}[base], 1)
1728 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001729 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001730 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001731 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001732 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001733 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001734 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001735 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001736 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001737 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001738 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001739 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001740 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001741 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001742 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001743 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001744 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001745 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001746 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001747 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001748 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001749 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001750 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001751 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001752 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001753 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001754 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001755 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001756 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001757 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001758 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001759 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001760 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001761 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001762 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001763 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001764 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001765 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001766 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001767
Tim Peters59c9a642001-09-13 05:38:56 +00001768 class CountedInput(file):
1769 """Counts lines read by self.readline().
1770
1771 self.lineno is the 0-based ordinal of the last line read, up to
1772 a maximum of one greater than the number of lines in the file.
1773
1774 self.ateof is true if and only if the final "" line has been read,
1775 at which point self.lineno stops incrementing, and further calls
1776 to readline() continue to return "".
1777 """
1778
1779 lineno = 0
1780 ateof = 0
1781 def readline(self):
1782 if self.ateof:
1783 return ""
1784 s = file.readline(self)
1785 # Next line works too.
1786 # s = super(CountedInput, self).readline()
1787 self.lineno += 1
1788 if s == "":
1789 self.ateof = 1
1790 return s
1791
Tim Peters561f8992001-09-13 19:36:36 +00001792 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001793 lines = ['a\n', 'b\n', 'c\n']
1794 try:
1795 f.writelines(lines)
1796 f.close()
1797 f = CountedInput(TESTFN)
1798 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1799 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00001800 vereq(expected, got)
1801 vereq(f.lineno, i)
1802 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00001803 f.close()
1804 finally:
1805 try:
1806 f.close()
1807 except:
1808 pass
1809 try:
1810 import os
1811 os.unlink(TESTFN)
1812 except:
1813 pass
1814
Tim Peters808b94e2001-09-13 19:33:07 +00001815def keywords():
1816 if verbose:
1817 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00001818 vereq(int(x=1), 1)
1819 vereq(float(x=2), 2.0)
1820 vereq(long(x=3), 3L)
1821 vereq(complex(imag=42, real=666), complex(666, 42))
1822 vereq(str(object=500), '500')
1823 vereq(unicode(string='abc', errors='strict'), u'abc')
1824 vereq(tuple(sequence=range(3)), (0, 1, 2))
1825 vereq(list(sequence=(0, 1, 2)), range(3))
1826 vereq(dictionary(mapping={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00001827
1828 for constructor in (int, float, long, complex, str, unicode,
1829 tuple, list, dictionary, file):
1830 try:
1831 constructor(bogus_keyword_arg=1)
1832 except TypeError:
1833 pass
1834 else:
1835 raise TestFailed("expected TypeError from bogus keyword "
1836 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001837
Tim Peters8fa45672001-09-13 21:01:29 +00001838def restricted():
1839 import rexec
1840 if verbose:
1841 print "Testing interaction with restricted execution ..."
1842
1843 sandbox = rexec.RExec()
1844
1845 code1 = """f = open(%r, 'w')""" % TESTFN
1846 code2 = """f = file(%r, 'w')""" % TESTFN
1847 code3 = """\
1848f = open(%r)
1849t = type(f) # a sneaky way to get the file() constructor
1850f.close()
1851f = t(%r, 'w') # rexec can't catch this by itself
1852""" % (TESTFN, TESTFN)
1853
1854 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1855 f.close()
1856
1857 try:
1858 for code in code1, code2, code3:
1859 try:
1860 sandbox.r_exec(code)
1861 except IOError, msg:
1862 if str(msg).find("restricted") >= 0:
1863 outcome = "OK"
1864 else:
1865 outcome = "got an exception, but not an expected one"
1866 else:
1867 outcome = "expected a restricted-execution exception"
1868
1869 if outcome != "OK":
1870 raise TestFailed("%s, in %r" % (outcome, code))
1871
1872 finally:
1873 try:
1874 import os
1875 os.unlink(TESTFN)
1876 except:
1877 pass
1878
Tim Peters0ab085c2001-09-14 00:25:33 +00001879def str_subclass_as_dict_key():
1880 if verbose:
1881 print "Testing a str subclass used as dict key .."
1882
1883 class cistr(str):
1884 """Sublcass of str that computes __eq__ case-insensitively.
1885
1886 Also computes a hash code of the string in canonical form.
1887 """
1888
1889 def __init__(self, value):
1890 self.canonical = value.lower()
1891 self.hashcode = hash(self.canonical)
1892
1893 def __eq__(self, other):
1894 if not isinstance(other, cistr):
1895 other = cistr(other)
1896 return self.canonical == other.canonical
1897
1898 def __hash__(self):
1899 return self.hashcode
1900
Guido van Rossum45704552001-10-08 16:35:45 +00001901 vereq(cistr('ABC'), 'abc')
1902 vereq('aBc', cistr('ABC'))
1903 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00001904
1905 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00001906 vereq(d[cistr('one')], 1)
1907 vereq(d[cistr('tWo')], 2)
1908 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001909 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001911
Guido van Rossumab3b0342001-09-18 20:38:53 +00001912def classic_comparisons():
1913 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00001914 class classic:
1915 pass
1916 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00001917 if verbose: print " (base = %s)" % base
1918 class C(base):
1919 def __init__(self, value):
1920 self.value = int(value)
1921 def __cmp__(self, other):
1922 if isinstance(other, C):
1923 return cmp(self.value, other.value)
1924 if isinstance(other, int) or isinstance(other, long):
1925 return cmp(self.value, other)
1926 return NotImplemented
1927 c1 = C(1)
1928 c2 = C(2)
1929 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00001930 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00001931 c = {1: c1, 2: c2, 3: c3}
1932 for x in 1, 2, 3:
1933 for y in 1, 2, 3:
1934 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1935 for op in "<", "<=", "==", "!=", ">", ">=":
1936 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
1937 "x=%d, y=%d" % (x, y))
1938 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
1939 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1940
Guido van Rossum0639f592001-09-18 21:06:04 +00001941def rich_comparisons():
1942 if verbose:
1943 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00001944 class Z(complex):
Guido van Rossum751c4c82001-09-29 00:40:25 +00001945 __dynamic__ = 0
Guido van Rossum22056422001-09-24 17:52:04 +00001946 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001947 vereq(z, 1+0j)
1948 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00001949 class ZZ(complex):
Guido van Rossum751c4c82001-09-29 00:40:25 +00001950 __dynamic__ = 0
Guido van Rossum22056422001-09-24 17:52:04 +00001951 def __eq__(self, other):
1952 try:
1953 return abs(self - other) <= 1e-6
1954 except:
1955 return NotImplemented
1956 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00001957 vereq(zz, 1+0j)
1958 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00001959
Guido van Rossum0639f592001-09-18 21:06:04 +00001960 class classic:
1961 pass
1962 for base in (classic, int, object, list):
1963 if verbose: print " (base = %s)" % base
1964 class C(base):
1965 def __init__(self, value):
1966 self.value = int(value)
1967 def __cmp__(self, other):
1968 raise TestFailed, "shouldn't call __cmp__"
1969 def __eq__(self, other):
1970 if isinstance(other, C):
1971 return self.value == other.value
1972 if isinstance(other, int) or isinstance(other, long):
1973 return self.value == other
1974 return NotImplemented
1975 def __ne__(self, other):
1976 if isinstance(other, C):
1977 return self.value != other.value
1978 if isinstance(other, int) or isinstance(other, long):
1979 return self.value != other
1980 return NotImplemented
1981 def __lt__(self, other):
1982 if isinstance(other, C):
1983 return self.value < other.value
1984 if isinstance(other, int) or isinstance(other, long):
1985 return self.value < other
1986 return NotImplemented
1987 def __le__(self, other):
1988 if isinstance(other, C):
1989 return self.value <= other.value
1990 if isinstance(other, int) or isinstance(other, long):
1991 return self.value <= other
1992 return NotImplemented
1993 def __gt__(self, other):
1994 if isinstance(other, C):
1995 return self.value > other.value
1996 if isinstance(other, int) or isinstance(other, long):
1997 return self.value > other
1998 return NotImplemented
1999 def __ge__(self, other):
2000 if isinstance(other, C):
2001 return self.value >= other.value
2002 if isinstance(other, int) or isinstance(other, long):
2003 return self.value >= other
2004 return NotImplemented
2005 c1 = C(1)
2006 c2 = C(2)
2007 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002008 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002009 c = {1: c1, 2: c2, 3: c3}
2010 for x in 1, 2, 3:
2011 for y in 1, 2, 3:
2012 for op in "<", "<=", "==", "!=", ">", ">=":
2013 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2014 "x=%d, y=%d" % (x, y))
2015 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2016 "x=%d, y=%d" % (x, y))
2017 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2018 "x=%d, y=%d" % (x, y))
2019
Guido van Rossum1952e382001-09-19 01:25:16 +00002020def coercions():
2021 if verbose: print "Testing coercions..."
2022 class I(int): pass
2023 coerce(I(0), 0)
2024 coerce(0, I(0))
2025 class L(long): pass
2026 coerce(L(0), 0)
2027 coerce(L(0), 0L)
2028 coerce(0, L(0))
2029 coerce(0L, L(0))
2030 class F(float): pass
2031 coerce(F(0), 0)
2032 coerce(F(0), 0L)
2033 coerce(F(0), 0.)
2034 coerce(0, F(0))
2035 coerce(0L, F(0))
2036 coerce(0., F(0))
Guido van Rossum751c4c82001-09-29 00:40:25 +00002037 class C(complex):
2038 __dynamic__ = 0
Guido van Rossum1952e382001-09-19 01:25:16 +00002039 coerce(C(0), 0)
2040 coerce(C(0), 0L)
2041 coerce(C(0), 0.)
2042 coerce(C(0), 0j)
2043 coerce(0, C(0))
2044 coerce(0L, C(0))
2045 coerce(0., C(0))
2046 coerce(0j, C(0))
2047
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002048def descrdoc():
2049 if verbose: print "Testing descriptor doc strings..."
2050 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002051 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002052 check(file.closed, "flag set if the file is closed") # getset descriptor
2053 check(file.name, "file name") # member descriptor
2054
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002055def setclass():
2056 if verbose: print "Testing __class__ assignment..."
2057 class C(object): pass
2058 class D(object): pass
2059 class E(object): pass
2060 class F(D, E): pass
2061 for cls in C, D, E, F:
2062 for cls2 in C, D, E, F:
2063 x = cls()
2064 x.__class__ = cls2
2065 verify(x.__class__ is cls2)
2066 x.__class__ = cls
2067 verify(x.__class__ is cls)
2068 def cant(x, C):
2069 try:
2070 x.__class__ = C
2071 except TypeError:
2072 pass
2073 else:
2074 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2075 cant(C(), list)
2076 cant(list(), C)
2077 cant(C(), 1)
2078 cant(C(), object)
2079 cant(object(), list)
2080 cant(list(), object)
2081
Guido van Rossum3926a632001-09-25 16:25:58 +00002082def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002083 if verbose:
2084 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002085 import pickle, cPickle
2086
2087 def sorteditems(d):
2088 L = d.items()
2089 L.sort()
2090 return L
2091
2092 global C
2093 class C(object):
2094 def __init__(self, a, b):
2095 super(C, self).__init__()
2096 self.a = a
2097 self.b = b
2098 def __repr__(self):
2099 return "C(%r, %r)" % (self.a, self.b)
2100
2101 global C1
2102 class C1(list):
2103 def __new__(cls, a, b):
2104 return super(C1, cls).__new__(cls)
2105 def __init__(self, a, b):
2106 self.a = a
2107 self.b = b
2108 def __repr__(self):
2109 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2110
2111 global C2
2112 class C2(int):
2113 def __new__(cls, a, b, val=0):
2114 return super(C2, cls).__new__(cls, val)
2115 def __init__(self, a, b, val=0):
2116 self.a = a
2117 self.b = b
2118 def __repr__(self):
2119 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2120
2121 for p in pickle, cPickle:
2122 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002123 if verbose:
2124 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002125
2126 for cls in C, C1, C2:
2127 s = p.dumps(cls, bin)
2128 cls2 = p.loads(s)
2129 verify(cls2 is cls)
2130
2131 a = C1(1, 2); a.append(42); a.append(24)
2132 b = C2("hello", "world", 42)
2133 s = p.dumps((a, b), bin)
2134 x, y = p.loads(s)
2135 assert x.__class__ == a.__class__
2136 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2137 assert y.__class__ == b.__class__
2138 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2139 assert `x` == `a`
2140 assert `y` == `b`
2141 if verbose:
2142 print "a = x =", a
2143 print "b = y =", b
2144
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002145 # Testing copy.deepcopy()
2146 if verbose:
2147 print "deepcopy"
2148 import copy
2149 for cls in C, C1, C2:
2150 cls2 = copy.deepcopy(cls)
2151 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002152
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002153 a = C1(1, 2); a.append(42); a.append(24)
2154 b = C2("hello", "world", 42)
2155 x, y = copy.deepcopy((a, b))
2156 assert x.__class__ == a.__class__
2157 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2158 assert y.__class__ == b.__class__
2159 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2160 assert `x` == `a`
2161 assert `y` == `b`
2162 if verbose:
2163 print "a = x =", a
2164 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002165
2166def copies():
2167 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2168 import copy
2169 class C(object):
2170 pass
2171
2172 a = C()
2173 a.foo = 12
2174 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002176
2177 a.bar = [1,2,3]
2178 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002179 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002180 verify(c.bar is a.bar)
2181
2182 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002184 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002185 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002186
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002187def binopoverride():
2188 if verbose: print "Testing overrides of binary operations..."
2189 class I(int):
2190 def __repr__(self):
2191 return "I(%r)" % int(self)
2192 def __add__(self, other):
2193 return I(int(self) + int(other))
2194 __radd__ = __add__
2195 def __pow__(self, other, mod=None):
2196 if mod is None:
2197 return I(pow(int(self), int(other)))
2198 else:
2199 return I(pow(int(self), int(other), int(mod)))
2200 def __rpow__(self, other, mod=None):
2201 if mod is None:
2202 return I(pow(int(other), int(self), mod))
2203 else:
2204 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002205
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002206 vereq(`I(1) + I(2)`, "I(3)")
2207 vereq(`I(1) + 2`, "I(3)")
2208 vereq(`1 + I(2)`, "I(3)")
2209 vereq(`I(2) ** I(3)`, "I(8)")
2210 vereq(`2 ** I(3)`, "I(8)")
2211 vereq(`I(2) ** 3`, "I(8)")
2212 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2213 class S(str):
2214 def __eq__(self, other):
2215 return self.lower() == other.lower()
2216
Tim Peters0ab085c2001-09-14 00:25:33 +00002217
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002218def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002219 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002220 lists()
2221 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002222 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002223 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002224 ints()
2225 longs()
2226 floats()
2227 complexes()
2228 spamlists()
2229 spamdicts()
2230 pydicts()
2231 pylists()
2232 metaclass()
2233 pymods()
2234 multi()
2235 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002236 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002237 slots()
2238 dynamics()
2239 errors()
2240 classmethods()
2241 staticmethods()
2242 classic()
2243 compattr()
2244 newslot()
2245 altmro()
2246 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002247 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002248 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002249 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002250 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002251 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002252 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002253 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002254 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002255 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002256 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002257 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002258 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002259 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002260 setclass()
Guido van Rossum3926a632001-09-25 16:25:58 +00002261 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002262 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002263 binopoverride()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002264 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002265
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002266if __name__ == "__main__":
2267 test_main()