blob: 61be8a82816f5b3082ff5443c93bae035558cdd2 [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
Guido van Rossum9acc3872008-01-23 23:23:43 +00003# XXX Please, please, please, someone convert this to unittest style!
4
Armin Rigoc0ba52d2007-04-19 14:44:48 +00005from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00006from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00007import warnings
Armin Rigo9790a272007-05-02 19:23:31 +00008import types
Tim Peters4d9b4662002-04-16 01:59:17 +00009
10warnings.filterwarnings("ignore",
11 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +000012 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000013
Guido van Rossum875eeaa2001-10-11 18:33:53 +000014def veris(a, b):
15 if a is not b:
16 raise TestFailed, "%r is %r" % (a, b)
17
Tim Peters6d6c1a32001-08-02 04:15:00 +000018def testunop(a, res, expr="len(a)", meth="__len__"):
19 if verbose: print "checking", expr
20 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000021 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000022 t = type(a)
23 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000024 while meth not in t.__dict__:
25 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(m, t.__dict__[meth])
27 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000028 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000029 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000030
31def testbinop(a, b, res, expr="a+b", meth="__add__"):
32 if verbose: print "checking", expr
33 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000034
35 # XXX Hack so this passes before 2.3 when -Qnew is specified.
36 if meth == "__div__" and 1/2 == 0.5:
37 meth = "__truediv__"
38
Guido van Rossum45704552001-10-08 16:35:45 +000039 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000040 t = type(a)
41 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000042 while meth not in t.__dict__:
43 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(m, t.__dict__[meth])
45 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000047 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000048
49def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
50 if verbose: print "checking", expr
51 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000052 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000053 t = type(a)
54 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000055 while meth not in t.__dict__:
56 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(m, t.__dict__[meth])
58 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000059 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000060 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000061
62def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
63 if verbose: print "checking", stmt
64 dict = {'a': deepcopy(a), 'b': b}
65 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000066 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000067 t = type(a)
68 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000069 while meth not in t.__dict__:
70 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict['a'] = deepcopy(a)
73 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000074 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000075 dict['a'] = deepcopy(a)
76 bm = getattr(dict['a'], meth)
77 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000078 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000079
80def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
81 if verbose: print "checking", stmt
82 dict = {'a': deepcopy(a), 'b': b, 'c': c}
83 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000084 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000085 t = type(a)
86 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000087 while meth not in t.__dict__:
88 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict['a'] = deepcopy(a)
91 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000092 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000093 dict['a'] = deepcopy(a)
94 bm = getattr(dict['a'], meth)
95 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000096 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000097
98def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
99 if verbose: print "checking", stmt
100 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
101 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +0000102 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000104 while meth not in t.__dict__:
105 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108 dict['a'] = deepcopy(a)
109 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000110 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000111 dict['a'] = deepcopy(a)
112 bm = getattr(dict['a'], meth)
113 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000114 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000115
Tim Peters2f93e282001-10-04 05:27:00 +0000116def class_docstrings():
117 class Classic:
118 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000119 vereq(Classic.__doc__, "A classic docstring.")
120 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000121
122 class Classic2:
123 pass
124 verify(Classic2.__doc__ is None)
125
Tim Peters4fb1fe82001-10-04 05:48:13 +0000126 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000127 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000128 vereq(NewStatic.__doc__, "Another docstring.")
129 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000130
Tim Peters4fb1fe82001-10-04 05:48:13 +0000131 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000132 pass
133 verify(NewStatic2.__doc__ is None)
134
Tim Peters4fb1fe82001-10-04 05:48:13 +0000135 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000136 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000137 vereq(NewDynamic.__doc__, "Another docstring.")
138 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000139
Tim Peters4fb1fe82001-10-04 05:48:13 +0000140 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000141 pass
142 verify(NewDynamic2.__doc__ is None)
143
Tim Peters6d6c1a32001-08-02 04:15:00 +0000144def lists():
145 if verbose: print "Testing list operations..."
146 testbinop([1], [2], [1,2], "a+b", "__add__")
147 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
148 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
149 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
150 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
151 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
152 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
153 testunop([1,2,3], 3, "len(a)", "__len__")
154 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
155 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
156 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
157 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
158
159def dicts():
160 if verbose: print "Testing dict operations..."
161 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
162 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
163 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
164 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
165 d = {1:2,3:4}
166 l1 = []
167 for i in d.keys(): l1.append(i)
168 l = []
169 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000171 l = []
172 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000173 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000175 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000177 d = {1:2, 3:4}
178 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000179 vereq(eval(repr(d), {}), d)
180 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000181 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
182
Tim Peters25786c02001-09-02 08:22:48 +0000183def dict_constructor():
184 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 print "Testing dict constructor ..."
186 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000187 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000188 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000189 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000190 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000191 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000192 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000193 vereq(d, dict(d.iteritems()))
194 d = dict({'one':1, 'two':2})
195 vereq(d, dict(one=1, two=2))
196 vereq(d, dict(**d))
197 vereq(d, dict({"one": 1}, two=2))
198 vereq(d, dict([("two", 2)], one=1))
199 vereq(d, dict([("one", 100), ("two", 200)], **d))
200 verify(d is not dict(**d))
Tim Peters25786c02001-09-02 08:22:48 +0000201 for badarg in 0, 0L, 0j, "0", [0], (0,):
202 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000203 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000204 except TypeError:
205 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000206 except ValueError:
207 if badarg == "0":
208 # It's a sequence, and its elements are also sequences (gotta
209 # love strings <wink>), but they aren't of length 2, so this
210 # one seemed better as a ValueError than a TypeError.
211 pass
212 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000213 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000214 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000216
217 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000218 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000219 except TypeError:
220 pass
221 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000222 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000223
224 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000225 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000226 dict = {1:2, 3:4, 'a':1j}
227
Tim Peters25786c02001-09-02 08:22:48 +0000228 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000229 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000230 except TypeError:
231 pass
232 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000233 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000234
235 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000236 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000237 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000238 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000239
Tim Peters1fc240e2001-10-26 05:06:50 +0000240 # Init from sequence of iterable objects, each producing a 2-sequence.
241 class AddressBookEntry:
242 def __init__(self, first, last):
243 self.first = first
244 self.last = last
245 def __iter__(self):
246 return iter([self.first, self.last])
247
Tim Petersa427a2b2001-10-29 22:25:45 +0000248 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000249 AddressBookEntry('Barry', 'Peters'),
250 AddressBookEntry('Tim', 'Peters'),
251 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000252 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
253
Tim Petersa427a2b2001-10-29 22:25:45 +0000254 d = dict(zip(range(4), range(1, 5)))
255 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000256
257 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000258 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000259 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000260 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000261 except ValueError:
262 pass
263 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000264 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000265
Tim Peters5d2b77c2001-09-03 05:47:38 +0000266def test_dir():
267 if verbose:
268 print "Testing dir() ..."
269 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000270 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000271 del junk
272
273 # Just make sure these don't blow up!
274 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
275 dir(arg)
276
Tim Peters37a309d2001-09-04 01:20:04 +0000277 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000278 class C:
279 Cdata = 1
280 def Cmethod(self): pass
281
282 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000284 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000285
286 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000287 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000288
289 c.cdata = 2
290 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000291 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000292 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000293
294 class A(C):
295 Adata = 1
296 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000297
Tim Peters37a309d2001-09-04 01:20:04 +0000298 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000300 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000301 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000302 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000303 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000304 a.adata = 42
305 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000306 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000307
308 # The same, but with new-style classes. Since these have object as a
309 # base class, a lot more gets sucked in.
310 def interesting(strings):
311 return [s for s in strings if not s.startswith('_')]
312
Tim Peters5d2b77c2001-09-03 05:47:38 +0000313 class C(object):
314 Cdata = 1
315 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000316
317 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000318 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000319
320 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000321 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000322 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000323
324 c.cdata = 2
325 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000326 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000327 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000328
Tim Peters5d2b77c2001-09-03 05:47:38 +0000329 class A(C):
330 Adata = 1
331 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000332
333 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000334 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000335 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000336 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000337 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000338 a.adata = 42
339 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000340 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000341 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000342
Tim Peterscaaff8d2001-09-10 23:12:14 +0000343 # Try a module subclass.
344 import sys
345 class M(type(sys)):
346 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000347 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000348 minstance.b = 2
349 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000350 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
351 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000352
353 class M2(M):
354 def getdict(self):
355 return "Not a dict!"
356 __dict__ = property(getdict)
357
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000358 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000359 m2instance.b = 2
360 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000361 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000362 try:
363 dir(m2instance)
364 except TypeError:
365 pass
366
Tim Peters9e6a3992001-10-30 05:45:26 +0000367 # Two essentially featureless objects, just inheriting stuff from
368 # object.
369 vereq(dir(None), dir(Ellipsis))
370
Guido van Rossum44022412002-05-13 18:29:46 +0000371 # Nasty test case for proxied objects
372 class Wrapper(object):
373 def __init__(self, obj):
374 self.__obj = obj
375 def __repr__(self):
376 return "Wrapper(%s)" % repr(self.__obj)
377 def __getitem__(self, key):
378 return Wrapper(self.__obj[key])
379 def __len__(self):
380 return len(self.__obj)
381 def __getattr__(self, name):
382 return Wrapper(getattr(self.__obj, name))
383
384 class C(object):
385 def __getclass(self):
386 return Wrapper(type(self))
387 __class__ = property(__getclass)
388
389 dir(C()) # This used to segfault
390
Tim Peters6d6c1a32001-08-02 04:15:00 +0000391binops = {
392 'add': '+',
393 'sub': '-',
394 'mul': '*',
395 'div': '/',
396 'mod': '%',
397 'divmod': 'divmod',
398 'pow': '**',
399 'lshift': '<<',
400 'rshift': '>>',
401 'and': '&',
402 'xor': '^',
403 'or': '|',
404 'cmp': 'cmp',
405 'lt': '<',
406 'le': '<=',
407 'eq': '==',
408 'ne': '!=',
409 'gt': '>',
410 'ge': '>=',
411 }
412
413for name, expr in binops.items():
414 if expr.islower():
415 expr = expr + "(a, b)"
416 else:
417 expr = 'a %s b' % expr
418 binops[name] = expr
419
420unops = {
421 'pos': '+',
422 'neg': '-',
423 'abs': 'abs',
424 'invert': '~',
425 'int': 'int',
426 'long': 'long',
427 'float': 'float',
428 'oct': 'oct',
429 'hex': 'hex',
430 }
431
432for name, expr in unops.items():
433 if expr.islower():
434 expr = expr + "(a)"
435 else:
436 expr = '%s a' % expr
437 unops[name] = expr
438
439def numops(a, b, skip=[]):
440 dict = {'a': a, 'b': b}
441 for name, expr in binops.items():
442 if name not in skip:
443 name = "__%s__" % name
444 if hasattr(a, name):
445 res = eval(expr, dict)
446 testbinop(a, b, res, expr, name)
447 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000448 if name not in skip:
449 name = "__%s__" % name
450 if hasattr(a, name):
451 res = eval(expr, dict)
452 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000453
454def ints():
455 if verbose: print "Testing int operations..."
456 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000457 # The following crashes in Python 2.2
458 vereq((1).__nonzero__(), 1)
459 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000460 # This returns 'NotImplemented' in Python 2.2
461 class C(int):
462 def __add__(self, other):
463 return NotImplemented
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000464 vereq(C(5L), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000465 try:
466 C() + ""
467 except TypeError:
468 pass
469 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000470 raise TestFailed, "NotImplemented should have caused TypeError"
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000471 import sys
472 try:
473 C(sys.maxint+1)
474 except OverflowError:
475 pass
476 else:
477 raise TestFailed, "should have raised OverflowError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000478
479def longs():
480 if verbose: print "Testing long operations..."
481 numops(100L, 3L)
482
483def floats():
484 if verbose: print "Testing float operations..."
485 numops(100.0, 3.0)
486
487def complexes():
488 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000489 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000490 class Number(complex):
491 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000492 def __new__(cls, *args, **kwds):
493 result = complex.__new__(cls, *args)
494 result.prec = kwds.get('prec', 12)
495 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000496 def __repr__(self):
497 prec = self.prec
498 if self.imag == 0.0:
499 return "%.*g" % (prec, self.real)
500 if self.real == 0.0:
501 return "%.*gj" % (prec, self.imag)
502 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
503 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000504
Tim Peters6d6c1a32001-08-02 04:15:00 +0000505 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000506 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000507 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000508
Tim Peters3f996e72001-09-13 19:18:27 +0000509 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000510 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000511 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000512
513 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000514 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000515 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000516
Tim Peters6d6c1a32001-08-02 04:15:00 +0000517def spamlists():
518 if verbose: print "Testing spamlist operations..."
519 import copy, xxsubtype as spam
520 def spamlist(l, memo=None):
521 import xxsubtype as spam
522 return spam.spamlist(l)
523 # This is an ugly hack:
524 copy._deepcopy_dispatch[spam.spamlist] = spamlist
525
526 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
527 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
528 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
529 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
530 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
531 "a[b:c]", "__getslice__")
532 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
533 "a+=b", "__iadd__")
534 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
535 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
536 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
537 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
538 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
539 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
540 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
541 # Test subclassing
542 class C(spam.spamlist):
543 def foo(self): return 1
544 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000545 vereq(a, [])
546 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000548 vereq(a, [100])
549 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000550 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000551 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000552
553def spamdicts():
554 if verbose: print "Testing spamdict operations..."
555 import copy, xxsubtype as spam
556 def spamdict(d, memo=None):
557 import xxsubtype as spam
558 sd = spam.spamdict()
559 for k, v in d.items(): sd[k] = v
560 return sd
561 # This is an ugly hack:
562 copy._deepcopy_dispatch[spam.spamdict] = spamdict
563
564 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
565 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
566 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
567 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
568 d = spamdict({1:2,3:4})
569 l1 = []
570 for i in d.keys(): l1.append(i)
571 l = []
572 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000573 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 l = []
575 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000576 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 l = []
578 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 straightd = {1:2, 3:4}
581 spamd = spamdict(straightd)
582 testunop(spamd, 2, "len(a)", "__len__")
583 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
584 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
585 "a[b]=c", "__setitem__")
586 # Test subclassing
587 class C(spam.spamdict):
588 def foo(self): return 1
589 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a.items(), [])
591 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a.items(), [('foo', 'bar')])
594 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000596 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597
598def pydicts():
599 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000600 verify(issubclass(dict, dict))
601 verify(isinstance({}, dict))
602 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000603 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000604 verify(d.__class__ is dict)
605 verify(isinstance(d, dict))
606 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000607 state = -1
608 def __init__(self, *a, **kw):
609 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000610 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000611 self.state = a[0]
612 if kw:
613 for k, v in kw.items(): self[v] = k
614 def __getitem__(self, key):
615 return self.get(key, 0)
616 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000617 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000618 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000619 def setstate(self, state):
620 self.state = state
621 def getstate(self):
622 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000623 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000625 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000626 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000627 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a.state, -1)
630 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000631 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000632 vereq(a.state, 0)
633 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000634 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000635 vereq(a.state, 10)
636 vereq(a.getstate(), 10)
637 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000638 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000639 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000640 if verbose: print "pydict stress test ..."
641 N = 50
642 for i in range(N):
643 a[i] = C()
644 for j in range(N):
645 a[i][j] = i*j
646 for i in range(N):
647 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000648 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000649
650def pylists():
651 if verbose: print "Testing Python subclass of list..."
652 class C(list):
653 def __getitem__(self, i):
654 return list.__getitem__(self, i) + 100
655 def __getslice__(self, i, j):
656 return (i, j)
657 a = C()
658 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000659 vereq(a[0], 100)
660 vereq(a[1], 101)
661 vereq(a[2], 102)
662 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000663
664def metaclass():
665 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000666 class C:
667 __metaclass__ = type
668 def __init__(self):
669 self.__state = 0
670 def getstate(self):
671 return self.__state
672 def setstate(self, state):
673 self.__state = state
674 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000675 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000676 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000677 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000678 class D:
679 class __metaclass__(type):
680 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000681 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000682 d = D()
683 verify(d.__class__ is D)
684 class M1(type):
685 def __new__(cls, name, bases, dict):
686 dict['__spam__'] = 1
687 return type.__new__(cls, name, bases, dict)
688 class C:
689 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000690 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000691 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000692 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000693
Guido van Rossum309b5662001-08-17 11:43:17 +0000694 class _instance(object):
695 pass
696 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000697 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000698 def __new__(cls, name, bases, dict):
699 self = object.__new__(cls)
700 self.name = name
701 self.bases = bases
702 self.dict = dict
703 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000704 def __call__(self):
705 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000706 # Early binding of methods
707 for key in self.dict:
708 if key.startswith("__"):
709 continue
710 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000711 return it
712 class C:
713 __metaclass__ = M2
714 def spam(self):
715 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000716 vereq(C.name, 'C')
717 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000718 verify('spam' in C.dict)
719 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000720 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721
Guido van Rossum91ee7982001-08-30 20:52:40 +0000722 # More metaclass examples
723
724 class autosuper(type):
725 # Automatically add __super to the class
726 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000727 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000728 cls = super(autosuper, metaclass).__new__(metaclass,
729 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000730 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 while name[:1] == "_":
732 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000733 if name:
734 name = "_%s__super" % name
735 else:
736 name = "__super"
737 setattr(cls, name, super(cls))
738 return cls
739 class A:
740 __metaclass__ = autosuper
741 def meth(self):
742 return "A"
743 class B(A):
744 def meth(self):
745 return "B" + self.__super.meth()
746 class C(A):
747 def meth(self):
748 return "C" + self.__super.meth()
749 class D(C, B):
750 def meth(self):
751 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000752 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000753 class E(B, C):
754 def meth(self):
755 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000756 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000757
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000758 class autoproperty(type):
759 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000760 # named _get_x and/or _set_x are found
761 def __new__(metaclass, name, bases, dict):
762 hits = {}
763 for key, val in dict.iteritems():
764 if key.startswith("_get_"):
765 key = key[5:]
766 get, set = hits.get(key, (None, None))
767 get = val
768 hits[key] = get, set
769 elif key.startswith("_set_"):
770 key = key[5:]
771 get, set = hits.get(key, (None, None))
772 set = val
773 hits[key] = get, set
774 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000775 dict[key] = property(get, set)
776 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000777 name, bases, dict)
778 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000779 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000780 def _get_x(self):
781 return -self.__x
782 def _set_x(self, x):
783 self.__x = -x
784 a = A()
785 verify(not hasattr(a, "x"))
786 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000787 vereq(a.x, 12)
788 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000789
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000790 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000791 # Merge of multiple cooperating metaclasses
792 pass
793 class A:
794 __metaclass__ = multimetaclass
795 def _get_x(self):
796 return "A"
797 class B(A):
798 def _get_x(self):
799 return "B" + self.__super._get_x()
800 class C(A):
801 def _get_x(self):
802 return "C" + self.__super._get_x()
803 class D(C, B):
804 def _get_x(self):
805 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000806 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000807
Guido van Rossumf76de622001-10-18 15:49:21 +0000808 # Make sure type(x) doesn't call x.__class__.__init__
809 class T(type):
810 counter = 0
811 def __init__(self, *args):
812 T.counter += 1
813 class C:
814 __metaclass__ = T
815 vereq(T.counter, 1)
816 a = C()
817 vereq(type(a), C)
818 vereq(T.counter, 1)
819
Guido van Rossum29d26062001-12-11 04:37:34 +0000820 class C(object): pass
821 c = C()
822 try: c()
823 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000824 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000825
Jeremy Hyltonfa955692007-02-27 18:29:45 +0000826 # Testing code to find most derived baseclass
827 class A(type):
828 def __new__(*args, **kwargs):
829 return type.__new__(*args, **kwargs)
830
831 class B(object):
832 pass
833
834 class C(object):
835 __metaclass__ = A
836
837 # The most derived metaclass of D is A rather than type.
838 class D(B, C):
839 pass
840
841
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842def pymods():
843 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000844 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000845 import sys
846 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000848 def __init__(self, name):
849 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000850 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000851 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000852 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853 def __setattr__(self, name, value):
854 log.append(("setattr", name, value))
855 MT.__setattr__(self, name, value)
856 def __delattr__(self, name):
857 log.append(("delattr", name))
858 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000859 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 a.foo = 12
861 x = a.foo
862 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000863 vereq(log, [("setattr", "foo", 12),
864 ("getattr", "foo"),
865 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000866
Armin Rigo9790a272007-05-02 19:23:31 +0000867 # http://python.org/sf/1174712
868 try:
869 class Module(types.ModuleType, str):
870 pass
871 except TypeError:
872 pass
873 else:
874 raise TestFailed("inheriting from ModuleType and str at the "
875 "same time should fail")
876
Tim Peters6d6c1a32001-08-02 04:15:00 +0000877def multi():
878 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879 class C(object):
880 def __init__(self):
881 self.__state = 0
882 def getstate(self):
883 return self.__state
884 def setstate(self, state):
885 self.__state = state
886 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000887 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000888 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000889 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000890 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891 def __init__(self):
892 type({}).__init__(self)
893 C.__init__(self)
894 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000895 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000896 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000897 vereq(d.items(), [("hello", "world")])
898 vereq(d["hello"], "world")
899 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000900 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000901 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000902 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000903
Guido van Rossume45763a2001-08-10 21:28:46 +0000904 # SF bug #442833
905 class Node(object):
906 def __int__(self):
907 return int(self.foo())
908 def foo(self):
909 return "23"
910 class Frag(Node, list):
911 def foo(self):
912 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000913 vereq(Node().__int__(), 23)
914 vereq(int(Node()), 23)
915 vereq(Frag().__int__(), 42)
916 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000917
Tim Petersa91e9642001-11-14 23:32:33 +0000918 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000919
920 class A:
921 x = 1
922
923 class B(A):
924 pass
925
926 class C(A):
927 x = 2
928
929 class D(B, C):
930 pass
931 vereq(D.x, 1)
932
933 # Classic MRO is preserved for a classic base class.
934 class E(D, object):
935 pass
936 vereq(E.__mro__, (E, D, B, A, C, object))
937 vereq(E.x, 1)
938
939 # But with a mix of classic bases, their MROs are combined using
940 # new-style MRO.
941 class F(B, C, object):
942 pass
943 vereq(F.__mro__, (F, B, C, A, object))
944 vereq(F.x, 2)
945
946 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000947 class C:
948 def cmethod(self):
949 return "C a"
950 def all_method(self):
951 return "C b"
952
953 class M1(C, object):
954 def m1method(self):
955 return "M1 a"
956 def all_method(self):
957 return "M1 b"
958
959 vereq(M1.__mro__, (M1, C, object))
960 m = M1()
961 vereq(m.cmethod(), "C a")
962 vereq(m.m1method(), "M1 a")
963 vereq(m.all_method(), "M1 b")
964
965 class D(C):
966 def dmethod(self):
967 return "D a"
968 def all_method(self):
969 return "D b"
970
Guido van Rossum9a818922002-11-14 19:50:14 +0000971 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000972 def m2method(self):
973 return "M2 a"
974 def all_method(self):
975 return "M2 b"
976
Guido van Rossum9a818922002-11-14 19:50:14 +0000977 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000978 m = M2()
979 vereq(m.cmethod(), "C a")
980 vereq(m.dmethod(), "D a")
981 vereq(m.m2method(), "M2 a")
982 vereq(m.all_method(), "M2 b")
983
Guido van Rossum9a818922002-11-14 19:50:14 +0000984 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000985 def m3method(self):
986 return "M3 a"
987 def all_method(self):
988 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000989 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000990 m = M3()
991 vereq(m.cmethod(), "C a")
992 vereq(m.dmethod(), "D a")
993 vereq(m.m1method(), "M1 a")
994 vereq(m.m2method(), "M2 a")
995 vereq(m.m3method(), "M3 a")
996 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000997
Guido van Rossume54616c2001-12-14 04:19:56 +0000998 class Classic:
999 pass
1000 try:
1001 class New(Classic):
1002 __metaclass__ = type
1003 except TypeError:
1004 pass
1005 else:
1006 raise TestFailed, "new class with only classic bases - shouldn't be"
1007
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008def diamond():
1009 if verbose: print "Testing multiple inheritance special cases..."
1010 class A(object):
1011 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +00001012 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013 class B(A):
1014 def boo(self): return "B"
1015 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +00001016 vereq(B().spam(), "B")
1017 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001018 class C(A):
1019 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +00001020 vereq(C().spam(), "A")
1021 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001022 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001023 vereq(D().spam(), "B")
1024 vereq(D().boo(), "B")
1025 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001026 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001027 vereq(E().spam(), "B")
1028 vereq(E().boo(), "C")
1029 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +00001030 # MRO order disagreement
1031 try:
1032 class F(D, E): pass
1033 except TypeError:
1034 pass
1035 else:
1036 raise TestFailed, "expected MRO order disagreement (F)"
1037 try:
1038 class G(E, D): pass
1039 except TypeError:
1040 pass
1041 else:
1042 raise TestFailed, "expected MRO order disagreement (G)"
1043
1044
1045# see thread python-dev/2002-October/029035.html
1046def ex5():
1047 if verbose: print "Testing ex5 from C3 switch discussion..."
1048 class A(object): pass
1049 class B(object): pass
1050 class C(object): pass
1051 class X(A): pass
1052 class Y(A): pass
1053 class Z(X,B,Y,C): pass
1054 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1055
1056# see "A Monotonic Superclass Linearization for Dylan",
1057# by Kim Barrett et al. (OOPSLA 1996)
1058def monotonicity():
1059 if verbose: print "Testing MRO monotonicity..."
1060 class Boat(object): pass
1061 class DayBoat(Boat): pass
1062 class WheelBoat(Boat): pass
1063 class EngineLess(DayBoat): pass
1064 class SmallMultihull(DayBoat): pass
1065 class PedalWheelBoat(EngineLess,WheelBoat): pass
1066 class SmallCatamaran(SmallMultihull): pass
1067 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1068
1069 vereq(PedalWheelBoat.__mro__,
1070 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1071 object))
1072 vereq(SmallCatamaran.__mro__,
1073 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1074
1075 vereq(Pedalo.__mro__,
1076 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1077 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1078
1079# see "A Monotonic Superclass Linearization for Dylan",
1080# by Kim Barrett et al. (OOPSLA 1996)
1081def consistency_with_epg():
1082 if verbose: print "Testing consistentcy with EPG..."
1083 class Pane(object): pass
1084 class ScrollingMixin(object): pass
1085 class EditingMixin(object): pass
1086 class ScrollablePane(Pane,ScrollingMixin): pass
1087 class EditablePane(Pane,EditingMixin): pass
1088 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1089
1090 vereq(EditableScrollablePane.__mro__,
1091 (EditableScrollablePane, ScrollablePane, EditablePane,
1092 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001093
Raymond Hettingerf394df42003-04-06 19:13:41 +00001094mro_err_msg = """Cannot create a consistent method resolution
1095order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +00001096
Guido van Rossumd32047f2002-11-25 21:38:52 +00001097def mro_disagreement():
1098 if verbose: print "Testing error messages for MRO disagreement..."
1099 def raises(exc, expected, callable, *args):
1100 try:
1101 callable(*args)
1102 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001103 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001104 raise TestFailed, "Message %r, expected %r" % (str(msg),
1105 expected)
1106 else:
1107 raise TestFailed, "Expected %s" % exc
1108 class A(object): pass
1109 class B(A): pass
1110 class C(object): pass
1111 # Test some very simple errors
1112 raises(TypeError, "duplicate base class A",
1113 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001114 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001115 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001116 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001117 type, "X", (A, C, B), {})
1118 # Test a slightly more complex error
1119 class GridLayout(object): pass
1120 class HorizontalGrid(GridLayout): pass
1121 class VerticalGrid(GridLayout): pass
1122 class HVGrid(HorizontalGrid, VerticalGrid): pass
1123 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +00001124 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001125 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1126
Guido van Rossum37202612001-08-09 19:45:21 +00001127def objects():
1128 if verbose: print "Testing object class..."
1129 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001130 vereq(a.__class__, object)
1131 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001132 b = object()
1133 verify(a is not b)
1134 verify(not hasattr(a, "foo"))
1135 try:
1136 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001137 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001138 pass
1139 else:
1140 verify(0, "object() should not allow setting a foo attribute")
1141 verify(not hasattr(object(), "__dict__"))
1142
1143 class Cdict(object):
1144 pass
1145 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001146 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001147 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001148 vereq(x.foo, 1)
1149 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001150
Tim Peters6d6c1a32001-08-02 04:15:00 +00001151def slots():
1152 if verbose: print "Testing __slots__..."
1153 class C0(object):
1154 __slots__ = []
1155 x = C0()
1156 verify(not hasattr(x, "__dict__"))
1157 verify(not hasattr(x, "foo"))
1158
1159 class C1(object):
1160 __slots__ = ['a']
1161 x = C1()
1162 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001163 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001164 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001165 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001166 x.a = None
1167 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001168 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001169 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001170
1171 class C3(object):
1172 __slots__ = ['a', 'b', 'c']
1173 x = C3()
1174 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001175 verify(not hasattr(x, 'a'))
1176 verify(not hasattr(x, 'b'))
1177 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001178 x.a = 1
1179 x.b = 2
1180 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001181 vereq(x.a, 1)
1182 vereq(x.b, 2)
1183 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001184
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001185 class C4(object):
1186 """Validate name mangling"""
1187 __slots__ = ['__a']
1188 def __init__(self, value):
1189 self.__a = value
1190 def get(self):
1191 return self.__a
1192 x = C4(5)
1193 verify(not hasattr(x, '__dict__'))
1194 verify(not hasattr(x, '__a'))
1195 vereq(x.get(), 5)
1196 try:
1197 x.__a = 6
1198 except AttributeError:
1199 pass
1200 else:
1201 raise TestFailed, "Double underscored names not mangled"
1202
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001203 # Make sure slot names are proper identifiers
1204 try:
1205 class C(object):
1206 __slots__ = [None]
1207 except TypeError:
1208 pass
1209 else:
1210 raise TestFailed, "[None] slots not caught"
1211 try:
1212 class C(object):
1213 __slots__ = ["foo bar"]
1214 except TypeError:
1215 pass
1216 else:
1217 raise TestFailed, "['foo bar'] slots not caught"
1218 try:
1219 class C(object):
1220 __slots__ = ["foo\0bar"]
1221 except TypeError:
1222 pass
1223 else:
1224 raise TestFailed, "['foo\\0bar'] slots not caught"
1225 try:
1226 class C(object):
1227 __slots__ = ["1"]
1228 except TypeError:
1229 pass
1230 else:
1231 raise TestFailed, "['1'] slots not caught"
1232 try:
1233 class C(object):
1234 __slots__ = [""]
1235 except TypeError:
1236 pass
1237 else:
1238 raise TestFailed, "[''] slots not caught"
1239 class C(object):
1240 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001241 # XXX(nnorwitz): was there supposed to be something tested
1242 # from the class above?
1243
1244 # Test a single string is not expanded as a sequence.
1245 class C(object):
1246 __slots__ = "abc"
1247 c = C()
1248 c.abc = 5
1249 vereq(c.abc, 5)
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001250
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001251 # Test unicode slot names
1252 try:
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001253 unicode
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001254 except NameError:
1255 pass
1256 else:
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001257 # Test a single unicode string is not expanded as a sequence.
1258 class C(object):
1259 __slots__ = unicode("abc")
1260 c = C()
1261 c.abc = 5
1262 vereq(c.abc, 5)
1263
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001264 # _unicode_to_string used to modify slots in certain circumstances
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001265 slots = (unicode("foo"), unicode("bar"))
1266 class C(object):
1267 __slots__ = slots
1268 x = C()
1269 x.foo = 5
1270 vereq(x.foo, 5)
1271 veris(type(slots[0]), unicode)
1272 # this used to leak references
1273 try:
1274 class C(object):
1275 __slots__ = [unichr(128)]
1276 except (TypeError, UnicodeEncodeError):
1277 pass
1278 else:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001279 raise TestFailed, "[unichr(128)] slots not caught"
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001280
Guido van Rossum33bab012001-12-05 22:45:48 +00001281 # Test leaks
1282 class Counted(object):
1283 counter = 0 # counts the number of instances alive
1284 def __init__(self):
1285 Counted.counter += 1
1286 def __del__(self):
1287 Counted.counter -= 1
1288 class C(object):
1289 __slots__ = ['a', 'b', 'c']
1290 x = C()
1291 x.a = Counted()
1292 x.b = Counted()
1293 x.c = Counted()
1294 vereq(Counted.counter, 3)
1295 del x
1296 vereq(Counted.counter, 0)
1297 class D(C):
1298 pass
1299 x = D()
1300 x.a = Counted()
1301 x.z = Counted()
1302 vereq(Counted.counter, 2)
1303 del x
1304 vereq(Counted.counter, 0)
1305 class E(D):
1306 __slots__ = ['e']
1307 x = E()
1308 x.a = Counted()
1309 x.z = Counted()
1310 x.e = Counted()
1311 vereq(Counted.counter, 3)
1312 del x
1313 vereq(Counted.counter, 0)
1314
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001315 # Test cyclical leaks [SF bug 519621]
1316 class F(object):
1317 __slots__ = ['a', 'b']
1318 log = []
1319 s = F()
1320 s.a = [Counted(), s]
1321 vereq(Counted.counter, 1)
1322 s = None
1323 import gc
1324 gc.collect()
1325 vereq(Counted.counter, 0)
1326
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001327 # Test lookup leaks [SF bug 572567]
1328 import sys,gc
1329 class G(object):
1330 def __cmp__(self, other):
1331 return 0
1332 g = G()
1333 orig_objects = len(gc.get_objects())
1334 for i in xrange(10):
1335 g==g
1336 new_objects = len(gc.get_objects())
1337 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001338 class H(object):
1339 __slots__ = ['a', 'b']
1340 def __init__(self):
1341 self.a = 1
1342 self.b = 2
1343 def __del__(self):
1344 assert self.a == 1
1345 assert self.b == 2
1346
1347 save_stderr = sys.stderr
1348 sys.stderr = sys.stdout
1349 h = H()
1350 try:
1351 del h
1352 finally:
1353 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001354
Guido van Rossum8b056da2002-08-13 18:26:26 +00001355def slotspecials():
1356 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1357
1358 class D(object):
1359 __slots__ = ["__dict__"]
1360 a = D()
1361 verify(hasattr(a, "__dict__"))
1362 verify(not hasattr(a, "__weakref__"))
1363 a.foo = 42
1364 vereq(a.__dict__, {"foo": 42})
1365
1366 class W(object):
1367 __slots__ = ["__weakref__"]
1368 a = W()
1369 verify(hasattr(a, "__weakref__"))
1370 verify(not hasattr(a, "__dict__"))
1371 try:
1372 a.foo = 42
1373 except AttributeError:
1374 pass
1375 else:
1376 raise TestFailed, "shouldn't be allowed to set a.foo"
1377
1378 class C1(W, D):
1379 __slots__ = []
1380 a = C1()
1381 verify(hasattr(a, "__dict__"))
1382 verify(hasattr(a, "__weakref__"))
1383 a.foo = 42
1384 vereq(a.__dict__, {"foo": 42})
1385
1386 class C2(D, W):
1387 __slots__ = []
1388 a = C2()
1389 verify(hasattr(a, "__dict__"))
1390 verify(hasattr(a, "__weakref__"))
1391 a.foo = 42
1392 vereq(a.__dict__, {"foo": 42})
1393
Guido van Rossum9a818922002-11-14 19:50:14 +00001394# MRO order disagreement
1395#
1396# class C3(C1, C2):
1397# __slots__ = []
1398#
1399# class C4(C2, C1):
1400# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001401
Tim Peters6d6c1a32001-08-02 04:15:00 +00001402def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001403 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001404 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001405 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001406 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001407 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001408 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001409 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001410 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001411 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001412 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001413 vereq(E.foo, 1)
1414 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001415 # Test dynamic instances
1416 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001417 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001418 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001419 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001420 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001421 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001422 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001423 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001424 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001425 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001426 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001427 vereq(int(a), 100)
1428 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001429 verify(not hasattr(a, "spam"))
1430 def mygetattr(self, name):
1431 if name == "spam":
1432 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001433 raise AttributeError
1434 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001435 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001436 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001437 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001438 def mysetattr(self, name, value):
1439 if name == "spam":
1440 raise AttributeError
1441 return object.__setattr__(self, name, value)
1442 C.__setattr__ = mysetattr
1443 try:
1444 a.spam = "not spam"
1445 except AttributeError:
1446 pass
1447 else:
1448 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001449 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001450 class D(C):
1451 pass
1452 d = D()
1453 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001454 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001455
Guido van Rossum7e35d572001-09-15 03:14:32 +00001456 # Test handling of int*seq and seq*int
1457 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001458 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001459 vereq("a"*I(2), "aa")
1460 vereq(I(2)*"a", "aa")
1461 vereq(2*I(3), 6)
1462 vereq(I(3)*2, 6)
1463 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001464
1465 # Test handling of long*seq and seq*long
1466 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001467 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001468 vereq("a"*L(2L), "aa")
1469 vereq(L(2L)*"a", "aa")
1470 vereq(2*L(3), 6)
1471 vereq(L(3)*2, 6)
1472 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001473
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001474 # Test comparison of classes with dynamic metaclasses
1475 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001476 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001477 class someclass:
1478 __metaclass__ = dynamicmetaclass
1479 verify(someclass != object)
1480
Tim Peters6d6c1a32001-08-02 04:15:00 +00001481def errors():
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001482 if verbose: print "Testing errors..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001483
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001484 try:
1485 class C(list, dict):
1486 pass
1487 except TypeError:
1488 pass
1489 else:
1490 verify(0, "inheritance from both list and dict should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001491
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001492 try:
1493 class C(object, None):
1494 pass
1495 except TypeError:
1496 pass
1497 else:
1498 verify(0, "inheritance from non-type should be illegal")
1499 class Classic:
1500 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001501
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001502 try:
1503 class C(type(len)):
1504 pass
1505 except TypeError:
1506 pass
1507 else:
1508 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001510 try:
1511 class C(object):
1512 __slots__ = 1
1513 except TypeError:
1514 pass
1515 else:
1516 verify(0, "__slots__ = 1 should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001517
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001518 try:
1519 class C(object):
1520 __slots__ = [1]
1521 except TypeError:
1522 pass
1523 else:
1524 verify(0, "__slots__ = [1] should be illegal")
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001525
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001526 class M1(type):
1527 pass
1528 class M2(type):
1529 pass
1530 class A1(object):
1531 __metaclass__ = M1
1532 class A2(object):
1533 __metaclass__ = M2
1534 try:
1535 class B(A1, A2):
1536 pass
1537 except TypeError:
1538 pass
1539 else:
1540 verify(0, "finding the most derived metaclass should have failed")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001541
1542def classmethods():
1543 if verbose: print "Testing class methods..."
1544 class C(object):
1545 def foo(*a): return a
1546 goo = classmethod(foo)
1547 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001548 vereq(C.goo(1), (C, 1))
1549 vereq(c.goo(1), (C, 1))
1550 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001551 class D(C):
1552 pass
1553 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001554 vereq(D.goo(1), (D, 1))
1555 vereq(d.goo(1), (D, 1))
1556 vereq(d.foo(1), (d, 1))
1557 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001558 # Test for a specific crash (SF bug 528132)
1559 def f(cls, arg): return (cls, arg)
1560 ff = classmethod(f)
1561 vereq(ff.__get__(0, int)(42), (int, 42))
1562 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001563
Guido van Rossum155db9a2002-04-02 17:53:47 +00001564 # Test super() with classmethods (SF bug 535444)
1565 veris(C.goo.im_self, C)
1566 veris(D.goo.im_self, D)
1567 veris(super(D,D).goo.im_self, D)
1568 veris(super(D,d).goo.im_self, D)
1569 vereq(super(D,D).goo(), (D,))
1570 vereq(super(D,d).goo(), (D,))
1571
Raymond Hettingerbe971532003-06-18 01:13:41 +00001572 # Verify that argument is checked for callability (SF bug 753451)
1573 try:
1574 classmethod(1).__get__(1)
1575 except TypeError:
1576 pass
1577 else:
1578 raise TestFailed, "classmethod should check for callability"
1579
Georg Brandl6a29c322006-02-21 22:17:46 +00001580 # Verify that classmethod() doesn't allow keyword args
1581 try:
1582 classmethod(f, kw=1)
1583 except TypeError:
1584 pass
1585 else:
1586 raise TestFailed, "classmethod shouldn't accept keyword args"
1587
Fred Drakef841aa62002-03-28 15:49:54 +00001588def classmethods_in_c():
1589 if verbose: print "Testing C-based class methods..."
1590 import xxsubtype as spam
1591 a = (1, 2, 3)
1592 d = {'abc': 123}
1593 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001594 veris(x, spam.spamlist)
1595 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001596 vereq(d, d1)
1597 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001598 veris(x, spam.spamlist)
1599 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001600 vereq(d, d1)
1601
Tim Peters6d6c1a32001-08-02 04:15:00 +00001602def staticmethods():
1603 if verbose: print "Testing static methods..."
1604 class C(object):
1605 def foo(*a): return a
1606 goo = staticmethod(foo)
1607 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001608 vereq(C.goo(1), (1,))
1609 vereq(c.goo(1), (1,))
1610 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001611 class D(C):
1612 pass
1613 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001614 vereq(D.goo(1), (1,))
1615 vereq(d.goo(1), (1,))
1616 vereq(d.foo(1), (d, 1))
1617 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001618
Fred Drakef841aa62002-03-28 15:49:54 +00001619def staticmethods_in_c():
1620 if verbose: print "Testing C-based static methods..."
1621 import xxsubtype as spam
1622 a = (1, 2, 3)
1623 d = {"abc": 123}
1624 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1625 veris(x, None)
1626 vereq(a, a1)
1627 vereq(d, d1)
1628 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1629 veris(x, None)
1630 vereq(a, a1)
1631 vereq(d, d1)
1632
Tim Peters6d6c1a32001-08-02 04:15:00 +00001633def classic():
1634 if verbose: print "Testing classic classes..."
1635 class C:
1636 def foo(*a): return a
1637 goo = classmethod(foo)
1638 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001639 vereq(C.goo(1), (C, 1))
1640 vereq(c.goo(1), (C, 1))
1641 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001642 class D(C):
1643 pass
1644 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001645 vereq(D.goo(1), (D, 1))
1646 vereq(d.goo(1), (D, 1))
1647 vereq(d.foo(1), (d, 1))
1648 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001649 class E: # *not* subclassing from C
1650 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001651 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001652 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001653
1654def compattr():
1655 if verbose: print "Testing computed attributes..."
1656 class C(object):
1657 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001658 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001659 self.__get = get
1660 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001661 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001662 def __get__(self, obj, type=None):
1663 return self.__get(obj)
1664 def __set__(self, obj, value):
1665 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001666 def __delete__(self, obj):
1667 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001668 def __init__(self):
1669 self.__x = 0
1670 def __get_x(self):
1671 x = self.__x
1672 self.__x = x+1
1673 return x
1674 def __set_x(self, x):
1675 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001676 def __delete_x(self):
1677 del self.__x
1678 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001679 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001680 vereq(a.x, 0)
1681 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001682 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq(a.x, 10)
1684 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001685 del a.x
1686 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001687
1688def newslot():
1689 if verbose: print "Testing __new__ slot override..."
1690 class C(list):
1691 def __new__(cls):
1692 self = list.__new__(cls)
1693 self.foo = 1
1694 return self
1695 def __init__(self):
1696 self.foo = self.foo + 2
1697 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001698 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001699 verify(a.__class__ is C)
1700 class D(C):
1701 pass
1702 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001703 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001704 verify(b.__class__ is D)
1705
Tim Peters6d6c1a32001-08-02 04:15:00 +00001706def altmro():
1707 if verbose: print "Testing mro() and overriding it..."
1708 class A(object):
1709 def f(self): return "A"
1710 class B(A):
1711 pass
1712 class C(A):
1713 def f(self): return "C"
1714 class D(B, C):
1715 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001716 vereq(D.mro(), [D, B, C, A, object])
1717 vereq(D.__mro__, (D, B, C, A, object))
1718 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001719
Guido van Rossumd3077402001-08-12 05:24:18 +00001720 class PerverseMetaType(type):
1721 def mro(cls):
1722 L = type.mro(cls)
1723 L.reverse()
1724 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001725 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001726 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001727 vereq(X.__mro__, (object, A, C, B, D, X))
1728 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001729
Armin Rigo037d1e02005-12-29 17:07:39 +00001730 try:
1731 class X(object):
1732 class __metaclass__(type):
1733 def mro(self):
1734 return [self, dict, object]
1735 except TypeError:
1736 pass
1737 else:
1738 raise TestFailed, "devious mro() return not caught"
1739
1740 try:
1741 class X(object):
1742 class __metaclass__(type):
1743 def mro(self):
1744 return [1]
1745 except TypeError:
1746 pass
1747 else:
1748 raise TestFailed, "non-class mro() return not caught"
1749
1750 try:
1751 class X(object):
1752 class __metaclass__(type):
1753 def mro(self):
1754 return 1
1755 except TypeError:
1756 pass
1757 else:
1758 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001759
Armin Rigo037d1e02005-12-29 17:07:39 +00001760
Tim Peters6d6c1a32001-08-02 04:15:00 +00001761def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001762 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001763
1764 class B(object):
1765 "Intermediate class because object doesn't have a __setattr__"
1766
1767 class C(B):
1768
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001769 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001770 if name == "foo":
1771 return ("getattr", name)
1772 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001773 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001774 def __setattr__(self, name, value):
1775 if name == "foo":
1776 self.setattr = (name, value)
1777 else:
1778 return B.__setattr__(self, name, value)
1779 def __delattr__(self, name):
1780 if name == "foo":
1781 self.delattr = name
1782 else:
1783 return B.__delattr__(self, name)
1784
1785 def __getitem__(self, key):
1786 return ("getitem", key)
1787 def __setitem__(self, key, value):
1788 self.setitem = (key, value)
1789 def __delitem__(self, key):
1790 self.delitem = key
1791
1792 def __getslice__(self, i, j):
1793 return ("getslice", i, j)
1794 def __setslice__(self, i, j, value):
1795 self.setslice = (i, j, value)
1796 def __delslice__(self, i, j):
1797 self.delslice = (i, j)
1798
1799 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001800 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001801 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001802 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001803 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001804 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001805
Guido van Rossum45704552001-10-08 16:35:45 +00001806 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001807 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001808 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001809 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001810 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001811
Guido van Rossum45704552001-10-08 16:35:45 +00001812 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001813 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001814 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001815 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001816 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001817
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001818def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001819 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001820 class C(object):
1821 def __init__(self, x):
1822 self.x = x
1823 def foo(self):
1824 return self.x
1825 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001826 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001827 class D(C):
1828 boo = C.foo
1829 goo = c1.foo
1830 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001831 vereq(d2.foo(), 2)
1832 vereq(d2.boo(), 2)
1833 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001834 class E(object):
1835 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001836 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001837 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001838
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001839def specials():
1840 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001841 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001842 # Test the default behavior for static classes
1843 class C(object):
1844 def __getitem__(self, i):
1845 if 0 <= i < 10: return i
1846 raise IndexError
1847 c1 = C()
1848 c2 = C()
1849 verify(not not c1)
Tim Peters85b362f2006-04-11 01:21:00 +00001850 verify(id(c1) != id(c2))
1851 hash(c1)
1852 hash(c2)
Guido van Rossum45704552001-10-08 16:35:45 +00001853 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1854 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001855 verify(c1 != c2)
1856 verify(not c1 != c1)
1857 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001858 # Note that the module name appears in str/repr, and that varies
1859 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001860 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001861 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001862 verify(-1 not in c1)
1863 for i in range(10):
1864 verify(i in c1)
1865 verify(10 not in c1)
1866 # Test the default behavior for dynamic classes
1867 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001868 def __getitem__(self, i):
1869 if 0 <= i < 10: return i
1870 raise IndexError
1871 d1 = D()
1872 d2 = D()
1873 verify(not not d1)
Tim Peters85b362f2006-04-11 01:21:00 +00001874 verify(id(d1) != id(d2))
1875 hash(d1)
1876 hash(d2)
Guido van Rossum45704552001-10-08 16:35:45 +00001877 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1878 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001879 verify(d1 != d2)
1880 verify(not d1 != d1)
1881 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001882 # Note that the module name appears in str/repr, and that varies
1883 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001884 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001885 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001886 verify(-1 not in d1)
1887 for i in range(10):
1888 verify(i in d1)
1889 verify(10 not in d1)
1890 # Test overridden behavior for static classes
1891 class Proxy(object):
1892 def __init__(self, x):
1893 self.x = x
1894 def __nonzero__(self):
1895 return not not self.x
1896 def __hash__(self):
1897 return hash(self.x)
1898 def __eq__(self, other):
1899 return self.x == other
1900 def __ne__(self, other):
1901 return self.x != other
1902 def __cmp__(self, other):
1903 return cmp(self.x, other.x)
1904 def __str__(self):
1905 return "Proxy:%s" % self.x
1906 def __repr__(self):
1907 return "Proxy(%r)" % self.x
1908 def __contains__(self, value):
1909 return value in self.x
1910 p0 = Proxy(0)
1911 p1 = Proxy(1)
1912 p_1 = Proxy(-1)
1913 verify(not p0)
1914 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001915 vereq(hash(p0), hash(0))
1916 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001917 verify(p0 != p1)
1918 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001919 vereq(not p0, p1)
1920 vereq(cmp(p0, p1), -1)
1921 vereq(cmp(p0, p0), 0)
1922 vereq(cmp(p0, p_1), 1)
1923 vereq(str(p0), "Proxy:0")
1924 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001925 p10 = Proxy(range(10))
1926 verify(-1 not in p10)
1927 for i in range(10):
1928 verify(i in p10)
1929 verify(10 not in p10)
1930 # Test overridden behavior for dynamic classes
1931 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001932 def __init__(self, x):
1933 self.x = x
1934 def __nonzero__(self):
1935 return not not self.x
1936 def __hash__(self):
1937 return hash(self.x)
1938 def __eq__(self, other):
1939 return self.x == other
1940 def __ne__(self, other):
1941 return self.x != other
1942 def __cmp__(self, other):
1943 return cmp(self.x, other.x)
1944 def __str__(self):
1945 return "DProxy:%s" % self.x
1946 def __repr__(self):
1947 return "DProxy(%r)" % self.x
1948 def __contains__(self, value):
1949 return value in self.x
1950 p0 = DProxy(0)
1951 p1 = DProxy(1)
1952 p_1 = DProxy(-1)
1953 verify(not p0)
1954 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001955 vereq(hash(p0), hash(0))
1956 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001957 verify(p0 != p1)
1958 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001959 vereq(not p0, p1)
1960 vereq(cmp(p0, p1), -1)
1961 vereq(cmp(p0, p0), 0)
1962 vereq(cmp(p0, p_1), 1)
1963 vereq(str(p0), "DProxy:0")
1964 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001965 p10 = DProxy(range(10))
1966 verify(-1 not in p10)
1967 for i in range(10):
1968 verify(i in p10)
1969 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001970 # Safety test for __cmp__
1971 def unsafecmp(a, b):
1972 try:
1973 a.__class__.__cmp__(a, b)
1974 except TypeError:
1975 pass
1976 else:
1977 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1978 a.__class__, a, b)
1979 unsafecmp(u"123", "123")
1980 unsafecmp("123", u"123")
1981 unsafecmp(1, 1.0)
1982 unsafecmp(1.0, 1)
1983 unsafecmp(1, 1L)
1984 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001985
Brett Cannon1e534b52007-09-07 04:18:30 +00001986def recursions():
1987 if verbose:
1988 print "Testing recursion checks ..."
1989
Neal Norwitz1a997502003-01-13 20:13:12 +00001990 class Letter(str):
1991 def __new__(cls, letter):
1992 if letter == 'EPS':
1993 return str.__new__(cls)
1994 return str.__new__(cls, letter)
1995 def __str__(self):
1996 if not self:
1997 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001998 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001999 # sys.stdout needs to be the original to trigger the recursion bug
2000 import sys
2001 test_stdout = sys.stdout
2002 sys.stdout = get_original_stdout()
2003 try:
2004 # nothing should actually be printed, this should raise an exception
2005 print Letter('w')
2006 except RuntimeError:
2007 pass
2008 else:
2009 raise TestFailed, "expected a RuntimeError for print recursion"
2010 sys.stdout = test_stdout
2011
Brett Cannon1e534b52007-09-07 04:18:30 +00002012 # Bug #1202533.
2013 class A(object):
2014 pass
Christian Heimes636afc52007-11-27 23:53:14 +00002015 A.__mul__ = types.MethodType(lambda self, x: self * x, None, A)
Brett Cannon1e534b52007-09-07 04:18:30 +00002016 try:
2017 A()*2
2018 except RuntimeError:
2019 pass
2020 else:
2021 raise TestFailed("expected a RuntimeError")
2022
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002023def weakrefs():
2024 if verbose: print "Testing weak references..."
2025 import weakref
2026 class C(object):
2027 pass
2028 c = C()
2029 r = weakref.ref(c)
2030 verify(r() is c)
2031 del c
2032 verify(r() is None)
2033 del r
2034 class NoWeak(object):
2035 __slots__ = ['foo']
2036 no = NoWeak()
2037 try:
2038 weakref.ref(no)
2039 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00002040 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002041 else:
2042 verify(0, "weakref.ref(no) should be illegal")
2043 class Weak(object):
2044 __slots__ = ['foo', '__weakref__']
2045 yes = Weak()
2046 r = weakref.ref(yes)
2047 verify(r() is yes)
2048 del yes
2049 verify(r() is None)
2050 del r
2051
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002052def properties():
2053 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002054 class C(object):
2055 def getx(self):
2056 return self.__x
2057 def setx(self, value):
2058 self.__x = value
2059 def delx(self):
2060 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00002061 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002062 a = C()
2063 verify(not hasattr(a, "x"))
2064 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00002065 vereq(a._C__x, 42)
2066 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002067 del a.x
2068 verify(not hasattr(a, "x"))
2069 verify(not hasattr(a, "_C__x"))
2070 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00002071 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00002072 C.x.__delete__(a)
2073 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002074
Tim Peters66c1a522001-09-24 21:17:50 +00002075 raw = C.__dict__['x']
2076 verify(isinstance(raw, property))
2077
2078 attrs = dir(raw)
2079 verify("__doc__" in attrs)
2080 verify("fget" in attrs)
2081 verify("fset" in attrs)
2082 verify("fdel" in attrs)
2083
Guido van Rossum45704552001-10-08 16:35:45 +00002084 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00002085 verify(raw.fget is C.__dict__['getx'])
2086 verify(raw.fset is C.__dict__['setx'])
2087 verify(raw.fdel is C.__dict__['delx'])
2088
2089 for attr in "__doc__", "fget", "fset", "fdel":
2090 try:
2091 setattr(raw, attr, 42)
2092 except TypeError, msg:
2093 if str(msg).find('readonly') < 0:
2094 raise TestFailed("when setting readonly attr %r on a "
2095 "property, got unexpected TypeError "
2096 "msg %r" % (attr, str(msg)))
2097 else:
2098 raise TestFailed("expected TypeError from trying to set "
2099 "readonly %r attr on a property" % attr)
2100
Neal Norwitz673cd822002-10-18 16:33:13 +00002101 class D(object):
2102 __getitem__ = property(lambda s: 1/0)
2103
2104 d = D()
2105 try:
2106 for i in d:
2107 str(i)
2108 except ZeroDivisionError:
2109 pass
2110 else:
2111 raise TestFailed, "expected ZeroDivisionError from bad property"
2112
Georg Brandl533ff6f2006-03-08 18:09:27 +00002113 class E(object):
2114 def getter(self):
2115 "getter method"
2116 return 0
2117 def setter(self, value):
2118 "setter method"
2119 pass
2120 prop = property(getter)
2121 vereq(prop.__doc__, "getter method")
2122 prop2 = property(fset=setter)
2123 vereq(prop2.__doc__, None)
2124
Georg Brandle9462c72006-08-04 18:03:37 +00002125 # this segfaulted in 2.5b2
2126 try:
2127 import _testcapi
2128 except ImportError:
2129 pass
2130 else:
2131 class X(object):
2132 p = property(_testcapi.test_with_docstring)
2133
2134
Guido van Rossumd1ef7892007-11-10 22:12:24 +00002135def properties_plus():
Brett Cannon4e438bc2007-12-25 00:14:34 +00002136 class C(object):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00002137 foo = property(doc="hello")
2138 @foo.getter
2139 def foo(self):
2140 return self._foo
2141 @foo.setter
2142 def foo(self, value):
2143 self._foo = abs(value)
2144 @foo.deleter
2145 def foo(self):
2146 del self._foo
2147 c = C()
2148 assert C.foo.__doc__ == "hello"
2149 assert not hasattr(c, "foo")
2150 c.foo = -42
Brett Cannon4e438bc2007-12-25 00:14:34 +00002151 assert hasattr(c, '_foo')
2152 assert c._foo == 42
Guido van Rossumd1ef7892007-11-10 22:12:24 +00002153 assert c.foo == 42
2154 del c.foo
Brett Cannon4e438bc2007-12-25 00:14:34 +00002155 assert not hasattr(c, '_foo')
Guido van Rossumd1ef7892007-11-10 22:12:24 +00002156 assert not hasattr(c, "foo")
2157
2158 class D(C):
2159 @C.foo.deleter
2160 def foo(self):
2161 try:
2162 del self._foo
2163 except AttributeError:
2164 pass
2165 d = D()
2166 d.foo = 24
2167 assert d.foo == 24
2168 del d.foo
2169 del d.foo
2170
Brett Cannon4e438bc2007-12-25 00:14:34 +00002171 class E(object):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00002172 @property
2173 def foo(self):
2174 return self._foo
2175 @foo.setter
Brett Cannon4e438bc2007-12-25 00:14:34 +00002176 def foo(self, value):
Guido van Rossumd1ef7892007-11-10 22:12:24 +00002177 raise RuntimeError
2178 @foo.setter
Brett Cannon4e438bc2007-12-25 00:14:34 +00002179 def foo(self, value):
2180 self._foo = abs(value)
Guido van Rossumd1ef7892007-11-10 22:12:24 +00002181 @foo.deleter
2182 def foo(self, value=None):
Brett Cannon4e438bc2007-12-25 00:14:34 +00002183 del self._foo
2184
Guido van Rossumd1ef7892007-11-10 22:12:24 +00002185 e = E()
2186 e.foo = -42
2187 assert e.foo == 42
2188 del e.foo
2189
2190 class F(E):
2191 @E.foo.deleter
2192 def foo(self):
2193 del self._foo
2194 @foo.setter
2195 def foo(self, value):
2196 self._foo = max(0, value)
2197 f = F()
2198 f.foo = -10
2199 assert f.foo == 0
2200 del f.foo
2201
2202
Guido van Rossumc4a18802001-08-24 16:55:27 +00002203def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00002204 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00002205
2206 class A(object):
2207 def meth(self, a):
2208 return "A(%r)" % a
2209
Guido van Rossum45704552001-10-08 16:35:45 +00002210 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002211
2212 class B(A):
2213 def __init__(self):
2214 self.__super = super(B, self)
2215 def meth(self, a):
2216 return "B(%r)" % a + self.__super.meth(a)
2217
Guido van Rossum45704552001-10-08 16:35:45 +00002218 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002219
2220 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002221 def meth(self, a):
2222 return "C(%r)" % a + self.__super.meth(a)
2223 C._C__super = super(C)
2224
Guido van Rossum45704552001-10-08 16:35:45 +00002225 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002226
2227 class D(C, B):
2228 def meth(self, a):
2229 return "D(%r)" % a + super(D, self).meth(a)
2230
Guido van Rossum5b443c62001-12-03 15:38:28 +00002231 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2232
2233 # Test for subclassing super
2234
2235 class mysuper(super):
2236 def __init__(self, *args):
2237 return super(mysuper, self).__init__(*args)
2238
2239 class E(D):
2240 def meth(self, a):
2241 return "E(%r)" % a + mysuper(E, self).meth(a)
2242
2243 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2244
2245 class F(E):
2246 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002247 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002248 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2249 F._F__super = mysuper(F)
2250
2251 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2252
2253 # Make sure certain errors are raised
2254
2255 try:
2256 super(D, 42)
2257 except TypeError:
2258 pass
2259 else:
2260 raise TestFailed, "shouldn't allow super(D, 42)"
2261
2262 try:
2263 super(D, C())
2264 except TypeError:
2265 pass
2266 else:
2267 raise TestFailed, "shouldn't allow super(D, C())"
2268
2269 try:
2270 super(D).__get__(12)
2271 except TypeError:
2272 pass
2273 else:
2274 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2275
2276 try:
2277 super(D).__get__(C())
2278 except TypeError:
2279 pass
2280 else:
2281 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002282
Guido van Rossuma4541a32003-04-16 20:02:22 +00002283 # Make sure data descriptors can be overridden and accessed via super
2284 # (new feature in Python 2.3)
2285
2286 class DDbase(object):
2287 def getx(self): return 42
2288 x = property(getx)
2289
2290 class DDsub(DDbase):
2291 def getx(self): return "hello"
2292 x = property(getx)
2293
2294 dd = DDsub()
2295 vereq(dd.x, "hello")
2296 vereq(super(DDsub, dd).x, 42)
2297
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002298 # Ensure that super() lookup of descriptor from classmethod
2299 # works (SF ID# 743627)
2300
2301 class Base(object):
2302 aProp = property(lambda self: "foo")
2303
2304 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002305 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002306 def test(klass):
2307 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002308
2309 veris(Sub.test(), Base.aProp)
2310
Georg Brandl5d59c092006-09-30 08:43:30 +00002311 # Verify that super() doesn't allow keyword args
2312 try:
2313 super(Base, kw=1)
2314 except TypeError:
2315 pass
2316 else:
2317 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002318
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002319def inherits():
2320 if verbose: print "Testing inheritance from basic types..."
2321
2322 class hexint(int):
2323 def __repr__(self):
2324 return hex(self)
2325 def __add__(self, other):
2326 return hexint(int.__add__(self, other))
2327 # (Note that overriding __radd__ doesn't work,
2328 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002329 vereq(repr(hexint(7) + 9), "0x10")
2330 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002331 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002332 vereq(a, 12345)
2333 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002334 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002335 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002336 verify((+a).__class__ is int)
2337 verify((a >> 0).__class__ is int)
2338 verify((a << 0).__class__ is int)
2339 verify((hexint(0) << 12).__class__ is int)
2340 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002341
2342 class octlong(long):
2343 __slots__ = []
2344 def __str__(self):
2345 s = oct(self)
2346 if s[-1] == 'L':
2347 s = s[:-1]
2348 return s
2349 def __add__(self, other):
2350 return self.__class__(super(octlong, self).__add__(other))
2351 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002352 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002353 # (Note that overriding __radd__ here only seems to work
2354 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002356 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(a, 12345L)
2358 vereq(long(a), 12345L)
2359 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002360 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002361 verify((+a).__class__ is long)
2362 verify((-a).__class__ is long)
2363 verify((-octlong(0)).__class__ is long)
2364 verify((a >> 0).__class__ is long)
2365 verify((a << 0).__class__ is long)
2366 verify((a - 0).__class__ is long)
2367 verify((a * 1).__class__ is long)
2368 verify((a ** 1).__class__ is long)
2369 verify((a // 1).__class__ is long)
2370 verify((1 * a).__class__ is long)
2371 verify((a | 0).__class__ is long)
2372 verify((a ^ 0).__class__ is long)
2373 verify((a & -1L).__class__ is long)
2374 verify((octlong(0) << 12).__class__ is long)
2375 verify((octlong(0) >> 12).__class__ is long)
2376 verify(abs(octlong(0)).__class__ is long)
2377
2378 # Because octlong overrides __add__, we can't check the absence of +0
2379 # optimizations using octlong.
2380 class longclone(long):
2381 pass
2382 a = longclone(1)
2383 verify((a + 0).__class__ is long)
2384 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002385
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002386 # Check that negative clones don't segfault
2387 a = longclone(-1)
2388 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002389 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002390
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002391 class precfloat(float):
2392 __slots__ = ['prec']
2393 def __init__(self, value=0.0, prec=12):
2394 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002395 def __repr__(self):
2396 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002397 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002398 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002399 vereq(a, 12345.0)
2400 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002401 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002402 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002403 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002404
Tim Peters2400fa42001-09-12 19:12:49 +00002405 class madcomplex(complex):
2406 def __repr__(self):
2407 return "%.17gj%+.17g" % (self.imag, self.real)
2408 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002409 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002410 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002411 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002412 vereq(a, base)
2413 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002414 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002415 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002416 vereq(repr(a), "4j-3")
2417 vereq(a, base)
2418 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002419 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002420 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002421 veris((+a).__class__, complex)
2422 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002423 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002424 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002425 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002426 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002427 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002428 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002429 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002430
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002431 class madtuple(tuple):
2432 _rev = None
2433 def rev(self):
2434 if self._rev is not None:
2435 return self._rev
2436 L = list(self)
2437 L.reverse()
2438 self._rev = self.__class__(L)
2439 return self._rev
2440 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002441 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2442 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2443 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002444 for i in range(512):
2445 t = madtuple(range(i))
2446 u = t.rev()
2447 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002448 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002449 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002450 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002451 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002452 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002453 verify(a[:].__class__ is tuple)
2454 verify((a * 1).__class__ is tuple)
2455 verify((a * 0).__class__ is tuple)
2456 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002457 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002458 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002459 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002460 verify((a + a).__class__ is tuple)
2461 verify((a * 0).__class__ is tuple)
2462 verify((a * 1).__class__ is tuple)
2463 verify((a * 2).__class__ is tuple)
2464 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002465
2466 class madstring(str):
2467 _rev = None
2468 def rev(self):
2469 if self._rev is not None:
2470 return self._rev
2471 L = list(self)
2472 L.reverse()
2473 self._rev = self.__class__("".join(L))
2474 return self._rev
2475 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002476 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2477 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2478 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002479 for i in range(256):
2480 s = madstring("".join(map(chr, range(i))))
2481 t = s.rev()
2482 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002483 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002484 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002485 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002486 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002487
Tim Peters8fa5dd02001-09-12 02:18:30 +00002488 base = "\x00" * 5
2489 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002490 vereq(s, base)
2491 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002492 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002493 vereq(hash(s), hash(base))
2494 vereq({s: 1}[base], 1)
2495 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002496 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002497 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002498 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002499 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002500 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002501 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002502 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002503 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002504 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002505 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002506 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002507 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002508 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002509 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002510 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002511 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002512 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002513 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002514 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002515 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002516 identitytab = ''.join([chr(i) for i in range(256)])
2517 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002518 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002519 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002520 vereq(s.translate(identitytab, "x"), base)
2521 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002522 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002523 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002524 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002525 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002526 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002527 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002528 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002529 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002530 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002531 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002532
Guido van Rossum91ee7982001-08-30 20:52:40 +00002533 class madunicode(unicode):
2534 _rev = None
2535 def rev(self):
2536 if self._rev is not None:
2537 return self._rev
2538 L = list(self)
2539 L.reverse()
2540 self._rev = self.__class__(u"".join(L))
2541 return self._rev
2542 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002543 vereq(u, u"ABCDEF")
2544 vereq(u.rev(), madunicode(u"FEDCBA"))
2545 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002546 base = u"12345"
2547 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002548 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002549 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002550 vereq(hash(u), hash(base))
2551 vereq({u: 1}[base], 1)
2552 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002553 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002554 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002555 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002556 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002557 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002558 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002559 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002560 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002561 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002562 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002563 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002564 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002565 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002566 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002567 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002568 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002569 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002570 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002571 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002572 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002573 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002574 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002575 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002576 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002577 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002578 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002579 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002580 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002581 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002582 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002583 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002584 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002585 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002586 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002587 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002588 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002589 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002590 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002591
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002592 class sublist(list):
2593 pass
2594 a = sublist(range(5))
2595 vereq(a, range(5))
2596 a.append("hello")
2597 vereq(a, range(5) + ["hello"])
2598 a[5] = 5
2599 vereq(a, range(6))
2600 a.extend(range(6, 20))
2601 vereq(a, range(20))
2602 a[-5:] = []
2603 vereq(a, range(15))
2604 del a[10:15]
2605 vereq(len(a), 10)
2606 vereq(a, range(10))
2607 vereq(list(a), range(10))
2608 vereq(a[0], 0)
2609 vereq(a[9], 9)
2610 vereq(a[-10], 0)
2611 vereq(a[-1], 9)
2612 vereq(a[:5], range(5))
2613
Tim Peters59c9a642001-09-13 05:38:56 +00002614 class CountedInput(file):
2615 """Counts lines read by self.readline().
2616
2617 self.lineno is the 0-based ordinal of the last line read, up to
2618 a maximum of one greater than the number of lines in the file.
2619
2620 self.ateof is true if and only if the final "" line has been read,
2621 at which point self.lineno stops incrementing, and further calls
2622 to readline() continue to return "".
2623 """
2624
2625 lineno = 0
2626 ateof = 0
2627 def readline(self):
2628 if self.ateof:
2629 return ""
2630 s = file.readline(self)
2631 # Next line works too.
2632 # s = super(CountedInput, self).readline()
2633 self.lineno += 1
2634 if s == "":
2635 self.ateof = 1
2636 return s
2637
Tim Peters561f8992001-09-13 19:36:36 +00002638 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002639 lines = ['a\n', 'b\n', 'c\n']
2640 try:
2641 f.writelines(lines)
2642 f.close()
2643 f = CountedInput(TESTFN)
2644 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2645 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002646 vereq(expected, got)
2647 vereq(f.lineno, i)
2648 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002649 f.close()
2650 finally:
2651 try:
2652 f.close()
2653 except:
2654 pass
2655 try:
2656 import os
2657 os.unlink(TESTFN)
2658 except:
2659 pass
2660
Tim Peters808b94e2001-09-13 19:33:07 +00002661def keywords():
2662 if verbose:
2663 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002664 vereq(int(x=1), 1)
2665 vereq(float(x=2), 2.0)
2666 vereq(long(x=3), 3L)
2667 vereq(complex(imag=42, real=666), complex(666, 42))
2668 vereq(str(object=500), '500')
2669 vereq(unicode(string='abc', errors='strict'), u'abc')
2670 vereq(tuple(sequence=range(3)), (0, 1, 2))
2671 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002672 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002673
2674 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002675 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002676 try:
2677 constructor(bogus_keyword_arg=1)
2678 except TypeError:
2679 pass
2680 else:
2681 raise TestFailed("expected TypeError from bogus keyword "
2682 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002683
Tim Peters8fa45672001-09-13 21:01:29 +00002684def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002685 # XXX This test is disabled because rexec is not deemed safe
2686 return
Tim Peters8fa45672001-09-13 21:01:29 +00002687 import rexec
2688 if verbose:
2689 print "Testing interaction with restricted execution ..."
2690
2691 sandbox = rexec.RExec()
2692
2693 code1 = """f = open(%r, 'w')""" % TESTFN
2694 code2 = """f = file(%r, 'w')""" % TESTFN
2695 code3 = """\
2696f = open(%r)
2697t = type(f) # a sneaky way to get the file() constructor
2698f.close()
2699f = t(%r, 'w') # rexec can't catch this by itself
2700""" % (TESTFN, TESTFN)
2701
2702 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2703 f.close()
2704
2705 try:
2706 for code in code1, code2, code3:
2707 try:
2708 sandbox.r_exec(code)
2709 except IOError, msg:
2710 if str(msg).find("restricted") >= 0:
2711 outcome = "OK"
2712 else:
2713 outcome = "got an exception, but not an expected one"
2714 else:
2715 outcome = "expected a restricted-execution exception"
2716
2717 if outcome != "OK":
2718 raise TestFailed("%s, in %r" % (outcome, code))
2719
2720 finally:
2721 try:
2722 import os
2723 os.unlink(TESTFN)
2724 except:
2725 pass
2726
Tim Peters0ab085c2001-09-14 00:25:33 +00002727def str_subclass_as_dict_key():
2728 if verbose:
2729 print "Testing a str subclass used as dict key .."
2730
2731 class cistr(str):
2732 """Sublcass of str that computes __eq__ case-insensitively.
2733
2734 Also computes a hash code of the string in canonical form.
2735 """
2736
2737 def __init__(self, value):
2738 self.canonical = value.lower()
2739 self.hashcode = hash(self.canonical)
2740
2741 def __eq__(self, other):
2742 if not isinstance(other, cistr):
2743 other = cistr(other)
2744 return self.canonical == other.canonical
2745
2746 def __hash__(self):
2747 return self.hashcode
2748
Guido van Rossum45704552001-10-08 16:35:45 +00002749 vereq(cistr('ABC'), 'abc')
2750 vereq('aBc', cistr('ABC'))
2751 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002752
2753 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002754 vereq(d[cistr('one')], 1)
2755 vereq(d[cistr('tWo')], 2)
2756 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002757 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002758 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002759
Guido van Rossumab3b0342001-09-18 20:38:53 +00002760def classic_comparisons():
2761 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002762 class classic:
2763 pass
2764 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002765 if verbose: print " (base = %s)" % base
2766 class C(base):
2767 def __init__(self, value):
2768 self.value = int(value)
2769 def __cmp__(self, other):
2770 if isinstance(other, C):
2771 return cmp(self.value, other.value)
2772 if isinstance(other, int) or isinstance(other, long):
2773 return cmp(self.value, other)
2774 return NotImplemented
2775 c1 = C(1)
2776 c2 = C(2)
2777 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002778 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002779 c = {1: c1, 2: c2, 3: c3}
2780 for x in 1, 2, 3:
2781 for y in 1, 2, 3:
2782 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2783 for op in "<", "<=", "==", "!=", ">", ">=":
2784 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2785 "x=%d, y=%d" % (x, y))
2786 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2787 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2788
Guido van Rossum0639f592001-09-18 21:06:04 +00002789def rich_comparisons():
2790 if verbose:
2791 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002792 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002793 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002794 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002795 vereq(z, 1+0j)
2796 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002797 class ZZ(complex):
2798 def __eq__(self, other):
2799 try:
2800 return abs(self - other) <= 1e-6
2801 except:
2802 return NotImplemented
2803 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002804 vereq(zz, 1+0j)
2805 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002806
Guido van Rossum0639f592001-09-18 21:06:04 +00002807 class classic:
2808 pass
2809 for base in (classic, int, object, list):
2810 if verbose: print " (base = %s)" % base
2811 class C(base):
2812 def __init__(self, value):
2813 self.value = int(value)
2814 def __cmp__(self, other):
2815 raise TestFailed, "shouldn't call __cmp__"
2816 def __eq__(self, other):
2817 if isinstance(other, C):
2818 return self.value == other.value
2819 if isinstance(other, int) or isinstance(other, long):
2820 return self.value == other
2821 return NotImplemented
2822 def __ne__(self, other):
2823 if isinstance(other, C):
2824 return self.value != other.value
2825 if isinstance(other, int) or isinstance(other, long):
2826 return self.value != other
2827 return NotImplemented
2828 def __lt__(self, other):
2829 if isinstance(other, C):
2830 return self.value < other.value
2831 if isinstance(other, int) or isinstance(other, long):
2832 return self.value < other
2833 return NotImplemented
2834 def __le__(self, other):
2835 if isinstance(other, C):
2836 return self.value <= other.value
2837 if isinstance(other, int) or isinstance(other, long):
2838 return self.value <= other
2839 return NotImplemented
2840 def __gt__(self, other):
2841 if isinstance(other, C):
2842 return self.value > other.value
2843 if isinstance(other, int) or isinstance(other, long):
2844 return self.value > other
2845 return NotImplemented
2846 def __ge__(self, other):
2847 if isinstance(other, C):
2848 return self.value >= other.value
2849 if isinstance(other, int) or isinstance(other, long):
2850 return self.value >= other
2851 return NotImplemented
2852 c1 = C(1)
2853 c2 = C(2)
2854 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002855 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002856 c = {1: c1, 2: c2, 3: c3}
2857 for x in 1, 2, 3:
2858 for y in 1, 2, 3:
2859 for op in "<", "<=", "==", "!=", ">", ">=":
2860 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2861 "x=%d, y=%d" % (x, y))
2862 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2863 "x=%d, y=%d" % (x, y))
2864 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2865 "x=%d, y=%d" % (x, y))
2866
Guido van Rossum1952e382001-09-19 01:25:16 +00002867def coercions():
2868 if verbose: print "Testing coercions..."
2869 class I(int): pass
2870 coerce(I(0), 0)
2871 coerce(0, I(0))
2872 class L(long): pass
2873 coerce(L(0), 0)
2874 coerce(L(0), 0L)
2875 coerce(0, L(0))
2876 coerce(0L, L(0))
2877 class F(float): pass
2878 coerce(F(0), 0)
2879 coerce(F(0), 0L)
2880 coerce(F(0), 0.)
2881 coerce(0, F(0))
2882 coerce(0L, F(0))
2883 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002884 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002885 coerce(C(0), 0)
2886 coerce(C(0), 0L)
2887 coerce(C(0), 0.)
2888 coerce(C(0), 0j)
2889 coerce(0, C(0))
2890 coerce(0L, C(0))
2891 coerce(0., C(0))
2892 coerce(0j, C(0))
2893
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002894def descrdoc():
2895 if verbose: print "Testing descriptor doc strings..."
2896 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002897 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002898 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002899 check(file.name, "file name") # member descriptor
2900
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002901def setclass():
2902 if verbose: print "Testing __class__ assignment..."
2903 class C(object): pass
2904 class D(object): pass
2905 class E(object): pass
2906 class F(D, E): pass
2907 for cls in C, D, E, F:
2908 for cls2 in C, D, E, F:
2909 x = cls()
2910 x.__class__ = cls2
2911 verify(x.__class__ is cls2)
2912 x.__class__ = cls
2913 verify(x.__class__ is cls)
2914 def cant(x, C):
2915 try:
2916 x.__class__ = C
2917 except TypeError:
2918 pass
2919 else:
2920 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002921 try:
2922 delattr(x, "__class__")
2923 except TypeError:
2924 pass
2925 else:
2926 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002927 cant(C(), list)
2928 cant(list(), C)
2929 cant(C(), 1)
2930 cant(C(), object)
2931 cant(object(), list)
2932 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002933 class Int(int): __slots__ = []
2934 cant(2, Int)
2935 cant(Int(), int)
2936 cant(True, int)
2937 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002938 o = object()
2939 cant(o, type(1))
2940 cant(o, type(None))
2941 del o
Žiga Seilnacht6f2d09c2007-03-16 11:59:38 +00002942 class G(object):
2943 __slots__ = ["a", "b"]
2944 class H(object):
2945 __slots__ = ["b", "a"]
2946 try:
2947 unicode
2948 except NameError:
2949 class I(object):
2950 __slots__ = ["a", "b"]
2951 else:
2952 class I(object):
2953 __slots__ = [unicode("a"), unicode("b")]
2954 class J(object):
2955 __slots__ = ["c", "b"]
2956 class K(object):
2957 __slots__ = ["a", "b", "d"]
2958 class L(H):
2959 __slots__ = ["e"]
2960 class M(I):
2961 __slots__ = ["e"]
2962 class N(J):
2963 __slots__ = ["__weakref__"]
2964 class P(J):
2965 __slots__ = ["__dict__"]
2966 class Q(J):
2967 pass
2968 class R(J):
2969 __slots__ = ["__dict__", "__weakref__"]
2970
2971 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2972 x = cls()
2973 x.a = 1
2974 x.__class__ = cls2
2975 verify(x.__class__ is cls2,
2976 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2977 vereq(x.a, 1)
2978 x.__class__ = cls
2979 verify(x.__class__ is cls,
2980 "assigning %r as __class__ for %r silently failed" % (cls, x))
2981 vereq(x.a, 1)
2982 for cls in G, J, K, L, M, N, P, R, list, Int:
2983 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2984 if cls is cls2:
2985 continue
2986 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002987
Guido van Rossum6661be32001-10-26 04:26:12 +00002988def setdict():
2989 if verbose: print "Testing __dict__ assignment..."
2990 class C(object): pass
2991 a = C()
2992 a.__dict__ = {'b': 1}
2993 vereq(a.b, 1)
2994 def cant(x, dict):
2995 try:
2996 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002997 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002998 pass
2999 else:
3000 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
3001 cant(a, None)
3002 cant(a, [])
3003 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00003004 del a.__dict__ # Deleting __dict__ is allowed
Armin Rigo9790a272007-05-02 19:23:31 +00003005
3006 class Base(object):
3007 pass
3008 def verify_dict_readonly(x):
3009 """
3010 x has to be an instance of a class inheriting from Base.
3011 """
3012 cant(x, {})
3013 try:
3014 del x.__dict__
3015 except (AttributeError, TypeError):
3016 pass
3017 else:
3018 raise TestFailed, "shouldn't allow del %r.__dict__" % x
3019 dict_descr = Base.__dict__["__dict__"]
3020 try:
3021 dict_descr.__set__(x, {})
3022 except (AttributeError, TypeError):
3023 pass
3024 else:
3025 raise TestFailed, "dict_descr allowed access to %r's dict" % x
3026
3027 # Classes don't allow __dict__ assignment and have readonly dicts
3028 class Meta1(type, Base):
3029 pass
3030 class Meta2(Base, type):
3031 pass
3032 class D(object):
3033 __metaclass__ = Meta1
3034 class E(object):
3035 __metaclass__ = Meta2
3036 for cls in C, D, E:
3037 verify_dict_readonly(cls)
3038 class_dict = cls.__dict__
3039 try:
3040 class_dict["spam"] = "eggs"
3041 except TypeError:
3042 pass
3043 else:
3044 raise TestFailed, "%r's __dict__ can be modified" % cls
3045
3046 # Modules also disallow __dict__ assignment
3047 class Module1(types.ModuleType, Base):
3048 pass
3049 class Module2(Base, types.ModuleType):
3050 pass
3051 for ModuleType in Module1, Module2:
3052 mod = ModuleType("spam")
3053 verify_dict_readonly(mod)
3054 mod.__dict__["spam"] = "eggs"
3055
3056 # Exception's __dict__ can be replaced, but not deleted
3057 class Exception1(Exception, Base):
3058 pass
3059 class Exception2(Base, Exception):
3060 pass
3061 for ExceptionType in Exception, Exception1, Exception2:
3062 e = ExceptionType()
3063 e.__dict__ = {"a": 1}
3064 vereq(e.a, 1)
3065 try:
3066 del e.__dict__
3067 except (TypeError, AttributeError):
3068 pass
3069 else:
3070 raise TestFaied, "%r's __dict__ can be deleted" % e
3071
Guido van Rossum6661be32001-10-26 04:26:12 +00003072
Guido van Rossum3926a632001-09-25 16:25:58 +00003073def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003074 if verbose:
3075 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00003076 import pickle, cPickle
3077
3078 def sorteditems(d):
3079 L = d.items()
3080 L.sort()
3081 return L
3082
3083 global C
3084 class C(object):
3085 def __init__(self, a, b):
3086 super(C, self).__init__()
3087 self.a = a
3088 self.b = b
3089 def __repr__(self):
3090 return "C(%r, %r)" % (self.a, self.b)
3091
3092 global C1
3093 class C1(list):
3094 def __new__(cls, a, b):
3095 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00003096 def __getnewargs__(self):
3097 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00003098 def __init__(self, a, b):
3099 self.a = a
3100 self.b = b
3101 def __repr__(self):
3102 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3103
3104 global C2
3105 class C2(int):
3106 def __new__(cls, a, b, val=0):
3107 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00003108 def __getnewargs__(self):
3109 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00003110 def __init__(self, a, b, val=0):
3111 self.a = a
3112 self.b = b
3113 def __repr__(self):
3114 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3115
Guido van Rossum90c45142001-11-24 21:07:01 +00003116 global C3
3117 class C3(object):
3118 def __init__(self, foo):
3119 self.foo = foo
3120 def __getstate__(self):
3121 return self.foo
3122 def __setstate__(self, foo):
3123 self.foo = foo
3124
3125 global C4classic, C4
3126 class C4classic: # classic
3127 pass
3128 class C4(C4classic, object): # mixed inheritance
3129 pass
3130
Guido van Rossum3926a632001-09-25 16:25:58 +00003131 for p in pickle, cPickle:
3132 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003133 if verbose:
3134 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00003135
3136 for cls in C, C1, C2:
3137 s = p.dumps(cls, bin)
3138 cls2 = p.loads(s)
3139 verify(cls2 is cls)
3140
3141 a = C1(1, 2); a.append(42); a.append(24)
3142 b = C2("hello", "world", 42)
3143 s = p.dumps((a, b), bin)
3144 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00003145 vereq(x.__class__, a.__class__)
3146 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3147 vereq(y.__class__, b.__class__)
3148 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003149 vereq(repr(x), repr(a))
3150 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00003151 if verbose:
3152 print "a = x =", a
3153 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00003154 # Test for __getstate__ and __setstate__ on new style class
3155 u = C3(42)
3156 s = p.dumps(u, bin)
3157 v = p.loads(s)
3158 veris(u.__class__, v.__class__)
3159 vereq(u.foo, v.foo)
3160 # Test for picklability of hybrid class
3161 u = C4()
3162 u.foo = 42
3163 s = p.dumps(u, bin)
3164 v = p.loads(s)
3165 veris(u.__class__, v.__class__)
3166 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003167
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003168 # Testing copy.deepcopy()
3169 if verbose:
3170 print "deepcopy"
3171 import copy
3172 for cls in C, C1, C2:
3173 cls2 = copy.deepcopy(cls)
3174 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003175
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003176 a = C1(1, 2); a.append(42); a.append(24)
3177 b = C2("hello", "world", 42)
3178 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003179 vereq(x.__class__, a.__class__)
3180 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3181 vereq(y.__class__, b.__class__)
3182 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003183 vereq(repr(x), repr(a))
3184 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003185 if verbose:
3186 print "a = x =", a
3187 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003188
Guido van Rossum8c842552002-03-14 23:05:54 +00003189def pickleslots():
3190 if verbose: print "Testing pickling of classes with __slots__ ..."
3191 import pickle, cPickle
3192 # Pickling of classes with __slots__ but without __getstate__ should fail
3193 global B, C, D, E
3194 class B(object):
3195 pass
3196 for base in [object, B]:
3197 class C(base):
3198 __slots__ = ['a']
3199 class D(C):
3200 pass
3201 try:
3202 pickle.dumps(C())
3203 except TypeError:
3204 pass
3205 else:
3206 raise TestFailed, "should fail: pickle C instance - %s" % base
3207 try:
3208 cPickle.dumps(C())
3209 except TypeError:
3210 pass
3211 else:
3212 raise TestFailed, "should fail: cPickle C instance - %s" % base
3213 try:
3214 pickle.dumps(C())
3215 except TypeError:
3216 pass
3217 else:
3218 raise TestFailed, "should fail: pickle D instance - %s" % base
3219 try:
3220 cPickle.dumps(D())
3221 except TypeError:
3222 pass
3223 else:
3224 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003225 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003226 class C(base):
3227 __slots__ = ['a']
3228 def __getstate__(self):
3229 try:
3230 d = self.__dict__.copy()
3231 except AttributeError:
3232 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003233 for cls in self.__class__.__mro__:
3234 for sn in cls.__dict__.get('__slots__', ()):
3235 try:
3236 d[sn] = getattr(self, sn)
3237 except AttributeError:
3238 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003239 return d
3240 def __setstate__(self, d):
3241 for k, v in d.items():
3242 setattr(self, k, v)
3243 class D(C):
3244 pass
3245 # Now it should work
3246 x = C()
3247 y = pickle.loads(pickle.dumps(x))
3248 vereq(hasattr(y, 'a'), 0)
3249 y = cPickle.loads(cPickle.dumps(x))
3250 vereq(hasattr(y, 'a'), 0)
3251 x.a = 42
3252 y = pickle.loads(pickle.dumps(x))
3253 vereq(y.a, 42)
3254 y = cPickle.loads(cPickle.dumps(x))
3255 vereq(y.a, 42)
3256 x = D()
3257 x.a = 42
3258 x.b = 100
3259 y = pickle.loads(pickle.dumps(x))
3260 vereq(y.a + y.b, 142)
3261 y = cPickle.loads(cPickle.dumps(x))
3262 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003263 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003264 class E(C):
3265 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003266 x = E()
3267 x.a = 42
3268 x.b = "foo"
3269 y = pickle.loads(pickle.dumps(x))
3270 vereq(y.a, x.a)
3271 vereq(y.b, x.b)
3272 y = cPickle.loads(cPickle.dumps(x))
3273 vereq(y.a, x.a)
3274 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003275
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003276def copies():
3277 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
3278 import copy
3279 class C(object):
3280 pass
3281
3282 a = C()
3283 a.foo = 12
3284 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003285 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003286
3287 a.bar = [1,2,3]
3288 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003289 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003290 verify(c.bar is a.bar)
3291
3292 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003293 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003294 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003295 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003296
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003297def binopoverride():
3298 if verbose: print "Testing overrides of binary operations..."
3299 class I(int):
3300 def __repr__(self):
3301 return "I(%r)" % int(self)
3302 def __add__(self, other):
3303 return I(int(self) + int(other))
3304 __radd__ = __add__
3305 def __pow__(self, other, mod=None):
3306 if mod is None:
3307 return I(pow(int(self), int(other)))
3308 else:
3309 return I(pow(int(self), int(other), int(mod)))
3310 def __rpow__(self, other, mod=None):
3311 if mod is None:
3312 return I(pow(int(other), int(self), mod))
3313 else:
3314 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003315
Walter Dörwald70a6b492004-02-12 17:35:32 +00003316 vereq(repr(I(1) + I(2)), "I(3)")
3317 vereq(repr(I(1) + 2), "I(3)")
3318 vereq(repr(1 + I(2)), "I(3)")
3319 vereq(repr(I(2) ** I(3)), "I(8)")
3320 vereq(repr(2 ** I(3)), "I(8)")
3321 vereq(repr(I(2) ** 3), "I(8)")
3322 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003323 class S(str):
3324 def __eq__(self, other):
3325 return self.lower() == other.lower()
3326
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003327def subclasspropagation():
3328 if verbose: print "Testing propagation of slot functions to subclasses..."
3329 class A(object):
3330 pass
3331 class B(A):
3332 pass
3333 class C(A):
3334 pass
3335 class D(B, C):
3336 pass
3337 d = D()
Tim Peters171b8682006-04-11 01:59:34 +00003338 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003339 A.__hash__ = lambda self: 42
3340 vereq(hash(d), 42)
3341 C.__hash__ = lambda self: 314
3342 vereq(hash(d), 314)
3343 B.__hash__ = lambda self: 144
3344 vereq(hash(d), 144)
3345 D.__hash__ = lambda self: 100
3346 vereq(hash(d), 100)
3347 del D.__hash__
3348 vereq(hash(d), 144)
3349 del B.__hash__
3350 vereq(hash(d), 314)
3351 del C.__hash__
3352 vereq(hash(d), 42)
3353 del A.__hash__
Tim Peters171b8682006-04-11 01:59:34 +00003354 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003355 d.foo = 42
3356 d.bar = 42
3357 vereq(d.foo, 42)
3358 vereq(d.bar, 42)
3359 def __getattribute__(self, name):
3360 if name == "foo":
3361 return 24
3362 return object.__getattribute__(self, name)
3363 A.__getattribute__ = __getattribute__
3364 vereq(d.foo, 24)
3365 vereq(d.bar, 42)
3366 def __getattr__(self, name):
3367 if name in ("spam", "foo", "bar"):
3368 return "hello"
3369 raise AttributeError, name
3370 B.__getattr__ = __getattr__
3371 vereq(d.spam, "hello")
3372 vereq(d.foo, 24)
3373 vereq(d.bar, 42)
3374 del A.__getattribute__
3375 vereq(d.foo, 42)
3376 del d.foo
3377 vereq(d.foo, "hello")
3378 vereq(d.bar, 42)
3379 del B.__getattr__
3380 try:
3381 d.foo
3382 except AttributeError:
3383 pass
3384 else:
3385 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003386
Guido van Rossume7f3e242002-06-14 02:35:45 +00003387 # Test a nasty bug in recurse_down_subclasses()
3388 import gc
3389 class A(object):
3390 pass
3391 class B(A):
3392 pass
3393 del B
3394 gc.collect()
3395 A.__setitem__ = lambda *a: None # crash
3396
Tim Petersfc57ccb2001-10-12 02:38:24 +00003397def buffer_inherit():
3398 import binascii
3399 # SF bug [#470040] ParseTuple t# vs subclasses.
3400 if verbose:
3401 print "Testing that buffer interface is inherited ..."
3402
3403 class MyStr(str):
3404 pass
3405 base = 'abc'
3406 m = MyStr(base)
3407 # b2a_hex uses the buffer interface to get its argument's value, via
3408 # PyArg_ParseTuple 't#' code.
3409 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3410
3411 # It's not clear that unicode will continue to support the character
3412 # buffer interface, and this test will fail if that's taken away.
3413 class MyUni(unicode):
3414 pass
3415 base = u'abc'
3416 m = MyUni(base)
3417 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3418
3419 class MyInt(int):
3420 pass
3421 m = MyInt(42)
3422 try:
3423 binascii.b2a_hex(m)
3424 raise TestFailed('subclass of int should not have a buffer interface')
3425 except TypeError:
3426 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003427
Tim Petersc9933152001-10-16 20:18:24 +00003428def str_of_str_subclass():
3429 import binascii
3430 import cStringIO
3431
3432 if verbose:
3433 print "Testing __str__ defined in subclass of str ..."
3434
3435 class octetstring(str):
3436 def __str__(self):
3437 return binascii.b2a_hex(self)
3438 def __repr__(self):
3439 return self + " repr"
3440
3441 o = octetstring('A')
3442 vereq(type(o), octetstring)
3443 vereq(type(str(o)), str)
3444 vereq(type(repr(o)), str)
3445 vereq(ord(o), 0x41)
3446 vereq(str(o), '41')
3447 vereq(repr(o), 'A repr')
3448 vereq(o.__str__(), '41')
3449 vereq(o.__repr__(), 'A repr')
3450
3451 capture = cStringIO.StringIO()
3452 # Calling str() or not exercises different internal paths.
3453 print >> capture, o
3454 print >> capture, str(o)
3455 vereq(capture.getvalue(), '41\n41\n')
3456 capture.close()
3457
Guido van Rossumc8e56452001-10-22 00:43:43 +00003458def kwdargs():
3459 if verbose: print "Testing keyword arguments to __init__, __call__..."
3460 def f(a): return a
3461 vereq(f.__call__(a=42), 42)
3462 a = []
3463 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003464 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003465
Brett Cannon22565aa2006-06-09 22:31:23 +00003466def recursive__call__():
3467 if verbose: print ("Testing recursive __call__() by setting to instance of "
3468 "class ...")
3469 class A(object):
3470 pass
3471
3472 A.__call__ = A()
3473 try:
3474 A()()
3475 except RuntimeError:
3476 pass
3477 else:
3478 raise TestFailed("Recursion limit should have been reached for "
3479 "__call__()")
3480
Guido van Rossumed87ad82001-10-30 02:33:02 +00003481def delhook():
3482 if verbose: print "Testing __del__ hook..."
3483 log = []
3484 class C(object):
3485 def __del__(self):
3486 log.append(1)
3487 c = C()
3488 vereq(log, [])
3489 del c
3490 vereq(log, [1])
3491
Guido van Rossum29d26062001-12-11 04:37:34 +00003492 class D(object): pass
3493 d = D()
3494 try: del d[0]
3495 except TypeError: pass
3496 else: raise TestFailed, "invalid del() didn't raise TypeError"
3497
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003498def hashinherit():
3499 if verbose: print "Testing hash of mutable subclasses..."
3500
3501 class mydict(dict):
3502 pass
3503 d = mydict()
3504 try:
3505 hash(d)
3506 except TypeError:
3507 pass
3508 else:
3509 raise TestFailed, "hash() of dict subclass should fail"
3510
3511 class mylist(list):
3512 pass
3513 d = mylist()
3514 try:
3515 hash(d)
3516 except TypeError:
3517 pass
3518 else:
3519 raise TestFailed, "hash() of list subclass should fail"
3520
Guido van Rossum29d26062001-12-11 04:37:34 +00003521def strops():
3522 try: 'a' + 5
3523 except TypeError: pass
3524 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3525
3526 try: ''.split('')
3527 except ValueError: pass
3528 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3529
3530 try: ''.join([0])
3531 except TypeError: pass
3532 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3533
3534 try: ''.rindex('5')
3535 except ValueError: pass
3536 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3537
Guido van Rossum29d26062001-12-11 04:37:34 +00003538 try: '%(n)s' % None
3539 except TypeError: pass
3540 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3541
3542 try: '%(n' % {}
3543 except ValueError: pass
3544 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3545
3546 try: '%*s' % ('abc')
3547 except TypeError: pass
3548 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3549
3550 try: '%*.*s' % ('abc', 5)
3551 except TypeError: pass
3552 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3553
3554 try: '%s' % (1, 2)
3555 except TypeError: pass
3556 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3557
3558 try: '%' % None
3559 except ValueError: pass
3560 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3561
3562 vereq('534253'.isdigit(), 1)
3563 vereq('534253x'.isdigit(), 0)
3564 vereq('%c' % 5, '\x05')
3565 vereq('%c' % '5', '5')
3566
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003567def deepcopyrecursive():
3568 if verbose: print "Testing deepcopy of recursive objects..."
3569 class Node:
3570 pass
3571 a = Node()
3572 b = Node()
3573 a.b = b
3574 b.a = a
3575 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003576
Guido van Rossumd7035672002-03-12 20:43:31 +00003577def modules():
3578 if verbose: print "Testing uninitialized module objects..."
3579 from types import ModuleType as M
3580 m = M.__new__(M)
3581 str(m)
3582 vereq(hasattr(m, "__name__"), 0)
3583 vereq(hasattr(m, "__file__"), 0)
3584 vereq(hasattr(m, "foo"), 0)
3585 vereq(m.__dict__, None)
3586 m.foo = 1
3587 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003588
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003589def dictproxyiterkeys():
3590 class C(object):
3591 def meth(self):
3592 pass
3593 if verbose: print "Testing dict-proxy iterkeys..."
3594 keys = [ key for key in C.__dict__.iterkeys() ]
3595 keys.sort()
3596 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3597
3598def dictproxyitervalues():
3599 class C(object):
3600 def meth(self):
3601 pass
3602 if verbose: print "Testing dict-proxy itervalues..."
3603 values = [ values for values in C.__dict__.itervalues() ]
3604 vereq(len(values), 5)
3605
3606def dictproxyiteritems():
3607 class C(object):
3608 def meth(self):
3609 pass
3610 if verbose: print "Testing dict-proxy iteritems..."
3611 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3612 keys.sort()
3613 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3614
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003615def funnynew():
3616 if verbose: print "Testing __new__ returning something unexpected..."
3617 class C(object):
3618 def __new__(cls, arg):
3619 if isinstance(arg, str): return [1, 2, 3]
3620 elif isinstance(arg, int): return object.__new__(D)
3621 else: return object.__new__(cls)
3622 class D(C):
3623 def __init__(self, arg):
3624 self.foo = arg
3625 vereq(C("1"), [1, 2, 3])
3626 vereq(D("1"), [1, 2, 3])
3627 d = D(None)
3628 veris(d.foo, None)
3629 d = C(1)
3630 vereq(isinstance(d, D), True)
3631 vereq(d.foo, 1)
3632 d = D(1)
3633 vereq(isinstance(d, D), True)
3634 vereq(d.foo, 1)
3635
Guido van Rossume8fc6402002-04-16 16:44:51 +00003636def imulbug():
3637 # SF bug 544647
3638 if verbose: print "Testing for __imul__ problems..."
3639 class C(object):
3640 def __imul__(self, other):
3641 return (self, other)
3642 x = C()
3643 y = x
3644 y *= 1.0
3645 vereq(y, (x, 1.0))
3646 y = x
3647 y *= 2
3648 vereq(y, (x, 2))
3649 y = x
3650 y *= 3L
3651 vereq(y, (x, 3L))
3652 y = x
3653 y *= 1L<<100
3654 vereq(y, (x, 1L<<100))
3655 y = x
3656 y *= None
3657 vereq(y, (x, None))
3658 y = x
3659 y *= "foo"
3660 vereq(y, (x, "foo"))
3661
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003662def docdescriptor():
3663 # SF bug 542984
3664 if verbose: print "Testing __doc__ descriptor..."
3665 class DocDescr(object):
3666 def __get__(self, object, otype):
3667 if object:
3668 object = object.__class__.__name__ + ' instance'
3669 if otype:
3670 otype = otype.__name__
3671 return 'object=%s; type=%s' % (object, otype)
3672 class OldClass:
3673 __doc__ = DocDescr()
3674 class NewClass(object):
3675 __doc__ = DocDescr()
3676 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3677 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3678 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3679 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3680
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003681def copy_setstate():
3682 if verbose:
3683 print "Testing that copy.*copy() correctly uses __setstate__..."
3684 import copy
3685 class C(object):
3686 def __init__(self, foo=None):
3687 self.foo = foo
3688 self.__foo = foo
3689 def setfoo(self, foo=None):
3690 self.foo = foo
3691 def getfoo(self):
3692 return self.__foo
3693 def __getstate__(self):
3694 return [self.foo]
3695 def __setstate__(self, lst):
3696 assert len(lst) == 1
3697 self.__foo = self.foo = lst[0]
3698 a = C(42)
3699 a.setfoo(24)
3700 vereq(a.foo, 24)
3701 vereq(a.getfoo(), 42)
3702 b = copy.copy(a)
3703 vereq(b.foo, 24)
3704 vereq(b.getfoo(), 24)
3705 b = copy.deepcopy(a)
3706 vereq(b.foo, 24)
3707 vereq(b.getfoo(), 24)
3708
Guido van Rossum09638c12002-06-13 19:17:46 +00003709def slices():
3710 if verbose:
3711 print "Testing cases with slices and overridden __getitem__ ..."
3712 # Strings
3713 vereq("hello"[:4], "hell")
3714 vereq("hello"[slice(4)], "hell")
3715 vereq(str.__getitem__("hello", slice(4)), "hell")
3716 class S(str):
3717 def __getitem__(self, x):
3718 return str.__getitem__(self, x)
3719 vereq(S("hello")[:4], "hell")
3720 vereq(S("hello")[slice(4)], "hell")
3721 vereq(S("hello").__getitem__(slice(4)), "hell")
3722 # Tuples
3723 vereq((1,2,3)[:2], (1,2))
3724 vereq((1,2,3)[slice(2)], (1,2))
3725 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3726 class T(tuple):
3727 def __getitem__(self, x):
3728 return tuple.__getitem__(self, x)
3729 vereq(T((1,2,3))[:2], (1,2))
3730 vereq(T((1,2,3))[slice(2)], (1,2))
3731 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3732 # Lists
3733 vereq([1,2,3][:2], [1,2])
3734 vereq([1,2,3][slice(2)], [1,2])
3735 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3736 class L(list):
3737 def __getitem__(self, x):
3738 return list.__getitem__(self, x)
3739 vereq(L([1,2,3])[:2], [1,2])
3740 vereq(L([1,2,3])[slice(2)], [1,2])
3741 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3742 # Now do lists and __setitem__
3743 a = L([1,2,3])
3744 a[slice(1, 3)] = [3,2]
3745 vereq(a, [1,3,2])
3746 a[slice(0, 2, 1)] = [3,1]
3747 vereq(a, [3,1,2])
3748 a.__setitem__(slice(1, 3), [2,1])
3749 vereq(a, [3,2,1])
3750 a.__setitem__(slice(0, 2, 1), [2,3])
3751 vereq(a, [2,3,1])
3752
Tim Peters2484aae2002-07-11 06:56:07 +00003753def subtype_resurrection():
3754 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003755 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003756
3757 class C(object):
3758 container = []
3759
3760 def __del__(self):
3761 # resurrect the instance
3762 C.container.append(self)
3763
3764 c = C()
3765 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003766 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003767 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003768 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003769
3770 # If that didn't blow up, it's also interesting to see whether clearing
3771 # the last container slot works: that will attempt to delete c again,
3772 # which will cause c to get appended back to the container again "during"
3773 # the del.
3774 del C.container[-1]
3775 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003776 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003777
Tim Peters14cb1e12002-07-11 18:26:21 +00003778 # Make c mortal again, so that the test framework with -l doesn't report
3779 # it as a leak.
3780 del C.__del__
3781
Guido van Rossum2d702462002-08-06 21:28:28 +00003782def slottrash():
3783 # Deallocating deeply nested slotted trash caused stack overflows
3784 if verbose:
3785 print "Testing slot trash..."
3786 class trash(object):
3787 __slots__ = ['x']
3788 def __init__(self, x):
3789 self.x = x
3790 o = None
3791 for i in xrange(50000):
3792 o = trash(o)
3793 del o
3794
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003795def slotmultipleinheritance():
3796 # SF bug 575229, multiple inheritance w/ slots dumps core
3797 class A(object):
3798 __slots__=()
3799 class B(object):
3800 pass
3801 class C(A,B) :
3802 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003803 vereq(C.__basicsize__, B.__basicsize__)
3804 verify(hasattr(C, '__dict__'))
3805 verify(hasattr(C, '__weakref__'))
3806 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003807
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003808def testrmul():
3809 # SF patch 592646
3810 if verbose:
3811 print "Testing correct invocation of __rmul__..."
3812 class C(object):
3813 def __mul__(self, other):
3814 return "mul"
3815 def __rmul__(self, other):
3816 return "rmul"
3817 a = C()
3818 vereq(a*2, "mul")
3819 vereq(a*2.2, "mul")
3820 vereq(2*a, "rmul")
3821 vereq(2.2*a, "rmul")
3822
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003823def testipow():
3824 # [SF bug 620179]
3825 if verbose:
3826 print "Testing correct invocation of __ipow__..."
3827 class C(object):
3828 def __ipow__(self, other):
3829 pass
3830 a = C()
3831 a **= 2
3832
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003833def do_this_first():
3834 if verbose:
3835 print "Testing SF bug 551412 ..."
3836 # This dumps core when SF bug 551412 isn't fixed --
3837 # but only when test_descr.py is run separately.
3838 # (That can't be helped -- as soon as PyType_Ready()
3839 # is called for PyLong_Type, the bug is gone.)
3840 class UserLong(object):
3841 def __pow__(self, *args):
3842 pass
3843 try:
3844 pow(0L, UserLong(), 0L)
3845 except:
3846 pass
3847
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003848 if verbose:
3849 print "Testing SF bug 570483..."
3850 # Another segfault only when run early
3851 # (before PyType_Ready(tuple) is called)
3852 type.mro(tuple)
3853
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003854def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003855 if verbose:
3856 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003857 # stuff that should work:
3858 class C(object):
3859 pass
3860 class C2(object):
3861 def __getattribute__(self, attr):
3862 if attr == 'a':
3863 return 2
3864 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003865 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003866 def meth(self):
3867 return 1
3868 class D(C):
3869 pass
3870 class E(D):
3871 pass
3872 d = D()
3873 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003874 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003875 D.__bases__ = (C2,)
3876 vereq(d.meth(), 1)
3877 vereq(e.meth(), 1)
3878 vereq(d.a, 2)
3879 vereq(e.a, 2)
3880 vereq(C2.__subclasses__(), [D])
3881
3882 # stuff that shouldn't:
3883 class L(list):
3884 pass
3885
3886 try:
3887 L.__bases__ = (dict,)
3888 except TypeError:
3889 pass
3890 else:
3891 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3892
3893 try:
3894 list.__bases__ = (dict,)
3895 except TypeError:
3896 pass
3897 else:
3898 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3899
3900 try:
Michael W. Hudsonf3904422006-11-23 13:54:04 +00003901 D.__bases__ = (C2, list)
3902 except TypeError:
3903 pass
3904 else:
3905 assert 0, "best_base calculation found wanting"
3906
3907 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003908 del D.__bases__
3909 except TypeError:
3910 pass
3911 else:
3912 raise TestFailed, "shouldn't be able to delete .__bases__"
3913
3914 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003915 D.__bases__ = ()
3916 except TypeError, msg:
3917 if str(msg) == "a new-style class can't have only classic bases":
3918 raise TestFailed, "wrong error message for .__bases__ = ()"
3919 else:
3920 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3921
3922 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003923 D.__bases__ = (D,)
3924 except TypeError:
3925 pass
3926 else:
3927 # actually, we'll have crashed by here...
3928 raise TestFailed, "shouldn't be able to create inheritance cycles"
3929
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003930 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003931 D.__bases__ = (C, C)
3932 except TypeError:
3933 pass
3934 else:
3935 raise TestFailed, "didn't detect repeated base classes"
3936
3937 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003938 D.__bases__ = (E,)
3939 except TypeError:
3940 pass
3941 else:
3942 raise TestFailed, "shouldn't be able to create inheritance cycles"
3943
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003944 # let's throw a classic class into the mix:
3945 class Classic:
3946 def meth2(self):
3947 return 3
3948
3949 D.__bases__ = (C, Classic)
3950
3951 vereq(d.meth2(), 3)
3952 vereq(e.meth2(), 3)
3953 try:
3954 d.a
3955 except AttributeError:
3956 pass
3957 else:
3958 raise TestFailed, "attribute should have vanished"
3959
3960 try:
3961 D.__bases__ = (Classic,)
3962 except TypeError:
3963 pass
3964 else:
3965 raise TestFailed, "new-style class must have a new-style base"
3966
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003967def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003968 if verbose:
3969 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003970 class WorkOnce(type):
3971 def __new__(self, name, bases, ns):
3972 self.flag = 0
3973 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3974 def mro(self):
3975 if self.flag > 0:
3976 raise RuntimeError, "bozo"
3977 else:
3978 self.flag += 1
3979 return type.mro(self)
3980
3981 class WorkAlways(type):
3982 def mro(self):
3983 # this is here to make sure that .mro()s aren't called
3984 # with an exception set (which was possible at one point).
3985 # An error message will be printed in a debug build.
3986 # What's a good way to test for this?
3987 return type.mro(self)
3988
3989 class C(object):
3990 pass
3991
3992 class C2(object):
3993 pass
3994
3995 class D(C):
3996 pass
3997
3998 class E(D):
3999 pass
4000
4001 class F(D):
4002 __metaclass__ = WorkOnce
4003
4004 class G(D):
4005 __metaclass__ = WorkAlways
4006
4007 # Immediate subclasses have their mro's adjusted in alphabetical
4008 # order, so E's will get adjusted before adjusting F's fails. We
4009 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00004010
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004011 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00004012 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004013
4014 try:
4015 D.__bases__ = (C2,)
4016 except RuntimeError:
4017 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00004018 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004019 else:
4020 raise TestFailed, "exception not propagated"
4021
4022def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00004023 if verbose:
4024 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004025 class A(object):
4026 pass
4027
4028 class B(object):
4029 pass
4030
4031 class C(A, B):
4032 pass
4033
4034 class D(A, B):
4035 pass
4036
4037 class E(C, D):
4038 pass
4039
4040 try:
4041 C.__bases__ = (B, A)
4042 except TypeError:
4043 pass
4044 else:
4045 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00004046
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004047def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00004048 if verbose:
4049 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004050 class C(object):
4051 pass
4052
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00004053 # C.__module__ could be 'test_descr' or '__main__'
4054 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00004055
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00004056 C.__name__ = 'D'
4057 vereq((C.__module__, C.__name__), (mod, 'D'))
4058
4059 C.__name__ = 'D.E'
4060 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00004061
Guido van Rossum613f24f2003-01-06 23:00:59 +00004062def subclass_right_op():
4063 if verbose:
4064 print "Testing correct dispatch of subclass overloading __r<op>__..."
4065
4066 # This code tests various cases where right-dispatch of a subclass
4067 # should be preferred over left-dispatch of a base class.
4068
4069 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4070
4071 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00004072 def __floordiv__(self, other):
4073 return "B.__floordiv__"
4074 def __rfloordiv__(self, other):
4075 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004076
Guido van Rossumf389c772003-02-27 20:04:19 +00004077 vereq(B(1) // 1, "B.__floordiv__")
4078 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004079
4080 # Case 2: subclass of object; this is just the baseline for case 3
4081
4082 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00004083 def __floordiv__(self, other):
4084 return "C.__floordiv__"
4085 def __rfloordiv__(self, other):
4086 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004087
Guido van Rossumf389c772003-02-27 20:04:19 +00004088 vereq(C() // 1, "C.__floordiv__")
4089 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004090
4091 # Case 3: subclass of new-style class; here it gets interesting
4092
4093 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00004094 def __floordiv__(self, other):
4095 return "D.__floordiv__"
4096 def __rfloordiv__(self, other):
4097 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004098
Guido van Rossumf389c772003-02-27 20:04:19 +00004099 vereq(D() // C(), "D.__floordiv__")
4100 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004101
4102 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4103
4104 class E(C):
4105 pass
4106
Guido van Rossumf389c772003-02-27 20:04:19 +00004107 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00004108
Guido van Rossumf389c772003-02-27 20:04:19 +00004109 vereq(E() // 1, "C.__floordiv__")
4110 vereq(1 // E(), "C.__rfloordiv__")
4111 vereq(E() // C(), "C.__floordiv__")
4112 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00004113
Guido van Rossum373c7412003-01-07 13:41:37 +00004114def dict_type_with_metaclass():
4115 if verbose:
4116 print "Testing type of __dict__ when __metaclass__ set..."
4117
4118 class B(object):
4119 pass
4120 class M(type):
4121 pass
4122 class C:
4123 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4124 __metaclass__ = M
4125 veris(type(C.__dict__), type(B.__dict__))
4126
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004127def meth_class_get():
4128 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004129 if verbose:
4130 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004131 # Baseline
4132 arg = [1, 2, 3]
4133 res = {1: None, 2: None, 3: None}
4134 vereq(dict.fromkeys(arg), res)
4135 vereq({}.fromkeys(arg), res)
4136 # Now get the descriptor
4137 descr = dict.__dict__["fromkeys"]
4138 # More baseline using the descriptor directly
4139 vereq(descr.__get__(None, dict)(arg), res)
4140 vereq(descr.__get__({})(arg), res)
4141 # Now check various error cases
4142 try:
4143 descr.__get__(None, None)
4144 except TypeError:
4145 pass
4146 else:
4147 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
4148 try:
4149 descr.__get__(42)
4150 except TypeError:
4151 pass
4152 else:
4153 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
4154 try:
4155 descr.__get__(None, 42)
4156 except TypeError:
4157 pass
4158 else:
4159 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
4160 try:
4161 descr.__get__(None, int)
4162 except TypeError:
4163 pass
4164 else:
4165 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
4166
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004167def isinst_isclass():
4168 if verbose:
4169 print "Testing proxy isinstance() and isclass()..."
4170 class Proxy(object):
4171 def __init__(self, obj):
4172 self.__obj = obj
4173 def __getattribute__(self, name):
4174 if name.startswith("_Proxy__"):
4175 return object.__getattribute__(self, name)
4176 else:
4177 return getattr(self.__obj, name)
4178 # Test with a classic class
4179 class C:
4180 pass
4181 a = C()
4182 pa = Proxy(a)
4183 verify(isinstance(a, C)) # Baseline
4184 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004185 # Test with a classic subclass
4186 class D(C):
4187 pass
4188 a = D()
4189 pa = Proxy(a)
4190 verify(isinstance(a, C)) # Baseline
4191 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004192 # Test with a new-style class
4193 class C(object):
4194 pass
4195 a = C()
4196 pa = Proxy(a)
4197 verify(isinstance(a, C)) # Baseline
4198 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004199 # Test with a new-style subclass
4200 class D(C):
4201 pass
4202 a = D()
4203 pa = Proxy(a)
4204 verify(isinstance(a, C)) # Baseline
4205 verify(isinstance(pa, C)) # Test
4206
4207def proxysuper():
4208 if verbose:
4209 print "Testing super() for a proxy object..."
4210 class Proxy(object):
4211 def __init__(self, obj):
4212 self.__obj = obj
4213 def __getattribute__(self, name):
4214 if name.startswith("_Proxy__"):
4215 return object.__getattribute__(self, name)
4216 else:
4217 return getattr(self.__obj, name)
4218
4219 class B(object):
4220 def f(self):
4221 return "B.f"
4222
4223 class C(B):
4224 def f(self):
4225 return super(C, self).f() + "->C.f"
4226
4227 obj = C()
4228 p = Proxy(obj)
4229 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004230
Guido van Rossum52b27052003-04-15 20:05:10 +00004231def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004232 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00004233 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004234 try:
4235 object.__setattr__(str, "foo", 42)
4236 except TypeError:
4237 pass
4238 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004239 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004240 try:
4241 object.__delattr__(str, "lower")
4242 except TypeError:
4243 pass
4244 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004245 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004246
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004247def weakref_segfault():
4248 # SF 742911
4249 if verbose:
4250 print "Testing weakref segfault..."
4251
4252 import weakref
4253
4254 class Provoker:
4255 def __init__(self, referrent):
4256 self.ref = weakref.ref(referrent)
4257
4258 def __del__(self):
4259 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004260
4261 class Oops(object):
4262 pass
4263
4264 o = Oops()
4265 o.whatever = Provoker(o)
4266 del o
4267
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004268def wrapper_segfault():
4269 # SF 927248: deeply nested wrappers could cause stack overflow
4270 f = lambda:None
4271 for i in xrange(1000000):
4272 f = f.__call__
4273 f = None
4274
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004275# Fix SF #762455, segfault when sys.stdout is changed in getattr
4276def filefault():
4277 if verbose:
4278 print "Testing sys.stdout is changed in getattr..."
4279 import sys
4280 class StdoutGuard:
4281 def __getattr__(self, attr):
4282 sys.stdout = sys.__stdout__
4283 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4284 sys.stdout = StdoutGuard()
4285 try:
4286 print "Oops!"
4287 except RuntimeError:
4288 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004289
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004290def vicious_descriptor_nonsense():
4291 # A potential segfault spotted by Thomas Wouters in mail to
4292 # python-dev 2003-04-17, turned into an example & fixed by Michael
4293 # Hudson just less than four months later...
4294 if verbose:
4295 print "Testing vicious_descriptor_nonsense..."
4296
4297 class Evil(object):
4298 def __hash__(self):
4299 return hash('attr')
4300 def __eq__(self, other):
4301 del C.attr
4302 return 0
4303
4304 class Descr(object):
4305 def __get__(self, ob, type=None):
4306 return 1
4307
4308 class C(object):
4309 attr = Descr()
4310
4311 c = C()
4312 c.__dict__[Evil()] = 0
4313
4314 vereq(c.attr, 1)
4315 # this makes a crash more likely:
4316 import gc; gc.collect()
4317 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004318
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004319def test_init():
4320 # SF 1155938
4321 class Foo(object):
4322 def __init__(self):
4323 return 10
4324 try:
4325 Foo()
4326 except TypeError:
4327 pass
4328 else:
4329 raise TestFailed, "did not test __init__() for None return"
4330
Armin Rigoc6686b72005-11-07 08:38:00 +00004331def methodwrapper():
4332 # <type 'method-wrapper'> did not support any reflection before 2.5
4333 if verbose:
4334 print "Testing method-wrapper objects..."
4335
4336 l = []
4337 vereq(l.__add__, l.__add__)
Armin Rigofd01d792006-06-08 10:56:24 +00004338 vereq(l.__add__, [].__add__)
4339 verify(l.__add__ != [5].__add__)
4340 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004341 verify(l.__add__.__name__ == '__add__')
4342 verify(l.__add__.__self__ is l)
4343 verify(l.__add__.__objclass__ is list)
4344 vereq(l.__add__.__doc__, list.__add__.__doc__)
Armin Rigofd01d792006-06-08 10:56:24 +00004345 try:
4346 hash(l.__add__)
4347 except TypeError:
4348 pass
4349 else:
4350 raise TestFailed("no TypeError from hash([].__add__)")
4351
4352 t = ()
4353 t += (7,)
4354 vereq(t.__add__, (7,).__add__)
4355 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004356
Armin Rigofd163f92005-12-29 15:59:19 +00004357def notimplemented():
4358 # all binary methods should be able to return a NotImplemented
4359 if verbose:
4360 print "Testing NotImplemented..."
4361
4362 import sys
4363 import types
4364 import operator
4365
4366 def specialmethod(self, other):
4367 return NotImplemented
4368
4369 def check(expr, x, y):
4370 try:
4371 exec expr in {'x': x, 'y': y, 'operator': operator}
4372 except TypeError:
4373 pass
4374 else:
4375 raise TestFailed("no TypeError from %r" % (expr,))
4376
4377 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
4378 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4379 # ValueErrors instead of TypeErrors
4380 for metaclass in [type, types.ClassType]:
4381 for name, expr, iexpr in [
4382 ('__add__', 'x + y', 'x += y'),
4383 ('__sub__', 'x - y', 'x -= y'),
4384 ('__mul__', 'x * y', 'x *= y'),
4385 ('__truediv__', 'operator.truediv(x, y)', None),
4386 ('__floordiv__', 'operator.floordiv(x, y)', None),
4387 ('__div__', 'x / y', 'x /= y'),
4388 ('__mod__', 'x % y', 'x %= y'),
4389 ('__divmod__', 'divmod(x, y)', None),
4390 ('__pow__', 'x ** y', 'x **= y'),
4391 ('__lshift__', 'x << y', 'x <<= y'),
4392 ('__rshift__', 'x >> y', 'x >>= y'),
4393 ('__and__', 'x & y', 'x &= y'),
4394 ('__or__', 'x | y', 'x |= y'),
4395 ('__xor__', 'x ^ y', 'x ^= y'),
4396 ('__coerce__', 'coerce(x, y)', None)]:
4397 if name == '__coerce__':
4398 rname = name
4399 else:
4400 rname = '__r' + name[2:]
4401 A = metaclass('A', (), {name: specialmethod})
4402 B = metaclass('B', (), {rname: specialmethod})
4403 a = A()
4404 b = B()
4405 check(expr, a, a)
4406 check(expr, a, b)
4407 check(expr, b, a)
4408 check(expr, b, b)
4409 check(expr, a, N1)
4410 check(expr, a, N2)
4411 check(expr, N1, b)
4412 check(expr, N2, b)
4413 if iexpr:
4414 check(iexpr, a, a)
4415 check(iexpr, a, b)
4416 check(iexpr, b, a)
4417 check(iexpr, b, b)
4418 check(iexpr, a, N1)
4419 check(iexpr, a, N2)
4420 iname = '__i' + name[2:]
4421 C = metaclass('C', (), {iname: specialmethod})
4422 c = C()
4423 check(iexpr, c, a)
4424 check(iexpr, c, b)
4425 check(iexpr, c, N1)
4426 check(iexpr, c, N2)
4427
Georg Brandl0fca97a2007-03-05 22:28:08 +00004428def test_assign_slice():
4429 # ceval.c's assign_slice used to check for
4430 # tp->tp_as_sequence->sq_slice instead of
4431 # tp->tp_as_sequence->sq_ass_slice
Guido van Rossum9acc3872008-01-23 23:23:43 +00004432 if verbose:
4433 print "Testing assign_slice..."
Georg Brandl0fca97a2007-03-05 22:28:08 +00004434
4435 class C(object):
4436 def __setslice__(self, start, stop, value):
4437 self.value = value
4438
4439 c = C()
4440 c[1:2] = 3
4441 vereq(c.value, 3)
4442
Guido van Rossum9acc3872008-01-23 23:23:43 +00004443def test_weakref_in_del_segfault():
4444 # This used to segfault until r60057
4445 if verbose:
4446 print "Testing weakref in del segfault..."
4447
4448 import weakref
4449 global ref
4450
4451 class Target():
4452 def __del__(self):
4453 global ref
4454 ref = weakref.ref(self)
4455
4456 w = Target()
4457 del w
4458 del ref
4459
4460def test_borrowed_ref_3_segfault():
4461 # This used to segfault until r60224
4462 if verbose:
4463 print "Testing borrowed ref 3 segfault..."
4464
4465 class KeyFunc(object):
4466 def __call__(self, n):
4467 del d['key']
4468 return 1
4469
4470 d = {'key': KeyFunc()}
4471 try:
4472 min(range(10), **d)
4473 except:
4474 pass
4475
4476def test_borrowed_ref_4_segfault():
4477 # This used to segfault until r60224
4478 if verbose:
4479 print "Testing borrowed ref 4 segfault..."
4480
4481 import types
4482 import __builtin__
4483
Guido van Rossum9acc3872008-01-23 23:23:43 +00004484 class X(object):
4485 def __getattr__(self, name):
4486 # this is called with name == '__bases__' by PyObject_IsInstance()
4487 # during the unbound method call -- it frees the unbound method
4488 # itself before it invokes its im_func.
4489 del __builtin__.__import__
4490 return ()
4491
4492 pseudoclass = X()
4493
4494 class Y(object):
4495 def __call__(self, *args):
4496 # 'self' was freed already
4497 return (self, args)
4498
4499 # make an unbound method
Neal Norwitzbf839e22008-01-24 04:14:50 +00004500 orig_import = __import__
4501 try:
4502 __builtin__.__import__ = types.MethodType(Y(), None, (pseudoclass, str))
4503 import spam
4504 finally:
4505 __builtin__.__import__ = orig_import
Guido van Rossum9acc3872008-01-23 23:23:43 +00004506
Guido van Rossum37edeab2008-01-24 17:58:05 +00004507def test_losing_dict_ref_segfault():
4508 # This used to segfault;
4509 # derived from issue #1303614, test67.py
4510 if verbose:
4511 print "Testing losing dict ref segfault..."
4512
4513 class Strange(object):
4514 def __hash__(self):
4515 return hash('hello')
4516
4517 def __eq__(self, other):
4518 x.__dict__ = {} # the old x.__dict__ is deallocated
4519 return False
4520
4521 class X(object):
4522 pass
4523
4524 v = 123
4525 x = X()
4526 x.__dict__ = {Strange(): 42, 'hello': v+456}
4527 x.hello
4528
4529
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004530def test_main():
Guido van Rossum4e3f1242008-01-24 15:53:22 +00004531 weakref_segfault() # Must be first, somehow
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004532 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004533 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004534 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004535 lists()
4536 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004537 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004538 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004539 ints()
4540 longs()
4541 floats()
4542 complexes()
4543 spamlists()
4544 spamdicts()
4545 pydicts()
4546 pylists()
4547 metaclass()
4548 pymods()
4549 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004550 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004551 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004552 ex5()
4553 monotonicity()
4554 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004555 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004556 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004557 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004558 dynamics()
Armin Rigoc0ba52d2007-04-19 14:44:48 +00004559 errors()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004560 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004561 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004562 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004563 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004564 classic()
4565 compattr()
4566 newslot()
4567 altmro()
4568 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004569 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004570 specials()
Brett Cannon1e534b52007-09-07 04:18:30 +00004571 recursions()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004572 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004573 properties()
Brett Cannon4e438bc2007-12-25 00:14:34 +00004574 properties_plus()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004575 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004576 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004577 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004578 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004579 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004580 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004581 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004582 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004583 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004584 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004585 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004586 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004587 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004588 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004589 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004590 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004591 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004592 kwdargs()
Brett Cannon22565aa2006-06-09 22:31:23 +00004593 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004594 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004595 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004596 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004597 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004598 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004599 dictproxyiterkeys()
4600 dictproxyitervalues()
4601 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004602 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004603 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004604 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004605 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004606 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004607 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004608 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004609 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004610 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004611 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004612 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004613 test_mutable_bases()
4614 test_mutable_bases_with_failing_mro()
4615 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004616 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004617 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004618 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004619 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004620 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004621 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004622 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004623 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004624 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004625 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004626 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004627 notimplemented()
Georg Brandl0fca97a2007-03-05 22:28:08 +00004628 test_assign_slice()
Guido van Rossum9acc3872008-01-23 23:23:43 +00004629 test_weakref_in_del_segfault()
4630 test_borrowed_ref_3_segfault()
4631 test_borrowed_ref_4_segfault()
Guido van Rossum37edeab2008-01-24 17:58:05 +00004632 test_losing_dict_ref_segfault()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004633
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004634 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004635
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004636if __name__ == "__main__":
4637 test_main()