blob: dbfce0c28da1a83a35229add831485d8335f65c3 [file] [log] [blame]
Tim Peters6d6c1a32001-08-02 04:15:00 +00001# Test descriptor-related enhancements
2
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
6def testunop(a, res, expr="len(a)", meth="__len__"):
7 if verbose: print "checking", expr
8 dict = {'a': a}
9 verify(eval(expr, dict) == res)
10 t = type(a)
11 m = getattr(t, meth)
12 verify(m == t.__dict__[meth])
13 verify(m(a) == res)
14 bm = getattr(a, meth)
15 verify(bm() == res)
16
17def testbinop(a, b, res, expr="a+b", meth="__add__"):
18 if verbose: print "checking", expr
19 dict = {'a': a, 'b': b}
20 verify(eval(expr, dict) == res)
21 t = type(a)
22 m = getattr(t, meth)
23 verify(m == t.__dict__[meth])
24 verify(m(a, b) == res)
25 bm = getattr(a, meth)
26 verify(bm(b) == res)
27
28def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
29 if verbose: print "checking", expr
30 dict = {'a': a, 'b': b, 'c': c}
31 verify(eval(expr, dict) == res)
32 t = type(a)
33 m = getattr(t, meth)
34 verify(m == t.__dict__[meth])
35 verify(m(a, b, c) == res)
36 bm = getattr(a, meth)
37 verify(bm(b, c) == res)
38
39def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
40 if verbose: print "checking", stmt
41 dict = {'a': deepcopy(a), 'b': b}
42 exec stmt in dict
43 verify(dict['a'] == res)
44 t = type(a)
45 m = getattr(t, meth)
46 verify(m == t.__dict__[meth])
47 dict['a'] = deepcopy(a)
48 m(dict['a'], b)
49 verify(dict['a'] == res)
50 dict['a'] = deepcopy(a)
51 bm = getattr(dict['a'], meth)
52 bm(b)
53 verify(dict['a'] == res)
54
55def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
56 if verbose: print "checking", stmt
57 dict = {'a': deepcopy(a), 'b': b, 'c': c}
58 exec stmt in dict
59 verify(dict['a'] == res)
60 t = type(a)
61 m = getattr(t, meth)
62 verify(m == t.__dict__[meth])
63 dict['a'] = deepcopy(a)
64 m(dict['a'], b, c)
65 verify(dict['a'] == res)
66 dict['a'] = deepcopy(a)
67 bm = getattr(dict['a'], meth)
68 bm(b, c)
69 verify(dict['a'] == res)
70
71def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
72 if verbose: print "checking", stmt
73 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
74 exec stmt in dict
75 verify(dict['a'] == res)
76 t = type(a)
77 m = getattr(t, meth)
78 verify(m == t.__dict__[meth])
79 dict['a'] = deepcopy(a)
80 m(dict['a'], b, c, d)
81 verify(dict['a'] == res)
82 dict['a'] = deepcopy(a)
83 bm = getattr(dict['a'], meth)
84 bm(b, c, d)
85 verify(dict['a'] == res)
86
87def lists():
88 if verbose: print "Testing list operations..."
89 testbinop([1], [2], [1,2], "a+b", "__add__")
90 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
91 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
92 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
93 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
94 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
95 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
96 testunop([1,2,3], 3, "len(a)", "__len__")
97 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
98 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
99 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
100 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
101
102def dicts():
103 if verbose: print "Testing dict operations..."
104 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
105 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
106 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
107 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
108 d = {1:2,3:4}
109 l1 = []
110 for i in d.keys(): l1.append(i)
111 l = []
112 for i in iter(d): l.append(i)
113 verify(l == l1)
114 l = []
115 for i in d.__iter__(): l.append(i)
116 verify(l == l1)
117 l = []
118 for i in dictionary.__iter__(d): l.append(i)
119 verify(l == l1)
120 d = {1:2, 3:4}
121 testunop(d, 2, "len(a)", "__len__")
122 verify(eval(repr(d), {}) == d)
123 verify(eval(d.__repr__(), {}) == d)
124 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
125
Tim Peters25786c02001-09-02 08:22:48 +0000126def dict_constructor():
127 if verbose:
128 print "Testing dictionary constructor ..."
129 d = dictionary()
130 verify(d == {})
131 d = dictionary({})
132 verify(d == {})
133 d = dictionary(mapping={})
134 verify(d == {})
135 d = dictionary({1: 2, 'a': 'b'})
136 verify(d == {1: 2, 'a': 'b'})
137 for badarg in 0, 0L, 0j, "0", [0], (0,):
138 try:
139 dictionary(badarg)
140 except TypeError:
141 pass
142 else:
143 raise TestFailed("no TypeError from dictionary(%r)" % badarg)
144 try:
145 dictionary(senseless={})
146 except TypeError:
147 pass
148 else:
149 raise TestFailed("no TypeError from dictionary(senseless={}")
150
151 try:
152 dictionary({}, {})
153 except TypeError:
154 pass
155 else:
156 raise TestFailed("no TypeError from dictionary({}, {})")
157
158 class Mapping:
159 dict = {1:2, 3:4, 'a':1j}
160
161 def __getitem__(self, i):
162 return self.dict[i]
163
164 try:
165 dictionary(Mapping())
166 except TypeError:
167 pass
168 else:
169 raise TestFailed("no TypeError from dictionary(incomplete mapping)")
170
171 Mapping.keys = lambda self: self.dict.keys()
172 d = dictionary(mapping=Mapping())
173 verify(d == Mapping.dict)
174
Tim Peters5d2b77c2001-09-03 05:47:38 +0000175def test_dir():
176 if verbose:
177 print "Testing dir() ..."
178 junk = 12
179 verify(dir() == ['junk'])
180 del junk
181
182 # Just make sure these don't blow up!
183 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
184 dir(arg)
185
Tim Peters37a309d2001-09-04 01:20:04 +0000186 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000187 class C:
188 Cdata = 1
189 def Cmethod(self): pass
190
191 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
192 verify(dir(C) == cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000193 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000194
195 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
196 verify(dir(c) == cstuff)
197
198 c.cdata = 2
199 c.cmethod = lambda self: 0
200 verify(dir(c) == cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000201 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000202
203 class A(C):
204 Adata = 1
205 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000206
Tim Peters37a309d2001-09-04 01:20:04 +0000207 astuff = ['Adata', 'Amethod'] + cstuff
208 verify(dir(A) == astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000209 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000210 a = A()
211 verify(dir(a) == astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000212 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000213 a.adata = 42
214 a.amethod = lambda self: 3
215 verify(dir(a) == astuff + ['adata', 'amethod'])
216
217 # The same, but with new-style classes. Since these have object as a
218 # base class, a lot more gets sucked in.
219 def interesting(strings):
220 return [s for s in strings if not s.startswith('_')]
221
Tim Peters5d2b77c2001-09-03 05:47:38 +0000222 class C(object):
223 Cdata = 1
224 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000225
226 cstuff = ['Cdata', 'Cmethod']
227 verify(interesting(dir(C)) == cstuff)
228
229 c = C()
230 verify(interesting(dir(c)) == cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000231 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000232
233 c.cdata = 2
234 c.cmethod = lambda self: 0
235 verify(interesting(dir(c)) == cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000236 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000237
Tim Peters5d2b77c2001-09-03 05:47:38 +0000238 class A(C):
239 Adata = 1
240 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000241
242 astuff = ['Adata', 'Amethod'] + cstuff
243 verify(interesting(dir(A)) == astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000244 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000245 a = A()
246 verify(interesting(dir(a)) == astuff)
247 a.adata = 42
248 a.amethod = lambda self: 3
249 verify(interesting(dir(a)) == astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000250 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000251
Tim Peterscaaff8d2001-09-10 23:12:14 +0000252 # Try a module subclass.
253 import sys
254 class M(type(sys)):
255 pass
256 minstance = M()
257 minstance.b = 2
258 minstance.a = 1
259 verify(dir(minstance) == ['a', 'b'])
260
261 class M2(M):
262 def getdict(self):
263 return "Not a dict!"
264 __dict__ = property(getdict)
265
266 m2instance = M2()
267 m2instance.b = 2
268 m2instance.a = 1
269 verify(m2instance.__dict__ == "Not a dict!")
270 try:
271 dir(m2instance)
272 except TypeError:
273 pass
274
Tim Peters6d6c1a32001-08-02 04:15:00 +0000275binops = {
276 'add': '+',
277 'sub': '-',
278 'mul': '*',
279 'div': '/',
280 'mod': '%',
281 'divmod': 'divmod',
282 'pow': '**',
283 'lshift': '<<',
284 'rshift': '>>',
285 'and': '&',
286 'xor': '^',
287 'or': '|',
288 'cmp': 'cmp',
289 'lt': '<',
290 'le': '<=',
291 'eq': '==',
292 'ne': '!=',
293 'gt': '>',
294 'ge': '>=',
295 }
296
297for name, expr in binops.items():
298 if expr.islower():
299 expr = expr + "(a, b)"
300 else:
301 expr = 'a %s b' % expr
302 binops[name] = expr
303
304unops = {
305 'pos': '+',
306 'neg': '-',
307 'abs': 'abs',
308 'invert': '~',
309 'int': 'int',
310 'long': 'long',
311 'float': 'float',
312 'oct': 'oct',
313 'hex': 'hex',
314 }
315
316for name, expr in unops.items():
317 if expr.islower():
318 expr = expr + "(a)"
319 else:
320 expr = '%s a' % expr
321 unops[name] = expr
322
323def numops(a, b, skip=[]):
324 dict = {'a': a, 'b': b}
325 for name, expr in binops.items():
326 if name not in skip:
327 name = "__%s__" % name
328 if hasattr(a, name):
329 res = eval(expr, dict)
330 testbinop(a, b, res, expr, name)
331 for name, expr in unops.items():
332 name = "__%s__" % name
333 if hasattr(a, name):
334 res = eval(expr, dict)
335 testunop(a, res, expr, name)
336
337def ints():
338 if verbose: print "Testing int operations..."
339 numops(100, 3)
340
341def longs():
342 if verbose: print "Testing long operations..."
343 numops(100L, 3L)
344
345def floats():
346 if verbose: print "Testing float operations..."
347 numops(100.0, 3.0)
348
349def complexes():
350 if verbose: print "Testing complex operations..."
351 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge'])
352 class Number(complex):
353 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000354 def __new__(cls, *args, **kwds):
355 result = complex.__new__(cls, *args)
356 result.prec = kwds.get('prec', 12)
357 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000358 def __repr__(self):
359 prec = self.prec
360 if self.imag == 0.0:
361 return "%.*g" % (prec, self.real)
362 if self.real == 0.0:
363 return "%.*gj" % (prec, self.imag)
364 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
365 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000366
Tim Peters6d6c1a32001-08-02 04:15:00 +0000367 a = Number(3.14, prec=6)
368 verify(`a` == "3.14")
369 verify(a.prec == 6)
370
Tim Peters3f996e72001-09-13 19:18:27 +0000371 a = Number(a, prec=2)
372 verify(`a` == "3.1")
373 verify(a.prec == 2)
374
375 a = Number(234.5)
376 verify(`a` == "234.5")
377 verify(a.prec == 12)
378
Tim Peters6d6c1a32001-08-02 04:15:00 +0000379def spamlists():
380 if verbose: print "Testing spamlist operations..."
381 import copy, xxsubtype as spam
382 def spamlist(l, memo=None):
383 import xxsubtype as spam
384 return spam.spamlist(l)
385 # This is an ugly hack:
386 copy._deepcopy_dispatch[spam.spamlist] = spamlist
387
388 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
389 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
390 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
391 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
392 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
393 "a[b:c]", "__getslice__")
394 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
395 "a+=b", "__iadd__")
396 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
397 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
398 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
399 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
400 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
401 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
402 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
403 # Test subclassing
404 class C(spam.spamlist):
405 def foo(self): return 1
406 a = C()
407 verify(a == [])
408 verify(a.foo() == 1)
409 a.append(100)
410 verify(a == [100])
411 verify(a.getstate() == 0)
412 a.setstate(42)
413 verify(a.getstate() == 42)
414
415def spamdicts():
416 if verbose: print "Testing spamdict operations..."
417 import copy, xxsubtype as spam
418 def spamdict(d, memo=None):
419 import xxsubtype as spam
420 sd = spam.spamdict()
421 for k, v in d.items(): sd[k] = v
422 return sd
423 # This is an ugly hack:
424 copy._deepcopy_dispatch[spam.spamdict] = spamdict
425
426 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
427 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
428 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
429 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
430 d = spamdict({1:2,3:4})
431 l1 = []
432 for i in d.keys(): l1.append(i)
433 l = []
434 for i in iter(d): l.append(i)
435 verify(l == l1)
436 l = []
437 for i in d.__iter__(): l.append(i)
438 verify(l == l1)
439 l = []
440 for i in type(spamdict({})).__iter__(d): l.append(i)
441 verify(l == l1)
442 straightd = {1:2, 3:4}
443 spamd = spamdict(straightd)
444 testunop(spamd, 2, "len(a)", "__len__")
445 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
446 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
447 "a[b]=c", "__setitem__")
448 # Test subclassing
449 class C(spam.spamdict):
450 def foo(self): return 1
451 a = C()
452 verify(a.items() == [])
453 verify(a.foo() == 1)
454 a['foo'] = 'bar'
455 verify(a.items() == [('foo', 'bar')])
456 verify(a.getstate() == 0)
457 a.setstate(100)
458 verify(a.getstate() == 100)
459
460def pydicts():
461 if verbose: print "Testing Python subclass of dict..."
462 verify(issubclass(dictionary, dictionary))
463 verify(isinstance({}, dictionary))
464 d = dictionary()
465 verify(d == {})
466 verify(d.__class__ is dictionary)
467 verify(isinstance(d, dictionary))
468 class C(dictionary):
469 state = -1
470 def __init__(self, *a, **kw):
471 if a:
472 assert len(a) == 1
473 self.state = a[0]
474 if kw:
475 for k, v in kw.items(): self[v] = k
476 def __getitem__(self, key):
477 return self.get(key, 0)
478 def __setitem__(self, key, value):
479 assert isinstance(key, type(0))
480 dictionary.__setitem__(self, key, value)
481 def setstate(self, state):
482 self.state = state
483 def getstate(self):
484 return self.state
485 verify(issubclass(C, dictionary))
486 a1 = C(12)
487 verify(a1.state == 12)
488 a2 = C(foo=1, bar=2)
489 verify(a2[1] == 'foo' and a2[2] == 'bar')
490 a = C()
491 verify(a.state == -1)
492 verify(a.getstate() == -1)
493 a.setstate(0)
494 verify(a.state == 0)
495 verify(a.getstate() == 0)
496 a.setstate(10)
497 verify(a.state == 10)
498 verify(a.getstate() == 10)
499 verify(a[42] == 0)
500 a[42] = 24
501 verify(a[42] == 24)
502 if verbose: print "pydict stress test ..."
503 N = 50
504 for i in range(N):
505 a[i] = C()
506 for j in range(N):
507 a[i][j] = i*j
508 for i in range(N):
509 for j in range(N):
510 verify(a[i][j] == i*j)
511
512def pylists():
513 if verbose: print "Testing Python subclass of list..."
514 class C(list):
515 def __getitem__(self, i):
516 return list.__getitem__(self, i) + 100
517 def __getslice__(self, i, j):
518 return (i, j)
519 a = C()
520 a.extend([0,1,2])
521 verify(a[0] == 100)
522 verify(a[1] == 101)
523 verify(a[2] == 102)
524 verify(a[100:200] == (100,200))
525
526def metaclass():
527 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000528 class C:
529 __metaclass__ = type
530 def __init__(self):
531 self.__state = 0
532 def getstate(self):
533 return self.__state
534 def setstate(self, state):
535 self.__state = state
536 a = C()
537 verify(a.getstate() == 0)
538 a.setstate(10)
539 verify(a.getstate() == 10)
540 class D:
541 class __metaclass__(type):
542 def myself(cls): return cls
543 verify(D.myself() == D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000544 d = D()
545 verify(d.__class__ is D)
546 class M1(type):
547 def __new__(cls, name, bases, dict):
548 dict['__spam__'] = 1
549 return type.__new__(cls, name, bases, dict)
550 class C:
551 __metaclass__ = M1
552 verify(C.__spam__ == 1)
553 c = C()
554 verify(c.__spam__ == 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000555
Guido van Rossum309b5662001-08-17 11:43:17 +0000556 class _instance(object):
557 pass
558 class M2(object):
559 def __new__(cls, name, bases, dict):
560 self = object.__new__(cls)
561 self.name = name
562 self.bases = bases
563 self.dict = dict
564 return self
565 __new__ = staticmethod(__new__)
566 def __call__(self):
567 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000568 # Early binding of methods
569 for key in self.dict:
570 if key.startswith("__"):
571 continue
572 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000573 return it
574 class C:
575 __metaclass__ = M2
576 def spam(self):
577 return 42
578 verify(C.name == 'C')
579 verify(C.bases == ())
580 verify('spam' in C.dict)
581 c = C()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000582 verify(c.spam() == 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583
Guido van Rossum91ee7982001-08-30 20:52:40 +0000584 # More metaclass examples
585
586 class autosuper(type):
587 # Automatically add __super to the class
588 # This trick only works for dynamic classes
589 # so we force __dynamic__ = 1
590 def __new__(metaclass, name, bases, dict):
591 # XXX Should check that name isn't already a base class name
592 dict["__dynamic__"] = 1
593 cls = super(autosuper, metaclass).__new__(metaclass,
594 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000595 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000596 while name[:1] == "_":
597 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000598 if name:
599 name = "_%s__super" % name
600 else:
601 name = "__super"
602 setattr(cls, name, super(cls))
603 return cls
604 class A:
605 __metaclass__ = autosuper
606 def meth(self):
607 return "A"
608 class B(A):
609 def meth(self):
610 return "B" + self.__super.meth()
611 class C(A):
612 def meth(self):
613 return "C" + self.__super.meth()
614 class D(C, B):
615 def meth(self):
616 return "D" + self.__super.meth()
617 verify(D().meth() == "DCBA")
618 class E(B, C):
619 def meth(self):
620 return "E" + self.__super.meth()
621 verify(E().meth() == "EBCA")
622
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000623 class autoproperty(type):
624 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000625 # named _get_x and/or _set_x are found
626 def __new__(metaclass, name, bases, dict):
627 hits = {}
628 for key, val in dict.iteritems():
629 if key.startswith("_get_"):
630 key = key[5:]
631 get, set = hits.get(key, (None, None))
632 get = val
633 hits[key] = get, set
634 elif key.startswith("_set_"):
635 key = key[5:]
636 get, set = hits.get(key, (None, None))
637 set = val
638 hits[key] = get, set
639 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000640 dict[key] = property(get, set)
641 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000642 name, bases, dict)
643 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000644 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000645 def _get_x(self):
646 return -self.__x
647 def _set_x(self, x):
648 self.__x = -x
649 a = A()
650 verify(not hasattr(a, "x"))
651 a.x = 12
652 verify(a.x == 12)
653 verify(a._A__x == -12)
654
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000655 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000656 # Merge of multiple cooperating metaclasses
657 pass
658 class A:
659 __metaclass__ = multimetaclass
660 def _get_x(self):
661 return "A"
662 class B(A):
663 def _get_x(self):
664 return "B" + self.__super._get_x()
665 class C(A):
666 def _get_x(self):
667 return "C" + self.__super._get_x()
668 class D(C, B):
669 def _get_x(self):
670 return "D" + self.__super._get_x()
671 verify(D().x == "DCBA")
672
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673def pymods():
674 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000676 import sys
677 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000678 class MM(MT):
679 def __init__(self):
680 MT.__init__(self)
681 def __getattr__(self, name):
682 log.append(("getattr", name))
683 return MT.__getattr__(self, name)
684 def __setattr__(self, name, value):
685 log.append(("setattr", name, value))
686 MT.__setattr__(self, name, value)
687 def __delattr__(self, name):
688 log.append(("delattr", name))
689 MT.__delattr__(self, name)
690 a = MM()
691 a.foo = 12
692 x = a.foo
693 del a.foo
Guido van Rossumce129a52001-08-28 18:23:24 +0000694 verify(log == [("setattr", "foo", 12),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000695 ("getattr", "foo"),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000696 ("delattr", "foo")], log)
697
698def multi():
699 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000700 class C(object):
701 def __init__(self):
702 self.__state = 0
703 def getstate(self):
704 return self.__state
705 def setstate(self, state):
706 self.__state = state
707 a = C()
708 verify(a.getstate() == 0)
709 a.setstate(10)
710 verify(a.getstate() == 10)
711 class D(dictionary, C):
712 def __init__(self):
713 type({}).__init__(self)
714 C.__init__(self)
715 d = D()
716 verify(d.keys() == [])
717 d["hello"] = "world"
718 verify(d.items() == [("hello", "world")])
719 verify(d["hello"] == "world")
720 verify(d.getstate() == 0)
721 d.setstate(10)
722 verify(d.getstate() == 10)
723 verify(D.__mro__ == (D, dictionary, C, object))
724
Guido van Rossume45763a2001-08-10 21:28:46 +0000725 # SF bug #442833
726 class Node(object):
727 def __int__(self):
728 return int(self.foo())
729 def foo(self):
730 return "23"
731 class Frag(Node, list):
732 def foo(self):
733 return "42"
734 verify(Node().__int__() == 23)
735 verify(int(Node()) == 23)
736 verify(Frag().__int__() == 42)
737 verify(int(Frag()) == 42)
738
Tim Peters6d6c1a32001-08-02 04:15:00 +0000739def diamond():
740 if verbose: print "Testing multiple inheritance special cases..."
741 class A(object):
742 def spam(self): return "A"
743 verify(A().spam() == "A")
744 class B(A):
745 def boo(self): return "B"
746 def spam(self): return "B"
747 verify(B().spam() == "B")
748 verify(B().boo() == "B")
749 class C(A):
750 def boo(self): return "C"
751 verify(C().spam() == "A")
752 verify(C().boo() == "C")
753 class D(B, C): pass
754 verify(D().spam() == "B")
755 verify(D().boo() == "B")
756 verify(D.__mro__ == (D, B, C, A, object))
757 class E(C, B): pass
758 verify(E().spam() == "B")
759 verify(E().boo() == "C")
760 verify(E.__mro__ == (E, C, B, A, object))
761 class F(D, E): pass
762 verify(F().spam() == "B")
763 verify(F().boo() == "B")
764 verify(F.__mro__ == (F, D, E, B, C, A, object))
765 class G(E, D): pass
766 verify(G().spam() == "B")
767 verify(G().boo() == "C")
768 verify(G.__mro__ == (G, E, D, C, B, A, object))
769
Guido van Rossum37202612001-08-09 19:45:21 +0000770def objects():
771 if verbose: print "Testing object class..."
772 a = object()
773 verify(a.__class__ == object == type(a))
774 b = object()
775 verify(a is not b)
776 verify(not hasattr(a, "foo"))
777 try:
778 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000779 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000780 pass
781 else:
782 verify(0, "object() should not allow setting a foo attribute")
783 verify(not hasattr(object(), "__dict__"))
784
785 class Cdict(object):
786 pass
787 x = Cdict()
788 verify(x.__dict__ is None)
789 x.foo = 1
790 verify(x.foo == 1)
791 verify(x.__dict__ == {'foo': 1})
792
Tim Peters6d6c1a32001-08-02 04:15:00 +0000793def slots():
794 if verbose: print "Testing __slots__..."
795 class C0(object):
796 __slots__ = []
797 x = C0()
798 verify(not hasattr(x, "__dict__"))
799 verify(not hasattr(x, "foo"))
800
801 class C1(object):
802 __slots__ = ['a']
803 x = C1()
804 verify(not hasattr(x, "__dict__"))
805 verify(x.a == None)
806 x.a = 1
807 verify(x.a == 1)
808 del x.a
809 verify(x.a == None)
810
811 class C3(object):
812 __slots__ = ['a', 'b', 'c']
813 x = C3()
814 verify(not hasattr(x, "__dict__"))
815 verify(x.a is None)
816 verify(x.b is None)
817 verify(x.c is None)
818 x.a = 1
819 x.b = 2
820 x.c = 3
821 verify(x.a == 1)
822 verify(x.b == 2)
823 verify(x.c == 3)
824
825def dynamics():
826 if verbose: print "Testing __dynamic__..."
827 verify(object.__dynamic__ == 0)
828 verify(list.__dynamic__ == 0)
829 class S1:
830 __metaclass__ = type
831 verify(S1.__dynamic__ == 0)
832 class S(object):
833 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000834 verify(S.__dynamic__ == 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000835 class D(object):
836 __dynamic__ = 1
837 verify(D.__dynamic__ == 1)
838 class E(D, S):
839 pass
840 verify(E.__dynamic__ == 1)
841 class F(S, D):
842 pass
843 verify(F.__dynamic__ == 1)
844 try:
845 S.foo = 1
846 except (AttributeError, TypeError):
847 pass
848 else:
849 verify(0, "assignment to a static class attribute should be illegal")
850 D.foo = 1
851 verify(D.foo == 1)
852 # Test that dynamic attributes are inherited
853 verify(E.foo == 1)
854 verify(F.foo == 1)
855 class SS(D):
856 __dynamic__ = 0
857 verify(SS.__dynamic__ == 0)
858 verify(SS.foo == 1)
859 try:
860 SS.foo = 1
861 except (AttributeError, TypeError):
862 pass
863 else:
864 verify(0, "assignment to SS.foo should be illegal")
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000865 # Test dynamic instances
866 class C(object):
867 __dynamic__ = 1
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000868 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000869 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000870 C.foobar = 2
871 verify(a.foobar == 2)
872 C.method = lambda self: 42
873 verify(a.method() == 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000874 C.__repr__ = lambda self: "C()"
875 verify(repr(a) == "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000876 C.__int__ = lambda self: 100
877 verify(int(a) == 100)
878 verify(a.foobar == 2)
879 verify(not hasattr(a, "spam"))
880 def mygetattr(self, name):
881 if name == "spam":
882 return "spam"
883 else:
884 return object.__getattr__(self, name)
885 C.__getattr__ = mygetattr
886 verify(a.spam == "spam")
887 a.new = 12
888 verify(a.new == 12)
889 def mysetattr(self, name, value):
890 if name == "spam":
891 raise AttributeError
892 return object.__setattr__(self, name, value)
893 C.__setattr__ = mysetattr
894 try:
895 a.spam = "not spam"
896 except AttributeError:
897 pass
898 else:
899 verify(0, "expected AttributeError")
900 verify(a.spam == "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000901 class D(C):
902 pass
903 d = D()
904 d.foo = 1
905 verify(d.foo == 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000906
Guido van Rossum7e35d572001-09-15 03:14:32 +0000907 # Test handling of int*seq and seq*int
908 class I(int):
909 __dynamic__ = 1
910 verify("a"*I(2) == "aa")
911 verify(I(2)*"a" == "aa")
Tim Peterse0007822001-09-15 06:35:55 +0000912 verify(2*I(3) == 6)
913 verify(I(3)*2 == 6)
914 verify(I(3)*I(2) == 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000915
916 # Test handling of long*seq and seq*long
917 class L(long):
918 __dynamic__ = 1
919 verify("a"*L(2L) == "aa")
920 verify(L(2L)*"a" == "aa")
Tim Peterse0007822001-09-15 06:35:55 +0000921 verify(2*L(3) == 6)
922 verify(L(3)*2 == 6)
923 verify(L(3)*L(2) == 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000924
Tim Peters6d6c1a32001-08-02 04:15:00 +0000925def errors():
926 if verbose: print "Testing errors..."
927
928 try:
929 class C(list, dictionary):
930 pass
931 except TypeError:
932 pass
933 else:
934 verify(0, "inheritance from both list and dict should be illegal")
935
936 try:
937 class C(object, None):
938 pass
939 except TypeError:
940 pass
941 else:
942 verify(0, "inheritance from non-type should be illegal")
943 class Classic:
944 pass
945
946 try:
947 class C(object, Classic):
948 pass
949 except TypeError:
950 pass
951 else:
952 verify(0, "inheritance from object and Classic should be illegal")
953
954 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000955 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000956 pass
957 except TypeError:
958 pass
959 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000960 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000961
962 try:
963 class C(object):
964 __slots__ = 1
965 except TypeError:
966 pass
967 else:
968 verify(0, "__slots__ = 1 should be illegal")
969
970 try:
971 class C(object):
972 __slots__ = [1]
973 except TypeError:
974 pass
975 else:
976 verify(0, "__slots__ = [1] should be illegal")
977
978def classmethods():
979 if verbose: print "Testing class methods..."
980 class C(object):
981 def foo(*a): return a
982 goo = classmethod(foo)
983 c = C()
984 verify(C.goo(1) == (C, 1))
985 verify(c.goo(1) == (C, 1))
986 verify(c.foo(1) == (c, 1))
987 class D(C):
988 pass
989 d = D()
990 verify(D.goo(1) == (D, 1))
991 verify(d.goo(1) == (D, 1))
992 verify(d.foo(1) == (d, 1))
993 verify(D.foo(d, 1) == (d, 1))
994
995def staticmethods():
996 if verbose: print "Testing static methods..."
997 class C(object):
998 def foo(*a): return a
999 goo = staticmethod(foo)
1000 c = C()
1001 verify(C.goo(1) == (1,))
1002 verify(c.goo(1) == (1,))
1003 verify(c.foo(1) == (c, 1,))
1004 class D(C):
1005 pass
1006 d = D()
1007 verify(D.goo(1) == (1,))
1008 verify(d.goo(1) == (1,))
1009 verify(d.foo(1) == (d, 1))
1010 verify(D.foo(d, 1) == (d, 1))
1011
1012def classic():
1013 if verbose: print "Testing classic classes..."
1014 class C:
1015 def foo(*a): return a
1016 goo = classmethod(foo)
1017 c = C()
1018 verify(C.goo(1) == (C, 1))
1019 verify(c.goo(1) == (C, 1))
1020 verify(c.foo(1) == (c, 1))
1021 class D(C):
1022 pass
1023 d = D()
1024 verify(D.goo(1) == (D, 1))
1025 verify(d.goo(1) == (D, 1))
1026 verify(d.foo(1) == (d, 1))
1027 verify(D.foo(d, 1) == (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001028 class E: # *not* subclassing from C
1029 foo = C.foo
1030 verify(E().foo == C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001031 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001032
1033def compattr():
1034 if verbose: print "Testing computed attributes..."
1035 class C(object):
1036 class computed_attribute(object):
1037 def __init__(self, get, set=None):
1038 self.__get = get
1039 self.__set = set
1040 def __get__(self, obj, type=None):
1041 return self.__get(obj)
1042 def __set__(self, obj, value):
1043 return self.__set(obj, value)
1044 def __init__(self):
1045 self.__x = 0
1046 def __get_x(self):
1047 x = self.__x
1048 self.__x = x+1
1049 return x
1050 def __set_x(self, x):
1051 self.__x = x
1052 x = computed_attribute(__get_x, __set_x)
1053 a = C()
1054 verify(a.x == 0)
1055 verify(a.x == 1)
1056 a.x = 10
1057 verify(a.x == 10)
1058 verify(a.x == 11)
1059
1060def newslot():
1061 if verbose: print "Testing __new__ slot override..."
1062 class C(list):
1063 def __new__(cls):
1064 self = list.__new__(cls)
1065 self.foo = 1
1066 return self
1067 def __init__(self):
1068 self.foo = self.foo + 2
1069 a = C()
1070 verify(a.foo == 3)
1071 verify(a.__class__ is C)
1072 class D(C):
1073 pass
1074 b = D()
1075 verify(b.foo == 3)
1076 verify(b.__class__ is D)
1077
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078def altmro():
1079 if verbose: print "Testing mro() and overriding it..."
1080 class A(object):
1081 def f(self): return "A"
1082 class B(A):
1083 pass
1084 class C(A):
1085 def f(self): return "C"
1086 class D(B, C):
1087 pass
1088 verify(D.mro() == [D, B, C, A, object] == list(D.__mro__))
1089 verify(D().f() == "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001090 class PerverseMetaType(type):
1091 def mro(cls):
1092 L = type.mro(cls)
1093 L.reverse()
1094 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001095 class X(A,B,C,D):
1096 __metaclass__ = PerverseMetaType
1097 verify(X.__mro__ == (object, A, C, B, D, X))
1098 verify(X().f() == "A")
1099
1100def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001101 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001102
1103 class B(object):
1104 "Intermediate class because object doesn't have a __setattr__"
1105
1106 class C(B):
1107
1108 def __getattr__(self, name):
1109 if name == "foo":
1110 return ("getattr", name)
1111 else:
1112 return B.__getattr__(self, name)
1113 def __setattr__(self, name, value):
1114 if name == "foo":
1115 self.setattr = (name, value)
1116 else:
1117 return B.__setattr__(self, name, value)
1118 def __delattr__(self, name):
1119 if name == "foo":
1120 self.delattr = name
1121 else:
1122 return B.__delattr__(self, name)
1123
1124 def __getitem__(self, key):
1125 return ("getitem", key)
1126 def __setitem__(self, key, value):
1127 self.setitem = (key, value)
1128 def __delitem__(self, key):
1129 self.delitem = key
1130
1131 def __getslice__(self, i, j):
1132 return ("getslice", i, j)
1133 def __setslice__(self, i, j, value):
1134 self.setslice = (i, j, value)
1135 def __delslice__(self, i, j):
1136 self.delslice = (i, j)
1137
1138 a = C()
1139 verify(a.foo == ("getattr", "foo"))
1140 a.foo = 12
1141 verify(a.setattr == ("foo", 12))
1142 del a.foo
1143 verify(a.delattr == "foo")
1144
1145 verify(a[12] == ("getitem", 12))
1146 a[12] = 21
1147 verify(a.setitem == (12, 21))
1148 del a[12]
1149 verify(a.delitem == 12)
1150
1151 verify(a[0:10] == ("getslice", 0, 10))
1152 a[0:10] = "foo"
1153 verify(a.setslice == (0, 10, "foo"))
1154 del a[0:10]
1155 verify(a.delslice == (0, 10))
1156
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001157def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001158 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001159 class C(object):
1160 def __init__(self, x):
1161 self.x = x
1162 def foo(self):
1163 return self.x
1164 c1 = C(1)
1165 verify(c1.foo() == 1)
1166 class D(C):
1167 boo = C.foo
1168 goo = c1.foo
1169 d2 = D(2)
1170 verify(d2.foo() == 2)
1171 verify(d2.boo() == 2)
Guido van Rossum501c7c72001-08-16 20:41:56 +00001172 verify(d2.goo() == 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001173 class E(object):
1174 foo = C.foo
1175 verify(E().foo == C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001176 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001177
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001178def specials():
1179 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001180 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001181 # Test the default behavior for static classes
1182 class C(object):
1183 def __getitem__(self, i):
1184 if 0 <= i < 10: return i
1185 raise IndexError
1186 c1 = C()
1187 c2 = C()
1188 verify(not not c1)
1189 verify(hash(c1) == id(c1))
1190 verify(cmp(c1, c2) == cmp(id(c1), id(c2)))
1191 verify(c1 == c1)
1192 verify(c1 != c2)
1193 verify(not c1 != c1)
1194 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001195 # Note that the module name appears in str/repr, and that varies
1196 # depending on whether this test is run standalone or from a framework.
1197 verify(str(c1).find('C instance at ') >= 0)
Tim Peters63a8d692001-08-16 16:56:16 +00001198 verify(str(c1) == repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001199 verify(-1 not in c1)
1200 for i in range(10):
1201 verify(i in c1)
1202 verify(10 not in c1)
1203 # Test the default behavior for dynamic classes
1204 class D(object):
1205 __dynamic__ = 1
1206 def __getitem__(self, i):
1207 if 0 <= i < 10: return i
1208 raise IndexError
1209 d1 = D()
1210 d2 = D()
1211 verify(not not d1)
1212 verify(hash(d1) == id(d1))
1213 verify(cmp(d1, d2) == cmp(id(d1), id(d2)))
1214 verify(d1 == d1)
1215 verify(d1 != d2)
1216 verify(not d1 != d1)
1217 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001218 # Note that the module name appears in str/repr, and that varies
1219 # depending on whether this test is run standalone or from a framework.
1220 verify(str(d1).find('D instance at ') >= 0)
Tim Peters63a8d692001-08-16 16:56:16 +00001221 verify(str(d1) == repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001222 verify(-1 not in d1)
1223 for i in range(10):
1224 verify(i in d1)
1225 verify(10 not in d1)
1226 # Test overridden behavior for static classes
1227 class Proxy(object):
1228 def __init__(self, x):
1229 self.x = x
1230 def __nonzero__(self):
1231 return not not self.x
1232 def __hash__(self):
1233 return hash(self.x)
1234 def __eq__(self, other):
1235 return self.x == other
1236 def __ne__(self, other):
1237 return self.x != other
1238 def __cmp__(self, other):
1239 return cmp(self.x, other.x)
1240 def __str__(self):
1241 return "Proxy:%s" % self.x
1242 def __repr__(self):
1243 return "Proxy(%r)" % self.x
1244 def __contains__(self, value):
1245 return value in self.x
1246 p0 = Proxy(0)
1247 p1 = Proxy(1)
1248 p_1 = Proxy(-1)
1249 verify(not p0)
1250 verify(not not p1)
1251 verify(hash(p0) == hash(0))
1252 verify(p0 == p0)
1253 verify(p0 != p1)
1254 verify(not p0 != p0)
1255 verify(not p0 == p1)
1256 verify(cmp(p0, p1) == -1)
1257 verify(cmp(p0, p0) == 0)
1258 verify(cmp(p0, p_1) == 1)
1259 verify(str(p0) == "Proxy:0")
1260 verify(repr(p0) == "Proxy(0)")
1261 p10 = Proxy(range(10))
1262 verify(-1 not in p10)
1263 for i in range(10):
1264 verify(i in p10)
1265 verify(10 not in p10)
1266 # Test overridden behavior for dynamic classes
1267 class DProxy(object):
1268 __dynamic__ = 1
1269 def __init__(self, x):
1270 self.x = x
1271 def __nonzero__(self):
1272 return not not self.x
1273 def __hash__(self):
1274 return hash(self.x)
1275 def __eq__(self, other):
1276 return self.x == other
1277 def __ne__(self, other):
1278 return self.x != other
1279 def __cmp__(self, other):
1280 return cmp(self.x, other.x)
1281 def __str__(self):
1282 return "DProxy:%s" % self.x
1283 def __repr__(self):
1284 return "DProxy(%r)" % self.x
1285 def __contains__(self, value):
1286 return value in self.x
1287 p0 = DProxy(0)
1288 p1 = DProxy(1)
1289 p_1 = DProxy(-1)
1290 verify(not p0)
1291 verify(not not p1)
1292 verify(hash(p0) == hash(0))
1293 verify(p0 == p0)
1294 verify(p0 != p1)
1295 verify(not p0 != p0)
1296 verify(not p0 == p1)
1297 verify(cmp(p0, p1) == -1)
1298 verify(cmp(p0, p0) == 0)
1299 verify(cmp(p0, p_1) == 1)
1300 verify(str(p0) == "DProxy:0")
1301 verify(repr(p0) == "DProxy(0)")
1302 p10 = DProxy(range(10))
1303 verify(-1 not in p10)
1304 for i in range(10):
1305 verify(i in p10)
1306 verify(10 not in p10)
1307
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001308def weakrefs():
1309 if verbose: print "Testing weak references..."
1310 import weakref
1311 class C(object):
1312 pass
1313 c = C()
1314 r = weakref.ref(c)
1315 verify(r() is c)
1316 del c
1317 verify(r() is None)
1318 del r
1319 class NoWeak(object):
1320 __slots__ = ['foo']
1321 no = NoWeak()
1322 try:
1323 weakref.ref(no)
1324 except TypeError, msg:
1325 verify(str(msg).find("weakly") >= 0)
1326 else:
1327 verify(0, "weakref.ref(no) should be illegal")
1328 class Weak(object):
1329 __slots__ = ['foo', '__weakref__']
1330 yes = Weak()
1331 r = weakref.ref(yes)
1332 verify(r() is yes)
1333 del yes
1334 verify(r() is None)
1335 del r
1336
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001337def properties():
1338 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001339 class C(object):
1340 def getx(self):
1341 return self.__x
1342 def setx(self, value):
1343 self.__x = value
1344 def delx(self):
1345 del self.__x
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001346 x = property(getx, setx, delx)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001347 a = C()
1348 verify(not hasattr(a, "x"))
1349 a.x = 42
1350 verify(a._C__x == 42)
1351 verify(a.x == 42)
1352 del a.x
1353 verify(not hasattr(a, "x"))
1354 verify(not hasattr(a, "_C__x"))
1355 C.x.__set__(a, 100)
1356 verify(C.x.__get__(a) == 100)
1357## C.x.__set__(a)
1358## verify(not hasattr(a, "x"))
1359
Guido van Rossumc4a18802001-08-24 16:55:27 +00001360def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001361 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001362
1363 class A(object):
1364 def meth(self, a):
1365 return "A(%r)" % a
1366
1367 verify(A().meth(1) == "A(1)")
1368
1369 class B(A):
1370 def __init__(self):
1371 self.__super = super(B, self)
1372 def meth(self, a):
1373 return "B(%r)" % a + self.__super.meth(a)
1374
1375 verify(B().meth(2) == "B(2)A(2)")
1376
1377 class C(A):
1378 __dynamic__ = 1
1379 def meth(self, a):
1380 return "C(%r)" % a + self.__super.meth(a)
1381 C._C__super = super(C)
1382
1383 verify(C().meth(3) == "C(3)A(3)")
1384
1385 class D(C, B):
1386 def meth(self, a):
1387 return "D(%r)" % a + super(D, self).meth(a)
1388
1389 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1390
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001391def inherits():
1392 if verbose: print "Testing inheritance from basic types..."
1393
1394 class hexint(int):
1395 def __repr__(self):
1396 return hex(self)
1397 def __add__(self, other):
1398 return hexint(int.__add__(self, other))
1399 # (Note that overriding __radd__ doesn't work,
1400 # because the int type gets first dibs.)
1401 verify(repr(hexint(7) + 9) == "0x10")
1402 verify(repr(hexint(1000) + 7) == "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001403 a = hexint(12345)
Tim Peters4f467e82001-09-12 19:53:15 +00001404 #XXX verify(a == 12345)
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001405 verify(int(a) == 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001406 verify(int(a).__class__ is int)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001407 verify(hash(a) == hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001408 verify((+a).__class__ is int)
1409 verify((a >> 0).__class__ is int)
1410 verify((a << 0).__class__ is int)
1411 verify((hexint(0) << 12).__class__ is int)
1412 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001413
1414 class octlong(long):
1415 __slots__ = []
1416 def __str__(self):
1417 s = oct(self)
1418 if s[-1] == 'L':
1419 s = s[:-1]
1420 return s
1421 def __add__(self, other):
1422 return self.__class__(super(octlong, self).__add__(other))
1423 __radd__ = __add__
1424 verify(str(octlong(3) + 5) == "010")
1425 # (Note that overriding __radd__ here only seems to work
1426 # because the example uses a short int left argument.)
1427 verify(str(5 + octlong(3000)) == "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001428 a = octlong(12345)
Tim Peters4f467e82001-09-12 19:53:15 +00001429 #XXX verify(a == 12345L)
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001430 verify(long(a) == 12345L)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001431 verify(hash(a) == hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001432 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001433 verify((+a).__class__ is long)
1434 verify((-a).__class__ is long)
1435 verify((-octlong(0)).__class__ is long)
1436 verify((a >> 0).__class__ is long)
1437 verify((a << 0).__class__ is long)
1438 verify((a - 0).__class__ is long)
1439 verify((a * 1).__class__ is long)
1440 verify((a ** 1).__class__ is long)
1441 verify((a // 1).__class__ is long)
1442 verify((1 * a).__class__ is long)
1443 verify((a | 0).__class__ is long)
1444 verify((a ^ 0).__class__ is long)
1445 verify((a & -1L).__class__ is long)
1446 verify((octlong(0) << 12).__class__ is long)
1447 verify((octlong(0) >> 12).__class__ is long)
1448 verify(abs(octlong(0)).__class__ is long)
1449
1450 # Because octlong overrides __add__, we can't check the absence of +0
1451 # optimizations using octlong.
1452 class longclone(long):
1453 pass
1454 a = longclone(1)
1455 verify((a + 0).__class__ is long)
1456 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001457
1458 class precfloat(float):
1459 __slots__ = ['prec']
1460 def __init__(self, value=0.0, prec=12):
1461 self.prec = int(prec)
1462 float.__init__(value)
1463 def __repr__(self):
1464 return "%.*g" % (self.prec, self)
1465 verify(repr(precfloat(1.1)) == "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001466 a = precfloat(12345)
Tim Peters4f467e82001-09-12 19:53:15 +00001467 #XXX verify(a == 12345.0)
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001468 verify(float(a) == 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001469 verify(float(a).__class__ is float)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001470 verify(hash(a) == hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001471 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001472
Tim Peters2400fa42001-09-12 19:12:49 +00001473 class madcomplex(complex):
1474 def __repr__(self):
1475 return "%.17gj%+.17g" % (self.imag, self.real)
1476 a = madcomplex(-3, 4)
1477 verify(repr(a) == "4j-3")
1478 base = complex(-3, 4)
1479 verify(base.__class__ is complex)
Tim Peters4f467e82001-09-12 19:53:15 +00001480 #XXX verify(a == base)
Tim Peters2400fa42001-09-12 19:12:49 +00001481 verify(complex(a) == base)
1482 verify(complex(a).__class__ is complex)
1483 a = madcomplex(a) # just trying another form of the constructor
1484 verify(repr(a) == "4j-3")
Tim Peters4f467e82001-09-12 19:53:15 +00001485 #XXX verify(a == base)
Tim Peters2400fa42001-09-12 19:12:49 +00001486 verify(complex(a) == base)
1487 verify(complex(a).__class__ is complex)
1488 verify(hash(a) == hash(base))
1489 verify((+a).__class__ is complex)
1490 verify((a + 0).__class__ is complex)
1491 verify(a + 0 == base)
1492 verify((a - 0).__class__ is complex)
1493 verify(a - 0 == base)
1494 verify((a * 1).__class__ is complex)
1495 verify(a * 1 == base)
1496 verify((a / 1).__class__ is complex)
1497 verify(a / 1 == base)
1498
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001499 class madtuple(tuple):
1500 _rev = None
1501 def rev(self):
1502 if self._rev is not None:
1503 return self._rev
1504 L = list(self)
1505 L.reverse()
1506 self._rev = self.__class__(L)
1507 return self._rev
1508 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Tim Peters4f467e82001-09-12 19:53:15 +00001509 verify(a == (1,2,3,4,5,6,7,8,9,0))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001510 verify(a.rev() == madtuple((0,9,8,7,6,5,4,3,2,1)))
1511 verify(a.rev().rev() == madtuple((1,2,3,4,5,6,7,8,9,0)))
1512 for i in range(512):
1513 t = madtuple(range(i))
1514 u = t.rev()
1515 v = u.rev()
1516 verify(v == t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001517 a = madtuple((1,2,3,4,5))
1518 verify(tuple(a) == (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001519 verify(tuple(a).__class__ is tuple)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001520 verify(hash(a) == hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001521 verify(a[:].__class__ is tuple)
1522 verify((a * 1).__class__ is tuple)
1523 verify((a * 0).__class__ is tuple)
1524 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001525 a = madtuple(())
1526 verify(tuple(a) == ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001527 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001528 verify((a + a).__class__ is tuple)
1529 verify((a * 0).__class__ is tuple)
1530 verify((a * 1).__class__ is tuple)
1531 verify((a * 2).__class__ is tuple)
1532 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001533
1534 class madstring(str):
1535 _rev = None
1536 def rev(self):
1537 if self._rev is not None:
1538 return self._rev
1539 L = list(self)
1540 L.reverse()
1541 self._rev = self.__class__("".join(L))
1542 return self._rev
1543 s = madstring("abcdefghijklmnopqrstuvwxyz")
Tim Peters4f467e82001-09-12 19:53:15 +00001544 #XXX verify(s == "abcdefghijklmnopqrstuvwxyz")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001545 verify(s.rev() == madstring("zyxwvutsrqponmlkjihgfedcba"))
1546 verify(s.rev().rev() == madstring("abcdefghijklmnopqrstuvwxyz"))
1547 for i in range(256):
1548 s = madstring("".join(map(chr, range(i))))
1549 t = s.rev()
1550 u = t.rev()
1551 verify(u == s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001552 s = madstring("12345")
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001553 verify(str(s) == "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001554 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001555
Tim Peters8fa5dd02001-09-12 02:18:30 +00001556 base = "\x00" * 5
1557 s = madstring(base)
Tim Peters4f467e82001-09-12 19:53:15 +00001558 #XXX verify(s == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001559 verify(str(s) == base)
Tim Petersc636f562001-09-11 01:52:02 +00001560 verify(str(s).__class__ is str)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001561 verify(hash(s) == hash(base))
Tim Peters0ab085c2001-09-14 00:25:33 +00001562 #XXX verify({s: 1}[base] == 1)
1563 #XXX verify({base: 1}[s] == 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001564 verify((s + "").__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001565 verify(s + "" == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001566 verify(("" + s).__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001567 verify("" + s == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001568 verify((s * 0).__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001569 verify(s * 0 == "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001570 verify((s * 1).__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001571 verify(s * 1 == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001572 verify((s * 2).__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001573 verify(s * 2 == base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001574 verify(s[:].__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001575 verify(s[:] == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001576 verify(s[0:0].__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001577 verify(s[0:0] == "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001578 verify(s.strip().__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001579 verify(s.strip() == base)
1580 verify(s.lstrip().__class__ is str)
1581 verify(s.lstrip() == base)
1582 verify(s.rstrip().__class__ is str)
1583 verify(s.rstrip() == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001584 identitytab = ''.join([chr(i) for i in range(256)])
1585 verify(s.translate(identitytab).__class__ is str)
1586 verify(s.translate(identitytab) == base)
1587 verify(s.translate(identitytab, "x").__class__ is str)
1588 verify(s.translate(identitytab, "x") == base)
1589 verify(s.translate(identitytab, "\x00") == "")
1590 verify(s.replace("x", "x").__class__ is str)
1591 verify(s.replace("x", "x") == base)
1592 verify(s.ljust(len(s)).__class__ is str)
1593 verify(s.ljust(len(s)) == base)
1594 verify(s.rjust(len(s)).__class__ is str)
1595 verify(s.rjust(len(s)) == base)
1596 verify(s.center(len(s)).__class__ is str)
1597 verify(s.center(len(s)) == base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001598 verify(s.lower().__class__ is str)
1599 verify(s.lower() == base)
Tim Petersc636f562001-09-11 01:52:02 +00001600
Tim Peters111f6092001-09-12 07:54:51 +00001601 s = madstring("x y")
Tim Peters4f467e82001-09-12 19:53:15 +00001602 #XXX verify(s == "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001603 verify(intern(s).__class__ is str)
1604 verify(intern(s) is intern("x y"))
1605 verify(intern(s) == "x y")
1606
1607 i = intern("y x")
1608 s = madstring("y x")
Tim Peters4f467e82001-09-12 19:53:15 +00001609 #XXX verify(s == i)
Tim Peters111f6092001-09-12 07:54:51 +00001610 verify(intern(s).__class__ is str)
1611 verify(intern(s) is i)
1612
1613 s = madstring(i)
1614 verify(intern(s).__class__ is str)
1615 verify(intern(s) is i)
1616
Guido van Rossum91ee7982001-08-30 20:52:40 +00001617 class madunicode(unicode):
1618 _rev = None
1619 def rev(self):
1620 if self._rev is not None:
1621 return self._rev
1622 L = list(self)
1623 L.reverse()
1624 self._rev = self.__class__(u"".join(L))
1625 return self._rev
1626 u = madunicode("ABCDEF")
Tim Peters4f467e82001-09-12 19:53:15 +00001627 verify(u == u"ABCDEF")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001628 verify(u.rev() == madunicode(u"FEDCBA"))
1629 verify(u.rev().rev() == madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001630 base = u"12345"
1631 u = madunicode(base)
1632 verify(unicode(u) == base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001633 verify(unicode(u).__class__ is unicode)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001634 verify(hash(u) == hash(base))
1635 verify({u: 1}[base] == 1)
1636 verify({base: 1}[u] == 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001637 verify(u.strip().__class__ is unicode)
1638 verify(u.strip() == base)
1639 verify(u.lstrip().__class__ is unicode)
1640 verify(u.lstrip() == base)
1641 verify(u.rstrip().__class__ is unicode)
1642 verify(u.rstrip() == base)
1643 verify(u.replace(u"x", u"x").__class__ is unicode)
1644 verify(u.replace(u"x", u"x") == base)
1645 verify(u.replace(u"xy", u"xy").__class__ is unicode)
1646 verify(u.replace(u"xy", u"xy") == base)
1647 verify(u.center(len(u)).__class__ is unicode)
1648 verify(u.center(len(u)) == base)
1649 verify(u.ljust(len(u)).__class__ is unicode)
1650 verify(u.ljust(len(u)) == base)
1651 verify(u.rjust(len(u)).__class__ is unicode)
1652 verify(u.rjust(len(u)) == base)
1653 verify(u.lower().__class__ is unicode)
1654 verify(u.lower() == base)
1655 verify(u.upper().__class__ is unicode)
1656 verify(u.upper() == base)
1657 verify(u.capitalize().__class__ is unicode)
1658 verify(u.capitalize() == base)
1659 verify(u.title().__class__ is unicode)
1660 verify(u.title() == base)
1661 verify((u + u"").__class__ is unicode)
1662 verify(u + u"" == base)
1663 verify((u"" + u).__class__ is unicode)
1664 verify(u"" + u == base)
1665 verify((u * 0).__class__ is unicode)
1666 verify(u * 0 == u"")
1667 verify((u * 1).__class__ is unicode)
1668 verify(u * 1 == base)
1669 verify((u * 2).__class__ is unicode)
1670 verify(u * 2 == base + base)
1671 verify(u[:].__class__ is unicode)
1672 verify(u[:] == base)
1673 verify(u[0:0].__class__ is unicode)
1674 verify(u[0:0] == u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001675
Tim Peters59c9a642001-09-13 05:38:56 +00001676 class CountedInput(file):
1677 """Counts lines read by self.readline().
1678
1679 self.lineno is the 0-based ordinal of the last line read, up to
1680 a maximum of one greater than the number of lines in the file.
1681
1682 self.ateof is true if and only if the final "" line has been read,
1683 at which point self.lineno stops incrementing, and further calls
1684 to readline() continue to return "".
1685 """
1686
1687 lineno = 0
1688 ateof = 0
1689 def readline(self):
1690 if self.ateof:
1691 return ""
1692 s = file.readline(self)
1693 # Next line works too.
1694 # s = super(CountedInput, self).readline()
1695 self.lineno += 1
1696 if s == "":
1697 self.ateof = 1
1698 return s
1699
Tim Peters561f8992001-09-13 19:36:36 +00001700 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001701 lines = ['a\n', 'b\n', 'c\n']
1702 try:
1703 f.writelines(lines)
1704 f.close()
1705 f = CountedInput(TESTFN)
1706 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1707 got = f.readline()
1708 verify(expected == got)
1709 verify(f.lineno == i)
1710 verify(f.ateof == (i > len(lines)))
1711 f.close()
1712 finally:
1713 try:
1714 f.close()
1715 except:
1716 pass
1717 try:
1718 import os
1719 os.unlink(TESTFN)
1720 except:
1721 pass
1722
Tim Peters808b94e2001-09-13 19:33:07 +00001723def keywords():
1724 if verbose:
1725 print "Testing keyword args to basic type constructors ..."
1726 verify(int(x=1) == 1)
1727 verify(float(x=2) == 2.0)
1728 verify(long(x=3) == 3L)
1729 verify(complex(imag=42, real=666) == complex(666, 42))
1730 verify(str(object=500) == '500')
1731 verify(unicode(string='abc', errors='strict') == u'abc')
1732 verify(tuple(sequence=range(3)) == (0, 1, 2))
1733 verify(list(sequence=(0, 1, 2)) == range(3))
1734 verify(dictionary(mapping={1: 2}) == {1: 2})
1735
1736 for constructor in (int, float, long, complex, str, unicode,
1737 tuple, list, dictionary, file):
1738 try:
1739 constructor(bogus_keyword_arg=1)
1740 except TypeError:
1741 pass
1742 else:
1743 raise TestFailed("expected TypeError from bogus keyword "
1744 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001745
Tim Peters8fa45672001-09-13 21:01:29 +00001746def restricted():
1747 import rexec
1748 if verbose:
1749 print "Testing interaction with restricted execution ..."
1750
1751 sandbox = rexec.RExec()
1752
1753 code1 = """f = open(%r, 'w')""" % TESTFN
1754 code2 = """f = file(%r, 'w')""" % TESTFN
1755 code3 = """\
1756f = open(%r)
1757t = type(f) # a sneaky way to get the file() constructor
1758f.close()
1759f = t(%r, 'w') # rexec can't catch this by itself
1760""" % (TESTFN, TESTFN)
1761
1762 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1763 f.close()
1764
1765 try:
1766 for code in code1, code2, code3:
1767 try:
1768 sandbox.r_exec(code)
1769 except IOError, msg:
1770 if str(msg).find("restricted") >= 0:
1771 outcome = "OK"
1772 else:
1773 outcome = "got an exception, but not an expected one"
1774 else:
1775 outcome = "expected a restricted-execution exception"
1776
1777 if outcome != "OK":
1778 raise TestFailed("%s, in %r" % (outcome, code))
1779
1780 finally:
1781 try:
1782 import os
1783 os.unlink(TESTFN)
1784 except:
1785 pass
1786
Tim Peters0ab085c2001-09-14 00:25:33 +00001787def str_subclass_as_dict_key():
1788 if verbose:
1789 print "Testing a str subclass used as dict key .."
1790
1791 class cistr(str):
1792 """Sublcass of str that computes __eq__ case-insensitively.
1793
1794 Also computes a hash code of the string in canonical form.
1795 """
1796
1797 def __init__(self, value):
1798 self.canonical = value.lower()
1799 self.hashcode = hash(self.canonical)
1800
1801 def __eq__(self, other):
1802 if not isinstance(other, cistr):
1803 other = cistr(other)
1804 return self.canonical == other.canonical
1805
1806 def __hash__(self):
1807 return self.hashcode
1808
1809 verify('aBc' == cistr('ABC') == 'abc')
1810 verify(str(cistr('ABC')) == 'ABC')
1811
1812 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
1813 verify(d[cistr('one')] == 1)
1814 verify(d[cistr('tWo')] == 2)
1815 verify(d[cistr('THrEE')] == 3)
1816 verify(cistr('ONe') in d)
1817 verify(d.get(cistr('thrEE')) == 3)
1818
1819
Tim Peters6d6c1a32001-08-02 04:15:00 +00001820def all():
1821 lists()
1822 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00001823 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00001824 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001825 ints()
1826 longs()
1827 floats()
1828 complexes()
1829 spamlists()
1830 spamdicts()
1831 pydicts()
1832 pylists()
1833 metaclass()
1834 pymods()
1835 multi()
1836 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00001837 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001838 slots()
1839 dynamics()
1840 errors()
1841 classmethods()
1842 staticmethods()
1843 classic()
1844 compattr()
1845 newslot()
1846 altmro()
1847 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001848 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001849 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001850 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001851 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00001852 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001853 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00001854 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00001855 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00001856 str_subclass_as_dict_key()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001857
1858all()
1859
1860if verbose: print "All OK"