blob: 54b03b2f9bc03f72fa27e36df64ba0c539c72a50 [file] [log] [blame]
Tim Peters6d6c1a32001-08-02 04:15:00 +00001# Test descriptor-related enhancements
2
3from test_support import verify, verbose
4from 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
126binops = {
127 'add': '+',
128 'sub': '-',
129 'mul': '*',
130 'div': '/',
131 'mod': '%',
132 'divmod': 'divmod',
133 'pow': '**',
134 'lshift': '<<',
135 'rshift': '>>',
136 'and': '&',
137 'xor': '^',
138 'or': '|',
139 'cmp': 'cmp',
140 'lt': '<',
141 'le': '<=',
142 'eq': '==',
143 'ne': '!=',
144 'gt': '>',
145 'ge': '>=',
146 }
147
148for name, expr in binops.items():
149 if expr.islower():
150 expr = expr + "(a, b)"
151 else:
152 expr = 'a %s b' % expr
153 binops[name] = expr
154
155unops = {
156 'pos': '+',
157 'neg': '-',
158 'abs': 'abs',
159 'invert': '~',
160 'int': 'int',
161 'long': 'long',
162 'float': 'float',
163 'oct': 'oct',
164 'hex': 'hex',
165 }
166
167for name, expr in unops.items():
168 if expr.islower():
169 expr = expr + "(a)"
170 else:
171 expr = '%s a' % expr
172 unops[name] = expr
173
174def numops(a, b, skip=[]):
175 dict = {'a': a, 'b': b}
176 for name, expr in binops.items():
177 if name not in skip:
178 name = "__%s__" % name
179 if hasattr(a, name):
180 res = eval(expr, dict)
181 testbinop(a, b, res, expr, name)
182 for name, expr in unops.items():
183 name = "__%s__" % name
184 if hasattr(a, name):
185 res = eval(expr, dict)
186 testunop(a, res, expr, name)
187
188def ints():
189 if verbose: print "Testing int operations..."
190 numops(100, 3)
191
192def longs():
193 if verbose: print "Testing long operations..."
194 numops(100L, 3L)
195
196def floats():
197 if verbose: print "Testing float operations..."
198 numops(100.0, 3.0)
199
200def complexes():
201 if verbose: print "Testing complex operations..."
202 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge'])
203 class Number(complex):
204 __slots__ = ['prec']
205 def __init__(self, *args, **kwds):
206 self.prec = kwds.get('prec', 12)
207 def __repr__(self):
208 prec = self.prec
209 if self.imag == 0.0:
210 return "%.*g" % (prec, self.real)
211 if self.real == 0.0:
212 return "%.*gj" % (prec, self.imag)
213 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
214 __str__ = __repr__
215 a = Number(3.14, prec=6)
216 verify(`a` == "3.14")
217 verify(a.prec == 6)
218
219def spamlists():
220 if verbose: print "Testing spamlist operations..."
221 import copy, xxsubtype as spam
222 def spamlist(l, memo=None):
223 import xxsubtype as spam
224 return spam.spamlist(l)
225 # This is an ugly hack:
226 copy._deepcopy_dispatch[spam.spamlist] = spamlist
227
228 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
229 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
230 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
231 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
232 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
233 "a[b:c]", "__getslice__")
234 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
235 "a+=b", "__iadd__")
236 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
237 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
238 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
239 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
240 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
241 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
242 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
243 # Test subclassing
244 class C(spam.spamlist):
245 def foo(self): return 1
246 a = C()
247 verify(a == [])
248 verify(a.foo() == 1)
249 a.append(100)
250 verify(a == [100])
251 verify(a.getstate() == 0)
252 a.setstate(42)
253 verify(a.getstate() == 42)
254
255def spamdicts():
256 if verbose: print "Testing spamdict operations..."
257 import copy, xxsubtype as spam
258 def spamdict(d, memo=None):
259 import xxsubtype as spam
260 sd = spam.spamdict()
261 for k, v in d.items(): sd[k] = v
262 return sd
263 # This is an ugly hack:
264 copy._deepcopy_dispatch[spam.spamdict] = spamdict
265
266 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
267 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
268 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
269 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
270 d = spamdict({1:2,3:4})
271 l1 = []
272 for i in d.keys(): l1.append(i)
273 l = []
274 for i in iter(d): l.append(i)
275 verify(l == l1)
276 l = []
277 for i in d.__iter__(): l.append(i)
278 verify(l == l1)
279 l = []
280 for i in type(spamdict({})).__iter__(d): l.append(i)
281 verify(l == l1)
282 straightd = {1:2, 3:4}
283 spamd = spamdict(straightd)
284 testunop(spamd, 2, "len(a)", "__len__")
285 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
286 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
287 "a[b]=c", "__setitem__")
288 # Test subclassing
289 class C(spam.spamdict):
290 def foo(self): return 1
291 a = C()
292 verify(a.items() == [])
293 verify(a.foo() == 1)
294 a['foo'] = 'bar'
295 verify(a.items() == [('foo', 'bar')])
296 verify(a.getstate() == 0)
297 a.setstate(100)
298 verify(a.getstate() == 100)
299
300def pydicts():
301 if verbose: print "Testing Python subclass of dict..."
302 verify(issubclass(dictionary, dictionary))
303 verify(isinstance({}, dictionary))
304 d = dictionary()
305 verify(d == {})
306 verify(d.__class__ is dictionary)
307 verify(isinstance(d, dictionary))
308 class C(dictionary):
309 state = -1
310 def __init__(self, *a, **kw):
311 if a:
312 assert len(a) == 1
313 self.state = a[0]
314 if kw:
315 for k, v in kw.items(): self[v] = k
316 def __getitem__(self, key):
317 return self.get(key, 0)
318 def __setitem__(self, key, value):
319 assert isinstance(key, type(0))
320 dictionary.__setitem__(self, key, value)
321 def setstate(self, state):
322 self.state = state
323 def getstate(self):
324 return self.state
325 verify(issubclass(C, dictionary))
326 a1 = C(12)
327 verify(a1.state == 12)
328 a2 = C(foo=1, bar=2)
329 verify(a2[1] == 'foo' and a2[2] == 'bar')
330 a = C()
331 verify(a.state == -1)
332 verify(a.getstate() == -1)
333 a.setstate(0)
334 verify(a.state == 0)
335 verify(a.getstate() == 0)
336 a.setstate(10)
337 verify(a.state == 10)
338 verify(a.getstate() == 10)
339 verify(a[42] == 0)
340 a[42] = 24
341 verify(a[42] == 24)
342 if verbose: print "pydict stress test ..."
343 N = 50
344 for i in range(N):
345 a[i] = C()
346 for j in range(N):
347 a[i][j] = i*j
348 for i in range(N):
349 for j in range(N):
350 verify(a[i][j] == i*j)
351
352def pylists():
353 if verbose: print "Testing Python subclass of list..."
354 class C(list):
355 def __getitem__(self, i):
356 return list.__getitem__(self, i) + 100
357 def __getslice__(self, i, j):
358 return (i, j)
359 a = C()
360 a.extend([0,1,2])
361 verify(a[0] == 100)
362 verify(a[1] == 101)
363 verify(a[2] == 102)
364 verify(a[100:200] == (100,200))
365
366def metaclass():
367 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000368 class C:
369 __metaclass__ = type
370 def __init__(self):
371 self.__state = 0
372 def getstate(self):
373 return self.__state
374 def setstate(self, state):
375 self.__state = state
376 a = C()
377 verify(a.getstate() == 0)
378 a.setstate(10)
379 verify(a.getstate() == 10)
380 class D:
381 class __metaclass__(type):
382 def myself(cls): return cls
383 verify(D.myself() == D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000384 d = D()
385 verify(d.__class__ is D)
386 class M1(type):
387 def __new__(cls, name, bases, dict):
388 dict['__spam__'] = 1
389 return type.__new__(cls, name, bases, dict)
390 class C:
391 __metaclass__ = M1
392 verify(C.__spam__ == 1)
393 c = C()
394 verify(c.__spam__ == 1)
395 class _instance(object):
396 pass
397 class M2(object):
398 def __new__(cls, name, bases, dict):
399 self = object.__new__(cls)
400 self.name = name
401 self.bases = bases
402 self.dict = dict
403 return self
404 __new__ = staticmethod(__new__)
405 def __call__(self):
406 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000407 # Early binding of methods
408 for key in self.dict:
409 if key.startswith("__"):
410 continue
411 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000412 return it
413 class C:
414 __metaclass__ = M2
415 def spam(self):
416 return 42
417 verify(C.name == 'C')
418 verify(C.bases == ())
419 verify('spam' in C.dict)
420 c = C()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000421 verify(c.spam() == 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000422
Tim Peters6d6c1a32001-08-02 04:15:00 +0000423def pymods():
424 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000425 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000426 import sys
427 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000428 class MM(MT):
429 def __init__(self):
430 MT.__init__(self)
431 def __getattr__(self, name):
432 log.append(("getattr", name))
433 return MT.__getattr__(self, name)
434 def __setattr__(self, name, value):
435 log.append(("setattr", name, value))
436 MT.__setattr__(self, name, value)
437 def __delattr__(self, name):
438 log.append(("delattr", name))
439 MT.__delattr__(self, name)
440 a = MM()
441 a.foo = 12
442 x = a.foo
443 del a.foo
Guido van Rossumce129a52001-08-28 18:23:24 +0000444 verify(log == [("setattr", "foo", 12),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000445 ("getattr", "foo"),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000446 ("delattr", "foo")], log)
447
448def multi():
449 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 class C(object):
451 def __init__(self):
452 self.__state = 0
453 def getstate(self):
454 return self.__state
455 def setstate(self, state):
456 self.__state = state
457 a = C()
458 verify(a.getstate() == 0)
459 a.setstate(10)
460 verify(a.getstate() == 10)
461 class D(dictionary, C):
462 def __init__(self):
463 type({}).__init__(self)
464 C.__init__(self)
465 d = D()
466 verify(d.keys() == [])
467 d["hello"] = "world"
468 verify(d.items() == [("hello", "world")])
469 verify(d["hello"] == "world")
470 verify(d.getstate() == 0)
471 d.setstate(10)
472 verify(d.getstate() == 10)
473 verify(D.__mro__ == (D, dictionary, C, object))
474
Guido van Rossume45763a2001-08-10 21:28:46 +0000475 # SF bug #442833
476 class Node(object):
477 def __int__(self):
478 return int(self.foo())
479 def foo(self):
480 return "23"
481 class Frag(Node, list):
482 def foo(self):
483 return "42"
484 verify(Node().__int__() == 23)
485 verify(int(Node()) == 23)
486 verify(Frag().__int__() == 42)
487 verify(int(Frag()) == 42)
488
Tim Peters6d6c1a32001-08-02 04:15:00 +0000489def diamond():
490 if verbose: print "Testing multiple inheritance special cases..."
491 class A(object):
492 def spam(self): return "A"
493 verify(A().spam() == "A")
494 class B(A):
495 def boo(self): return "B"
496 def spam(self): return "B"
497 verify(B().spam() == "B")
498 verify(B().boo() == "B")
499 class C(A):
500 def boo(self): return "C"
501 verify(C().spam() == "A")
502 verify(C().boo() == "C")
503 class D(B, C): pass
504 verify(D().spam() == "B")
505 verify(D().boo() == "B")
506 verify(D.__mro__ == (D, B, C, A, object))
507 class E(C, B): pass
508 verify(E().spam() == "B")
509 verify(E().boo() == "C")
510 verify(E.__mro__ == (E, C, B, A, object))
511 class F(D, E): pass
512 verify(F().spam() == "B")
513 verify(F().boo() == "B")
514 verify(F.__mro__ == (F, D, E, B, C, A, object))
515 class G(E, D): pass
516 verify(G().spam() == "B")
517 verify(G().boo() == "C")
518 verify(G.__mro__ == (G, E, D, C, B, A, object))
519
Guido van Rossum37202612001-08-09 19:45:21 +0000520def objects():
521 if verbose: print "Testing object class..."
522 a = object()
523 verify(a.__class__ == object == type(a))
524 b = object()
525 verify(a is not b)
526 verify(not hasattr(a, "foo"))
527 try:
528 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000529 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000530 pass
531 else:
532 verify(0, "object() should not allow setting a foo attribute")
533 verify(not hasattr(object(), "__dict__"))
534
535 class Cdict(object):
536 pass
537 x = Cdict()
538 verify(x.__dict__ is None)
539 x.foo = 1
540 verify(x.foo == 1)
541 verify(x.__dict__ == {'foo': 1})
542
Tim Peters6d6c1a32001-08-02 04:15:00 +0000543def slots():
544 if verbose: print "Testing __slots__..."
545 class C0(object):
546 __slots__ = []
547 x = C0()
548 verify(not hasattr(x, "__dict__"))
549 verify(not hasattr(x, "foo"))
550
551 class C1(object):
552 __slots__ = ['a']
553 x = C1()
554 verify(not hasattr(x, "__dict__"))
555 verify(x.a == None)
556 x.a = 1
557 verify(x.a == 1)
558 del x.a
559 verify(x.a == None)
560
561 class C3(object):
562 __slots__ = ['a', 'b', 'c']
563 x = C3()
564 verify(not hasattr(x, "__dict__"))
565 verify(x.a is None)
566 verify(x.b is None)
567 verify(x.c is None)
568 x.a = 1
569 x.b = 2
570 x.c = 3
571 verify(x.a == 1)
572 verify(x.b == 2)
573 verify(x.c == 3)
574
575def dynamics():
576 if verbose: print "Testing __dynamic__..."
577 verify(object.__dynamic__ == 0)
578 verify(list.__dynamic__ == 0)
579 class S1:
580 __metaclass__ = type
581 verify(S1.__dynamic__ == 0)
582 class S(object):
583 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000584 verify(S.__dynamic__ == 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 class D(object):
586 __dynamic__ = 1
587 verify(D.__dynamic__ == 1)
588 class E(D, S):
589 pass
590 verify(E.__dynamic__ == 1)
591 class F(S, D):
592 pass
593 verify(F.__dynamic__ == 1)
594 try:
595 S.foo = 1
596 except (AttributeError, TypeError):
597 pass
598 else:
599 verify(0, "assignment to a static class attribute should be illegal")
600 D.foo = 1
601 verify(D.foo == 1)
602 # Test that dynamic attributes are inherited
603 verify(E.foo == 1)
604 verify(F.foo == 1)
605 class SS(D):
606 __dynamic__ = 0
607 verify(SS.__dynamic__ == 0)
608 verify(SS.foo == 1)
609 try:
610 SS.foo = 1
611 except (AttributeError, TypeError):
612 pass
613 else:
614 verify(0, "assignment to SS.foo should be illegal")
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000615 # Test dynamic instances
616 class C(object):
617 __dynamic__ = 1
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000618 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000619 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000620 C.foobar = 2
621 verify(a.foobar == 2)
622 C.method = lambda self: 42
623 verify(a.method() == 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000624 C.__repr__ = lambda self: "C()"
625 verify(repr(a) == "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000626 C.__int__ = lambda self: 100
627 verify(int(a) == 100)
628 verify(a.foobar == 2)
629 verify(not hasattr(a, "spam"))
630 def mygetattr(self, name):
631 if name == "spam":
632 return "spam"
633 else:
634 return object.__getattr__(self, name)
635 C.__getattr__ = mygetattr
636 verify(a.spam == "spam")
637 a.new = 12
638 verify(a.new == 12)
639 def mysetattr(self, name, value):
640 if name == "spam":
641 raise AttributeError
642 return object.__setattr__(self, name, value)
643 C.__setattr__ = mysetattr
644 try:
645 a.spam = "not spam"
646 except AttributeError:
647 pass
648 else:
649 verify(0, "expected AttributeError")
650 verify(a.spam == "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000651 class D(C):
652 pass
653 d = D()
654 d.foo = 1
655 verify(d.foo == 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000656
657def errors():
658 if verbose: print "Testing errors..."
659
660 try:
661 class C(list, dictionary):
662 pass
663 except TypeError:
664 pass
665 else:
666 verify(0, "inheritance from both list and dict should be illegal")
667
668 try:
669 class C(object, None):
670 pass
671 except TypeError:
672 pass
673 else:
674 verify(0, "inheritance from non-type should be illegal")
675 class Classic:
676 pass
677
678 try:
679 class C(object, Classic):
680 pass
681 except TypeError:
682 pass
683 else:
684 verify(0, "inheritance from object and Classic should be illegal")
685
686 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000687 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000688 pass
689 except TypeError:
690 pass
691 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000692 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000693
694 try:
695 class C(object):
696 __slots__ = 1
697 except TypeError:
698 pass
699 else:
700 verify(0, "__slots__ = 1 should be illegal")
701
702 try:
703 class C(object):
704 __slots__ = [1]
705 except TypeError:
706 pass
707 else:
708 verify(0, "__slots__ = [1] should be illegal")
709
710def classmethods():
711 if verbose: print "Testing class methods..."
712 class C(object):
713 def foo(*a): return a
714 goo = classmethod(foo)
715 c = C()
716 verify(C.goo(1) == (C, 1))
717 verify(c.goo(1) == (C, 1))
718 verify(c.foo(1) == (c, 1))
719 class D(C):
720 pass
721 d = D()
722 verify(D.goo(1) == (D, 1))
723 verify(d.goo(1) == (D, 1))
724 verify(d.foo(1) == (d, 1))
725 verify(D.foo(d, 1) == (d, 1))
726
727def staticmethods():
728 if verbose: print "Testing static methods..."
729 class C(object):
730 def foo(*a): return a
731 goo = staticmethod(foo)
732 c = C()
733 verify(C.goo(1) == (1,))
734 verify(c.goo(1) == (1,))
735 verify(c.foo(1) == (c, 1,))
736 class D(C):
737 pass
738 d = D()
739 verify(D.goo(1) == (1,))
740 verify(d.goo(1) == (1,))
741 verify(d.foo(1) == (d, 1))
742 verify(D.foo(d, 1) == (d, 1))
743
744def classic():
745 if verbose: print "Testing classic classes..."
746 class C:
747 def foo(*a): return a
748 goo = classmethod(foo)
749 c = C()
750 verify(C.goo(1) == (C, 1))
751 verify(c.goo(1) == (C, 1))
752 verify(c.foo(1) == (c, 1))
753 class D(C):
754 pass
755 d = D()
756 verify(D.goo(1) == (D, 1))
757 verify(d.goo(1) == (D, 1))
758 verify(d.foo(1) == (d, 1))
759 verify(D.foo(d, 1) == (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +0000760 class E: # *not* subclassing from C
761 foo = C.foo
762 verify(E().foo == C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +0000763 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000764
765def compattr():
766 if verbose: print "Testing computed attributes..."
767 class C(object):
768 class computed_attribute(object):
769 def __init__(self, get, set=None):
770 self.__get = get
771 self.__set = set
772 def __get__(self, obj, type=None):
773 return self.__get(obj)
774 def __set__(self, obj, value):
775 return self.__set(obj, value)
776 def __init__(self):
777 self.__x = 0
778 def __get_x(self):
779 x = self.__x
780 self.__x = x+1
781 return x
782 def __set_x(self, x):
783 self.__x = x
784 x = computed_attribute(__get_x, __set_x)
785 a = C()
786 verify(a.x == 0)
787 verify(a.x == 1)
788 a.x = 10
789 verify(a.x == 10)
790 verify(a.x == 11)
791
792def newslot():
793 if verbose: print "Testing __new__ slot override..."
794 class C(list):
795 def __new__(cls):
796 self = list.__new__(cls)
797 self.foo = 1
798 return self
799 def __init__(self):
800 self.foo = self.foo + 2
801 a = C()
802 verify(a.foo == 3)
803 verify(a.__class__ is C)
804 class D(C):
805 pass
806 b = D()
807 verify(b.foo == 3)
808 verify(b.__class__ is D)
809
Tim Peters6d6c1a32001-08-02 04:15:00 +0000810def altmro():
811 if verbose: print "Testing mro() and overriding it..."
812 class A(object):
813 def f(self): return "A"
814 class B(A):
815 pass
816 class C(A):
817 def f(self): return "C"
818 class D(B, C):
819 pass
820 verify(D.mro() == [D, B, C, A, object] == list(D.__mro__))
821 verify(D().f() == "C")
Guido van Rossumd3077402001-08-12 05:24:18 +0000822 class PerverseMetaType(type):
823 def mro(cls):
824 L = type.mro(cls)
825 L.reverse()
826 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827 class X(A,B,C,D):
828 __metaclass__ = PerverseMetaType
829 verify(X.__mro__ == (object, A, C, B, D, X))
830 verify(X().f() == "A")
831
832def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +0000833 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834
835 class B(object):
836 "Intermediate class because object doesn't have a __setattr__"
837
838 class C(B):
839
840 def __getattr__(self, name):
841 if name == "foo":
842 return ("getattr", name)
843 else:
844 return B.__getattr__(self, name)
845 def __setattr__(self, name, value):
846 if name == "foo":
847 self.setattr = (name, value)
848 else:
849 return B.__setattr__(self, name, value)
850 def __delattr__(self, name):
851 if name == "foo":
852 self.delattr = name
853 else:
854 return B.__delattr__(self, name)
855
856 def __getitem__(self, key):
857 return ("getitem", key)
858 def __setitem__(self, key, value):
859 self.setitem = (key, value)
860 def __delitem__(self, key):
861 self.delitem = key
862
863 def __getslice__(self, i, j):
864 return ("getslice", i, j)
865 def __setslice__(self, i, j, value):
866 self.setslice = (i, j, value)
867 def __delslice__(self, i, j):
868 self.delslice = (i, j)
869
870 a = C()
871 verify(a.foo == ("getattr", "foo"))
872 a.foo = 12
873 verify(a.setattr == ("foo", 12))
874 del a.foo
875 verify(a.delattr == "foo")
876
877 verify(a[12] == ("getitem", 12))
878 a[12] = 21
879 verify(a.setitem == (12, 21))
880 del a[12]
881 verify(a.delitem == 12)
882
883 verify(a[0:10] == ("getslice", 0, 10))
884 a[0:10] = "foo"
885 verify(a.setslice == (0, 10, "foo"))
886 del a[0:10]
887 verify(a.delslice == (0, 10))
888
Guido van Rossumb5a136b2001-08-15 17:51:17 +0000889def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +0000890 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +0000891 class C(object):
892 def __init__(self, x):
893 self.x = x
894 def foo(self):
895 return self.x
896 c1 = C(1)
897 verify(c1.foo() == 1)
898 class D(C):
899 boo = C.foo
900 goo = c1.foo
901 d2 = D(2)
902 verify(d2.foo() == 2)
903 verify(d2.boo() == 2)
Guido van Rossum501c7c72001-08-16 20:41:56 +0000904 verify(d2.goo() == 1)
Guido van Rossum93018762001-08-17 13:40:47 +0000905 class E(object):
906 foo = C.foo
907 verify(E().foo == C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +0000908 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +0000909
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +0000910def specials():
911 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +0000912 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +0000913 # Test the default behavior for static classes
914 class C(object):
915 def __getitem__(self, i):
916 if 0 <= i < 10: return i
917 raise IndexError
918 c1 = C()
919 c2 = C()
920 verify(not not c1)
921 verify(hash(c1) == id(c1))
922 verify(cmp(c1, c2) == cmp(id(c1), id(c2)))
923 verify(c1 == c1)
924 verify(c1 != c2)
925 verify(not c1 != c1)
926 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +0000927 # Note that the module name appears in str/repr, and that varies
928 # depending on whether this test is run standalone or from a framework.
929 verify(str(c1).find('C instance at ') >= 0)
Tim Peters63a8d692001-08-16 16:56:16 +0000930 verify(str(c1) == repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +0000931 verify(-1 not in c1)
932 for i in range(10):
933 verify(i in c1)
934 verify(10 not in c1)
935 # Test the default behavior for dynamic classes
936 class D(object):
937 __dynamic__ = 1
938 def __getitem__(self, i):
939 if 0 <= i < 10: return i
940 raise IndexError
941 d1 = D()
942 d2 = D()
943 verify(not not d1)
944 verify(hash(d1) == id(d1))
945 verify(cmp(d1, d2) == cmp(id(d1), id(d2)))
946 verify(d1 == d1)
947 verify(d1 != d2)
948 verify(not d1 != d1)
949 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +0000950 # Note that the module name appears in str/repr, and that varies
951 # depending on whether this test is run standalone or from a framework.
952 verify(str(d1).find('D instance at ') >= 0)
Tim Peters63a8d692001-08-16 16:56:16 +0000953 verify(str(d1) == repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +0000954 verify(-1 not in d1)
955 for i in range(10):
956 verify(i in d1)
957 verify(10 not in d1)
958 # Test overridden behavior for static classes
959 class Proxy(object):
960 def __init__(self, x):
961 self.x = x
962 def __nonzero__(self):
963 return not not self.x
964 def __hash__(self):
965 return hash(self.x)
966 def __eq__(self, other):
967 return self.x == other
968 def __ne__(self, other):
969 return self.x != other
970 def __cmp__(self, other):
971 return cmp(self.x, other.x)
972 def __str__(self):
973 return "Proxy:%s" % self.x
974 def __repr__(self):
975 return "Proxy(%r)" % self.x
976 def __contains__(self, value):
977 return value in self.x
978 p0 = Proxy(0)
979 p1 = Proxy(1)
980 p_1 = Proxy(-1)
981 verify(not p0)
982 verify(not not p1)
983 verify(hash(p0) == hash(0))
984 verify(p0 == p0)
985 verify(p0 != p1)
986 verify(not p0 != p0)
987 verify(not p0 == p1)
988 verify(cmp(p0, p1) == -1)
989 verify(cmp(p0, p0) == 0)
990 verify(cmp(p0, p_1) == 1)
991 verify(str(p0) == "Proxy:0")
992 verify(repr(p0) == "Proxy(0)")
993 p10 = Proxy(range(10))
994 verify(-1 not in p10)
995 for i in range(10):
996 verify(i in p10)
997 verify(10 not in p10)
998 # Test overridden behavior for dynamic classes
999 class DProxy(object):
1000 __dynamic__ = 1
1001 def __init__(self, x):
1002 self.x = x
1003 def __nonzero__(self):
1004 return not not self.x
1005 def __hash__(self):
1006 return hash(self.x)
1007 def __eq__(self, other):
1008 return self.x == other
1009 def __ne__(self, other):
1010 return self.x != other
1011 def __cmp__(self, other):
1012 return cmp(self.x, other.x)
1013 def __str__(self):
1014 return "DProxy:%s" % self.x
1015 def __repr__(self):
1016 return "DProxy(%r)" % self.x
1017 def __contains__(self, value):
1018 return value in self.x
1019 p0 = DProxy(0)
1020 p1 = DProxy(1)
1021 p_1 = DProxy(-1)
1022 verify(not p0)
1023 verify(not not p1)
1024 verify(hash(p0) == hash(0))
1025 verify(p0 == p0)
1026 verify(p0 != p1)
1027 verify(not p0 != p0)
1028 verify(not p0 == p1)
1029 verify(cmp(p0, p1) == -1)
1030 verify(cmp(p0, p0) == 0)
1031 verify(cmp(p0, p_1) == 1)
1032 verify(str(p0) == "DProxy:0")
1033 verify(repr(p0) == "DProxy(0)")
1034 p10 = DProxy(range(10))
1035 verify(-1 not in p10)
1036 for i in range(10):
1037 verify(i in p10)
1038 verify(10 not in p10)
1039
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001040def weakrefs():
1041 if verbose: print "Testing weak references..."
1042 import weakref
1043 class C(object):
1044 pass
1045 c = C()
1046 r = weakref.ref(c)
1047 verify(r() is c)
1048 del c
1049 verify(r() is None)
1050 del r
1051 class NoWeak(object):
1052 __slots__ = ['foo']
1053 no = NoWeak()
1054 try:
1055 weakref.ref(no)
1056 except TypeError, msg:
1057 verify(str(msg).find("weakly") >= 0)
1058 else:
1059 verify(0, "weakref.ref(no) should be illegal")
1060 class Weak(object):
1061 __slots__ = ['foo', '__weakref__']
1062 yes = Weak()
1063 r = weakref.ref(yes)
1064 verify(r() is yes)
1065 del yes
1066 verify(r() is None)
1067 del r
1068
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001069def getsets():
1070 if verbose: print "Testing getset..."
1071 class C(object):
1072 def getx(self):
1073 return self.__x
1074 def setx(self, value):
1075 self.__x = value
1076 def delx(self):
1077 del self.__x
1078 x = getset(getx, setx, delx)
1079 a = C()
1080 verify(not hasattr(a, "x"))
1081 a.x = 42
1082 verify(a._C__x == 42)
1083 verify(a.x == 42)
1084 del a.x
1085 verify(not hasattr(a, "x"))
1086 verify(not hasattr(a, "_C__x"))
1087 C.x.__set__(a, 100)
1088 verify(C.x.__get__(a) == 100)
1089## C.x.__set__(a)
1090## verify(not hasattr(a, "x"))
1091
Guido van Rossumc4a18802001-08-24 16:55:27 +00001092def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001093 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001094
1095 class A(object):
1096 def meth(self, a):
1097 return "A(%r)" % a
1098
1099 verify(A().meth(1) == "A(1)")
1100
1101 class B(A):
1102 def __init__(self):
1103 self.__super = super(B, self)
1104 def meth(self, a):
1105 return "B(%r)" % a + self.__super.meth(a)
1106
1107 verify(B().meth(2) == "B(2)A(2)")
1108
1109 class C(A):
1110 __dynamic__ = 1
1111 def meth(self, a):
1112 return "C(%r)" % a + self.__super.meth(a)
1113 C._C__super = super(C)
1114
1115 verify(C().meth(3) == "C(3)A(3)")
1116
1117 class D(C, B):
1118 def meth(self, a):
1119 return "D(%r)" % a + super(D, self).meth(a)
1120
1121 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1122
Tim Peters6d6c1a32001-08-02 04:15:00 +00001123def all():
1124 lists()
1125 dicts()
1126 ints()
1127 longs()
1128 floats()
1129 complexes()
1130 spamlists()
1131 spamdicts()
1132 pydicts()
1133 pylists()
1134 metaclass()
1135 pymods()
1136 multi()
1137 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00001138 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001139 slots()
1140 dynamics()
1141 errors()
1142 classmethods()
1143 staticmethods()
1144 classic()
1145 compattr()
1146 newslot()
1147 altmro()
1148 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001149 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001150 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001151 weakrefs()
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001152 getsets()
Guido van Rossumc4a18802001-08-24 16:55:27 +00001153 supers()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001154
1155all()
1156
1157if verbose: print "All OK"