blob: f6b9e1be1fd0bf10f322d0361c5f0b52b9e8eee7 [file] [log] [blame]
Tim Peters6d6c1a32001-08-02 04:15:00 +00001# Test descriptor-related enhancements
2
Tim Peters25786c02001-09-02 08:22:48 +00003from test_support import verify, verbose, TestFailed
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 Peters6d6c1a32001-08-02 04:15:00 +0000175binops = {
176 'add': '+',
177 'sub': '-',
178 'mul': '*',
179 'div': '/',
180 'mod': '%',
181 'divmod': 'divmod',
182 'pow': '**',
183 'lshift': '<<',
184 'rshift': '>>',
185 'and': '&',
186 'xor': '^',
187 'or': '|',
188 'cmp': 'cmp',
189 'lt': '<',
190 'le': '<=',
191 'eq': '==',
192 'ne': '!=',
193 'gt': '>',
194 'ge': '>=',
195 }
196
197for name, expr in binops.items():
198 if expr.islower():
199 expr = expr + "(a, b)"
200 else:
201 expr = 'a %s b' % expr
202 binops[name] = expr
203
204unops = {
205 'pos': '+',
206 'neg': '-',
207 'abs': 'abs',
208 'invert': '~',
209 'int': 'int',
210 'long': 'long',
211 'float': 'float',
212 'oct': 'oct',
213 'hex': 'hex',
214 }
215
216for name, expr in unops.items():
217 if expr.islower():
218 expr = expr + "(a)"
219 else:
220 expr = '%s a' % expr
221 unops[name] = expr
222
223def numops(a, b, skip=[]):
224 dict = {'a': a, 'b': b}
225 for name, expr in binops.items():
226 if name not in skip:
227 name = "__%s__" % name
228 if hasattr(a, name):
229 res = eval(expr, dict)
230 testbinop(a, b, res, expr, name)
231 for name, expr in unops.items():
232 name = "__%s__" % name
233 if hasattr(a, name):
234 res = eval(expr, dict)
235 testunop(a, res, expr, name)
236
237def ints():
238 if verbose: print "Testing int operations..."
239 numops(100, 3)
240
241def longs():
242 if verbose: print "Testing long operations..."
243 numops(100L, 3L)
244
245def floats():
246 if verbose: print "Testing float operations..."
247 numops(100.0, 3.0)
248
249def complexes():
250 if verbose: print "Testing complex operations..."
251 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge'])
252 class Number(complex):
253 __slots__ = ['prec']
254 def __init__(self, *args, **kwds):
255 self.prec = kwds.get('prec', 12)
256 def __repr__(self):
257 prec = self.prec
258 if self.imag == 0.0:
259 return "%.*g" % (prec, self.real)
260 if self.real == 0.0:
261 return "%.*gj" % (prec, self.imag)
262 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
263 __str__ = __repr__
264 a = Number(3.14, prec=6)
265 verify(`a` == "3.14")
266 verify(a.prec == 6)
267
268def spamlists():
269 if verbose: print "Testing spamlist operations..."
270 import copy, xxsubtype as spam
271 def spamlist(l, memo=None):
272 import xxsubtype as spam
273 return spam.spamlist(l)
274 # This is an ugly hack:
275 copy._deepcopy_dispatch[spam.spamlist] = spamlist
276
277 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
278 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
279 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
280 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
281 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
282 "a[b:c]", "__getslice__")
283 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
284 "a+=b", "__iadd__")
285 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
286 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
287 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
288 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
289 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
290 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
291 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
292 # Test subclassing
293 class C(spam.spamlist):
294 def foo(self): return 1
295 a = C()
296 verify(a == [])
297 verify(a.foo() == 1)
298 a.append(100)
299 verify(a == [100])
300 verify(a.getstate() == 0)
301 a.setstate(42)
302 verify(a.getstate() == 42)
303
304def spamdicts():
305 if verbose: print "Testing spamdict operations..."
306 import copy, xxsubtype as spam
307 def spamdict(d, memo=None):
308 import xxsubtype as spam
309 sd = spam.spamdict()
310 for k, v in d.items(): sd[k] = v
311 return sd
312 # This is an ugly hack:
313 copy._deepcopy_dispatch[spam.spamdict] = spamdict
314
315 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
316 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
317 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
318 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
319 d = spamdict({1:2,3:4})
320 l1 = []
321 for i in d.keys(): l1.append(i)
322 l = []
323 for i in iter(d): l.append(i)
324 verify(l == l1)
325 l = []
326 for i in d.__iter__(): l.append(i)
327 verify(l == l1)
328 l = []
329 for i in type(spamdict({})).__iter__(d): l.append(i)
330 verify(l == l1)
331 straightd = {1:2, 3:4}
332 spamd = spamdict(straightd)
333 testunop(spamd, 2, "len(a)", "__len__")
334 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
335 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
336 "a[b]=c", "__setitem__")
337 # Test subclassing
338 class C(spam.spamdict):
339 def foo(self): return 1
340 a = C()
341 verify(a.items() == [])
342 verify(a.foo() == 1)
343 a['foo'] = 'bar'
344 verify(a.items() == [('foo', 'bar')])
345 verify(a.getstate() == 0)
346 a.setstate(100)
347 verify(a.getstate() == 100)
348
349def pydicts():
350 if verbose: print "Testing Python subclass of dict..."
351 verify(issubclass(dictionary, dictionary))
352 verify(isinstance({}, dictionary))
353 d = dictionary()
354 verify(d == {})
355 verify(d.__class__ is dictionary)
356 verify(isinstance(d, dictionary))
357 class C(dictionary):
358 state = -1
359 def __init__(self, *a, **kw):
360 if a:
361 assert len(a) == 1
362 self.state = a[0]
363 if kw:
364 for k, v in kw.items(): self[v] = k
365 def __getitem__(self, key):
366 return self.get(key, 0)
367 def __setitem__(self, key, value):
368 assert isinstance(key, type(0))
369 dictionary.__setitem__(self, key, value)
370 def setstate(self, state):
371 self.state = state
372 def getstate(self):
373 return self.state
374 verify(issubclass(C, dictionary))
375 a1 = C(12)
376 verify(a1.state == 12)
377 a2 = C(foo=1, bar=2)
378 verify(a2[1] == 'foo' and a2[2] == 'bar')
379 a = C()
380 verify(a.state == -1)
381 verify(a.getstate() == -1)
382 a.setstate(0)
383 verify(a.state == 0)
384 verify(a.getstate() == 0)
385 a.setstate(10)
386 verify(a.state == 10)
387 verify(a.getstate() == 10)
388 verify(a[42] == 0)
389 a[42] = 24
390 verify(a[42] == 24)
391 if verbose: print "pydict stress test ..."
392 N = 50
393 for i in range(N):
394 a[i] = C()
395 for j in range(N):
396 a[i][j] = i*j
397 for i in range(N):
398 for j in range(N):
399 verify(a[i][j] == i*j)
400
401def pylists():
402 if verbose: print "Testing Python subclass of list..."
403 class C(list):
404 def __getitem__(self, i):
405 return list.__getitem__(self, i) + 100
406 def __getslice__(self, i, j):
407 return (i, j)
408 a = C()
409 a.extend([0,1,2])
410 verify(a[0] == 100)
411 verify(a[1] == 101)
412 verify(a[2] == 102)
413 verify(a[100:200] == (100,200))
414
415def metaclass():
416 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000417 class C:
418 __metaclass__ = type
419 def __init__(self):
420 self.__state = 0
421 def getstate(self):
422 return self.__state
423 def setstate(self, state):
424 self.__state = state
425 a = C()
426 verify(a.getstate() == 0)
427 a.setstate(10)
428 verify(a.getstate() == 10)
429 class D:
430 class __metaclass__(type):
431 def myself(cls): return cls
432 verify(D.myself() == D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000433 d = D()
434 verify(d.__class__ is D)
435 class M1(type):
436 def __new__(cls, name, bases, dict):
437 dict['__spam__'] = 1
438 return type.__new__(cls, name, bases, dict)
439 class C:
440 __metaclass__ = M1
441 verify(C.__spam__ == 1)
442 c = C()
443 verify(c.__spam__ == 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000444
Guido van Rossum309b5662001-08-17 11:43:17 +0000445 class _instance(object):
446 pass
447 class M2(object):
448 def __new__(cls, name, bases, dict):
449 self = object.__new__(cls)
450 self.name = name
451 self.bases = bases
452 self.dict = dict
453 return self
454 __new__ = staticmethod(__new__)
455 def __call__(self):
456 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000457 # Early binding of methods
458 for key in self.dict:
459 if key.startswith("__"):
460 continue
461 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000462 return it
463 class C:
464 __metaclass__ = M2
465 def spam(self):
466 return 42
467 verify(C.name == 'C')
468 verify(C.bases == ())
469 verify('spam' in C.dict)
470 c = C()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000471 verify(c.spam() == 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472
Guido van Rossum91ee7982001-08-30 20:52:40 +0000473 # More metaclass examples
474
475 class autosuper(type):
476 # Automatically add __super to the class
477 # This trick only works for dynamic classes
478 # so we force __dynamic__ = 1
479 def __new__(metaclass, name, bases, dict):
480 # XXX Should check that name isn't already a base class name
481 dict["__dynamic__"] = 1
482 cls = super(autosuper, metaclass).__new__(metaclass,
483 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000484 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000485 while name[:1] == "_":
486 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000487 if name:
488 name = "_%s__super" % name
489 else:
490 name = "__super"
491 setattr(cls, name, super(cls))
492 return cls
493 class A:
494 __metaclass__ = autosuper
495 def meth(self):
496 return "A"
497 class B(A):
498 def meth(self):
499 return "B" + self.__super.meth()
500 class C(A):
501 def meth(self):
502 return "C" + self.__super.meth()
503 class D(C, B):
504 def meth(self):
505 return "D" + self.__super.meth()
506 verify(D().meth() == "DCBA")
507 class E(B, C):
508 def meth(self):
509 return "E" + self.__super.meth()
510 verify(E().meth() == "EBCA")
511
512 class autogetset(type):
513 # Automatically create getset attributes when methods
514 # named _get_x and/or _set_x are found
515 def __new__(metaclass, name, bases, dict):
516 hits = {}
517 for key, val in dict.iteritems():
518 if key.startswith("_get_"):
519 key = key[5:]
520 get, set = hits.get(key, (None, None))
521 get = val
522 hits[key] = get, set
523 elif key.startswith("_set_"):
524 key = key[5:]
525 get, set = hits.get(key, (None, None))
526 set = val
527 hits[key] = get, set
528 for key, (get, set) in hits.iteritems():
529 dict[key] = getset(get, set)
530 return super(autogetset, metaclass).__new__(metaclass,
531 name, bases, dict)
532 class A:
533 __metaclass__ = autogetset
534 def _get_x(self):
535 return -self.__x
536 def _set_x(self, x):
537 self.__x = -x
538 a = A()
539 verify(not hasattr(a, "x"))
540 a.x = 12
541 verify(a.x == 12)
542 verify(a._A__x == -12)
543
544 class multimetaclass(autogetset, autosuper):
545 # Merge of multiple cooperating metaclasses
546 pass
547 class A:
548 __metaclass__ = multimetaclass
549 def _get_x(self):
550 return "A"
551 class B(A):
552 def _get_x(self):
553 return "B" + self.__super._get_x()
554 class C(A):
555 def _get_x(self):
556 return "C" + self.__super._get_x()
557 class D(C, B):
558 def _get_x(self):
559 return "D" + self.__super._get_x()
560 verify(D().x == "DCBA")
561
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562def pymods():
563 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000564 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000565 import sys
566 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000567 class MM(MT):
568 def __init__(self):
569 MT.__init__(self)
570 def __getattr__(self, name):
571 log.append(("getattr", name))
572 return MT.__getattr__(self, name)
573 def __setattr__(self, name, value):
574 log.append(("setattr", name, value))
575 MT.__setattr__(self, name, value)
576 def __delattr__(self, name):
577 log.append(("delattr", name))
578 MT.__delattr__(self, name)
579 a = MM()
580 a.foo = 12
581 x = a.foo
582 del a.foo
Guido van Rossumce129a52001-08-28 18:23:24 +0000583 verify(log == [("setattr", "foo", 12),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000584 ("getattr", "foo"),
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 ("delattr", "foo")], log)
586
587def multi():
588 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 class C(object):
590 def __init__(self):
591 self.__state = 0
592 def getstate(self):
593 return self.__state
594 def setstate(self, state):
595 self.__state = state
596 a = C()
597 verify(a.getstate() == 0)
598 a.setstate(10)
599 verify(a.getstate() == 10)
600 class D(dictionary, C):
601 def __init__(self):
602 type({}).__init__(self)
603 C.__init__(self)
604 d = D()
605 verify(d.keys() == [])
606 d["hello"] = "world"
607 verify(d.items() == [("hello", "world")])
608 verify(d["hello"] == "world")
609 verify(d.getstate() == 0)
610 d.setstate(10)
611 verify(d.getstate() == 10)
612 verify(D.__mro__ == (D, dictionary, C, object))
613
Guido van Rossume45763a2001-08-10 21:28:46 +0000614 # SF bug #442833
615 class Node(object):
616 def __int__(self):
617 return int(self.foo())
618 def foo(self):
619 return "23"
620 class Frag(Node, list):
621 def foo(self):
622 return "42"
623 verify(Node().__int__() == 23)
624 verify(int(Node()) == 23)
625 verify(Frag().__int__() == 42)
626 verify(int(Frag()) == 42)
627
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628def diamond():
629 if verbose: print "Testing multiple inheritance special cases..."
630 class A(object):
631 def spam(self): return "A"
632 verify(A().spam() == "A")
633 class B(A):
634 def boo(self): return "B"
635 def spam(self): return "B"
636 verify(B().spam() == "B")
637 verify(B().boo() == "B")
638 class C(A):
639 def boo(self): return "C"
640 verify(C().spam() == "A")
641 verify(C().boo() == "C")
642 class D(B, C): pass
643 verify(D().spam() == "B")
644 verify(D().boo() == "B")
645 verify(D.__mro__ == (D, B, C, A, object))
646 class E(C, B): pass
647 verify(E().spam() == "B")
648 verify(E().boo() == "C")
649 verify(E.__mro__ == (E, C, B, A, object))
650 class F(D, E): pass
651 verify(F().spam() == "B")
652 verify(F().boo() == "B")
653 verify(F.__mro__ == (F, D, E, B, C, A, object))
654 class G(E, D): pass
655 verify(G().spam() == "B")
656 verify(G().boo() == "C")
657 verify(G.__mro__ == (G, E, D, C, B, A, object))
658
Guido van Rossum37202612001-08-09 19:45:21 +0000659def objects():
660 if verbose: print "Testing object class..."
661 a = object()
662 verify(a.__class__ == object == type(a))
663 b = object()
664 verify(a is not b)
665 verify(not hasattr(a, "foo"))
666 try:
667 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000668 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000669 pass
670 else:
671 verify(0, "object() should not allow setting a foo attribute")
672 verify(not hasattr(object(), "__dict__"))
673
674 class Cdict(object):
675 pass
676 x = Cdict()
677 verify(x.__dict__ is None)
678 x.foo = 1
679 verify(x.foo == 1)
680 verify(x.__dict__ == {'foo': 1})
681
Tim Peters6d6c1a32001-08-02 04:15:00 +0000682def slots():
683 if verbose: print "Testing __slots__..."
684 class C0(object):
685 __slots__ = []
686 x = C0()
687 verify(not hasattr(x, "__dict__"))
688 verify(not hasattr(x, "foo"))
689
690 class C1(object):
691 __slots__ = ['a']
692 x = C1()
693 verify(not hasattr(x, "__dict__"))
694 verify(x.a == None)
695 x.a = 1
696 verify(x.a == 1)
697 del x.a
698 verify(x.a == None)
699
700 class C3(object):
701 __slots__ = ['a', 'b', 'c']
702 x = C3()
703 verify(not hasattr(x, "__dict__"))
704 verify(x.a is None)
705 verify(x.b is None)
706 verify(x.c is None)
707 x.a = 1
708 x.b = 2
709 x.c = 3
710 verify(x.a == 1)
711 verify(x.b == 2)
712 verify(x.c == 3)
713
714def dynamics():
715 if verbose: print "Testing __dynamic__..."
716 verify(object.__dynamic__ == 0)
717 verify(list.__dynamic__ == 0)
718 class S1:
719 __metaclass__ = type
720 verify(S1.__dynamic__ == 0)
721 class S(object):
722 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000723 verify(S.__dynamic__ == 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000724 class D(object):
725 __dynamic__ = 1
726 verify(D.__dynamic__ == 1)
727 class E(D, S):
728 pass
729 verify(E.__dynamic__ == 1)
730 class F(S, D):
731 pass
732 verify(F.__dynamic__ == 1)
733 try:
734 S.foo = 1
735 except (AttributeError, TypeError):
736 pass
737 else:
738 verify(0, "assignment to a static class attribute should be illegal")
739 D.foo = 1
740 verify(D.foo == 1)
741 # Test that dynamic attributes are inherited
742 verify(E.foo == 1)
743 verify(F.foo == 1)
744 class SS(D):
745 __dynamic__ = 0
746 verify(SS.__dynamic__ == 0)
747 verify(SS.foo == 1)
748 try:
749 SS.foo = 1
750 except (AttributeError, TypeError):
751 pass
752 else:
753 verify(0, "assignment to SS.foo should be illegal")
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000754 # Test dynamic instances
755 class C(object):
756 __dynamic__ = 1
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000757 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000758 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000759 C.foobar = 2
760 verify(a.foobar == 2)
761 C.method = lambda self: 42
762 verify(a.method() == 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000763 C.__repr__ = lambda self: "C()"
764 verify(repr(a) == "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000765 C.__int__ = lambda self: 100
766 verify(int(a) == 100)
767 verify(a.foobar == 2)
768 verify(not hasattr(a, "spam"))
769 def mygetattr(self, name):
770 if name == "spam":
771 return "spam"
772 else:
773 return object.__getattr__(self, name)
774 C.__getattr__ = mygetattr
775 verify(a.spam == "spam")
776 a.new = 12
777 verify(a.new == 12)
778 def mysetattr(self, name, value):
779 if name == "spam":
780 raise AttributeError
781 return object.__setattr__(self, name, value)
782 C.__setattr__ = mysetattr
783 try:
784 a.spam = "not spam"
785 except AttributeError:
786 pass
787 else:
788 verify(0, "expected AttributeError")
789 verify(a.spam == "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000790 class D(C):
791 pass
792 d = D()
793 d.foo = 1
794 verify(d.foo == 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795
796def errors():
797 if verbose: print "Testing errors..."
798
799 try:
800 class C(list, dictionary):
801 pass
802 except TypeError:
803 pass
804 else:
805 verify(0, "inheritance from both list and dict should be illegal")
806
807 try:
808 class C(object, None):
809 pass
810 except TypeError:
811 pass
812 else:
813 verify(0, "inheritance from non-type should be illegal")
814 class Classic:
815 pass
816
817 try:
818 class C(object, Classic):
819 pass
820 except TypeError:
821 pass
822 else:
823 verify(0, "inheritance from object and Classic should be illegal")
824
825 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000826 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827 pass
828 except TypeError:
829 pass
830 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +0000831 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000832
833 try:
834 class C(object):
835 __slots__ = 1
836 except TypeError:
837 pass
838 else:
839 verify(0, "__slots__ = 1 should be illegal")
840
841 try:
842 class C(object):
843 __slots__ = [1]
844 except TypeError:
845 pass
846 else:
847 verify(0, "__slots__ = [1] should be illegal")
848
849def classmethods():
850 if verbose: print "Testing class methods..."
851 class C(object):
852 def foo(*a): return a
853 goo = classmethod(foo)
854 c = C()
855 verify(C.goo(1) == (C, 1))
856 verify(c.goo(1) == (C, 1))
857 verify(c.foo(1) == (c, 1))
858 class D(C):
859 pass
860 d = D()
861 verify(D.goo(1) == (D, 1))
862 verify(d.goo(1) == (D, 1))
863 verify(d.foo(1) == (d, 1))
864 verify(D.foo(d, 1) == (d, 1))
865
866def staticmethods():
867 if verbose: print "Testing static methods..."
868 class C(object):
869 def foo(*a): return a
870 goo = staticmethod(foo)
871 c = C()
872 verify(C.goo(1) == (1,))
873 verify(c.goo(1) == (1,))
874 verify(c.foo(1) == (c, 1,))
875 class D(C):
876 pass
877 d = D()
878 verify(D.goo(1) == (1,))
879 verify(d.goo(1) == (1,))
880 verify(d.foo(1) == (d, 1))
881 verify(D.foo(d, 1) == (d, 1))
882
883def classic():
884 if verbose: print "Testing classic classes..."
885 class C:
886 def foo(*a): return a
887 goo = classmethod(foo)
888 c = C()
889 verify(C.goo(1) == (C, 1))
890 verify(c.goo(1) == (C, 1))
891 verify(c.foo(1) == (c, 1))
892 class D(C):
893 pass
894 d = D()
895 verify(D.goo(1) == (D, 1))
896 verify(d.goo(1) == (D, 1))
897 verify(d.foo(1) == (d, 1))
898 verify(D.foo(d, 1) == (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +0000899 class E: # *not* subclassing from C
900 foo = C.foo
901 verify(E().foo == C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +0000902 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000903
904def compattr():
905 if verbose: print "Testing computed attributes..."
906 class C(object):
907 class computed_attribute(object):
908 def __init__(self, get, set=None):
909 self.__get = get
910 self.__set = set
911 def __get__(self, obj, type=None):
912 return self.__get(obj)
913 def __set__(self, obj, value):
914 return self.__set(obj, value)
915 def __init__(self):
916 self.__x = 0
917 def __get_x(self):
918 x = self.__x
919 self.__x = x+1
920 return x
921 def __set_x(self, x):
922 self.__x = x
923 x = computed_attribute(__get_x, __set_x)
924 a = C()
925 verify(a.x == 0)
926 verify(a.x == 1)
927 a.x = 10
928 verify(a.x == 10)
929 verify(a.x == 11)
930
931def newslot():
932 if verbose: print "Testing __new__ slot override..."
933 class C(list):
934 def __new__(cls):
935 self = list.__new__(cls)
936 self.foo = 1
937 return self
938 def __init__(self):
939 self.foo = self.foo + 2
940 a = C()
941 verify(a.foo == 3)
942 verify(a.__class__ is C)
943 class D(C):
944 pass
945 b = D()
946 verify(b.foo == 3)
947 verify(b.__class__ is D)
948
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949def altmro():
950 if verbose: print "Testing mro() and overriding it..."
951 class A(object):
952 def f(self): return "A"
953 class B(A):
954 pass
955 class C(A):
956 def f(self): return "C"
957 class D(B, C):
958 pass
959 verify(D.mro() == [D, B, C, A, object] == list(D.__mro__))
960 verify(D().f() == "C")
Guido van Rossumd3077402001-08-12 05:24:18 +0000961 class PerverseMetaType(type):
962 def mro(cls):
963 L = type.mro(cls)
964 L.reverse()
965 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +0000966 class X(A,B,C,D):
967 __metaclass__ = PerverseMetaType
968 verify(X.__mro__ == (object, A, C, B, D, X))
969 verify(X().f() == "A")
970
971def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +0000972 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000973
974 class B(object):
975 "Intermediate class because object doesn't have a __setattr__"
976
977 class C(B):
978
979 def __getattr__(self, name):
980 if name == "foo":
981 return ("getattr", name)
982 else:
983 return B.__getattr__(self, name)
984 def __setattr__(self, name, value):
985 if name == "foo":
986 self.setattr = (name, value)
987 else:
988 return B.__setattr__(self, name, value)
989 def __delattr__(self, name):
990 if name == "foo":
991 self.delattr = name
992 else:
993 return B.__delattr__(self, name)
994
995 def __getitem__(self, key):
996 return ("getitem", key)
997 def __setitem__(self, key, value):
998 self.setitem = (key, value)
999 def __delitem__(self, key):
1000 self.delitem = key
1001
1002 def __getslice__(self, i, j):
1003 return ("getslice", i, j)
1004 def __setslice__(self, i, j, value):
1005 self.setslice = (i, j, value)
1006 def __delslice__(self, i, j):
1007 self.delslice = (i, j)
1008
1009 a = C()
1010 verify(a.foo == ("getattr", "foo"))
1011 a.foo = 12
1012 verify(a.setattr == ("foo", 12))
1013 del a.foo
1014 verify(a.delattr == "foo")
1015
1016 verify(a[12] == ("getitem", 12))
1017 a[12] = 21
1018 verify(a.setitem == (12, 21))
1019 del a[12]
1020 verify(a.delitem == 12)
1021
1022 verify(a[0:10] == ("getslice", 0, 10))
1023 a[0:10] = "foo"
1024 verify(a.setslice == (0, 10, "foo"))
1025 del a[0:10]
1026 verify(a.delslice == (0, 10))
1027
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001028def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001029 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001030 class C(object):
1031 def __init__(self, x):
1032 self.x = x
1033 def foo(self):
1034 return self.x
1035 c1 = C(1)
1036 verify(c1.foo() == 1)
1037 class D(C):
1038 boo = C.foo
1039 goo = c1.foo
1040 d2 = D(2)
1041 verify(d2.foo() == 2)
1042 verify(d2.boo() == 2)
Guido van Rossum501c7c72001-08-16 20:41:56 +00001043 verify(d2.goo() == 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001044 class E(object):
1045 foo = C.foo
1046 verify(E().foo == C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001047 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001048
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001049def specials():
1050 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001051 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001052 # Test the default behavior for static classes
1053 class C(object):
1054 def __getitem__(self, i):
1055 if 0 <= i < 10: return i
1056 raise IndexError
1057 c1 = C()
1058 c2 = C()
1059 verify(not not c1)
1060 verify(hash(c1) == id(c1))
1061 verify(cmp(c1, c2) == cmp(id(c1), id(c2)))
1062 verify(c1 == c1)
1063 verify(c1 != c2)
1064 verify(not c1 != c1)
1065 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001066 # Note that the module name appears in str/repr, and that varies
1067 # depending on whether this test is run standalone or from a framework.
1068 verify(str(c1).find('C instance at ') >= 0)
Tim Peters63a8d692001-08-16 16:56:16 +00001069 verify(str(c1) == repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001070 verify(-1 not in c1)
1071 for i in range(10):
1072 verify(i in c1)
1073 verify(10 not in c1)
1074 # Test the default behavior for dynamic classes
1075 class D(object):
1076 __dynamic__ = 1
1077 def __getitem__(self, i):
1078 if 0 <= i < 10: return i
1079 raise IndexError
1080 d1 = D()
1081 d2 = D()
1082 verify(not not d1)
1083 verify(hash(d1) == id(d1))
1084 verify(cmp(d1, d2) == cmp(id(d1), id(d2)))
1085 verify(d1 == d1)
1086 verify(d1 != d2)
1087 verify(not d1 != d1)
1088 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001089 # Note that the module name appears in str/repr, and that varies
1090 # depending on whether this test is run standalone or from a framework.
1091 verify(str(d1).find('D instance at ') >= 0)
Tim Peters63a8d692001-08-16 16:56:16 +00001092 verify(str(d1) == repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001093 verify(-1 not in d1)
1094 for i in range(10):
1095 verify(i in d1)
1096 verify(10 not in d1)
1097 # Test overridden behavior for static classes
1098 class Proxy(object):
1099 def __init__(self, x):
1100 self.x = x
1101 def __nonzero__(self):
1102 return not not self.x
1103 def __hash__(self):
1104 return hash(self.x)
1105 def __eq__(self, other):
1106 return self.x == other
1107 def __ne__(self, other):
1108 return self.x != other
1109 def __cmp__(self, other):
1110 return cmp(self.x, other.x)
1111 def __str__(self):
1112 return "Proxy:%s" % self.x
1113 def __repr__(self):
1114 return "Proxy(%r)" % self.x
1115 def __contains__(self, value):
1116 return value in self.x
1117 p0 = Proxy(0)
1118 p1 = Proxy(1)
1119 p_1 = Proxy(-1)
1120 verify(not p0)
1121 verify(not not p1)
1122 verify(hash(p0) == hash(0))
1123 verify(p0 == p0)
1124 verify(p0 != p1)
1125 verify(not p0 != p0)
1126 verify(not p0 == p1)
1127 verify(cmp(p0, p1) == -1)
1128 verify(cmp(p0, p0) == 0)
1129 verify(cmp(p0, p_1) == 1)
1130 verify(str(p0) == "Proxy:0")
1131 verify(repr(p0) == "Proxy(0)")
1132 p10 = Proxy(range(10))
1133 verify(-1 not in p10)
1134 for i in range(10):
1135 verify(i in p10)
1136 verify(10 not in p10)
1137 # Test overridden behavior for dynamic classes
1138 class DProxy(object):
1139 __dynamic__ = 1
1140 def __init__(self, x):
1141 self.x = x
1142 def __nonzero__(self):
1143 return not not self.x
1144 def __hash__(self):
1145 return hash(self.x)
1146 def __eq__(self, other):
1147 return self.x == other
1148 def __ne__(self, other):
1149 return self.x != other
1150 def __cmp__(self, other):
1151 return cmp(self.x, other.x)
1152 def __str__(self):
1153 return "DProxy:%s" % self.x
1154 def __repr__(self):
1155 return "DProxy(%r)" % self.x
1156 def __contains__(self, value):
1157 return value in self.x
1158 p0 = DProxy(0)
1159 p1 = DProxy(1)
1160 p_1 = DProxy(-1)
1161 verify(not p0)
1162 verify(not not p1)
1163 verify(hash(p0) == hash(0))
1164 verify(p0 == p0)
1165 verify(p0 != p1)
1166 verify(not p0 != p0)
1167 verify(not p0 == p1)
1168 verify(cmp(p0, p1) == -1)
1169 verify(cmp(p0, p0) == 0)
1170 verify(cmp(p0, p_1) == 1)
1171 verify(str(p0) == "DProxy:0")
1172 verify(repr(p0) == "DProxy(0)")
1173 p10 = DProxy(range(10))
1174 verify(-1 not in p10)
1175 for i in range(10):
1176 verify(i in p10)
1177 verify(10 not in p10)
1178
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001179def weakrefs():
1180 if verbose: print "Testing weak references..."
1181 import weakref
1182 class C(object):
1183 pass
1184 c = C()
1185 r = weakref.ref(c)
1186 verify(r() is c)
1187 del c
1188 verify(r() is None)
1189 del r
1190 class NoWeak(object):
1191 __slots__ = ['foo']
1192 no = NoWeak()
1193 try:
1194 weakref.ref(no)
1195 except TypeError, msg:
1196 verify(str(msg).find("weakly") >= 0)
1197 else:
1198 verify(0, "weakref.ref(no) should be illegal")
1199 class Weak(object):
1200 __slots__ = ['foo', '__weakref__']
1201 yes = Weak()
1202 r = weakref.ref(yes)
1203 verify(r() is yes)
1204 del yes
1205 verify(r() is None)
1206 del r
1207
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001208def getsets():
1209 if verbose: print "Testing getset..."
1210 class C(object):
1211 def getx(self):
1212 return self.__x
1213 def setx(self, value):
1214 self.__x = value
1215 def delx(self):
1216 del self.__x
1217 x = getset(getx, setx, delx)
1218 a = C()
1219 verify(not hasattr(a, "x"))
1220 a.x = 42
1221 verify(a._C__x == 42)
1222 verify(a.x == 42)
1223 del a.x
1224 verify(not hasattr(a, "x"))
1225 verify(not hasattr(a, "_C__x"))
1226 C.x.__set__(a, 100)
1227 verify(C.x.__get__(a) == 100)
1228## C.x.__set__(a)
1229## verify(not hasattr(a, "x"))
1230
Guido van Rossumc4a18802001-08-24 16:55:27 +00001231def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001232 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001233
1234 class A(object):
1235 def meth(self, a):
1236 return "A(%r)" % a
1237
1238 verify(A().meth(1) == "A(1)")
1239
1240 class B(A):
1241 def __init__(self):
1242 self.__super = super(B, self)
1243 def meth(self, a):
1244 return "B(%r)" % a + self.__super.meth(a)
1245
1246 verify(B().meth(2) == "B(2)A(2)")
1247
1248 class C(A):
1249 __dynamic__ = 1
1250 def meth(self, a):
1251 return "C(%r)" % a + self.__super.meth(a)
1252 C._C__super = super(C)
1253
1254 verify(C().meth(3) == "C(3)A(3)")
1255
1256 class D(C, B):
1257 def meth(self, a):
1258 return "D(%r)" % a + super(D, self).meth(a)
1259
1260 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1261
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001262def inherits():
1263 if verbose: print "Testing inheritance from basic types..."
1264
1265 class hexint(int):
1266 def __repr__(self):
1267 return hex(self)
1268 def __add__(self, other):
1269 return hexint(int.__add__(self, other))
1270 # (Note that overriding __radd__ doesn't work,
1271 # because the int type gets first dibs.)
1272 verify(repr(hexint(7) + 9) == "0x10")
1273 verify(repr(hexint(1000) + 7) == "0x3ef")
1274
1275 class octlong(long):
1276 __slots__ = []
1277 def __str__(self):
1278 s = oct(self)
1279 if s[-1] == 'L':
1280 s = s[:-1]
1281 return s
1282 def __add__(self, other):
1283 return self.__class__(super(octlong, self).__add__(other))
1284 __radd__ = __add__
1285 verify(str(octlong(3) + 5) == "010")
1286 # (Note that overriding __radd__ here only seems to work
1287 # because the example uses a short int left argument.)
1288 verify(str(5 + octlong(3000)) == "05675")
1289
1290 class precfloat(float):
1291 __slots__ = ['prec']
1292 def __init__(self, value=0.0, prec=12):
1293 self.prec = int(prec)
1294 float.__init__(value)
1295 def __repr__(self):
1296 return "%.*g" % (self.prec, self)
1297 verify(repr(precfloat(1.1)) == "1.1")
1298
1299 class madtuple(tuple):
1300 _rev = None
1301 def rev(self):
1302 if self._rev is not None:
1303 return self._rev
1304 L = list(self)
1305 L.reverse()
1306 self._rev = self.__class__(L)
1307 return self._rev
1308 a = madtuple((1,2,3,4,5,6,7,8,9,0))
1309 verify(a.rev() == madtuple((0,9,8,7,6,5,4,3,2,1)))
1310 verify(a.rev().rev() == madtuple((1,2,3,4,5,6,7,8,9,0)))
1311 for i in range(512):
1312 t = madtuple(range(i))
1313 u = t.rev()
1314 v = u.rev()
1315 verify(v == t)
1316
1317 class madstring(str):
1318 _rev = None
1319 def rev(self):
1320 if self._rev is not None:
1321 return self._rev
1322 L = list(self)
1323 L.reverse()
1324 self._rev = self.__class__("".join(L))
1325 return self._rev
1326 s = madstring("abcdefghijklmnopqrstuvwxyz")
1327 verify(s.rev() == madstring("zyxwvutsrqponmlkjihgfedcba"))
1328 verify(s.rev().rev() == madstring("abcdefghijklmnopqrstuvwxyz"))
1329 for i in range(256):
1330 s = madstring("".join(map(chr, range(i))))
1331 t = s.rev()
1332 u = t.rev()
1333 verify(u == s)
1334
Guido van Rossum91ee7982001-08-30 20:52:40 +00001335 class madunicode(unicode):
1336 _rev = None
1337 def rev(self):
1338 if self._rev is not None:
1339 return self._rev
1340 L = list(self)
1341 L.reverse()
1342 self._rev = self.__class__(u"".join(L))
1343 return self._rev
1344 u = madunicode("ABCDEF")
1345 verify(u.rev() == madunicode(u"FEDCBA"))
1346 verify(u.rev().rev() == madunicode(u"ABCDEF"))
1347
Tim Peters6d6c1a32001-08-02 04:15:00 +00001348def all():
1349 lists()
1350 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00001351 dict_constructor()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001352 ints()
1353 longs()
1354 floats()
1355 complexes()
1356 spamlists()
1357 spamdicts()
1358 pydicts()
1359 pylists()
1360 metaclass()
1361 pymods()
1362 multi()
1363 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00001364 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001365 slots()
1366 dynamics()
1367 errors()
1368 classmethods()
1369 staticmethods()
1370 classic()
1371 compattr()
1372 newslot()
1373 altmro()
1374 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001375 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001376 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001377 weakrefs()
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001378 getsets()
Guido van Rossumc4a18802001-08-24 16:55:27 +00001379 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001380 inherits()
Tim Peters6d6c1a32001-08-02 04:15:00 +00001381
1382all()
1383
1384if verbose: print "All OK"