blob: 2e1f5af04e12fa3fa4579e2fd50c2e3906745193 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Barry Warsaw04f357c2002-07-23 19:04:11 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
16 if verbose: print "checking", expr
17 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
29 if verbose: print "checking", expr
30 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
32 # XXX Hack so this passes before 2.3 when -Qnew is specified.
33 if meth == "__div__" and 1/2 == 0.5:
34 meth = "__truediv__"
35
Guido van Rossum45704552001-10-08 16:35:45 +000036 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 t = type(a)
38 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000039 while meth not in t.__dict__:
40 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000041 vereq(m, t.__dict__[meth])
42 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045
46def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
47 if verbose: print "checking", expr
48 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000049 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 t = type(a)
51 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000052 while meth not in t.__dict__:
53 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000054 vereq(m, t.__dict__[meth])
55 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000056 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058
59def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
60 if verbose: print "checking", stmt
61 dict = {'a': deepcopy(a), 'b': b}
62 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 t = type(a)
65 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000066 while meth not in t.__dict__:
67 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000068 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000069 dict['a'] = deepcopy(a)
70 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict['a'] = deepcopy(a)
73 bm = getattr(dict['a'], meth)
74 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076
77def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
78 if verbose: print "checking", stmt
79 dict = {'a': deepcopy(a), 'b': b, 'c': c}
80 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000081 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 t = type(a)
83 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000084 while meth not in t.__dict__:
85 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 dict['a'] = deepcopy(a)
88 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict['a'] = deepcopy(a)
91 bm = getattr(dict['a'], meth)
92 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094
95def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
96 if verbose: print "checking", stmt
97 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
98 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000099 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000101 while meth not in t.__dict__:
102 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105 dict['a'] = deepcopy(a)
106 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108 dict['a'] = deepcopy(a)
109 bm = getattr(dict['a'], meth)
110 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000111 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000112
Tim Peters2f93e282001-10-04 05:27:00 +0000113def class_docstrings():
114 class Classic:
115 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000116 vereq(Classic.__doc__, "A classic docstring.")
117 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000118
119 class Classic2:
120 pass
121 verify(Classic2.__doc__ is None)
122
Tim Peters4fb1fe82001-10-04 05:48:13 +0000123 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000124 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000125 vereq(NewStatic.__doc__, "Another docstring.")
126 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 pass
130 verify(NewStatic2.__doc__ is None)
131
Tim Peters4fb1fe82001-10-04 05:48:13 +0000132 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000133 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000134 vereq(NewDynamic.__doc__, "Another docstring.")
135 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000136
Tim Peters4fb1fe82001-10-04 05:48:13 +0000137 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000138 pass
139 verify(NewDynamic2.__doc__ is None)
140
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141def lists():
142 if verbose: print "Testing list operations..."
143 testbinop([1], [2], [1,2], "a+b", "__add__")
144 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
145 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
146 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
147 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
148 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
149 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
150 testunop([1,2,3], 3, "len(a)", "__len__")
151 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
152 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
153 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
154 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
155
156def dicts():
157 if verbose: print "Testing dict operations..."
158 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
159 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
160 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
161 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
162 d = {1:2,3:4}
163 l1 = []
164 for i in d.keys(): l1.append(i)
165 l = []
166 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 l = []
169 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000171 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000172 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000173 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 d = {1:2, 3:4}
175 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(eval(repr(d), {}), d)
177 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
179
Tim Peters25786c02001-09-02 08:22:48 +0000180def dict_constructor():
181 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 print "Testing dict constructor ..."
183 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000186 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000187 d = dict(items={})
Guido van Rossum45704552001-10-08 16:35:45 +0000188 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000189 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000190 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000191 vereq(d, dict(d.items()))
192 vereq(d, dict(items=d.iteritems()))
Tim Peters25786c02001-09-02 08:22:48 +0000193 for badarg in 0, 0L, 0j, "0", [0], (0,):
194 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000195 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000196 except TypeError:
197 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000198 except ValueError:
199 if badarg == "0":
200 # It's a sequence, and its elements are also sequences (gotta
201 # love strings <wink>), but they aren't of length 2, so this
202 # one seemed better as a ValueError than a TypeError.
203 pass
204 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000205 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000206 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000207 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000208 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000209 dict(senseless={})
Tim Peters25786c02001-09-02 08:22:48 +0000210 except TypeError:
211 pass
212 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000213 raise TestFailed("no TypeError from dict(senseless={})")
Tim Peters25786c02001-09-02 08:22:48 +0000214
215 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000216 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000217 except TypeError:
218 pass
219 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000220 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000221
222 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000223 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000224 dict = {1:2, 3:4, 'a':1j}
225
Tim Peters25786c02001-09-02 08:22:48 +0000226 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000227 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000228 except TypeError:
229 pass
230 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000231 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000232
233 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000234 Mapping.__getitem__ = lambda self, i: self.dict[i]
Tim Petersa427a2b2001-10-29 22:25:45 +0000235 d = dict(items=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000236 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000237
Tim Peters1fc240e2001-10-26 05:06:50 +0000238 # Init from sequence of iterable objects, each producing a 2-sequence.
239 class AddressBookEntry:
240 def __init__(self, first, last):
241 self.first = first
242 self.last = last
243 def __iter__(self):
244 return iter([self.first, self.last])
245
Tim Petersa427a2b2001-10-29 22:25:45 +0000246 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000247 AddressBookEntry('Barry', 'Peters'),
248 AddressBookEntry('Tim', 'Peters'),
249 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000250 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
251
Tim Petersa427a2b2001-10-29 22:25:45 +0000252 d = dict(zip(range(4), range(1, 5)))
253 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000254
255 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000256 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000257 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000258 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000259 except ValueError:
260 pass
261 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000262 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000263
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264def test_dir():
265 if verbose:
266 print "Testing dir() ..."
267 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000268 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000269 del junk
270
271 # Just make sure these don't blow up!
272 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
273 dir(arg)
274
Tim Peters37a309d2001-09-04 01:20:04 +0000275 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000276 class C:
277 Cdata = 1
278 def Cmethod(self): pass
279
280 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000281 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000282 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000283
284 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000285 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000286
287 c.cdata = 2
288 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000289 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000290 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291
292 class A(C):
293 Adata = 1
294 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000295
Tim Peters37a309d2001-09-04 01:20:04 +0000296 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000297 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000298 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000299 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000300 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000301 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000302 a.adata = 42
303 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000304 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000305
306 # The same, but with new-style classes. Since these have object as a
307 # base class, a lot more gets sucked in.
308 def interesting(strings):
309 return [s for s in strings if not s.startswith('_')]
310
Tim Peters5d2b77c2001-09-03 05:47:38 +0000311 class C(object):
312 Cdata = 1
313 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000314
315 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000316 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000317
318 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000319 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000320 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000321
322 c.cdata = 2
323 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000324 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000325 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000326
Tim Peters5d2b77c2001-09-03 05:47:38 +0000327 class A(C):
328 Adata = 1
329 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000330
331 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000332 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000333 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000334 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000335 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000336 a.adata = 42
337 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000338 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000339 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000340
Tim Peterscaaff8d2001-09-10 23:12:14 +0000341 # Try a module subclass.
342 import sys
343 class M(type(sys)):
344 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000345 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000346 minstance.b = 2
347 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000348 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
349 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000350
351 class M2(M):
352 def getdict(self):
353 return "Not a dict!"
354 __dict__ = property(getdict)
355
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000356 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000357 m2instance.b = 2
358 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000359 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000360 try:
361 dir(m2instance)
362 except TypeError:
363 pass
364
Tim Peters9e6a3992001-10-30 05:45:26 +0000365 # Two essentially featureless objects, just inheriting stuff from
366 # object.
367 vereq(dir(None), dir(Ellipsis))
368
Guido van Rossum44022412002-05-13 18:29:46 +0000369 # Nasty test case for proxied objects
370 class Wrapper(object):
371 def __init__(self, obj):
372 self.__obj = obj
373 def __repr__(self):
374 return "Wrapper(%s)" % repr(self.__obj)
375 def __getitem__(self, key):
376 return Wrapper(self.__obj[key])
377 def __len__(self):
378 return len(self.__obj)
379 def __getattr__(self, name):
380 return Wrapper(getattr(self.__obj, name))
381
382 class C(object):
383 def __getclass(self):
384 return Wrapper(type(self))
385 __class__ = property(__getclass)
386
387 dir(C()) # This used to segfault
388
Tim Peters6d6c1a32001-08-02 04:15:00 +0000389binops = {
390 'add': '+',
391 'sub': '-',
392 'mul': '*',
393 'div': '/',
394 'mod': '%',
395 'divmod': 'divmod',
396 'pow': '**',
397 'lshift': '<<',
398 'rshift': '>>',
399 'and': '&',
400 'xor': '^',
401 'or': '|',
402 'cmp': 'cmp',
403 'lt': '<',
404 'le': '<=',
405 'eq': '==',
406 'ne': '!=',
407 'gt': '>',
408 'ge': '>=',
409 }
410
411for name, expr in binops.items():
412 if expr.islower():
413 expr = expr + "(a, b)"
414 else:
415 expr = 'a %s b' % expr
416 binops[name] = expr
417
418unops = {
419 'pos': '+',
420 'neg': '-',
421 'abs': 'abs',
422 'invert': '~',
423 'int': 'int',
424 'long': 'long',
425 'float': 'float',
426 'oct': 'oct',
427 'hex': 'hex',
428 }
429
430for name, expr in unops.items():
431 if expr.islower():
432 expr = expr + "(a)"
433 else:
434 expr = '%s a' % expr
435 unops[name] = expr
436
437def numops(a, b, skip=[]):
438 dict = {'a': a, 'b': b}
439 for name, expr in binops.items():
440 if name not in skip:
441 name = "__%s__" % name
442 if hasattr(a, name):
443 res = eval(expr, dict)
444 testbinop(a, b, res, expr, name)
445 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000446 if name not in skip:
447 name = "__%s__" % name
448 if hasattr(a, name):
449 res = eval(expr, dict)
450 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451
452def ints():
453 if verbose: print "Testing int operations..."
454 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000455 # The following crashes in Python 2.2
456 vereq((1).__nonzero__(), 1)
457 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000458 # This returns 'NotImplemented' in Python 2.2
459 class C(int):
460 def __add__(self, other):
461 return NotImplemented
462 try:
463 C() + ""
464 except TypeError:
465 pass
466 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000467 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000468
469def longs():
470 if verbose: print "Testing long operations..."
471 numops(100L, 3L)
472
473def floats():
474 if verbose: print "Testing float operations..."
475 numops(100.0, 3.0)
476
477def complexes():
478 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000479 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000480 class Number(complex):
481 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000482 def __new__(cls, *args, **kwds):
483 result = complex.__new__(cls, *args)
484 result.prec = kwds.get('prec', 12)
485 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000486 def __repr__(self):
487 prec = self.prec
488 if self.imag == 0.0:
489 return "%.*g" % (prec, self.real)
490 if self.real == 0.0:
491 return "%.*gj" % (prec, self.imag)
492 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
493 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000494
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000496 vereq(`a`, "3.14")
497 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000498
Tim Peters3f996e72001-09-13 19:18:27 +0000499 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000500 vereq(`a`, "3.1")
501 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000502
503 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000504 vereq(`a`, "234.5")
505 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000506
Tim Peters6d6c1a32001-08-02 04:15:00 +0000507def spamlists():
508 if verbose: print "Testing spamlist operations..."
509 import copy, xxsubtype as spam
510 def spamlist(l, memo=None):
511 import xxsubtype as spam
512 return spam.spamlist(l)
513 # This is an ugly hack:
514 copy._deepcopy_dispatch[spam.spamlist] = spamlist
515
516 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
517 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
518 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
519 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
520 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
521 "a[b:c]", "__getslice__")
522 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
523 "a+=b", "__iadd__")
524 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
525 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
526 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
527 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
528 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
529 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
530 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
531 # Test subclassing
532 class C(spam.spamlist):
533 def foo(self): return 1
534 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000535 vereq(a, [])
536 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000537 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000538 vereq(a, [100])
539 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000540 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000541 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000542
543def spamdicts():
544 if verbose: print "Testing spamdict operations..."
545 import copy, xxsubtype as spam
546 def spamdict(d, memo=None):
547 import xxsubtype as spam
548 sd = spam.spamdict()
549 for k, v in d.items(): sd[k] = v
550 return sd
551 # This is an ugly hack:
552 copy._deepcopy_dispatch[spam.spamdict] = spamdict
553
554 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
555 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
556 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
557 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
558 d = spamdict({1:2,3:4})
559 l1 = []
560 for i in d.keys(): l1.append(i)
561 l = []
562 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000563 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000564 l = []
565 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000566 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000567 l = []
568 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000569 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000570 straightd = {1:2, 3:4}
571 spamd = spamdict(straightd)
572 testunop(spamd, 2, "len(a)", "__len__")
573 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
574 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
575 "a[b]=c", "__setitem__")
576 # Test subclassing
577 class C(spam.spamdict):
578 def foo(self): return 1
579 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a.items(), [])
581 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.items(), [('foo', 'bar')])
584 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000587
588def pydicts():
589 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000590 verify(issubclass(dict, dict))
591 verify(isinstance({}, dict))
592 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000594 verify(d.__class__ is dict)
595 verify(isinstance(d, dict))
596 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597 state = -1
598 def __init__(self, *a, **kw):
599 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000600 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000601 self.state = a[0]
602 if kw:
603 for k, v in kw.items(): self[v] = k
604 def __getitem__(self, key):
605 return self.get(key, 0)
606 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000607 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000608 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000609 def setstate(self, state):
610 self.state = state
611 def getstate(self):
612 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000613 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000615 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000616 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000617 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000618 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000619 vereq(a.state, -1)
620 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000622 vereq(a.state, 0)
623 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000625 vereq(a.state, 10)
626 vereq(a.getstate(), 10)
627 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 if verbose: print "pydict stress test ..."
631 N = 50
632 for i in range(N):
633 a[i] = C()
634 for j in range(N):
635 a[i][j] = i*j
636 for i in range(N):
637 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000638 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000639
640def pylists():
641 if verbose: print "Testing Python subclass of list..."
642 class C(list):
643 def __getitem__(self, i):
644 return list.__getitem__(self, i) + 100
645 def __getslice__(self, i, j):
646 return (i, j)
647 a = C()
648 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000649 vereq(a[0], 100)
650 vereq(a[1], 101)
651 vereq(a[2], 102)
652 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000653
654def metaclass():
655 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000656 class C:
657 __metaclass__ = type
658 def __init__(self):
659 self.__state = 0
660 def getstate(self):
661 return self.__state
662 def setstate(self, state):
663 self.__state = state
664 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000665 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000666 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000667 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000668 class D:
669 class __metaclass__(type):
670 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000671 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000672 d = D()
673 verify(d.__class__ is D)
674 class M1(type):
675 def __new__(cls, name, bases, dict):
676 dict['__spam__'] = 1
677 return type.__new__(cls, name, bases, dict)
678 class C:
679 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000680 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000681 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000682 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000683
Guido van Rossum309b5662001-08-17 11:43:17 +0000684 class _instance(object):
685 pass
686 class M2(object):
687 def __new__(cls, name, bases, dict):
688 self = object.__new__(cls)
689 self.name = name
690 self.bases = bases
691 self.dict = dict
692 return self
693 __new__ = staticmethod(__new__)
694 def __call__(self):
695 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000696 # Early binding of methods
697 for key in self.dict:
698 if key.startswith("__"):
699 continue
700 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000701 return it
702 class C:
703 __metaclass__ = M2
704 def spam(self):
705 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000706 vereq(C.name, 'C')
707 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000708 verify('spam' in C.dict)
709 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000710 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000711
Guido van Rossum91ee7982001-08-30 20:52:40 +0000712 # More metaclass examples
713
714 class autosuper(type):
715 # Automatically add __super to the class
716 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000718 cls = super(autosuper, metaclass).__new__(metaclass,
719 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000720 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000721 while name[:1] == "_":
722 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000723 if name:
724 name = "_%s__super" % name
725 else:
726 name = "__super"
727 setattr(cls, name, super(cls))
728 return cls
729 class A:
730 __metaclass__ = autosuper
731 def meth(self):
732 return "A"
733 class B(A):
734 def meth(self):
735 return "B" + self.__super.meth()
736 class C(A):
737 def meth(self):
738 return "C" + self.__super.meth()
739 class D(C, B):
740 def meth(self):
741 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000742 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000743 class E(B, C):
744 def meth(self):
745 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000746 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000747
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000748 class autoproperty(type):
749 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000750 # named _get_x and/or _set_x are found
751 def __new__(metaclass, name, bases, dict):
752 hits = {}
753 for key, val in dict.iteritems():
754 if key.startswith("_get_"):
755 key = key[5:]
756 get, set = hits.get(key, (None, None))
757 get = val
758 hits[key] = get, set
759 elif key.startswith("_set_"):
760 key = key[5:]
761 get, set = hits.get(key, (None, None))
762 set = val
763 hits[key] = get, set
764 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000765 dict[key] = property(get, set)
766 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000767 name, bases, dict)
768 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000769 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000770 def _get_x(self):
771 return -self.__x
772 def _set_x(self, x):
773 self.__x = -x
774 a = A()
775 verify(not hasattr(a, "x"))
776 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000777 vereq(a.x, 12)
778 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000779
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000780 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000781 # Merge of multiple cooperating metaclasses
782 pass
783 class A:
784 __metaclass__ = multimetaclass
785 def _get_x(self):
786 return "A"
787 class B(A):
788 def _get_x(self):
789 return "B" + self.__super._get_x()
790 class C(A):
791 def _get_x(self):
792 return "C" + self.__super._get_x()
793 class D(C, B):
794 def _get_x(self):
795 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000796 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000797
Guido van Rossumf76de622001-10-18 15:49:21 +0000798 # Make sure type(x) doesn't call x.__class__.__init__
799 class T(type):
800 counter = 0
801 def __init__(self, *args):
802 T.counter += 1
803 class C:
804 __metaclass__ = T
805 vereq(T.counter, 1)
806 a = C()
807 vereq(type(a), C)
808 vereq(T.counter, 1)
809
Guido van Rossum29d26062001-12-11 04:37:34 +0000810 class C(object): pass
811 c = C()
812 try: c()
813 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000814 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000815
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816def pymods():
817 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000818 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000819 import sys
820 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000821 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000822 def __init__(self, name):
823 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000824 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000826 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827 def __setattr__(self, name, value):
828 log.append(("setattr", name, value))
829 MT.__setattr__(self, name, value)
830 def __delattr__(self, name):
831 log.append(("delattr", name))
832 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000833 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 a.foo = 12
835 x = a.foo
836 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000837 vereq(log, [("setattr", "foo", 12),
838 ("getattr", "foo"),
839 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840
841def multi():
842 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 class C(object):
844 def __init__(self):
845 self.__state = 0
846 def getstate(self):
847 return self.__state
848 def setstate(self, state):
849 self.__state = state
850 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000851 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000852 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000853 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000854 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855 def __init__(self):
856 type({}).__init__(self)
857 C.__init__(self)
858 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000859 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000861 vereq(d.items(), [("hello", "world")])
862 vereq(d["hello"], "world")
863 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000865 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000866 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867
Guido van Rossume45763a2001-08-10 21:28:46 +0000868 # SF bug #442833
869 class Node(object):
870 def __int__(self):
871 return int(self.foo())
872 def foo(self):
873 return "23"
874 class Frag(Node, list):
875 def foo(self):
876 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(Node().__int__(), 23)
878 vereq(int(Node()), 23)
879 vereq(Frag().__int__(), 42)
880 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000881
Tim Petersa91e9642001-11-14 23:32:33 +0000882 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000883
884 class A:
885 x = 1
886
887 class B(A):
888 pass
889
890 class C(A):
891 x = 2
892
893 class D(B, C):
894 pass
895 vereq(D.x, 1)
896
897 # Classic MRO is preserved for a classic base class.
898 class E(D, object):
899 pass
900 vereq(E.__mro__, (E, D, B, A, C, object))
901 vereq(E.x, 1)
902
903 # But with a mix of classic bases, their MROs are combined using
904 # new-style MRO.
905 class F(B, C, object):
906 pass
907 vereq(F.__mro__, (F, B, C, A, object))
908 vereq(F.x, 2)
909
910 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000911 class C:
912 def cmethod(self):
913 return "C a"
914 def all_method(self):
915 return "C b"
916
917 class M1(C, object):
918 def m1method(self):
919 return "M1 a"
920 def all_method(self):
921 return "M1 b"
922
923 vereq(M1.__mro__, (M1, C, object))
924 m = M1()
925 vereq(m.cmethod(), "C a")
926 vereq(m.m1method(), "M1 a")
927 vereq(m.all_method(), "M1 b")
928
929 class D(C):
930 def dmethod(self):
931 return "D a"
932 def all_method(self):
933 return "D b"
934
Guido van Rossum9a818922002-11-14 19:50:14 +0000935 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000936 def m2method(self):
937 return "M2 a"
938 def all_method(self):
939 return "M2 b"
940
Guido van Rossum9a818922002-11-14 19:50:14 +0000941 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000942 m = M2()
943 vereq(m.cmethod(), "C a")
944 vereq(m.dmethod(), "D a")
945 vereq(m.m2method(), "M2 a")
946 vereq(m.all_method(), "M2 b")
947
Guido van Rossum9a818922002-11-14 19:50:14 +0000948 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000949 def m3method(self):
950 return "M3 a"
951 def all_method(self):
952 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000953 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000954 m = M3()
955 vereq(m.cmethod(), "C a")
956 vereq(m.dmethod(), "D a")
957 vereq(m.m1method(), "M1 a")
958 vereq(m.m2method(), "M2 a")
959 vereq(m.m3method(), "M3 a")
960 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000961
Guido van Rossume54616c2001-12-14 04:19:56 +0000962 class Classic:
963 pass
964 try:
965 class New(Classic):
966 __metaclass__ = type
967 except TypeError:
968 pass
969 else:
970 raise TestFailed, "new class with only classic bases - shouldn't be"
971
Tim Peters6d6c1a32001-08-02 04:15:00 +0000972def diamond():
973 if verbose: print "Testing multiple inheritance special cases..."
974 class A(object):
975 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000976 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000977 class B(A):
978 def boo(self): return "B"
979 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000980 vereq(B().spam(), "B")
981 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000982 class C(A):
983 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000984 vereq(C().spam(), "A")
985 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000986 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000987 vereq(D().spam(), "B")
988 vereq(D().boo(), "B")
989 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000990 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000991 vereq(E().spam(), "B")
992 vereq(E().boo(), "C")
993 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000994 # MRO order disagreement
995 try:
996 class F(D, E): pass
997 except TypeError:
998 pass
999 else:
1000 raise TestFailed, "expected MRO order disagreement (F)"
1001 try:
1002 class G(E, D): pass
1003 except TypeError:
1004 pass
1005 else:
1006 raise TestFailed, "expected MRO order disagreement (G)"
1007
1008
1009# see thread python-dev/2002-October/029035.html
1010def ex5():
1011 if verbose: print "Testing ex5 from C3 switch discussion..."
1012 class A(object): pass
1013 class B(object): pass
1014 class C(object): pass
1015 class X(A): pass
1016 class Y(A): pass
1017 class Z(X,B,Y,C): pass
1018 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1019
1020# see "A Monotonic Superclass Linearization for Dylan",
1021# by Kim Barrett et al. (OOPSLA 1996)
1022def monotonicity():
1023 if verbose: print "Testing MRO monotonicity..."
1024 class Boat(object): pass
1025 class DayBoat(Boat): pass
1026 class WheelBoat(Boat): pass
1027 class EngineLess(DayBoat): pass
1028 class SmallMultihull(DayBoat): pass
1029 class PedalWheelBoat(EngineLess,WheelBoat): pass
1030 class SmallCatamaran(SmallMultihull): pass
1031 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1032
1033 vereq(PedalWheelBoat.__mro__,
1034 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1035 object))
1036 vereq(SmallCatamaran.__mro__,
1037 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1038
1039 vereq(Pedalo.__mro__,
1040 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1041 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1042
1043# see "A Monotonic Superclass Linearization for Dylan",
1044# by Kim Barrett et al. (OOPSLA 1996)
1045def consistency_with_epg():
1046 if verbose: print "Testing consistentcy with EPG..."
1047 class Pane(object): pass
1048 class ScrollingMixin(object): pass
1049 class EditingMixin(object): pass
1050 class ScrollablePane(Pane,ScrollingMixin): pass
1051 class EditablePane(Pane,EditingMixin): pass
1052 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1053
1054 vereq(EditableScrollablePane.__mro__,
1055 (EditableScrollablePane, ScrollablePane, EditablePane,
1056 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001057
Guido van Rossum37202612001-08-09 19:45:21 +00001058def objects():
1059 if verbose: print "Testing object class..."
1060 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001061 vereq(a.__class__, object)
1062 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001063 b = object()
1064 verify(a is not b)
1065 verify(not hasattr(a, "foo"))
1066 try:
1067 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001068 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001069 pass
1070 else:
1071 verify(0, "object() should not allow setting a foo attribute")
1072 verify(not hasattr(object(), "__dict__"))
1073
1074 class Cdict(object):
1075 pass
1076 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001077 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001078 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001079 vereq(x.foo, 1)
1080 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001081
Tim Peters6d6c1a32001-08-02 04:15:00 +00001082def slots():
1083 if verbose: print "Testing __slots__..."
1084 class C0(object):
1085 __slots__ = []
1086 x = C0()
1087 verify(not hasattr(x, "__dict__"))
1088 verify(not hasattr(x, "foo"))
1089
1090 class C1(object):
1091 __slots__ = ['a']
1092 x = C1()
1093 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001094 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001095 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001096 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001097 x.a = None
1098 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001099 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001100 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001101
1102 class C3(object):
1103 __slots__ = ['a', 'b', 'c']
1104 x = C3()
1105 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001106 verify(not hasattr(x, 'a'))
1107 verify(not hasattr(x, 'b'))
1108 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001109 x.a = 1
1110 x.b = 2
1111 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001112 vereq(x.a, 1)
1113 vereq(x.b, 2)
1114 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001115
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001116 class C4(object):
1117 """Validate name mangling"""
1118 __slots__ = ['__a']
1119 def __init__(self, value):
1120 self.__a = value
1121 def get(self):
1122 return self.__a
1123 x = C4(5)
1124 verify(not hasattr(x, '__dict__'))
1125 verify(not hasattr(x, '__a'))
1126 vereq(x.get(), 5)
1127 try:
1128 x.__a = 6
1129 except AttributeError:
1130 pass
1131 else:
1132 raise TestFailed, "Double underscored names not mangled"
1133
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001134 # Make sure slot names are proper identifiers
1135 try:
1136 class C(object):
1137 __slots__ = [None]
1138 except TypeError:
1139 pass
1140 else:
1141 raise TestFailed, "[None] slots not caught"
1142 try:
1143 class C(object):
1144 __slots__ = ["foo bar"]
1145 except TypeError:
1146 pass
1147 else:
1148 raise TestFailed, "['foo bar'] slots not caught"
1149 try:
1150 class C(object):
1151 __slots__ = ["foo\0bar"]
1152 except TypeError:
1153 pass
1154 else:
1155 raise TestFailed, "['foo\\0bar'] slots not caught"
1156 try:
1157 class C(object):
1158 __slots__ = ["1"]
1159 except TypeError:
1160 pass
1161 else:
1162 raise TestFailed, "['1'] slots not caught"
1163 try:
1164 class C(object):
1165 __slots__ = [""]
1166 except TypeError:
1167 pass
1168 else:
1169 raise TestFailed, "[''] slots not caught"
1170 class C(object):
1171 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1172
Guido van Rossum33bab012001-12-05 22:45:48 +00001173 # Test leaks
1174 class Counted(object):
1175 counter = 0 # counts the number of instances alive
1176 def __init__(self):
1177 Counted.counter += 1
1178 def __del__(self):
1179 Counted.counter -= 1
1180 class C(object):
1181 __slots__ = ['a', 'b', 'c']
1182 x = C()
1183 x.a = Counted()
1184 x.b = Counted()
1185 x.c = Counted()
1186 vereq(Counted.counter, 3)
1187 del x
1188 vereq(Counted.counter, 0)
1189 class D(C):
1190 pass
1191 x = D()
1192 x.a = Counted()
1193 x.z = Counted()
1194 vereq(Counted.counter, 2)
1195 del x
1196 vereq(Counted.counter, 0)
1197 class E(D):
1198 __slots__ = ['e']
1199 x = E()
1200 x.a = Counted()
1201 x.z = Counted()
1202 x.e = Counted()
1203 vereq(Counted.counter, 3)
1204 del x
1205 vereq(Counted.counter, 0)
1206
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001207 # Test cyclical leaks [SF bug 519621]
1208 class F(object):
1209 __slots__ = ['a', 'b']
1210 log = []
1211 s = F()
1212 s.a = [Counted(), s]
1213 vereq(Counted.counter, 1)
1214 s = None
1215 import gc
1216 gc.collect()
1217 vereq(Counted.counter, 0)
1218
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001219 # Test lookup leaks [SF bug 572567]
1220 import sys,gc
1221 class G(object):
1222 def __cmp__(self, other):
1223 return 0
1224 g = G()
1225 orig_objects = len(gc.get_objects())
1226 for i in xrange(10):
1227 g==g
1228 new_objects = len(gc.get_objects())
1229 vereq(orig_objects, new_objects)
1230
Guido van Rossum8b056da2002-08-13 18:26:26 +00001231def slotspecials():
1232 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1233
1234 class D(object):
1235 __slots__ = ["__dict__"]
1236 a = D()
1237 verify(hasattr(a, "__dict__"))
1238 verify(not hasattr(a, "__weakref__"))
1239 a.foo = 42
1240 vereq(a.__dict__, {"foo": 42})
1241
1242 class W(object):
1243 __slots__ = ["__weakref__"]
1244 a = W()
1245 verify(hasattr(a, "__weakref__"))
1246 verify(not hasattr(a, "__dict__"))
1247 try:
1248 a.foo = 42
1249 except AttributeError:
1250 pass
1251 else:
1252 raise TestFailed, "shouldn't be allowed to set a.foo"
1253
1254 class C1(W, D):
1255 __slots__ = []
1256 a = C1()
1257 verify(hasattr(a, "__dict__"))
1258 verify(hasattr(a, "__weakref__"))
1259 a.foo = 42
1260 vereq(a.__dict__, {"foo": 42})
1261
1262 class C2(D, W):
1263 __slots__ = []
1264 a = C2()
1265 verify(hasattr(a, "__dict__"))
1266 verify(hasattr(a, "__weakref__"))
1267 a.foo = 42
1268 vereq(a.__dict__, {"foo": 42})
1269
Guido van Rossum9a818922002-11-14 19:50:14 +00001270# MRO order disagreement
1271#
1272# class C3(C1, C2):
1273# __slots__ = []
1274#
1275# class C4(C2, C1):
1276# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001277
Tim Peters6d6c1a32001-08-02 04:15:00 +00001278def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001279 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001281 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001282 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001283 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001284 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001285 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001286 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001287 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001288 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001289 vereq(E.foo, 1)
1290 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001291 # Test dynamic instances
1292 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001293 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001294 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001295 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001296 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001297 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001298 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001299 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001300 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001301 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001302 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001303 vereq(int(a), 100)
1304 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001305 verify(not hasattr(a, "spam"))
1306 def mygetattr(self, name):
1307 if name == "spam":
1308 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001309 raise AttributeError
1310 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001311 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001312 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001313 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001314 def mysetattr(self, name, value):
1315 if name == "spam":
1316 raise AttributeError
1317 return object.__setattr__(self, name, value)
1318 C.__setattr__ = mysetattr
1319 try:
1320 a.spam = "not spam"
1321 except AttributeError:
1322 pass
1323 else:
1324 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001325 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001326 class D(C):
1327 pass
1328 d = D()
1329 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001330 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001331
Guido van Rossum7e35d572001-09-15 03:14:32 +00001332 # Test handling of int*seq and seq*int
1333 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001334 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001335 vereq("a"*I(2), "aa")
1336 vereq(I(2)*"a", "aa")
1337 vereq(2*I(3), 6)
1338 vereq(I(3)*2, 6)
1339 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001340
1341 # Test handling of long*seq and seq*long
1342 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001343 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001344 vereq("a"*L(2L), "aa")
1345 vereq(L(2L)*"a", "aa")
1346 vereq(2*L(3), 6)
1347 vereq(L(3)*2, 6)
1348 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001349
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001350 # Test comparison of classes with dynamic metaclasses
1351 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001352 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001353 class someclass:
1354 __metaclass__ = dynamicmetaclass
1355 verify(someclass != object)
1356
Tim Peters6d6c1a32001-08-02 04:15:00 +00001357def errors():
1358 if verbose: print "Testing errors..."
1359
1360 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001361 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001362 pass
1363 except TypeError:
1364 pass
1365 else:
1366 verify(0, "inheritance from both list and dict should be illegal")
1367
1368 try:
1369 class C(object, None):
1370 pass
1371 except TypeError:
1372 pass
1373 else:
1374 verify(0, "inheritance from non-type should be illegal")
1375 class Classic:
1376 pass
1377
1378 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001379 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001380 pass
1381 except TypeError:
1382 pass
1383 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001384 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001385
1386 try:
1387 class C(object):
1388 __slots__ = 1
1389 except TypeError:
1390 pass
1391 else:
1392 verify(0, "__slots__ = 1 should be illegal")
1393
1394 try:
1395 class C(object):
1396 __slots__ = [1]
1397 except TypeError:
1398 pass
1399 else:
1400 verify(0, "__slots__ = [1] should be illegal")
1401
1402def classmethods():
1403 if verbose: print "Testing class methods..."
1404 class C(object):
1405 def foo(*a): return a
1406 goo = classmethod(foo)
1407 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001408 vereq(C.goo(1), (C, 1))
1409 vereq(c.goo(1), (C, 1))
1410 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001411 class D(C):
1412 pass
1413 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001414 vereq(D.goo(1), (D, 1))
1415 vereq(d.goo(1), (D, 1))
1416 vereq(d.foo(1), (d, 1))
1417 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001418 # Test for a specific crash (SF bug 528132)
1419 def f(cls, arg): return (cls, arg)
1420 ff = classmethod(f)
1421 vereq(ff.__get__(0, int)(42), (int, 42))
1422 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001423
Guido van Rossum155db9a2002-04-02 17:53:47 +00001424 # Test super() with classmethods (SF bug 535444)
1425 veris(C.goo.im_self, C)
1426 veris(D.goo.im_self, D)
1427 veris(super(D,D).goo.im_self, D)
1428 veris(super(D,d).goo.im_self, D)
1429 vereq(super(D,D).goo(), (D,))
1430 vereq(super(D,d).goo(), (D,))
1431
Fred Drakef841aa62002-03-28 15:49:54 +00001432def classmethods_in_c():
1433 if verbose: print "Testing C-based class methods..."
1434 import xxsubtype as spam
1435 a = (1, 2, 3)
1436 d = {'abc': 123}
1437 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1438 veris(x, None)
1439 vereq((spam.spamlist,) + a, a1)
1440 vereq(d, d1)
1441 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1442 veris(x, None)
1443 vereq((spam.spamlist,) + a, a1)
1444 vereq(d, d1)
1445
Tim Peters6d6c1a32001-08-02 04:15:00 +00001446def staticmethods():
1447 if verbose: print "Testing static methods..."
1448 class C(object):
1449 def foo(*a): return a
1450 goo = staticmethod(foo)
1451 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001452 vereq(C.goo(1), (1,))
1453 vereq(c.goo(1), (1,))
1454 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001455 class D(C):
1456 pass
1457 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001458 vereq(D.goo(1), (1,))
1459 vereq(d.goo(1), (1,))
1460 vereq(d.foo(1), (d, 1))
1461 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001462
Fred Drakef841aa62002-03-28 15:49:54 +00001463def staticmethods_in_c():
1464 if verbose: print "Testing C-based static methods..."
1465 import xxsubtype as spam
1466 a = (1, 2, 3)
1467 d = {"abc": 123}
1468 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1469 veris(x, None)
1470 vereq(a, a1)
1471 vereq(d, d1)
1472 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1473 veris(x, None)
1474 vereq(a, a1)
1475 vereq(d, d1)
1476
Tim Peters6d6c1a32001-08-02 04:15:00 +00001477def classic():
1478 if verbose: print "Testing classic classes..."
1479 class C:
1480 def foo(*a): return a
1481 goo = classmethod(foo)
1482 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001483 vereq(C.goo(1), (C, 1))
1484 vereq(c.goo(1), (C, 1))
1485 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001486 class D(C):
1487 pass
1488 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001489 vereq(D.goo(1), (D, 1))
1490 vereq(d.goo(1), (D, 1))
1491 vereq(d.foo(1), (d, 1))
1492 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001493 class E: # *not* subclassing from C
1494 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001496 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001497
1498def compattr():
1499 if verbose: print "Testing computed attributes..."
1500 class C(object):
1501 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001502 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001503 self.__get = get
1504 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001505 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001506 def __get__(self, obj, type=None):
1507 return self.__get(obj)
1508 def __set__(self, obj, value):
1509 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001510 def __delete__(self, obj):
1511 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512 def __init__(self):
1513 self.__x = 0
1514 def __get_x(self):
1515 x = self.__x
1516 self.__x = x+1
1517 return x
1518 def __set_x(self, x):
1519 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001520 def __delete_x(self):
1521 del self.__x
1522 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001523 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001524 vereq(a.x, 0)
1525 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001526 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001527 vereq(a.x, 10)
1528 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001529 del a.x
1530 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001531
1532def newslot():
1533 if verbose: print "Testing __new__ slot override..."
1534 class C(list):
1535 def __new__(cls):
1536 self = list.__new__(cls)
1537 self.foo = 1
1538 return self
1539 def __init__(self):
1540 self.foo = self.foo + 2
1541 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001542 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001543 verify(a.__class__ is C)
1544 class D(C):
1545 pass
1546 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001547 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001548 verify(b.__class__ is D)
1549
Tim Peters6d6c1a32001-08-02 04:15:00 +00001550def altmro():
1551 if verbose: print "Testing mro() and overriding it..."
1552 class A(object):
1553 def f(self): return "A"
1554 class B(A):
1555 pass
1556 class C(A):
1557 def f(self): return "C"
1558 class D(B, C):
1559 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001560 vereq(D.mro(), [D, B, C, A, object])
1561 vereq(D.__mro__, (D, B, C, A, object))
1562 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001563
Guido van Rossumd3077402001-08-12 05:24:18 +00001564 class PerverseMetaType(type):
1565 def mro(cls):
1566 L = type.mro(cls)
1567 L.reverse()
1568 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001569 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001570 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001571 vereq(X.__mro__, (object, A, C, B, D, X))
1572 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001573
1574def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001575 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001576
1577 class B(object):
1578 "Intermediate class because object doesn't have a __setattr__"
1579
1580 class C(B):
1581
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001582 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001583 if name == "foo":
1584 return ("getattr", name)
1585 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001586 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587 def __setattr__(self, name, value):
1588 if name == "foo":
1589 self.setattr = (name, value)
1590 else:
1591 return B.__setattr__(self, name, value)
1592 def __delattr__(self, name):
1593 if name == "foo":
1594 self.delattr = name
1595 else:
1596 return B.__delattr__(self, name)
1597
1598 def __getitem__(self, key):
1599 return ("getitem", key)
1600 def __setitem__(self, key, value):
1601 self.setitem = (key, value)
1602 def __delitem__(self, key):
1603 self.delitem = key
1604
1605 def __getslice__(self, i, j):
1606 return ("getslice", i, j)
1607 def __setslice__(self, i, j, value):
1608 self.setslice = (i, j, value)
1609 def __delslice__(self, i, j):
1610 self.delslice = (i, j)
1611
1612 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001613 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001614 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001615 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001616 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001617 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001618
Guido van Rossum45704552001-10-08 16:35:45 +00001619 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001620 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001621 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001622 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001623 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001624
Guido van Rossum45704552001-10-08 16:35:45 +00001625 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001626 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001627 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001628 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001629 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001630
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001631def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001632 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001633 class C(object):
1634 def __init__(self, x):
1635 self.x = x
1636 def foo(self):
1637 return self.x
1638 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001639 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001640 class D(C):
1641 boo = C.foo
1642 goo = c1.foo
1643 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(d2.foo(), 2)
1645 vereq(d2.boo(), 2)
1646 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001647 class E(object):
1648 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001649 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001650 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001651
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001652def specials():
1653 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001654 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001655 # Test the default behavior for static classes
1656 class C(object):
1657 def __getitem__(self, i):
1658 if 0 <= i < 10: return i
1659 raise IndexError
1660 c1 = C()
1661 c2 = C()
1662 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001663 vereq(hash(c1), id(c1))
1664 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1665 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001666 verify(c1 != c2)
1667 verify(not c1 != c1)
1668 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001669 # Note that the module name appears in str/repr, and that varies
1670 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001671 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001672 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001673 verify(-1 not in c1)
1674 for i in range(10):
1675 verify(i in c1)
1676 verify(10 not in c1)
1677 # Test the default behavior for dynamic classes
1678 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001679 def __getitem__(self, i):
1680 if 0 <= i < 10: return i
1681 raise IndexError
1682 d1 = D()
1683 d2 = D()
1684 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001685 vereq(hash(d1), id(d1))
1686 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1687 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001688 verify(d1 != d2)
1689 verify(not d1 != d1)
1690 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001691 # Note that the module name appears in str/repr, and that varies
1692 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001693 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001694 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001695 verify(-1 not in d1)
1696 for i in range(10):
1697 verify(i in d1)
1698 verify(10 not in d1)
1699 # Test overridden behavior for static classes
1700 class Proxy(object):
1701 def __init__(self, x):
1702 self.x = x
1703 def __nonzero__(self):
1704 return not not self.x
1705 def __hash__(self):
1706 return hash(self.x)
1707 def __eq__(self, other):
1708 return self.x == other
1709 def __ne__(self, other):
1710 return self.x != other
1711 def __cmp__(self, other):
1712 return cmp(self.x, other.x)
1713 def __str__(self):
1714 return "Proxy:%s" % self.x
1715 def __repr__(self):
1716 return "Proxy(%r)" % self.x
1717 def __contains__(self, value):
1718 return value in self.x
1719 p0 = Proxy(0)
1720 p1 = Proxy(1)
1721 p_1 = Proxy(-1)
1722 verify(not p0)
1723 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001724 vereq(hash(p0), hash(0))
1725 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001726 verify(p0 != p1)
1727 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001728 vereq(not p0, p1)
1729 vereq(cmp(p0, p1), -1)
1730 vereq(cmp(p0, p0), 0)
1731 vereq(cmp(p0, p_1), 1)
1732 vereq(str(p0), "Proxy:0")
1733 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001734 p10 = Proxy(range(10))
1735 verify(-1 not in p10)
1736 for i in range(10):
1737 verify(i in p10)
1738 verify(10 not in p10)
1739 # Test overridden behavior for dynamic classes
1740 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001741 def __init__(self, x):
1742 self.x = x
1743 def __nonzero__(self):
1744 return not not self.x
1745 def __hash__(self):
1746 return hash(self.x)
1747 def __eq__(self, other):
1748 return self.x == other
1749 def __ne__(self, other):
1750 return self.x != other
1751 def __cmp__(self, other):
1752 return cmp(self.x, other.x)
1753 def __str__(self):
1754 return "DProxy:%s" % self.x
1755 def __repr__(self):
1756 return "DProxy(%r)" % self.x
1757 def __contains__(self, value):
1758 return value in self.x
1759 p0 = DProxy(0)
1760 p1 = DProxy(1)
1761 p_1 = DProxy(-1)
1762 verify(not p0)
1763 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001764 vereq(hash(p0), hash(0))
1765 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001766 verify(p0 != p1)
1767 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(not p0, p1)
1769 vereq(cmp(p0, p1), -1)
1770 vereq(cmp(p0, p0), 0)
1771 vereq(cmp(p0, p_1), 1)
1772 vereq(str(p0), "DProxy:0")
1773 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001774 p10 = DProxy(range(10))
1775 verify(-1 not in p10)
1776 for i in range(10):
1777 verify(i in p10)
1778 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001779 # Safety test for __cmp__
1780 def unsafecmp(a, b):
1781 try:
1782 a.__class__.__cmp__(a, b)
1783 except TypeError:
1784 pass
1785 else:
1786 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1787 a.__class__, a, b)
1788 unsafecmp(u"123", "123")
1789 unsafecmp("123", u"123")
1790 unsafecmp(1, 1.0)
1791 unsafecmp(1.0, 1)
1792 unsafecmp(1, 1L)
1793 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001794
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001795def weakrefs():
1796 if verbose: print "Testing weak references..."
1797 import weakref
1798 class C(object):
1799 pass
1800 c = C()
1801 r = weakref.ref(c)
1802 verify(r() is c)
1803 del c
1804 verify(r() is None)
1805 del r
1806 class NoWeak(object):
1807 __slots__ = ['foo']
1808 no = NoWeak()
1809 try:
1810 weakref.ref(no)
1811 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001812 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001813 else:
1814 verify(0, "weakref.ref(no) should be illegal")
1815 class Weak(object):
1816 __slots__ = ['foo', '__weakref__']
1817 yes = Weak()
1818 r = weakref.ref(yes)
1819 verify(r() is yes)
1820 del yes
1821 verify(r() is None)
1822 del r
1823
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001824def properties():
1825 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001826 class C(object):
1827 def getx(self):
1828 return self.__x
1829 def setx(self, value):
1830 self.__x = value
1831 def delx(self):
1832 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001833 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001834 a = C()
1835 verify(not hasattr(a, "x"))
1836 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001837 vereq(a._C__x, 42)
1838 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001839 del a.x
1840 verify(not hasattr(a, "x"))
1841 verify(not hasattr(a, "_C__x"))
1842 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001843 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001844 C.x.__delete__(a)
1845 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001846
Tim Peters66c1a522001-09-24 21:17:50 +00001847 raw = C.__dict__['x']
1848 verify(isinstance(raw, property))
1849
1850 attrs = dir(raw)
1851 verify("__doc__" in attrs)
1852 verify("fget" in attrs)
1853 verify("fset" in attrs)
1854 verify("fdel" in attrs)
1855
Guido van Rossum45704552001-10-08 16:35:45 +00001856 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001857 verify(raw.fget is C.__dict__['getx'])
1858 verify(raw.fset is C.__dict__['setx'])
1859 verify(raw.fdel is C.__dict__['delx'])
1860
1861 for attr in "__doc__", "fget", "fset", "fdel":
1862 try:
1863 setattr(raw, attr, 42)
1864 except TypeError, msg:
1865 if str(msg).find('readonly') < 0:
1866 raise TestFailed("when setting readonly attr %r on a "
1867 "property, got unexpected TypeError "
1868 "msg %r" % (attr, str(msg)))
1869 else:
1870 raise TestFailed("expected TypeError from trying to set "
1871 "readonly %r attr on a property" % attr)
1872
Neal Norwitz673cd822002-10-18 16:33:13 +00001873 class D(object):
1874 __getitem__ = property(lambda s: 1/0)
1875
1876 d = D()
1877 try:
1878 for i in d:
1879 str(i)
1880 except ZeroDivisionError:
1881 pass
1882 else:
1883 raise TestFailed, "expected ZeroDivisionError from bad property"
1884
Guido van Rossumc4a18802001-08-24 16:55:27 +00001885def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001886 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001887
1888 class A(object):
1889 def meth(self, a):
1890 return "A(%r)" % a
1891
Guido van Rossum45704552001-10-08 16:35:45 +00001892 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001893
1894 class B(A):
1895 def __init__(self):
1896 self.__super = super(B, self)
1897 def meth(self, a):
1898 return "B(%r)" % a + self.__super.meth(a)
1899
Guido van Rossum45704552001-10-08 16:35:45 +00001900 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001901
1902 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001903 def meth(self, a):
1904 return "C(%r)" % a + self.__super.meth(a)
1905 C._C__super = super(C)
1906
Guido van Rossum45704552001-10-08 16:35:45 +00001907 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001908
1909 class D(C, B):
1910 def meth(self, a):
1911 return "D(%r)" % a + super(D, self).meth(a)
1912
Guido van Rossum5b443c62001-12-03 15:38:28 +00001913 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1914
1915 # Test for subclassing super
1916
1917 class mysuper(super):
1918 def __init__(self, *args):
1919 return super(mysuper, self).__init__(*args)
1920
1921 class E(D):
1922 def meth(self, a):
1923 return "E(%r)" % a + mysuper(E, self).meth(a)
1924
1925 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1926
1927 class F(E):
1928 def meth(self, a):
1929 s = self.__super
1930 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1931 F._F__super = mysuper(F)
1932
1933 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1934
1935 # Make sure certain errors are raised
1936
1937 try:
1938 super(D, 42)
1939 except TypeError:
1940 pass
1941 else:
1942 raise TestFailed, "shouldn't allow super(D, 42)"
1943
1944 try:
1945 super(D, C())
1946 except TypeError:
1947 pass
1948 else:
1949 raise TestFailed, "shouldn't allow super(D, C())"
1950
1951 try:
1952 super(D).__get__(12)
1953 except TypeError:
1954 pass
1955 else:
1956 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1957
1958 try:
1959 super(D).__get__(C())
1960 except TypeError:
1961 pass
1962 else:
1963 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001964
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001965def inherits():
1966 if verbose: print "Testing inheritance from basic types..."
1967
1968 class hexint(int):
1969 def __repr__(self):
1970 return hex(self)
1971 def __add__(self, other):
1972 return hexint(int.__add__(self, other))
1973 # (Note that overriding __radd__ doesn't work,
1974 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001975 vereq(repr(hexint(7) + 9), "0x10")
1976 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001977 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001978 vereq(a, 12345)
1979 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001980 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001981 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001982 verify((+a).__class__ is int)
1983 verify((a >> 0).__class__ is int)
1984 verify((a << 0).__class__ is int)
1985 verify((hexint(0) << 12).__class__ is int)
1986 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001987
1988 class octlong(long):
1989 __slots__ = []
1990 def __str__(self):
1991 s = oct(self)
1992 if s[-1] == 'L':
1993 s = s[:-1]
1994 return s
1995 def __add__(self, other):
1996 return self.__class__(super(octlong, self).__add__(other))
1997 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001998 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001999 # (Note that overriding __radd__ here only seems to work
2000 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002001 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002002 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002003 vereq(a, 12345L)
2004 vereq(long(a), 12345L)
2005 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002006 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002007 verify((+a).__class__ is long)
2008 verify((-a).__class__ is long)
2009 verify((-octlong(0)).__class__ is long)
2010 verify((a >> 0).__class__ is long)
2011 verify((a << 0).__class__ is long)
2012 verify((a - 0).__class__ is long)
2013 verify((a * 1).__class__ is long)
2014 verify((a ** 1).__class__ is long)
2015 verify((a // 1).__class__ is long)
2016 verify((1 * a).__class__ is long)
2017 verify((a | 0).__class__ is long)
2018 verify((a ^ 0).__class__ is long)
2019 verify((a & -1L).__class__ is long)
2020 verify((octlong(0) << 12).__class__ is long)
2021 verify((octlong(0) >> 12).__class__ is long)
2022 verify(abs(octlong(0)).__class__ is long)
2023
2024 # Because octlong overrides __add__, we can't check the absence of +0
2025 # optimizations using octlong.
2026 class longclone(long):
2027 pass
2028 a = longclone(1)
2029 verify((a + 0).__class__ is long)
2030 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002031
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002032 # Check that negative clones don't segfault
2033 a = longclone(-1)
2034 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002035 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002036
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002037 class precfloat(float):
2038 __slots__ = ['prec']
2039 def __init__(self, value=0.0, prec=12):
2040 self.prec = int(prec)
2041 float.__init__(value)
2042 def __repr__(self):
2043 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002044 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002045 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002046 vereq(a, 12345.0)
2047 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002048 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002049 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002050 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002051
Tim Peters2400fa42001-09-12 19:12:49 +00002052 class madcomplex(complex):
2053 def __repr__(self):
2054 return "%.17gj%+.17g" % (self.imag, self.real)
2055 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002056 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002057 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002058 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002059 vereq(a, base)
2060 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002061 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002062 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002063 vereq(repr(a), "4j-3")
2064 vereq(a, base)
2065 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002066 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002067 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002068 veris((+a).__class__, complex)
2069 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002070 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002071 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002072 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002073 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002074 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002075 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002076 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002077
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002078 class madtuple(tuple):
2079 _rev = None
2080 def rev(self):
2081 if self._rev is not None:
2082 return self._rev
2083 L = list(self)
2084 L.reverse()
2085 self._rev = self.__class__(L)
2086 return self._rev
2087 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002088 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2089 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2090 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002091 for i in range(512):
2092 t = madtuple(range(i))
2093 u = t.rev()
2094 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002095 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002096 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002097 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002098 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002099 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002100 verify(a[:].__class__ is tuple)
2101 verify((a * 1).__class__ is tuple)
2102 verify((a * 0).__class__ is tuple)
2103 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002104 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002105 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002106 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002107 verify((a + a).__class__ is tuple)
2108 verify((a * 0).__class__ is tuple)
2109 verify((a * 1).__class__ is tuple)
2110 verify((a * 2).__class__ is tuple)
2111 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002112
2113 class madstring(str):
2114 _rev = None
2115 def rev(self):
2116 if self._rev is not None:
2117 return self._rev
2118 L = list(self)
2119 L.reverse()
2120 self._rev = self.__class__("".join(L))
2121 return self._rev
2122 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002123 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2124 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2125 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002126 for i in range(256):
2127 s = madstring("".join(map(chr, range(i))))
2128 t = s.rev()
2129 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002130 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002131 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002132 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002133 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002134
Tim Peters8fa5dd02001-09-12 02:18:30 +00002135 base = "\x00" * 5
2136 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002137 vereq(s, base)
2138 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002139 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002140 vereq(hash(s), hash(base))
2141 vereq({s: 1}[base], 1)
2142 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002143 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002144 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002145 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002146 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002147 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002148 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002149 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002150 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002151 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002152 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002153 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002154 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002155 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002156 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002157 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002158 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002159 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002160 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002161 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002162 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002163 identitytab = ''.join([chr(i) for i in range(256)])
2164 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002165 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002166 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002167 vereq(s.translate(identitytab, "x"), base)
2168 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002169 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002170 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002171 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002172 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002173 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002174 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002175 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002176 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002177 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002179
Tim Peters111f6092001-09-12 07:54:51 +00002180 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002181 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002182 verify(intern(s).__class__ is str)
2183 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002184 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002185
2186 i = intern("y x")
2187 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002188 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002189 verify(intern(s).__class__ is str)
2190 verify(intern(s) is i)
2191
2192 s = madstring(i)
2193 verify(intern(s).__class__ is str)
2194 verify(intern(s) is i)
2195
Guido van Rossum91ee7982001-08-30 20:52:40 +00002196 class madunicode(unicode):
2197 _rev = None
2198 def rev(self):
2199 if self._rev is not None:
2200 return self._rev
2201 L = list(self)
2202 L.reverse()
2203 self._rev = self.__class__(u"".join(L))
2204 return self._rev
2205 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002206 vereq(u, u"ABCDEF")
2207 vereq(u.rev(), madunicode(u"FEDCBA"))
2208 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002209 base = u"12345"
2210 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002211 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002212 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002213 vereq(hash(u), hash(base))
2214 vereq({u: 1}[base], 1)
2215 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002216 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002217 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002218 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002219 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002220 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002222 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002223 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002224 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002225 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002226 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002227 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002228 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002229 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002230 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002231 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002232 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002233 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002234 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002235 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002236 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002237 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002238 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002239 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002240 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002241 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002242 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002243 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002244 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002245 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002246 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002247 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002248 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002249 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002250 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002251 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002252 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002253 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002254
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002255 class sublist(list):
2256 pass
2257 a = sublist(range(5))
2258 vereq(a, range(5))
2259 a.append("hello")
2260 vereq(a, range(5) + ["hello"])
2261 a[5] = 5
2262 vereq(a, range(6))
2263 a.extend(range(6, 20))
2264 vereq(a, range(20))
2265 a[-5:] = []
2266 vereq(a, range(15))
2267 del a[10:15]
2268 vereq(len(a), 10)
2269 vereq(a, range(10))
2270 vereq(list(a), range(10))
2271 vereq(a[0], 0)
2272 vereq(a[9], 9)
2273 vereq(a[-10], 0)
2274 vereq(a[-1], 9)
2275 vereq(a[:5], range(5))
2276
Tim Peters59c9a642001-09-13 05:38:56 +00002277 class CountedInput(file):
2278 """Counts lines read by self.readline().
2279
2280 self.lineno is the 0-based ordinal of the last line read, up to
2281 a maximum of one greater than the number of lines in the file.
2282
2283 self.ateof is true if and only if the final "" line has been read,
2284 at which point self.lineno stops incrementing, and further calls
2285 to readline() continue to return "".
2286 """
2287
2288 lineno = 0
2289 ateof = 0
2290 def readline(self):
2291 if self.ateof:
2292 return ""
2293 s = file.readline(self)
2294 # Next line works too.
2295 # s = super(CountedInput, self).readline()
2296 self.lineno += 1
2297 if s == "":
2298 self.ateof = 1
2299 return s
2300
Tim Peters561f8992001-09-13 19:36:36 +00002301 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002302 lines = ['a\n', 'b\n', 'c\n']
2303 try:
2304 f.writelines(lines)
2305 f.close()
2306 f = CountedInput(TESTFN)
2307 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2308 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002309 vereq(expected, got)
2310 vereq(f.lineno, i)
2311 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002312 f.close()
2313 finally:
2314 try:
2315 f.close()
2316 except:
2317 pass
2318 try:
2319 import os
2320 os.unlink(TESTFN)
2321 except:
2322 pass
2323
Tim Peters808b94e2001-09-13 19:33:07 +00002324def keywords():
2325 if verbose:
2326 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(int(x=1), 1)
2328 vereq(float(x=2), 2.0)
2329 vereq(long(x=3), 3L)
2330 vereq(complex(imag=42, real=666), complex(666, 42))
2331 vereq(str(object=500), '500')
2332 vereq(unicode(string='abc', errors='strict'), u'abc')
2333 vereq(tuple(sequence=range(3)), (0, 1, 2))
2334 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002335 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002336
2337 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002338 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002339 try:
2340 constructor(bogus_keyword_arg=1)
2341 except TypeError:
2342 pass
2343 else:
2344 raise TestFailed("expected TypeError from bogus keyword "
2345 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002346
Tim Peters8fa45672001-09-13 21:01:29 +00002347def restricted():
2348 import rexec
2349 if verbose:
2350 print "Testing interaction with restricted execution ..."
2351
2352 sandbox = rexec.RExec()
2353
2354 code1 = """f = open(%r, 'w')""" % TESTFN
2355 code2 = """f = file(%r, 'w')""" % TESTFN
2356 code3 = """\
2357f = open(%r)
2358t = type(f) # a sneaky way to get the file() constructor
2359f.close()
2360f = t(%r, 'w') # rexec can't catch this by itself
2361""" % (TESTFN, TESTFN)
2362
2363 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2364 f.close()
2365
2366 try:
2367 for code in code1, code2, code3:
2368 try:
2369 sandbox.r_exec(code)
2370 except IOError, msg:
2371 if str(msg).find("restricted") >= 0:
2372 outcome = "OK"
2373 else:
2374 outcome = "got an exception, but not an expected one"
2375 else:
2376 outcome = "expected a restricted-execution exception"
2377
2378 if outcome != "OK":
2379 raise TestFailed("%s, in %r" % (outcome, code))
2380
2381 finally:
2382 try:
2383 import os
2384 os.unlink(TESTFN)
2385 except:
2386 pass
2387
Tim Peters0ab085c2001-09-14 00:25:33 +00002388def str_subclass_as_dict_key():
2389 if verbose:
2390 print "Testing a str subclass used as dict key .."
2391
2392 class cistr(str):
2393 """Sublcass of str that computes __eq__ case-insensitively.
2394
2395 Also computes a hash code of the string in canonical form.
2396 """
2397
2398 def __init__(self, value):
2399 self.canonical = value.lower()
2400 self.hashcode = hash(self.canonical)
2401
2402 def __eq__(self, other):
2403 if not isinstance(other, cistr):
2404 other = cistr(other)
2405 return self.canonical == other.canonical
2406
2407 def __hash__(self):
2408 return self.hashcode
2409
Guido van Rossum45704552001-10-08 16:35:45 +00002410 vereq(cistr('ABC'), 'abc')
2411 vereq('aBc', cistr('ABC'))
2412 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002413
2414 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002415 vereq(d[cistr('one')], 1)
2416 vereq(d[cistr('tWo')], 2)
2417 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002418 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002419 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002420
Guido van Rossumab3b0342001-09-18 20:38:53 +00002421def classic_comparisons():
2422 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002423 class classic:
2424 pass
2425 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002426 if verbose: print " (base = %s)" % base
2427 class C(base):
2428 def __init__(self, value):
2429 self.value = int(value)
2430 def __cmp__(self, other):
2431 if isinstance(other, C):
2432 return cmp(self.value, other.value)
2433 if isinstance(other, int) or isinstance(other, long):
2434 return cmp(self.value, other)
2435 return NotImplemented
2436 c1 = C(1)
2437 c2 = C(2)
2438 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002439 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002440 c = {1: c1, 2: c2, 3: c3}
2441 for x in 1, 2, 3:
2442 for y in 1, 2, 3:
2443 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2444 for op in "<", "<=", "==", "!=", ">", ">=":
2445 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2446 "x=%d, y=%d" % (x, y))
2447 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2448 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2449
Guido van Rossum0639f592001-09-18 21:06:04 +00002450def rich_comparisons():
2451 if verbose:
2452 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002453 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002454 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002455 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002456 vereq(z, 1+0j)
2457 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002458 class ZZ(complex):
2459 def __eq__(self, other):
2460 try:
2461 return abs(self - other) <= 1e-6
2462 except:
2463 return NotImplemented
2464 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002465 vereq(zz, 1+0j)
2466 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002467
Guido van Rossum0639f592001-09-18 21:06:04 +00002468 class classic:
2469 pass
2470 for base in (classic, int, object, list):
2471 if verbose: print " (base = %s)" % base
2472 class C(base):
2473 def __init__(self, value):
2474 self.value = int(value)
2475 def __cmp__(self, other):
2476 raise TestFailed, "shouldn't call __cmp__"
2477 def __eq__(self, other):
2478 if isinstance(other, C):
2479 return self.value == other.value
2480 if isinstance(other, int) or isinstance(other, long):
2481 return self.value == other
2482 return NotImplemented
2483 def __ne__(self, other):
2484 if isinstance(other, C):
2485 return self.value != other.value
2486 if isinstance(other, int) or isinstance(other, long):
2487 return self.value != other
2488 return NotImplemented
2489 def __lt__(self, other):
2490 if isinstance(other, C):
2491 return self.value < other.value
2492 if isinstance(other, int) or isinstance(other, long):
2493 return self.value < other
2494 return NotImplemented
2495 def __le__(self, other):
2496 if isinstance(other, C):
2497 return self.value <= other.value
2498 if isinstance(other, int) or isinstance(other, long):
2499 return self.value <= other
2500 return NotImplemented
2501 def __gt__(self, other):
2502 if isinstance(other, C):
2503 return self.value > other.value
2504 if isinstance(other, int) or isinstance(other, long):
2505 return self.value > other
2506 return NotImplemented
2507 def __ge__(self, other):
2508 if isinstance(other, C):
2509 return self.value >= other.value
2510 if isinstance(other, int) or isinstance(other, long):
2511 return self.value >= other
2512 return NotImplemented
2513 c1 = C(1)
2514 c2 = C(2)
2515 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002516 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002517 c = {1: c1, 2: c2, 3: c3}
2518 for x in 1, 2, 3:
2519 for y in 1, 2, 3:
2520 for op in "<", "<=", "==", "!=", ">", ">=":
2521 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2522 "x=%d, y=%d" % (x, y))
2523 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2524 "x=%d, y=%d" % (x, y))
2525 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2526 "x=%d, y=%d" % (x, y))
2527
Guido van Rossum1952e382001-09-19 01:25:16 +00002528def coercions():
2529 if verbose: print "Testing coercions..."
2530 class I(int): pass
2531 coerce(I(0), 0)
2532 coerce(0, I(0))
2533 class L(long): pass
2534 coerce(L(0), 0)
2535 coerce(L(0), 0L)
2536 coerce(0, L(0))
2537 coerce(0L, L(0))
2538 class F(float): pass
2539 coerce(F(0), 0)
2540 coerce(F(0), 0L)
2541 coerce(F(0), 0.)
2542 coerce(0, F(0))
2543 coerce(0L, F(0))
2544 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002545 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002546 coerce(C(0), 0)
2547 coerce(C(0), 0L)
2548 coerce(C(0), 0.)
2549 coerce(C(0), 0j)
2550 coerce(0, C(0))
2551 coerce(0L, C(0))
2552 coerce(0., C(0))
2553 coerce(0j, C(0))
2554
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002555def descrdoc():
2556 if verbose: print "Testing descriptor doc strings..."
2557 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002558 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002559 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002560 check(file.name, "file name") # member descriptor
2561
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002562def setclass():
2563 if verbose: print "Testing __class__ assignment..."
2564 class C(object): pass
2565 class D(object): pass
2566 class E(object): pass
2567 class F(D, E): pass
2568 for cls in C, D, E, F:
2569 for cls2 in C, D, E, F:
2570 x = cls()
2571 x.__class__ = cls2
2572 verify(x.__class__ is cls2)
2573 x.__class__ = cls
2574 verify(x.__class__ is cls)
2575 def cant(x, C):
2576 try:
2577 x.__class__ = C
2578 except TypeError:
2579 pass
2580 else:
2581 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002582 try:
2583 delattr(x, "__class__")
2584 except TypeError:
2585 pass
2586 else:
2587 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002588 cant(C(), list)
2589 cant(list(), C)
2590 cant(C(), 1)
2591 cant(C(), object)
2592 cant(object(), list)
2593 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002594 class Int(int): __slots__ = []
2595 cant(2, Int)
2596 cant(Int(), int)
2597 cant(True, int)
2598 cant(2, bool)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002599
Guido van Rossum6661be32001-10-26 04:26:12 +00002600def setdict():
2601 if verbose: print "Testing __dict__ assignment..."
2602 class C(object): pass
2603 a = C()
2604 a.__dict__ = {'b': 1}
2605 vereq(a.b, 1)
2606 def cant(x, dict):
2607 try:
2608 x.__dict__ = dict
2609 except TypeError:
2610 pass
2611 else:
2612 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2613 cant(a, None)
2614 cant(a, [])
2615 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002616 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002617 # Classes don't allow __dict__ assignment
2618 cant(C, {})
2619
Guido van Rossum3926a632001-09-25 16:25:58 +00002620def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002621 if verbose:
2622 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002623 import pickle, cPickle
2624
2625 def sorteditems(d):
2626 L = d.items()
2627 L.sort()
2628 return L
2629
2630 global C
2631 class C(object):
2632 def __init__(self, a, b):
2633 super(C, self).__init__()
2634 self.a = a
2635 self.b = b
2636 def __repr__(self):
2637 return "C(%r, %r)" % (self.a, self.b)
2638
2639 global C1
2640 class C1(list):
2641 def __new__(cls, a, b):
2642 return super(C1, cls).__new__(cls)
2643 def __init__(self, a, b):
2644 self.a = a
2645 self.b = b
2646 def __repr__(self):
2647 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2648
2649 global C2
2650 class C2(int):
2651 def __new__(cls, a, b, val=0):
2652 return super(C2, cls).__new__(cls, val)
2653 def __init__(self, a, b, val=0):
2654 self.a = a
2655 self.b = b
2656 def __repr__(self):
2657 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2658
Guido van Rossum90c45142001-11-24 21:07:01 +00002659 global C3
2660 class C3(object):
2661 def __init__(self, foo):
2662 self.foo = foo
2663 def __getstate__(self):
2664 return self.foo
2665 def __setstate__(self, foo):
2666 self.foo = foo
2667
2668 global C4classic, C4
2669 class C4classic: # classic
2670 pass
2671 class C4(C4classic, object): # mixed inheritance
2672 pass
2673
Guido van Rossum3926a632001-09-25 16:25:58 +00002674 for p in pickle, cPickle:
2675 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002676 if verbose:
2677 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002678
2679 for cls in C, C1, C2:
2680 s = p.dumps(cls, bin)
2681 cls2 = p.loads(s)
2682 verify(cls2 is cls)
2683
2684 a = C1(1, 2); a.append(42); a.append(24)
2685 b = C2("hello", "world", 42)
2686 s = p.dumps((a, b), bin)
2687 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002688 vereq(x.__class__, a.__class__)
2689 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2690 vereq(y.__class__, b.__class__)
2691 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2692 vereq(`x`, `a`)
2693 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002694 if verbose:
2695 print "a = x =", a
2696 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002697 # Test for __getstate__ and __setstate__ on new style class
2698 u = C3(42)
2699 s = p.dumps(u, bin)
2700 v = p.loads(s)
2701 veris(u.__class__, v.__class__)
2702 vereq(u.foo, v.foo)
2703 # Test for picklability of hybrid class
2704 u = C4()
2705 u.foo = 42
2706 s = p.dumps(u, bin)
2707 v = p.loads(s)
2708 veris(u.__class__, v.__class__)
2709 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002710
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002711 # Testing copy.deepcopy()
2712 if verbose:
2713 print "deepcopy"
2714 import copy
2715 for cls in C, C1, C2:
2716 cls2 = copy.deepcopy(cls)
2717 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002718
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002719 a = C1(1, 2); a.append(42); a.append(24)
2720 b = C2("hello", "world", 42)
2721 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002722 vereq(x.__class__, a.__class__)
2723 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2724 vereq(y.__class__, b.__class__)
2725 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2726 vereq(`x`, `a`)
2727 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002728 if verbose:
2729 print "a = x =", a
2730 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002731
Guido van Rossum8c842552002-03-14 23:05:54 +00002732def pickleslots():
2733 if verbose: print "Testing pickling of classes with __slots__ ..."
2734 import pickle, cPickle
2735 # Pickling of classes with __slots__ but without __getstate__ should fail
2736 global B, C, D, E
2737 class B(object):
2738 pass
2739 for base in [object, B]:
2740 class C(base):
2741 __slots__ = ['a']
2742 class D(C):
2743 pass
2744 try:
2745 pickle.dumps(C())
2746 except TypeError:
2747 pass
2748 else:
2749 raise TestFailed, "should fail: pickle C instance - %s" % base
2750 try:
2751 cPickle.dumps(C())
2752 except TypeError:
2753 pass
2754 else:
2755 raise TestFailed, "should fail: cPickle C instance - %s" % base
2756 try:
2757 pickle.dumps(C())
2758 except TypeError:
2759 pass
2760 else:
2761 raise TestFailed, "should fail: pickle D instance - %s" % base
2762 try:
2763 cPickle.dumps(D())
2764 except TypeError:
2765 pass
2766 else:
2767 raise TestFailed, "should fail: cPickle D instance - %s" % base
2768 # Give C a __getstate__ and __setstate__
2769 class C(base):
2770 __slots__ = ['a']
2771 def __getstate__(self):
2772 try:
2773 d = self.__dict__.copy()
2774 except AttributeError:
2775 d = {}
2776 try:
2777 d['a'] = self.a
2778 except AttributeError:
2779 pass
2780 return d
2781 def __setstate__(self, d):
2782 for k, v in d.items():
2783 setattr(self, k, v)
2784 class D(C):
2785 pass
2786 # Now it should work
2787 x = C()
2788 y = pickle.loads(pickle.dumps(x))
2789 vereq(hasattr(y, 'a'), 0)
2790 y = cPickle.loads(cPickle.dumps(x))
2791 vereq(hasattr(y, 'a'), 0)
2792 x.a = 42
2793 y = pickle.loads(pickle.dumps(x))
2794 vereq(y.a, 42)
2795 y = cPickle.loads(cPickle.dumps(x))
2796 vereq(y.a, 42)
2797 x = D()
2798 x.a = 42
2799 x.b = 100
2800 y = pickle.loads(pickle.dumps(x))
2801 vereq(y.a + y.b, 142)
2802 y = cPickle.loads(cPickle.dumps(x))
2803 vereq(y.a + y.b, 142)
2804 # But a subclass that adds a slot should not work
2805 class E(C):
2806 __slots__ = ['b']
2807 try:
2808 pickle.dumps(E())
2809 except TypeError:
2810 pass
2811 else:
2812 raise TestFailed, "should fail: pickle E instance - %s" % base
2813 try:
2814 cPickle.dumps(E())
2815 except TypeError:
2816 pass
2817 else:
2818 raise TestFailed, "should fail: cPickle E instance - %s" % base
2819
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002820def copies():
2821 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2822 import copy
2823 class C(object):
2824 pass
2825
2826 a = C()
2827 a.foo = 12
2828 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002829 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002830
2831 a.bar = [1,2,3]
2832 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002833 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002834 verify(c.bar is a.bar)
2835
2836 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002837 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002838 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002839 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002840
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002841def binopoverride():
2842 if verbose: print "Testing overrides of binary operations..."
2843 class I(int):
2844 def __repr__(self):
2845 return "I(%r)" % int(self)
2846 def __add__(self, other):
2847 return I(int(self) + int(other))
2848 __radd__ = __add__
2849 def __pow__(self, other, mod=None):
2850 if mod is None:
2851 return I(pow(int(self), int(other)))
2852 else:
2853 return I(pow(int(self), int(other), int(mod)))
2854 def __rpow__(self, other, mod=None):
2855 if mod is None:
2856 return I(pow(int(other), int(self), mod))
2857 else:
2858 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002859
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002860 vereq(`I(1) + I(2)`, "I(3)")
2861 vereq(`I(1) + 2`, "I(3)")
2862 vereq(`1 + I(2)`, "I(3)")
2863 vereq(`I(2) ** I(3)`, "I(8)")
2864 vereq(`2 ** I(3)`, "I(8)")
2865 vereq(`I(2) ** 3`, "I(8)")
2866 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2867 class S(str):
2868 def __eq__(self, other):
2869 return self.lower() == other.lower()
2870
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002871def subclasspropagation():
2872 if verbose: print "Testing propagation of slot functions to subclasses..."
2873 class A(object):
2874 pass
2875 class B(A):
2876 pass
2877 class C(A):
2878 pass
2879 class D(B, C):
2880 pass
2881 d = D()
2882 vereq(hash(d), id(d))
2883 A.__hash__ = lambda self: 42
2884 vereq(hash(d), 42)
2885 C.__hash__ = lambda self: 314
2886 vereq(hash(d), 314)
2887 B.__hash__ = lambda self: 144
2888 vereq(hash(d), 144)
2889 D.__hash__ = lambda self: 100
2890 vereq(hash(d), 100)
2891 del D.__hash__
2892 vereq(hash(d), 144)
2893 del B.__hash__
2894 vereq(hash(d), 314)
2895 del C.__hash__
2896 vereq(hash(d), 42)
2897 del A.__hash__
2898 vereq(hash(d), id(d))
2899 d.foo = 42
2900 d.bar = 42
2901 vereq(d.foo, 42)
2902 vereq(d.bar, 42)
2903 def __getattribute__(self, name):
2904 if name == "foo":
2905 return 24
2906 return object.__getattribute__(self, name)
2907 A.__getattribute__ = __getattribute__
2908 vereq(d.foo, 24)
2909 vereq(d.bar, 42)
2910 def __getattr__(self, name):
2911 if name in ("spam", "foo", "bar"):
2912 return "hello"
2913 raise AttributeError, name
2914 B.__getattr__ = __getattr__
2915 vereq(d.spam, "hello")
2916 vereq(d.foo, 24)
2917 vereq(d.bar, 42)
2918 del A.__getattribute__
2919 vereq(d.foo, 42)
2920 del d.foo
2921 vereq(d.foo, "hello")
2922 vereq(d.bar, 42)
2923 del B.__getattr__
2924 try:
2925 d.foo
2926 except AttributeError:
2927 pass
2928 else:
2929 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002930
Guido van Rossume7f3e242002-06-14 02:35:45 +00002931 # Test a nasty bug in recurse_down_subclasses()
2932 import gc
2933 class A(object):
2934 pass
2935 class B(A):
2936 pass
2937 del B
2938 gc.collect()
2939 A.__setitem__ = lambda *a: None # crash
2940
Tim Petersfc57ccb2001-10-12 02:38:24 +00002941def buffer_inherit():
2942 import binascii
2943 # SF bug [#470040] ParseTuple t# vs subclasses.
2944 if verbose:
2945 print "Testing that buffer interface is inherited ..."
2946
2947 class MyStr(str):
2948 pass
2949 base = 'abc'
2950 m = MyStr(base)
2951 # b2a_hex uses the buffer interface to get its argument's value, via
2952 # PyArg_ParseTuple 't#' code.
2953 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2954
2955 # It's not clear that unicode will continue to support the character
2956 # buffer interface, and this test will fail if that's taken away.
2957 class MyUni(unicode):
2958 pass
2959 base = u'abc'
2960 m = MyUni(base)
2961 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2962
2963 class MyInt(int):
2964 pass
2965 m = MyInt(42)
2966 try:
2967 binascii.b2a_hex(m)
2968 raise TestFailed('subclass of int should not have a buffer interface')
2969 except TypeError:
2970 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002971
Tim Petersc9933152001-10-16 20:18:24 +00002972def str_of_str_subclass():
2973 import binascii
2974 import cStringIO
2975
2976 if verbose:
2977 print "Testing __str__ defined in subclass of str ..."
2978
2979 class octetstring(str):
2980 def __str__(self):
2981 return binascii.b2a_hex(self)
2982 def __repr__(self):
2983 return self + " repr"
2984
2985 o = octetstring('A')
2986 vereq(type(o), octetstring)
2987 vereq(type(str(o)), str)
2988 vereq(type(repr(o)), str)
2989 vereq(ord(o), 0x41)
2990 vereq(str(o), '41')
2991 vereq(repr(o), 'A repr')
2992 vereq(o.__str__(), '41')
2993 vereq(o.__repr__(), 'A repr')
2994
2995 capture = cStringIO.StringIO()
2996 # Calling str() or not exercises different internal paths.
2997 print >> capture, o
2998 print >> capture, str(o)
2999 vereq(capture.getvalue(), '41\n41\n')
3000 capture.close()
3001
Guido van Rossumc8e56452001-10-22 00:43:43 +00003002def kwdargs():
3003 if verbose: print "Testing keyword arguments to __init__, __call__..."
3004 def f(a): return a
3005 vereq(f.__call__(a=42), 42)
3006 a = []
3007 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003008 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003009
Guido van Rossumed87ad82001-10-30 02:33:02 +00003010def delhook():
3011 if verbose: print "Testing __del__ hook..."
3012 log = []
3013 class C(object):
3014 def __del__(self):
3015 log.append(1)
3016 c = C()
3017 vereq(log, [])
3018 del c
3019 vereq(log, [1])
3020
Guido van Rossum29d26062001-12-11 04:37:34 +00003021 class D(object): pass
3022 d = D()
3023 try: del d[0]
3024 except TypeError: pass
3025 else: raise TestFailed, "invalid del() didn't raise TypeError"
3026
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003027def hashinherit():
3028 if verbose: print "Testing hash of mutable subclasses..."
3029
3030 class mydict(dict):
3031 pass
3032 d = mydict()
3033 try:
3034 hash(d)
3035 except TypeError:
3036 pass
3037 else:
3038 raise TestFailed, "hash() of dict subclass should fail"
3039
3040 class mylist(list):
3041 pass
3042 d = mylist()
3043 try:
3044 hash(d)
3045 except TypeError:
3046 pass
3047 else:
3048 raise TestFailed, "hash() of list subclass should fail"
3049
Guido van Rossum29d26062001-12-11 04:37:34 +00003050def strops():
3051 try: 'a' + 5
3052 except TypeError: pass
3053 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3054
3055 try: ''.split('')
3056 except ValueError: pass
3057 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3058
3059 try: ''.join([0])
3060 except TypeError: pass
3061 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3062
3063 try: ''.rindex('5')
3064 except ValueError: pass
3065 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3066
Guido van Rossum29d26062001-12-11 04:37:34 +00003067 try: '%(n)s' % None
3068 except TypeError: pass
3069 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3070
3071 try: '%(n' % {}
3072 except ValueError: pass
3073 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3074
3075 try: '%*s' % ('abc')
3076 except TypeError: pass
3077 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3078
3079 try: '%*.*s' % ('abc', 5)
3080 except TypeError: pass
3081 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3082
3083 try: '%s' % (1, 2)
3084 except TypeError: pass
3085 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3086
3087 try: '%' % None
3088 except ValueError: pass
3089 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3090
3091 vereq('534253'.isdigit(), 1)
3092 vereq('534253x'.isdigit(), 0)
3093 vereq('%c' % 5, '\x05')
3094 vereq('%c' % '5', '5')
3095
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003096def deepcopyrecursive():
3097 if verbose: print "Testing deepcopy of recursive objects..."
3098 class Node:
3099 pass
3100 a = Node()
3101 b = Node()
3102 a.b = b
3103 b.a = a
3104 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003105
Guido van Rossumd7035672002-03-12 20:43:31 +00003106def modules():
3107 if verbose: print "Testing uninitialized module objects..."
3108 from types import ModuleType as M
3109 m = M.__new__(M)
3110 str(m)
3111 vereq(hasattr(m, "__name__"), 0)
3112 vereq(hasattr(m, "__file__"), 0)
3113 vereq(hasattr(m, "foo"), 0)
3114 vereq(m.__dict__, None)
3115 m.foo = 1
3116 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003117
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003118def dictproxyiterkeys():
3119 class C(object):
3120 def meth(self):
3121 pass
3122 if verbose: print "Testing dict-proxy iterkeys..."
3123 keys = [ key for key in C.__dict__.iterkeys() ]
3124 keys.sort()
3125 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3126
3127def dictproxyitervalues():
3128 class C(object):
3129 def meth(self):
3130 pass
3131 if verbose: print "Testing dict-proxy itervalues..."
3132 values = [ values for values in C.__dict__.itervalues() ]
3133 vereq(len(values), 5)
3134
3135def dictproxyiteritems():
3136 class C(object):
3137 def meth(self):
3138 pass
3139 if verbose: print "Testing dict-proxy iteritems..."
3140 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3141 keys.sort()
3142 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3143
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003144def funnynew():
3145 if verbose: print "Testing __new__ returning something unexpected..."
3146 class C(object):
3147 def __new__(cls, arg):
3148 if isinstance(arg, str): return [1, 2, 3]
3149 elif isinstance(arg, int): return object.__new__(D)
3150 else: return object.__new__(cls)
3151 class D(C):
3152 def __init__(self, arg):
3153 self.foo = arg
3154 vereq(C("1"), [1, 2, 3])
3155 vereq(D("1"), [1, 2, 3])
3156 d = D(None)
3157 veris(d.foo, None)
3158 d = C(1)
3159 vereq(isinstance(d, D), True)
3160 vereq(d.foo, 1)
3161 d = D(1)
3162 vereq(isinstance(d, D), True)
3163 vereq(d.foo, 1)
3164
Guido van Rossume8fc6402002-04-16 16:44:51 +00003165def imulbug():
3166 # SF bug 544647
3167 if verbose: print "Testing for __imul__ problems..."
3168 class C(object):
3169 def __imul__(self, other):
3170 return (self, other)
3171 x = C()
3172 y = x
3173 y *= 1.0
3174 vereq(y, (x, 1.0))
3175 y = x
3176 y *= 2
3177 vereq(y, (x, 2))
3178 y = x
3179 y *= 3L
3180 vereq(y, (x, 3L))
3181 y = x
3182 y *= 1L<<100
3183 vereq(y, (x, 1L<<100))
3184 y = x
3185 y *= None
3186 vereq(y, (x, None))
3187 y = x
3188 y *= "foo"
3189 vereq(y, (x, "foo"))
3190
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003191def docdescriptor():
3192 # SF bug 542984
3193 if verbose: print "Testing __doc__ descriptor..."
3194 class DocDescr(object):
3195 def __get__(self, object, otype):
3196 if object:
3197 object = object.__class__.__name__ + ' instance'
3198 if otype:
3199 otype = otype.__name__
3200 return 'object=%s; type=%s' % (object, otype)
3201 class OldClass:
3202 __doc__ = DocDescr()
3203 class NewClass(object):
3204 __doc__ = DocDescr()
3205 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3206 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3207 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3208 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3209
Tim Petersafb2c802002-04-18 18:06:20 +00003210def string_exceptions():
3211 if verbose:
3212 print "Testing string exceptions ..."
3213
3214 # Ensure builtin strings work OK as exceptions.
3215 astring = "An exception string."
3216 try:
3217 raise astring
3218 except astring:
3219 pass
3220 else:
3221 raise TestFailed, "builtin string not usable as exception"
3222
3223 # Ensure string subclass instances do not.
3224 class MyStr(str):
3225 pass
3226
3227 newstring = MyStr("oops -- shouldn't work")
3228 try:
3229 raise newstring
3230 except TypeError:
3231 pass
3232 except:
3233 raise TestFailed, "string subclass allowed as exception"
3234
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003235def copy_setstate():
3236 if verbose:
3237 print "Testing that copy.*copy() correctly uses __setstate__..."
3238 import copy
3239 class C(object):
3240 def __init__(self, foo=None):
3241 self.foo = foo
3242 self.__foo = foo
3243 def setfoo(self, foo=None):
3244 self.foo = foo
3245 def getfoo(self):
3246 return self.__foo
3247 def __getstate__(self):
3248 return [self.foo]
3249 def __setstate__(self, lst):
3250 assert len(lst) == 1
3251 self.__foo = self.foo = lst[0]
3252 a = C(42)
3253 a.setfoo(24)
3254 vereq(a.foo, 24)
3255 vereq(a.getfoo(), 42)
3256 b = copy.copy(a)
3257 vereq(b.foo, 24)
3258 vereq(b.getfoo(), 24)
3259 b = copy.deepcopy(a)
3260 vereq(b.foo, 24)
3261 vereq(b.getfoo(), 24)
3262
Guido van Rossum09638c12002-06-13 19:17:46 +00003263def slices():
3264 if verbose:
3265 print "Testing cases with slices and overridden __getitem__ ..."
3266 # Strings
3267 vereq("hello"[:4], "hell")
3268 vereq("hello"[slice(4)], "hell")
3269 vereq(str.__getitem__("hello", slice(4)), "hell")
3270 class S(str):
3271 def __getitem__(self, x):
3272 return str.__getitem__(self, x)
3273 vereq(S("hello")[:4], "hell")
3274 vereq(S("hello")[slice(4)], "hell")
3275 vereq(S("hello").__getitem__(slice(4)), "hell")
3276 # Tuples
3277 vereq((1,2,3)[:2], (1,2))
3278 vereq((1,2,3)[slice(2)], (1,2))
3279 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3280 class T(tuple):
3281 def __getitem__(self, x):
3282 return tuple.__getitem__(self, x)
3283 vereq(T((1,2,3))[:2], (1,2))
3284 vereq(T((1,2,3))[slice(2)], (1,2))
3285 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3286 # Lists
3287 vereq([1,2,3][:2], [1,2])
3288 vereq([1,2,3][slice(2)], [1,2])
3289 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3290 class L(list):
3291 def __getitem__(self, x):
3292 return list.__getitem__(self, x)
3293 vereq(L([1,2,3])[:2], [1,2])
3294 vereq(L([1,2,3])[slice(2)], [1,2])
3295 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3296 # Now do lists and __setitem__
3297 a = L([1,2,3])
3298 a[slice(1, 3)] = [3,2]
3299 vereq(a, [1,3,2])
3300 a[slice(0, 2, 1)] = [3,1]
3301 vereq(a, [3,1,2])
3302 a.__setitem__(slice(1, 3), [2,1])
3303 vereq(a, [3,2,1])
3304 a.__setitem__(slice(0, 2, 1), [2,3])
3305 vereq(a, [2,3,1])
3306
Tim Peters2484aae2002-07-11 06:56:07 +00003307def subtype_resurrection():
3308 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003309 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003310
3311 class C(object):
3312 container = []
3313
3314 def __del__(self):
3315 # resurrect the instance
3316 C.container.append(self)
3317
3318 c = C()
3319 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003320 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003321 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003322 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003323
3324 # If that didn't blow up, it's also interesting to see whether clearing
3325 # the last container slot works: that will attempt to delete c again,
3326 # which will cause c to get appended back to the container again "during"
3327 # the del.
3328 del C.container[-1]
3329 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003330 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003331
Tim Peters14cb1e12002-07-11 18:26:21 +00003332 # Make c mortal again, so that the test framework with -l doesn't report
3333 # it as a leak.
3334 del C.__del__
3335
Guido van Rossum2d702462002-08-06 21:28:28 +00003336def slottrash():
3337 # Deallocating deeply nested slotted trash caused stack overflows
3338 if verbose:
3339 print "Testing slot trash..."
3340 class trash(object):
3341 __slots__ = ['x']
3342 def __init__(self, x):
3343 self.x = x
3344 o = None
3345 for i in xrange(50000):
3346 o = trash(o)
3347 del o
3348
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003349def slotmultipleinheritance():
3350 # SF bug 575229, multiple inheritance w/ slots dumps core
3351 class A(object):
3352 __slots__=()
3353 class B(object):
3354 pass
3355 class C(A,B) :
3356 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003357 vereq(C.__basicsize__, B.__basicsize__)
3358 verify(hasattr(C, '__dict__'))
3359 verify(hasattr(C, '__weakref__'))
3360 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003361
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003362def testrmul():
3363 # SF patch 592646
3364 if verbose:
3365 print "Testing correct invocation of __rmul__..."
3366 class C(object):
3367 def __mul__(self, other):
3368 return "mul"
3369 def __rmul__(self, other):
3370 return "rmul"
3371 a = C()
3372 vereq(a*2, "mul")
3373 vereq(a*2.2, "mul")
3374 vereq(2*a, "rmul")
3375 vereq(2.2*a, "rmul")
3376
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003377def testipow():
3378 # [SF bug 620179]
3379 if verbose:
3380 print "Testing correct invocation of __ipow__..."
3381 class C(object):
3382 def __ipow__(self, other):
3383 pass
3384 a = C()
3385 a **= 2
3386
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003387def do_this_first():
3388 if verbose:
3389 print "Testing SF bug 551412 ..."
3390 # This dumps core when SF bug 551412 isn't fixed --
3391 # but only when test_descr.py is run separately.
3392 # (That can't be helped -- as soon as PyType_Ready()
3393 # is called for PyLong_Type, the bug is gone.)
3394 class UserLong(object):
3395 def __pow__(self, *args):
3396 pass
3397 try:
3398 pow(0L, UserLong(), 0L)
3399 except:
3400 pass
3401
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003402 if verbose:
3403 print "Testing SF bug 570483..."
3404 # Another segfault only when run early
3405 # (before PyType_Ready(tuple) is called)
3406 type.mro(tuple)
3407
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003408def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003409 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003410 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003411 lists()
3412 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003413 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003414 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003415 ints()
3416 longs()
3417 floats()
3418 complexes()
3419 spamlists()
3420 spamdicts()
3421 pydicts()
3422 pylists()
3423 metaclass()
3424 pymods()
3425 multi()
3426 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00003427 ex5()
3428 monotonicity()
3429 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00003430 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003431 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003432 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003433 dynamics()
3434 errors()
3435 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003436 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003437 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003438 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003439 classic()
3440 compattr()
3441 newslot()
3442 altmro()
3443 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003444 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003445 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003446 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003447 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003448 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003449 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003450 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003451 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003452 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003453 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003454 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003455 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003456 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003457 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003458 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003459 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003460 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003461 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003462 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003463 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003464 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003465 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003466 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003467 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003468 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003469 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003470 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003471 dictproxyiterkeys()
3472 dictproxyitervalues()
3473 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003474 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003475 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003476 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003477 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003478 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003479 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003480 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003481 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003482 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003483 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003484 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003485 testipow()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003486 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003487
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003488if __name__ == "__main__":
3489 test_main()