blob: f495a3728d9ae1b3b97f3c76e991d5662930a6ad [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)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000395
Guido van Rossum309b5662001-08-17 11:43:17 +0000396 class _instance(object):
397 pass
398 class M2(object):
399 def __new__(cls, name, bases, dict):
400 self = object.__new__(cls)
401 self.name = name
402 self.bases = bases
403 self.dict = dict
404 return self
405 __new__ = staticmethod(__new__)
406 def __call__(self):
407 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000408 # Early binding of methods
409 for key in self.dict:
410 if key.startswith("__"):
411 continue
412 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000413 return it
414 class C:
415 __metaclass__ = M2
416 def spam(self):
417 return 42
418 verify(C.name == 'C')
419 verify(C.bases == ())
420 verify('spam' in C.dict)
421 c = C()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000422 verify(c.spam() == 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000423
Guido van Rossum91ee7982001-08-30 20:52:40 +0000424 # More metaclass examples
425
426 class autosuper(type):
427 # Automatically add __super to the class
428 # This trick only works for dynamic classes
429 # so we force __dynamic__ = 1
430 def __new__(metaclass, name, bases, dict):
431 # XXX Should check that name isn't already a base class name
432 dict["__dynamic__"] = 1
433 cls = super(autosuper, metaclass).__new__(metaclass,
434 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000435 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000436 while name[:1] == "_":
437 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000438 if name:
439 name = "_%s__super" % name
440 else:
441 name = "__super"
442 setattr(cls, name, super(cls))
443 return cls
444 class A:
445 __metaclass__ = autosuper
446 def meth(self):
447 return "A"
448 class B(A):
449 def meth(self):
450 return "B" + self.__super.meth()
451 class C(A):
452 def meth(self):
453 return "C" + self.__super.meth()
454 class D(C, B):
455 def meth(self):
456 return "D" + self.__super.meth()
457 verify(D().meth() == "DCBA")
458 class E(B, C):
459 def meth(self):
460 return "E" + self.__super.meth()
461 verify(E().meth() == "EBCA")
462
463 class autogetset(type):
464 # Automatically create getset attributes when methods
465 # named _get_x and/or _set_x are found
466 def __new__(metaclass, name, bases, dict):
467 hits = {}
468 for key, val in dict.iteritems():
469 if key.startswith("_get_"):
470 key = key[5:]
471 get, set = hits.get(key, (None, None))
472 get = val
473 hits[key] = get, set
474 elif key.startswith("_set_"):
475 key = key[5:]
476 get, set = hits.get(key, (None, None))
477 set = val
478 hits[key] = get, set
479 for key, (get, set) in hits.iteritems():
480 dict[key] = getset(get, set)
481 return super(autogetset, metaclass).__new__(metaclass,
482 name, bases, dict)
483 class A:
484 __metaclass__ = autogetset
485 def _get_x(self):
486 return -self.__x
487 def _set_x(self, x):
488 self.__x = -x
489 a = A()
490 verify(not hasattr(a, "x"))
491 a.x = 12
492 verify(a.x == 12)
493 verify(a._A__x == -12)
494
495 class multimetaclass(autogetset, autosuper):
496 # Merge of multiple cooperating metaclasses
497 pass
498 class A:
499 __metaclass__ = multimetaclass
500 def _get_x(self):
501 return "A"
502 class B(A):
503 def _get_x(self):
504 return "B" + self.__super._get_x()
505 class C(A):
506 def _get_x(self):
507 return "C" + self.__super._get_x()
508 class D(C, B):
509 def _get_x(self):
510 return "D" + self.__super._get_x()
511 verify(D().x == "DCBA")
512
Tim Peters6d6c1a32001-08-02 04:15:00 +0000513def pymods():
514 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000515 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000516 import sys
517 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000518 class MM(MT):
519 def __init__(self):
520 MT.__init__(self)
521 def __getattr__(self, name):
522 log.append(("getattr", name))
523 return MT.__getattr__(self, name)
524 def __setattr__(self, name, value):
525 log.append(("setattr", name, value))
526 MT.__setattr__(self, name, value)
527 def __delattr__(self, name):
528 log.append(("delattr", name))
529 MT.__delattr__(self, name)
530 a = MM()
531 a.foo = 12
532 x = a.foo
533 del a.foo
Guido van Rossumce129a52001-08-28 18:23:24 +0000534 verify(log == [("setattr", "foo", 12),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000535 ("getattr", "foo"),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000536 ("delattr", "foo")], log)
537
538def multi():
539 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000540 class C(object):
541 def __init__(self):
542 self.__state = 0
543 def getstate(self):
544 return self.__state
545 def setstate(self, state):
546 self.__state = state
547 a = C()
548 verify(a.getstate() == 0)
549 a.setstate(10)
550 verify(a.getstate() == 10)
551 class D(dictionary, C):
552 def __init__(self):
553 type({}).__init__(self)
554 C.__init__(self)
555 d = D()
556 verify(d.keys() == [])
557 d["hello"] = "world"
558 verify(d.items() == [("hello", "world")])
559 verify(d["hello"] == "world")
560 verify(d.getstate() == 0)
561 d.setstate(10)
562 verify(d.getstate() == 10)
563 verify(D.__mro__ == (D, dictionary, C, object))
564
Guido van Rossume45763a2001-08-10 21:28:46 +0000565 # SF bug #442833
566 class Node(object):
567 def __int__(self):
568 return int(self.foo())
569 def foo(self):
570 return "23"
571 class Frag(Node, list):
572 def foo(self):
573 return "42"
574 verify(Node().__int__() == 23)
575 verify(int(Node()) == 23)
576 verify(Frag().__int__() == 42)
577 verify(int(Frag()) == 42)
578
Tim Peters6d6c1a32001-08-02 04:15:00 +0000579def diamond():
580 if verbose: print "Testing multiple inheritance special cases..."
581 class A(object):
582 def spam(self): return "A"
583 verify(A().spam() == "A")
584 class B(A):
585 def boo(self): return "B"
586 def spam(self): return "B"
587 verify(B().spam() == "B")
588 verify(B().boo() == "B")
589 class C(A):
590 def boo(self): return "C"
591 verify(C().spam() == "A")
592 verify(C().boo() == "C")
593 class D(B, C): pass
594 verify(D().spam() == "B")
595 verify(D().boo() == "B")
596 verify(D.__mro__ == (D, B, C, A, object))
597 class E(C, B): pass
598 verify(E().spam() == "B")
599 verify(E().boo() == "C")
600 verify(E.__mro__ == (E, C, B, A, object))
601 class F(D, E): pass
602 verify(F().spam() == "B")
603 verify(F().boo() == "B")
604 verify(F.__mro__ == (F, D, E, B, C, A, object))
605 class G(E, D): pass
606 verify(G().spam() == "B")
607 verify(G().boo() == "C")
608 verify(G.__mro__ == (G, E, D, C, B, A, object))
609
Guido van Rossum37202612001-08-09 19:45:21 +0000610def objects():
611 if verbose: print "Testing object class..."
612 a = object()
613 verify(a.__class__ == object == type(a))
614 b = object()
615 verify(a is not b)
616 verify(not hasattr(a, "foo"))
617 try:
618 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000619 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000620 pass
621 else:
622 verify(0, "object() should not allow setting a foo attribute")
623 verify(not hasattr(object(), "__dict__"))
624
625 class Cdict(object):
626 pass
627 x = Cdict()
628 verify(x.__dict__ is None)
629 x.foo = 1
630 verify(x.foo == 1)
631 verify(x.__dict__ == {'foo': 1})
632
Tim Peters6d6c1a32001-08-02 04:15:00 +0000633def slots():
634 if verbose: print "Testing __slots__..."
635 class C0(object):
636 __slots__ = []
637 x = C0()
638 verify(not hasattr(x, "__dict__"))
639 verify(not hasattr(x, "foo"))
640
641 class C1(object):
642 __slots__ = ['a']
643 x = C1()
644 verify(not hasattr(x, "__dict__"))
645 verify(x.a == None)
646 x.a = 1
647 verify(x.a == 1)
648 del x.a
649 verify(x.a == None)
650
651 class C3(object):
652 __slots__ = ['a', 'b', 'c']
653 x = C3()
654 verify(not hasattr(x, "__dict__"))
655 verify(x.a is None)
656 verify(x.b is None)
657 verify(x.c is None)
658 x.a = 1
659 x.b = 2
660 x.c = 3
661 verify(x.a == 1)
662 verify(x.b == 2)
663 verify(x.c == 3)
664
665def dynamics():
666 if verbose: print "Testing __dynamic__..."
667 verify(object.__dynamic__ == 0)
668 verify(list.__dynamic__ == 0)
669 class S1:
670 __metaclass__ = type
671 verify(S1.__dynamic__ == 0)
672 class S(object):
673 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000674 verify(S.__dynamic__ == 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 class D(object):
676 __dynamic__ = 1
677 verify(D.__dynamic__ == 1)
678 class E(D, S):
679 pass
680 verify(E.__dynamic__ == 1)
681 class F(S, D):
682 pass
683 verify(F.__dynamic__ == 1)
684 try:
685 S.foo = 1
686 except (AttributeError, TypeError):
687 pass
688 else:
689 verify(0, "assignment to a static class attribute should be illegal")
690 D.foo = 1
691 verify(D.foo == 1)
692 # Test that dynamic attributes are inherited
693 verify(E.foo == 1)
694 verify(F.foo == 1)
695 class SS(D):
696 __dynamic__ = 0
697 verify(SS.__dynamic__ == 0)
698 verify(SS.foo == 1)
699 try:
700 SS.foo = 1
701 except (AttributeError, TypeError):
702 pass
703 else:
704 verify(0, "assignment to SS.foo should be illegal")
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000705 # Test dynamic instances
706 class C(object):
707 __dynamic__ = 1
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000708 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000709 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000710 C.foobar = 2
711 verify(a.foobar == 2)
712 C.method = lambda self: 42
713 verify(a.method() == 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000714 C.__repr__ = lambda self: "C()"
715 verify(repr(a) == "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000716 C.__int__ = lambda self: 100
717 verify(int(a) == 100)
718 verify(a.foobar == 2)
719 verify(not hasattr(a, "spam"))
720 def mygetattr(self, name):
721 if name == "spam":
722 return "spam"
723 else:
724 return object.__getattr__(self, name)
725 C.__getattr__ = mygetattr
726 verify(a.spam == "spam")
727 a.new = 12
728 verify(a.new == 12)
729 def mysetattr(self, name, value):
730 if name == "spam":
731 raise AttributeError
732 return object.__setattr__(self, name, value)
733 C.__setattr__ = mysetattr
734 try:
735 a.spam = "not spam"
736 except AttributeError:
737 pass
738 else:
739 verify(0, "expected AttributeError")
740 verify(a.spam == "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000741 class D(C):
742 pass
743 d = D()
744 d.foo = 1
745 verify(d.foo == 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000746
747def errors():
748 if verbose: print "Testing errors..."
749
750 try:
751 class C(list, dictionary):
752 pass
753 except TypeError:
754 pass
755 else:
756 verify(0, "inheritance from both list and dict should be illegal")
757
758 try:
759 class C(object, None):
760 pass
761 except TypeError:
762 pass
763 else:
764 verify(0, "inheritance from non-type should be illegal")
765 class Classic:
766 pass
767
768 try:
769 class C(object, Classic):
770 pass
771 except TypeError:
772 pass
773 else:
774 verify(0, "inheritance from object and Classic should be illegal")
775
776 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000777 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000778 pass
779 except TypeError:
780 pass
781 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000782 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000783
784 try:
785 class C(object):
786 __slots__ = 1
787 except TypeError:
788 pass
789 else:
790 verify(0, "__slots__ = 1 should be illegal")
791
792 try:
793 class C(object):
794 __slots__ = [1]
795 except TypeError:
796 pass
797 else:
798 verify(0, "__slots__ = [1] should be illegal")
799
800def classmethods():
801 if verbose: print "Testing class methods..."
802 class C(object):
803 def foo(*a): return a
804 goo = classmethod(foo)
805 c = C()
806 verify(C.goo(1) == (C, 1))
807 verify(c.goo(1) == (C, 1))
808 verify(c.foo(1) == (c, 1))
809 class D(C):
810 pass
811 d = D()
812 verify(D.goo(1) == (D, 1))
813 verify(d.goo(1) == (D, 1))
814 verify(d.foo(1) == (d, 1))
815 verify(D.foo(d, 1) == (d, 1))
816
817def staticmethods():
818 if verbose: print "Testing static methods..."
819 class C(object):
820 def foo(*a): return a
821 goo = staticmethod(foo)
822 c = C()
823 verify(C.goo(1) == (1,))
824 verify(c.goo(1) == (1,))
825 verify(c.foo(1) == (c, 1,))
826 class D(C):
827 pass
828 d = D()
829 verify(D.goo(1) == (1,))
830 verify(d.goo(1) == (1,))
831 verify(d.foo(1) == (d, 1))
832 verify(D.foo(d, 1) == (d, 1))
833
834def classic():
835 if verbose: print "Testing classic classes..."
836 class C:
837 def foo(*a): return a
838 goo = classmethod(foo)
839 c = C()
840 verify(C.goo(1) == (C, 1))
841 verify(c.goo(1) == (C, 1))
842 verify(c.foo(1) == (c, 1))
843 class D(C):
844 pass
845 d = D()
846 verify(D.goo(1) == (D, 1))
847 verify(d.goo(1) == (D, 1))
848 verify(d.foo(1) == (d, 1))
849 verify(D.foo(d, 1) == (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +0000850 class E: # *not* subclassing from C
851 foo = C.foo
852 verify(E().foo == C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +0000853 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854
855def compattr():
856 if verbose: print "Testing computed attributes..."
857 class C(object):
858 class computed_attribute(object):
859 def __init__(self, get, set=None):
860 self.__get = get
861 self.__set = set
862 def __get__(self, obj, type=None):
863 return self.__get(obj)
864 def __set__(self, obj, value):
865 return self.__set(obj, value)
866 def __init__(self):
867 self.__x = 0
868 def __get_x(self):
869 x = self.__x
870 self.__x = x+1
871 return x
872 def __set_x(self, x):
873 self.__x = x
874 x = computed_attribute(__get_x, __set_x)
875 a = C()
876 verify(a.x == 0)
877 verify(a.x == 1)
878 a.x = 10
879 verify(a.x == 10)
880 verify(a.x == 11)
881
882def newslot():
883 if verbose: print "Testing __new__ slot override..."
884 class C(list):
885 def __new__(cls):
886 self = list.__new__(cls)
887 self.foo = 1
888 return self
889 def __init__(self):
890 self.foo = self.foo + 2
891 a = C()
892 verify(a.foo == 3)
893 verify(a.__class__ is C)
894 class D(C):
895 pass
896 b = D()
897 verify(b.foo == 3)
898 verify(b.__class__ is D)
899
Tim Peters6d6c1a32001-08-02 04:15:00 +0000900def altmro():
901 if verbose: print "Testing mro() and overriding it..."
902 class A(object):
903 def f(self): return "A"
904 class B(A):
905 pass
906 class C(A):
907 def f(self): return "C"
908 class D(B, C):
909 pass
910 verify(D.mro() == [D, B, C, A, object] == list(D.__mro__))
911 verify(D().f() == "C")
Guido van Rossumd3077402001-08-12 05:24:18 +0000912 class PerverseMetaType(type):
913 def mro(cls):
914 L = type.mro(cls)
915 L.reverse()
916 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +0000917 class X(A,B,C,D):
918 __metaclass__ = PerverseMetaType
919 verify(X.__mro__ == (object, A, C, B, D, X))
920 verify(X().f() == "A")
921
922def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +0000923 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000924
925 class B(object):
926 "Intermediate class because object doesn't have a __setattr__"
927
928 class C(B):
929
930 def __getattr__(self, name):
931 if name == "foo":
932 return ("getattr", name)
933 else:
934 return B.__getattr__(self, name)
935 def __setattr__(self, name, value):
936 if name == "foo":
937 self.setattr = (name, value)
938 else:
939 return B.__setattr__(self, name, value)
940 def __delattr__(self, name):
941 if name == "foo":
942 self.delattr = name
943 else:
944 return B.__delattr__(self, name)
945
946 def __getitem__(self, key):
947 return ("getitem", key)
948 def __setitem__(self, key, value):
949 self.setitem = (key, value)
950 def __delitem__(self, key):
951 self.delitem = key
952
953 def __getslice__(self, i, j):
954 return ("getslice", i, j)
955 def __setslice__(self, i, j, value):
956 self.setslice = (i, j, value)
957 def __delslice__(self, i, j):
958 self.delslice = (i, j)
959
960 a = C()
961 verify(a.foo == ("getattr", "foo"))
962 a.foo = 12
963 verify(a.setattr == ("foo", 12))
964 del a.foo
965 verify(a.delattr == "foo")
966
967 verify(a[12] == ("getitem", 12))
968 a[12] = 21
969 verify(a.setitem == (12, 21))
970 del a[12]
971 verify(a.delitem == 12)
972
973 verify(a[0:10] == ("getslice", 0, 10))
974 a[0:10] = "foo"
975 verify(a.setslice == (0, 10, "foo"))
976 del a[0:10]
977 verify(a.delslice == (0, 10))
978
Guido van Rossumb5a136b2001-08-15 17:51:17 +0000979def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +0000980 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +0000981 class C(object):
982 def __init__(self, x):
983 self.x = x
984 def foo(self):
985 return self.x
986 c1 = C(1)
987 verify(c1.foo() == 1)
988 class D(C):
989 boo = C.foo
990 goo = c1.foo
991 d2 = D(2)
992 verify(d2.foo() == 2)
993 verify(d2.boo() == 2)
Guido van Rossum501c7c72001-08-16 20:41:56 +0000994 verify(d2.goo() == 1)
Guido van Rossum93018762001-08-17 13:40:47 +0000995 class E(object):
996 foo = C.foo
997 verify(E().foo == C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +0000998 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +0000999
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001000def specials():
1001 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001002 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001003 # Test the default behavior for static classes
1004 class C(object):
1005 def __getitem__(self, i):
1006 if 0 <= i < 10: return i
1007 raise IndexError
1008 c1 = C()
1009 c2 = C()
1010 verify(not not c1)
1011 verify(hash(c1) == id(c1))
1012 verify(cmp(c1, c2) == cmp(id(c1), id(c2)))
1013 verify(c1 == c1)
1014 verify(c1 != c2)
1015 verify(not c1 != c1)
1016 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001017 # Note that the module name appears in str/repr, and that varies
1018 # depending on whether this test is run standalone or from a framework.
1019 verify(str(c1).find('C instance at ') >= 0)
Tim Peters63a8d692001-08-16 16:56:16 +00001020 verify(str(c1) == repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001021 verify(-1 not in c1)
1022 for i in range(10):
1023 verify(i in c1)
1024 verify(10 not in c1)
1025 # Test the default behavior for dynamic classes
1026 class D(object):
1027 __dynamic__ = 1
1028 def __getitem__(self, i):
1029 if 0 <= i < 10: return i
1030 raise IndexError
1031 d1 = D()
1032 d2 = D()
1033 verify(not not d1)
1034 verify(hash(d1) == id(d1))
1035 verify(cmp(d1, d2) == cmp(id(d1), id(d2)))
1036 verify(d1 == d1)
1037 verify(d1 != d2)
1038 verify(not d1 != d1)
1039 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001040 # Note that the module name appears in str/repr, and that varies
1041 # depending on whether this test is run standalone or from a framework.
1042 verify(str(d1).find('D instance at ') >= 0)
Tim Peters63a8d692001-08-16 16:56:16 +00001043 verify(str(d1) == repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001044 verify(-1 not in d1)
1045 for i in range(10):
1046 verify(i in d1)
1047 verify(10 not in d1)
1048 # Test overridden behavior for static classes
1049 class Proxy(object):
1050 def __init__(self, x):
1051 self.x = x
1052 def __nonzero__(self):
1053 return not not self.x
1054 def __hash__(self):
1055 return hash(self.x)
1056 def __eq__(self, other):
1057 return self.x == other
1058 def __ne__(self, other):
1059 return self.x != other
1060 def __cmp__(self, other):
1061 return cmp(self.x, other.x)
1062 def __str__(self):
1063 return "Proxy:%s" % self.x
1064 def __repr__(self):
1065 return "Proxy(%r)" % self.x
1066 def __contains__(self, value):
1067 return value in self.x
1068 p0 = Proxy(0)
1069 p1 = Proxy(1)
1070 p_1 = Proxy(-1)
1071 verify(not p0)
1072 verify(not not p1)
1073 verify(hash(p0) == hash(0))
1074 verify(p0 == p0)
1075 verify(p0 != p1)
1076 verify(not p0 != p0)
1077 verify(not p0 == p1)
1078 verify(cmp(p0, p1) == -1)
1079 verify(cmp(p0, p0) == 0)
1080 verify(cmp(p0, p_1) == 1)
1081 verify(str(p0) == "Proxy:0")
1082 verify(repr(p0) == "Proxy(0)")
1083 p10 = Proxy(range(10))
1084 verify(-1 not in p10)
1085 for i in range(10):
1086 verify(i in p10)
1087 verify(10 not in p10)
1088 # Test overridden behavior for dynamic classes
1089 class DProxy(object):
1090 __dynamic__ = 1
1091 def __init__(self, x):
1092 self.x = x
1093 def __nonzero__(self):
1094 return not not self.x
1095 def __hash__(self):
1096 return hash(self.x)
1097 def __eq__(self, other):
1098 return self.x == other
1099 def __ne__(self, other):
1100 return self.x != other
1101 def __cmp__(self, other):
1102 return cmp(self.x, other.x)
1103 def __str__(self):
1104 return "DProxy:%s" % self.x
1105 def __repr__(self):
1106 return "DProxy(%r)" % self.x
1107 def __contains__(self, value):
1108 return value in self.x
1109 p0 = DProxy(0)
1110 p1 = DProxy(1)
1111 p_1 = DProxy(-1)
1112 verify(not p0)
1113 verify(not not p1)
1114 verify(hash(p0) == hash(0))
1115 verify(p0 == p0)
1116 verify(p0 != p1)
1117 verify(not p0 != p0)
1118 verify(not p0 == p1)
1119 verify(cmp(p0, p1) == -1)
1120 verify(cmp(p0, p0) == 0)
1121 verify(cmp(p0, p_1) == 1)
1122 verify(str(p0) == "DProxy:0")
1123 verify(repr(p0) == "DProxy(0)")
1124 p10 = DProxy(range(10))
1125 verify(-1 not in p10)
1126 for i in range(10):
1127 verify(i in p10)
1128 verify(10 not in p10)
1129
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001130def weakrefs():
1131 if verbose: print "Testing weak references..."
1132 import weakref
1133 class C(object):
1134 pass
1135 c = C()
1136 r = weakref.ref(c)
1137 verify(r() is c)
1138 del c
1139 verify(r() is None)
1140 del r
1141 class NoWeak(object):
1142 __slots__ = ['foo']
1143 no = NoWeak()
1144 try:
1145 weakref.ref(no)
1146 except TypeError, msg:
1147 verify(str(msg).find("weakly") >= 0)
1148 else:
1149 verify(0, "weakref.ref(no) should be illegal")
1150 class Weak(object):
1151 __slots__ = ['foo', '__weakref__']
1152 yes = Weak()
1153 r = weakref.ref(yes)
1154 verify(r() is yes)
1155 del yes
1156 verify(r() is None)
1157 del r
1158
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001159def getsets():
1160 if verbose: print "Testing getset..."
1161 class C(object):
1162 def getx(self):
1163 return self.__x
1164 def setx(self, value):
1165 self.__x = value
1166 def delx(self):
1167 del self.__x
1168 x = getset(getx, setx, delx)
1169 a = C()
1170 verify(not hasattr(a, "x"))
1171 a.x = 42
1172 verify(a._C__x == 42)
1173 verify(a.x == 42)
1174 del a.x
1175 verify(not hasattr(a, "x"))
1176 verify(not hasattr(a, "_C__x"))
1177 C.x.__set__(a, 100)
1178 verify(C.x.__get__(a) == 100)
1179## C.x.__set__(a)
1180## verify(not hasattr(a, "x"))
1181
Guido van Rossumc4a18802001-08-24 16:55:27 +00001182def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001183 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001184
1185 class A(object):
1186 def meth(self, a):
1187 return "A(%r)" % a
1188
1189 verify(A().meth(1) == "A(1)")
1190
1191 class B(A):
1192 def __init__(self):
1193 self.__super = super(B, self)
1194 def meth(self, a):
1195 return "B(%r)" % a + self.__super.meth(a)
1196
1197 verify(B().meth(2) == "B(2)A(2)")
1198
1199 class C(A):
1200 __dynamic__ = 1
1201 def meth(self, a):
1202 return "C(%r)" % a + self.__super.meth(a)
1203 C._C__super = super(C)
1204
1205 verify(C().meth(3) == "C(3)A(3)")
1206
1207 class D(C, B):
1208 def meth(self, a):
1209 return "D(%r)" % a + super(D, self).meth(a)
1210
1211 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1212
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001213def inherits():
1214 if verbose: print "Testing inheritance from basic types..."
1215
1216 class hexint(int):
1217 def __repr__(self):
1218 return hex(self)
1219 def __add__(self, other):
1220 return hexint(int.__add__(self, other))
1221 # (Note that overriding __radd__ doesn't work,
1222 # because the int type gets first dibs.)
1223 verify(repr(hexint(7) + 9) == "0x10")
1224 verify(repr(hexint(1000) + 7) == "0x3ef")
1225
1226 class octlong(long):
1227 __slots__ = []
1228 def __str__(self):
1229 s = oct(self)
1230 if s[-1] == 'L':
1231 s = s[:-1]
1232 return s
1233 def __add__(self, other):
1234 return self.__class__(super(octlong, self).__add__(other))
1235 __radd__ = __add__
1236 verify(str(octlong(3) + 5) == "010")
1237 # (Note that overriding __radd__ here only seems to work
1238 # because the example uses a short int left argument.)
1239 verify(str(5 + octlong(3000)) == "05675")
1240
1241 class precfloat(float):
1242 __slots__ = ['prec']
1243 def __init__(self, value=0.0, prec=12):
1244 self.prec = int(prec)
1245 float.__init__(value)
1246 def __repr__(self):
1247 return "%.*g" % (self.prec, self)
1248 verify(repr(precfloat(1.1)) == "1.1")
1249
1250 class madtuple(tuple):
1251 _rev = None
1252 def rev(self):
1253 if self._rev is not None:
1254 return self._rev
1255 L = list(self)
1256 L.reverse()
1257 self._rev = self.__class__(L)
1258 return self._rev
1259 a = madtuple((1,2,3,4,5,6,7,8,9,0))
1260 verify(a.rev() == madtuple((0,9,8,7,6,5,4,3,2,1)))
1261 verify(a.rev().rev() == madtuple((1,2,3,4,5,6,7,8,9,0)))
1262 for i in range(512):
1263 t = madtuple(range(i))
1264 u = t.rev()
1265 v = u.rev()
1266 verify(v == t)
1267
1268 class madstring(str):
1269 _rev = None
1270 def rev(self):
1271 if self._rev is not None:
1272 return self._rev
1273 L = list(self)
1274 L.reverse()
1275 self._rev = self.__class__("".join(L))
1276 return self._rev
1277 s = madstring("abcdefghijklmnopqrstuvwxyz")
1278 verify(s.rev() == madstring("zyxwvutsrqponmlkjihgfedcba"))
1279 verify(s.rev().rev() == madstring("abcdefghijklmnopqrstuvwxyz"))
1280 for i in range(256):
1281 s = madstring("".join(map(chr, range(i))))
1282 t = s.rev()
1283 u = t.rev()
1284 verify(u == s)
1285
Guido van Rossum91ee7982001-08-30 20:52:40 +00001286 class madunicode(unicode):
1287 _rev = None
1288 def rev(self):
1289 if self._rev is not None:
1290 return self._rev
1291 L = list(self)
1292 L.reverse()
1293 self._rev = self.__class__(u"".join(L))
1294 return self._rev
1295 u = madunicode("ABCDEF")
1296 verify(u.rev() == madunicode(u"FEDCBA"))
1297 verify(u.rev().rev() == madunicode(u"ABCDEF"))
1298
Tim Peters6d6c1a32001-08-02 04:15:00 +00001299def all():
1300 lists()
1301 dicts()
1302 ints()
1303 longs()
1304 floats()
1305 complexes()
1306 spamlists()
1307 spamdicts()
1308 pydicts()
1309 pylists()
1310 metaclass()
1311 pymods()
1312 multi()
1313 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00001314 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001315 slots()
1316 dynamics()
1317 errors()
1318 classmethods()
1319 staticmethods()
1320 classic()
1321 compattr()
1322 newslot()
1323 altmro()
1324 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001325 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001326 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001327 weakrefs()
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001328 getsets()
Guido van Rossumc4a18802001-08-24 16:55:27 +00001329 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001330 inherits()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001331
1332all()
1333
1334if verbose: print "All OK"