blob: fab1e66dadb7034d61bfd1d228ef9f64816b232b [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)
Guido van Rossum843daa82001-09-18 20:04:26 +00001307 # Safety test for __cmp__
1308 def unsafecmp(a, b):
1309 try:
1310 a.__class__.__cmp__(a, b)
1311 except TypeError:
1312 pass
1313 else:
1314 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1315 a.__class__, a, b)
1316 unsafecmp(u"123", "123")
1317 unsafecmp("123", u"123")
1318 unsafecmp(1, 1.0)
1319 unsafecmp(1.0, 1)
1320 unsafecmp(1, 1L)
1321 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001322
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001323def weakrefs():
1324 if verbose: print "Testing weak references..."
1325 import weakref
1326 class C(object):
1327 pass
1328 c = C()
1329 r = weakref.ref(c)
1330 verify(r() is c)
1331 del c
1332 verify(r() is None)
1333 del r
1334 class NoWeak(object):
1335 __slots__ = ['foo']
1336 no = NoWeak()
1337 try:
1338 weakref.ref(no)
1339 except TypeError, msg:
1340 verify(str(msg).find("weakly") >= 0)
1341 else:
1342 verify(0, "weakref.ref(no) should be illegal")
1343 class Weak(object):
1344 __slots__ = ['foo', '__weakref__']
1345 yes = Weak()
1346 r = weakref.ref(yes)
1347 verify(r() is yes)
1348 del yes
1349 verify(r() is None)
1350 del r
1351
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001352def properties():
1353 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001354 class C(object):
1355 def getx(self):
1356 return self.__x
1357 def setx(self, value):
1358 self.__x = value
1359 def delx(self):
1360 del self.__x
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001361 x = property(getx, setx, delx)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001362 a = C()
1363 verify(not hasattr(a, "x"))
1364 a.x = 42
1365 verify(a._C__x == 42)
1366 verify(a.x == 42)
1367 del a.x
1368 verify(not hasattr(a, "x"))
1369 verify(not hasattr(a, "_C__x"))
1370 C.x.__set__(a, 100)
1371 verify(C.x.__get__(a) == 100)
1372## C.x.__set__(a)
1373## verify(not hasattr(a, "x"))
1374
Guido van Rossumc4a18802001-08-24 16:55:27 +00001375def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001376 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001377
1378 class A(object):
1379 def meth(self, a):
1380 return "A(%r)" % a
1381
1382 verify(A().meth(1) == "A(1)")
1383
1384 class B(A):
1385 def __init__(self):
1386 self.__super = super(B, self)
1387 def meth(self, a):
1388 return "B(%r)" % a + self.__super.meth(a)
1389
1390 verify(B().meth(2) == "B(2)A(2)")
1391
1392 class C(A):
1393 __dynamic__ = 1
1394 def meth(self, a):
1395 return "C(%r)" % a + self.__super.meth(a)
1396 C._C__super = super(C)
1397
1398 verify(C().meth(3) == "C(3)A(3)")
1399
1400 class D(C, B):
1401 def meth(self, a):
1402 return "D(%r)" % a + super(D, self).meth(a)
1403
1404 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1405
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001406def inherits():
1407 if verbose: print "Testing inheritance from basic types..."
1408
1409 class hexint(int):
1410 def __repr__(self):
1411 return hex(self)
1412 def __add__(self, other):
1413 return hexint(int.__add__(self, other))
1414 # (Note that overriding __radd__ doesn't work,
1415 # because the int type gets first dibs.)
1416 verify(repr(hexint(7) + 9) == "0x10")
1417 verify(repr(hexint(1000) + 7) == "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001418 a = hexint(12345)
Tim Peters50fda6c2001-09-18 21:24:18 +00001419 verify(a == 12345)
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001420 verify(int(a) == 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001421 verify(int(a).__class__ is int)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001422 verify(hash(a) == hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001423 verify((+a).__class__ is int)
1424 verify((a >> 0).__class__ is int)
1425 verify((a << 0).__class__ is int)
1426 verify((hexint(0) << 12).__class__ is int)
1427 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001428
1429 class octlong(long):
1430 __slots__ = []
1431 def __str__(self):
1432 s = oct(self)
1433 if s[-1] == 'L':
1434 s = s[:-1]
1435 return s
1436 def __add__(self, other):
1437 return self.__class__(super(octlong, self).__add__(other))
1438 __radd__ = __add__
1439 verify(str(octlong(3) + 5) == "010")
1440 # (Note that overriding __radd__ here only seems to work
1441 # because the example uses a short int left argument.)
1442 verify(str(5 + octlong(3000)) == "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001443 a = octlong(12345)
Tim Peters50fda6c2001-09-18 21:24:18 +00001444 verify(a == 12345L)
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001445 verify(long(a) == 12345L)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001446 verify(hash(a) == hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001447 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001448 verify((+a).__class__ is long)
1449 verify((-a).__class__ is long)
1450 verify((-octlong(0)).__class__ is long)
1451 verify((a >> 0).__class__ is long)
1452 verify((a << 0).__class__ is long)
1453 verify((a - 0).__class__ is long)
1454 verify((a * 1).__class__ is long)
1455 verify((a ** 1).__class__ is long)
1456 verify((a // 1).__class__ is long)
1457 verify((1 * a).__class__ is long)
1458 verify((a | 0).__class__ is long)
1459 verify((a ^ 0).__class__ is long)
1460 verify((a & -1L).__class__ is long)
1461 verify((octlong(0) << 12).__class__ is long)
1462 verify((octlong(0) >> 12).__class__ is long)
1463 verify(abs(octlong(0)).__class__ is long)
1464
1465 # Because octlong overrides __add__, we can't check the absence of +0
1466 # optimizations using octlong.
1467 class longclone(long):
1468 pass
1469 a = longclone(1)
1470 verify((a + 0).__class__ is long)
1471 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001472
1473 class precfloat(float):
1474 __slots__ = ['prec']
1475 def __init__(self, value=0.0, prec=12):
1476 self.prec = int(prec)
1477 float.__init__(value)
1478 def __repr__(self):
1479 return "%.*g" % (self.prec, self)
1480 verify(repr(precfloat(1.1)) == "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001481 a = precfloat(12345)
Tim Peters50fda6c2001-09-18 21:24:18 +00001482 verify(a == 12345.0)
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001483 verify(float(a) == 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001484 verify(float(a).__class__ is float)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001485 verify(hash(a) == hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001486 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001487
Tim Peters2400fa42001-09-12 19:12:49 +00001488 class madcomplex(complex):
1489 def __repr__(self):
1490 return "%.17gj%+.17g" % (self.imag, self.real)
1491 a = madcomplex(-3, 4)
1492 verify(repr(a) == "4j-3")
1493 base = complex(-3, 4)
1494 verify(base.__class__ is complex)
Guido van Rossumd5d8e4a2001-09-19 01:16:16 +00001495 verify(a == base)
Tim Peters2400fa42001-09-12 19:12:49 +00001496 verify(complex(a) == base)
1497 verify(complex(a).__class__ is complex)
1498 a = madcomplex(a) # just trying another form of the constructor
1499 verify(repr(a) == "4j-3")
Guido van Rossumd5d8e4a2001-09-19 01:16:16 +00001500 verify(a == base)
Tim Peters2400fa42001-09-12 19:12:49 +00001501 verify(complex(a) == base)
1502 verify(complex(a).__class__ is complex)
1503 verify(hash(a) == hash(base))
1504 verify((+a).__class__ is complex)
1505 verify((a + 0).__class__ is complex)
1506 verify(a + 0 == base)
1507 verify((a - 0).__class__ is complex)
1508 verify(a - 0 == base)
1509 verify((a * 1).__class__ is complex)
1510 verify(a * 1 == base)
1511 verify((a / 1).__class__ is complex)
1512 verify(a / 1 == base)
1513
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001514 class madtuple(tuple):
1515 _rev = None
1516 def rev(self):
1517 if self._rev is not None:
1518 return self._rev
1519 L = list(self)
1520 L.reverse()
1521 self._rev = self.__class__(L)
1522 return self._rev
1523 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Tim Peters4f467e82001-09-12 19:53:15 +00001524 verify(a == (1,2,3,4,5,6,7,8,9,0))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001525 verify(a.rev() == madtuple((0,9,8,7,6,5,4,3,2,1)))
1526 verify(a.rev().rev() == madtuple((1,2,3,4,5,6,7,8,9,0)))
1527 for i in range(512):
1528 t = madtuple(range(i))
1529 u = t.rev()
1530 v = u.rev()
1531 verify(v == t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001532 a = madtuple((1,2,3,4,5))
1533 verify(tuple(a) == (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001534 verify(tuple(a).__class__ is tuple)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001535 verify(hash(a) == hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001536 verify(a[:].__class__ is tuple)
1537 verify((a * 1).__class__ is tuple)
1538 verify((a * 0).__class__ is tuple)
1539 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001540 a = madtuple(())
1541 verify(tuple(a) == ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001542 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001543 verify((a + a).__class__ is tuple)
1544 verify((a * 0).__class__ is tuple)
1545 verify((a * 1).__class__ is tuple)
1546 verify((a * 2).__class__ is tuple)
1547 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001548
1549 class madstring(str):
1550 _rev = None
1551 def rev(self):
1552 if self._rev is not None:
1553 return self._rev
1554 L = list(self)
1555 L.reverse()
1556 self._rev = self.__class__("".join(L))
1557 return self._rev
1558 s = madstring("abcdefghijklmnopqrstuvwxyz")
Tim Peters4f467e82001-09-12 19:53:15 +00001559 #XXX verify(s == "abcdefghijklmnopqrstuvwxyz")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001560 verify(s.rev() == madstring("zyxwvutsrqponmlkjihgfedcba"))
1561 verify(s.rev().rev() == madstring("abcdefghijklmnopqrstuvwxyz"))
1562 for i in range(256):
1563 s = madstring("".join(map(chr, range(i))))
1564 t = s.rev()
1565 u = t.rev()
1566 verify(u == s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001567 s = madstring("12345")
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001568 verify(str(s) == "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001569 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001570
Tim Peters8fa5dd02001-09-12 02:18:30 +00001571 base = "\x00" * 5
1572 s = madstring(base)
Tim Peters4f467e82001-09-12 19:53:15 +00001573 #XXX verify(s == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001574 verify(str(s) == base)
Tim Petersc636f562001-09-11 01:52:02 +00001575 verify(str(s).__class__ is str)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001576 verify(hash(s) == hash(base))
Tim Peters0ab085c2001-09-14 00:25:33 +00001577 #XXX verify({s: 1}[base] == 1)
1578 #XXX verify({base: 1}[s] == 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001579 verify((s + "").__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001580 verify(s + "" == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001581 verify(("" + s).__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001582 verify("" + s == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001583 verify((s * 0).__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001584 verify(s * 0 == "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001585 verify((s * 1).__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001586 verify(s * 1 == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001587 verify((s * 2).__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001588 verify(s * 2 == base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001589 verify(s[:].__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001590 verify(s[:] == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001591 verify(s[0:0].__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001592 verify(s[0:0] == "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001593 verify(s.strip().__class__ is str)
Tim Peters7a29bd52001-09-12 03:03:31 +00001594 verify(s.strip() == base)
1595 verify(s.lstrip().__class__ is str)
1596 verify(s.lstrip() == base)
1597 verify(s.rstrip().__class__ is str)
1598 verify(s.rstrip() == base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001599 identitytab = ''.join([chr(i) for i in range(256)])
1600 verify(s.translate(identitytab).__class__ is str)
1601 verify(s.translate(identitytab) == base)
1602 verify(s.translate(identitytab, "x").__class__ is str)
1603 verify(s.translate(identitytab, "x") == base)
1604 verify(s.translate(identitytab, "\x00") == "")
1605 verify(s.replace("x", "x").__class__ is str)
1606 verify(s.replace("x", "x") == base)
1607 verify(s.ljust(len(s)).__class__ is str)
1608 verify(s.ljust(len(s)) == base)
1609 verify(s.rjust(len(s)).__class__ is str)
1610 verify(s.rjust(len(s)) == base)
1611 verify(s.center(len(s)).__class__ is str)
1612 verify(s.center(len(s)) == base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001613 verify(s.lower().__class__ is str)
1614 verify(s.lower() == base)
Tim Petersc636f562001-09-11 01:52:02 +00001615
Tim Peters111f6092001-09-12 07:54:51 +00001616 s = madstring("x y")
Tim Peters4f467e82001-09-12 19:53:15 +00001617 #XXX verify(s == "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001618 verify(intern(s).__class__ is str)
1619 verify(intern(s) is intern("x y"))
1620 verify(intern(s) == "x y")
1621
1622 i = intern("y x")
1623 s = madstring("y x")
Tim Peters4f467e82001-09-12 19:53:15 +00001624 #XXX verify(s == i)
Tim Peters111f6092001-09-12 07:54:51 +00001625 verify(intern(s).__class__ is str)
1626 verify(intern(s) is i)
1627
1628 s = madstring(i)
1629 verify(intern(s).__class__ is str)
1630 verify(intern(s) is i)
1631
Guido van Rossum91ee7982001-08-30 20:52:40 +00001632 class madunicode(unicode):
1633 _rev = None
1634 def rev(self):
1635 if self._rev is not None:
1636 return self._rev
1637 L = list(self)
1638 L.reverse()
1639 self._rev = self.__class__(u"".join(L))
1640 return self._rev
1641 u = madunicode("ABCDEF")
Tim Peters4f467e82001-09-12 19:53:15 +00001642 verify(u == u"ABCDEF")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001643 verify(u.rev() == madunicode(u"FEDCBA"))
1644 verify(u.rev().rev() == madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001645 base = u"12345"
1646 u = madunicode(base)
1647 verify(unicode(u) == base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001648 verify(unicode(u).__class__ is unicode)
Tim Petersaf90b3e2001-09-12 05:18:58 +00001649 verify(hash(u) == hash(base))
1650 verify({u: 1}[base] == 1)
1651 verify({base: 1}[u] == 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001652 verify(u.strip().__class__ is unicode)
1653 verify(u.strip() == base)
1654 verify(u.lstrip().__class__ is unicode)
1655 verify(u.lstrip() == base)
1656 verify(u.rstrip().__class__ is unicode)
1657 verify(u.rstrip() == base)
1658 verify(u.replace(u"x", u"x").__class__ is unicode)
1659 verify(u.replace(u"x", u"x") == base)
1660 verify(u.replace(u"xy", u"xy").__class__ is unicode)
1661 verify(u.replace(u"xy", u"xy") == base)
1662 verify(u.center(len(u)).__class__ is unicode)
1663 verify(u.center(len(u)) == base)
1664 verify(u.ljust(len(u)).__class__ is unicode)
1665 verify(u.ljust(len(u)) == base)
1666 verify(u.rjust(len(u)).__class__ is unicode)
1667 verify(u.rjust(len(u)) == base)
1668 verify(u.lower().__class__ is unicode)
1669 verify(u.lower() == base)
1670 verify(u.upper().__class__ is unicode)
1671 verify(u.upper() == base)
1672 verify(u.capitalize().__class__ is unicode)
1673 verify(u.capitalize() == base)
1674 verify(u.title().__class__ is unicode)
1675 verify(u.title() == base)
1676 verify((u + u"").__class__ is unicode)
1677 verify(u + u"" == base)
1678 verify((u"" + u).__class__ is unicode)
1679 verify(u"" + u == base)
1680 verify((u * 0).__class__ is unicode)
1681 verify(u * 0 == u"")
1682 verify((u * 1).__class__ is unicode)
1683 verify(u * 1 == base)
1684 verify((u * 2).__class__ is unicode)
1685 verify(u * 2 == base + base)
1686 verify(u[:].__class__ is unicode)
1687 verify(u[:] == base)
1688 verify(u[0:0].__class__ is unicode)
1689 verify(u[0:0] == u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001690
Tim Peters59c9a642001-09-13 05:38:56 +00001691 class CountedInput(file):
1692 """Counts lines read by self.readline().
1693
1694 self.lineno is the 0-based ordinal of the last line read, up to
1695 a maximum of one greater than the number of lines in the file.
1696
1697 self.ateof is true if and only if the final "" line has been read,
1698 at which point self.lineno stops incrementing, and further calls
1699 to readline() continue to return "".
1700 """
1701
1702 lineno = 0
1703 ateof = 0
1704 def readline(self):
1705 if self.ateof:
1706 return ""
1707 s = file.readline(self)
1708 # Next line works too.
1709 # s = super(CountedInput, self).readline()
1710 self.lineno += 1
1711 if s == "":
1712 self.ateof = 1
1713 return s
1714
Tim Peters561f8992001-09-13 19:36:36 +00001715 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001716 lines = ['a\n', 'b\n', 'c\n']
1717 try:
1718 f.writelines(lines)
1719 f.close()
1720 f = CountedInput(TESTFN)
1721 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1722 got = f.readline()
1723 verify(expected == got)
1724 verify(f.lineno == i)
1725 verify(f.ateof == (i > len(lines)))
1726 f.close()
1727 finally:
1728 try:
1729 f.close()
1730 except:
1731 pass
1732 try:
1733 import os
1734 os.unlink(TESTFN)
1735 except:
1736 pass
1737
Tim Peters808b94e2001-09-13 19:33:07 +00001738def keywords():
1739 if verbose:
1740 print "Testing keyword args to basic type constructors ..."
1741 verify(int(x=1) == 1)
1742 verify(float(x=2) == 2.0)
1743 verify(long(x=3) == 3L)
1744 verify(complex(imag=42, real=666) == complex(666, 42))
1745 verify(str(object=500) == '500')
1746 verify(unicode(string='abc', errors='strict') == u'abc')
1747 verify(tuple(sequence=range(3)) == (0, 1, 2))
1748 verify(list(sequence=(0, 1, 2)) == range(3))
1749 verify(dictionary(mapping={1: 2}) == {1: 2})
1750
1751 for constructor in (int, float, long, complex, str, unicode,
1752 tuple, list, dictionary, file):
1753 try:
1754 constructor(bogus_keyword_arg=1)
1755 except TypeError:
1756 pass
1757 else:
1758 raise TestFailed("expected TypeError from bogus keyword "
1759 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001760
Tim Peters8fa45672001-09-13 21:01:29 +00001761def restricted():
1762 import rexec
1763 if verbose:
1764 print "Testing interaction with restricted execution ..."
1765
1766 sandbox = rexec.RExec()
1767
1768 code1 = """f = open(%r, 'w')""" % TESTFN
1769 code2 = """f = file(%r, 'w')""" % TESTFN
1770 code3 = """\
1771f = open(%r)
1772t = type(f) # a sneaky way to get the file() constructor
1773f.close()
1774f = t(%r, 'w') # rexec can't catch this by itself
1775""" % (TESTFN, TESTFN)
1776
1777 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1778 f.close()
1779
1780 try:
1781 for code in code1, code2, code3:
1782 try:
1783 sandbox.r_exec(code)
1784 except IOError, msg:
1785 if str(msg).find("restricted") >= 0:
1786 outcome = "OK"
1787 else:
1788 outcome = "got an exception, but not an expected one"
1789 else:
1790 outcome = "expected a restricted-execution exception"
1791
1792 if outcome != "OK":
1793 raise TestFailed("%s, in %r" % (outcome, code))
1794
1795 finally:
1796 try:
1797 import os
1798 os.unlink(TESTFN)
1799 except:
1800 pass
1801
Tim Peters0ab085c2001-09-14 00:25:33 +00001802def str_subclass_as_dict_key():
1803 if verbose:
1804 print "Testing a str subclass used as dict key .."
1805
1806 class cistr(str):
1807 """Sublcass of str that computes __eq__ case-insensitively.
1808
1809 Also computes a hash code of the string in canonical form.
1810 """
1811
1812 def __init__(self, value):
1813 self.canonical = value.lower()
1814 self.hashcode = hash(self.canonical)
1815
1816 def __eq__(self, other):
1817 if not isinstance(other, cistr):
1818 other = cistr(other)
1819 return self.canonical == other.canonical
1820
1821 def __hash__(self):
1822 return self.hashcode
1823
Guido van Rossumd5d8e4a2001-09-19 01:16:16 +00001824 verify(cistr('ABC') == 'abc')
1825 verify('aBc' == cistr('ABC'))
Tim Peters0ab085c2001-09-14 00:25:33 +00001826 verify(str(cistr('ABC')) == 'ABC')
1827
1828 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
1829 verify(d[cistr('one')] == 1)
1830 verify(d[cistr('tWo')] == 2)
1831 verify(d[cistr('THrEE')] == 3)
1832 verify(cistr('ONe') in d)
1833 verify(d.get(cistr('thrEE')) == 3)
1834
Guido van Rossumab3b0342001-09-18 20:38:53 +00001835def classic_comparisons():
1836 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00001837 class classic:
1838 pass
1839 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00001840 if verbose: print " (base = %s)" % base
1841 class C(base):
1842 def __init__(self, value):
1843 self.value = int(value)
1844 def __cmp__(self, other):
1845 if isinstance(other, C):
1846 return cmp(self.value, other.value)
1847 if isinstance(other, int) or isinstance(other, long):
1848 return cmp(self.value, other)
1849 return NotImplemented
1850 c1 = C(1)
1851 c2 = C(2)
1852 c3 = C(3)
1853 verify(c1 == 1)
1854 c = {1: c1, 2: c2, 3: c3}
1855 for x in 1, 2, 3:
1856 for y in 1, 2, 3:
1857 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1858 for op in "<", "<=", "==", "!=", ">", ">=":
1859 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
1860 "x=%d, y=%d" % (x, y))
1861 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
1862 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1863
Guido van Rossum0639f592001-09-18 21:06:04 +00001864def rich_comparisons():
1865 if verbose:
1866 print "Testing rich comparisons..."
1867 class classic:
1868 pass
1869 for base in (classic, int, object, list):
1870 if verbose: print " (base = %s)" % base
1871 class C(base):
1872 def __init__(self, value):
1873 self.value = int(value)
1874 def __cmp__(self, other):
1875 raise TestFailed, "shouldn't call __cmp__"
1876 def __eq__(self, other):
1877 if isinstance(other, C):
1878 return self.value == other.value
1879 if isinstance(other, int) or isinstance(other, long):
1880 return self.value == other
1881 return NotImplemented
1882 def __ne__(self, other):
1883 if isinstance(other, C):
1884 return self.value != other.value
1885 if isinstance(other, int) or isinstance(other, long):
1886 return self.value != other
1887 return NotImplemented
1888 def __lt__(self, other):
1889 if isinstance(other, C):
1890 return self.value < other.value
1891 if isinstance(other, int) or isinstance(other, long):
1892 return self.value < other
1893 return NotImplemented
1894 def __le__(self, other):
1895 if isinstance(other, C):
1896 return self.value <= other.value
1897 if isinstance(other, int) or isinstance(other, long):
1898 return self.value <= other
1899 return NotImplemented
1900 def __gt__(self, other):
1901 if isinstance(other, C):
1902 return self.value > other.value
1903 if isinstance(other, int) or isinstance(other, long):
1904 return self.value > other
1905 return NotImplemented
1906 def __ge__(self, other):
1907 if isinstance(other, C):
1908 return self.value >= other.value
1909 if isinstance(other, int) or isinstance(other, long):
1910 return self.value >= other
1911 return NotImplemented
1912 c1 = C(1)
1913 c2 = C(2)
1914 c3 = C(3)
1915 verify(c1 == 1)
1916 c = {1: c1, 2: c2, 3: c3}
1917 for x in 1, 2, 3:
1918 for y in 1, 2, 3:
1919 for op in "<", "<=", "==", "!=", ">", ">=":
1920 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
1921 "x=%d, y=%d" % (x, y))
1922 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
1923 "x=%d, y=%d" % (x, y))
1924 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
1925 "x=%d, y=%d" % (x, y))
1926
Guido van Rossum1952e382001-09-19 01:25:16 +00001927def coercions():
1928 if verbose: print "Testing coercions..."
1929 class I(int): pass
1930 coerce(I(0), 0)
1931 coerce(0, I(0))
1932 class L(long): pass
1933 coerce(L(0), 0)
1934 coerce(L(0), 0L)
1935 coerce(0, L(0))
1936 coerce(0L, L(0))
1937 class F(float): pass
1938 coerce(F(0), 0)
1939 coerce(F(0), 0L)
1940 coerce(F(0), 0.)
1941 coerce(0, F(0))
1942 coerce(0L, F(0))
1943 coerce(0., F(0))
1944 class C(complex): pass
1945 coerce(C(0), 0)
1946 coerce(C(0), 0L)
1947 coerce(C(0), 0.)
1948 coerce(C(0), 0j)
1949 coerce(0, C(0))
1950 coerce(0L, C(0))
1951 coerce(0., C(0))
1952 coerce(0j, C(0))
1953
Tim Peters0ab085c2001-09-14 00:25:33 +00001954
Guido van Rossuma56b42b2001-09-20 21:39:07 +00001955def test_main():
Tim Peters6d6c1a32001-08-02 04:15:00 +00001956 lists()
1957 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00001958 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00001959 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001960 ints()
1961 longs()
1962 floats()
1963 complexes()
1964 spamlists()
1965 spamdicts()
1966 pydicts()
1967 pylists()
1968 metaclass()
1969 pymods()
1970 multi()
1971 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00001972 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001973 slots()
1974 dynamics()
1975 errors()
1976 classmethods()
1977 staticmethods()
1978 classic()
1979 compattr()
1980 newslot()
1981 altmro()
1982 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001983 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001984 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001985 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001986 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00001987 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001988 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00001989 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00001990 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00001991 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00001992 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00001993 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00001994 coercions()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00001995 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00001996
Guido van Rossuma56b42b2001-09-20 21:39:07 +00001997if __name__ == "__main__":
1998 test_main()