blob: a29f404f5f2d83c7c77e39bbeade7a71f661dec6 [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
Neal Norwitz1a997502003-01-13 20:13:12 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
16 if verbose: print "checking", expr
17 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
29 if verbose: print "checking", expr
30 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
32 # XXX Hack so this passes before 2.3 when -Qnew is specified.
33 if meth == "__div__" and 1/2 == 0.5:
34 meth = "__truediv__"
35
Guido van Rossum45704552001-10-08 16:35:45 +000036 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 t = type(a)
38 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000039 while meth not in t.__dict__:
40 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000041 vereq(m, t.__dict__[meth])
42 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045
46def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
47 if verbose: print "checking", expr
48 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000049 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 t = type(a)
51 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000052 while meth not in t.__dict__:
53 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000054 vereq(m, t.__dict__[meth])
55 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000056 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058
59def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
60 if verbose: print "checking", stmt
61 dict = {'a': deepcopy(a), 'b': b}
62 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 t = type(a)
65 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000066 while meth not in t.__dict__:
67 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000068 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000069 dict['a'] = deepcopy(a)
70 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict['a'] = deepcopy(a)
73 bm = getattr(dict['a'], meth)
74 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076
77def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
78 if verbose: print "checking", stmt
79 dict = {'a': deepcopy(a), 'b': b, 'c': c}
80 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000081 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 t = type(a)
83 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000084 while meth not in t.__dict__:
85 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 dict['a'] = deepcopy(a)
88 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict['a'] = deepcopy(a)
91 bm = getattr(dict['a'], meth)
92 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094
95def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
96 if verbose: print "checking", stmt
97 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
98 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000099 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000101 while meth not in t.__dict__:
102 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105 dict['a'] = deepcopy(a)
106 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108 dict['a'] = deepcopy(a)
109 bm = getattr(dict['a'], meth)
110 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000111 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000112
Tim Peters2f93e282001-10-04 05:27:00 +0000113def class_docstrings():
114 class Classic:
115 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000116 vereq(Classic.__doc__, "A classic docstring.")
117 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000118
119 class Classic2:
120 pass
121 verify(Classic2.__doc__ is None)
122
Tim Peters4fb1fe82001-10-04 05:48:13 +0000123 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000124 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000125 vereq(NewStatic.__doc__, "Another docstring.")
126 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 pass
130 verify(NewStatic2.__doc__ is None)
131
Tim Peters4fb1fe82001-10-04 05:48:13 +0000132 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000133 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000134 vereq(NewDynamic.__doc__, "Another docstring.")
135 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000136
Tim Peters4fb1fe82001-10-04 05:48:13 +0000137 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000138 pass
139 verify(NewDynamic2.__doc__ is None)
140
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141def lists():
142 if verbose: print "Testing list operations..."
143 testbinop([1], [2], [1,2], "a+b", "__add__")
144 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
145 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
146 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
147 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
148 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
149 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
150 testunop([1,2,3], 3, "len(a)", "__len__")
151 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
152 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
153 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
154 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
155
156def dicts():
157 if verbose: print "Testing dict operations..."
158 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
159 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
160 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
161 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
162 d = {1:2,3:4}
163 l1 = []
164 for i in d.keys(): l1.append(i)
165 l = []
166 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 l = []
169 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000171 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000172 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000173 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 d = {1:2, 3:4}
175 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(eval(repr(d), {}), d)
177 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
179
Tim Peters25786c02001-09-02 08:22:48 +0000180def dict_constructor():
181 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 print "Testing dict constructor ..."
183 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000186 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000187 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000188 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000189 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000190 vereq(d, dict(d.iteritems()))
191 d = dict({'one':1, 'two':2})
192 vereq(d, dict(one=1, two=2))
193 vereq(d, dict(**d))
194 vereq(d, dict({"one": 1}, two=2))
195 vereq(d, dict([("two", 2)], one=1))
196 vereq(d, dict([("one", 100), ("two", 200)], **d))
197 verify(d is not dict(**d))
Tim Peters25786c02001-09-02 08:22:48 +0000198 for badarg in 0, 0L, 0j, "0", [0], (0,):
199 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000200 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000201 except TypeError:
202 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000203 except ValueError:
204 if badarg == "0":
205 # It's a sequence, and its elements are also sequences (gotta
206 # love strings <wink>), but they aren't of length 2, so this
207 # one seemed better as a ValueError than a TypeError.
208 pass
209 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000210 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000211 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000212 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000213
214 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000216 except TypeError:
217 pass
218 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000219 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000220
221 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000222 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000223 dict = {1:2, 3:4, 'a':1j}
224
Tim Peters25786c02001-09-02 08:22:48 +0000225 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000226 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000227 except TypeError:
228 pass
229 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000230 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000231
232 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000233 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000234 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000235 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000236
Tim Peters1fc240e2001-10-26 05:06:50 +0000237 # Init from sequence of iterable objects, each producing a 2-sequence.
238 class AddressBookEntry:
239 def __init__(self, first, last):
240 self.first = first
241 self.last = last
242 def __iter__(self):
243 return iter([self.first, self.last])
244
Tim Petersa427a2b2001-10-29 22:25:45 +0000245 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000246 AddressBookEntry('Barry', 'Peters'),
247 AddressBookEntry('Tim', 'Peters'),
248 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000249 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
250
Tim Petersa427a2b2001-10-29 22:25:45 +0000251 d = dict(zip(range(4), range(1, 5)))
252 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000253
254 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000255 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000256 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000257 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000258 except ValueError:
259 pass
260 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000261 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000262
Tim Peters5d2b77c2001-09-03 05:47:38 +0000263def test_dir():
264 if verbose:
265 print "Testing dir() ..."
266 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000267 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000268 del junk
269
270 # Just make sure these don't blow up!
271 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
272 dir(arg)
273
Tim Peters37a309d2001-09-04 01:20:04 +0000274 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275 class C:
276 Cdata = 1
277 def Cmethod(self): pass
278
279 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000281 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000282
283 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000284 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000285
286 c.cdata = 2
287 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000288 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000289 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000290
291 class A(C):
292 Adata = 1
293 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000294
Tim Peters37a309d2001-09-04 01:20:04 +0000295 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000296 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000297 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000298 a = A()
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.adata = 42
302 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000303 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000304
305 # The same, but with new-style classes. Since these have object as a
306 # base class, a lot more gets sucked in.
307 def interesting(strings):
308 return [s for s in strings if not s.startswith('_')]
309
Tim Peters5d2b77c2001-09-03 05:47:38 +0000310 class C(object):
311 Cdata = 1
312 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000313
314 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000315 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000316
317 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000318 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000319 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000320
321 c.cdata = 2
322 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000323 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000324 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000325
Tim Peters5d2b77c2001-09-03 05:47:38 +0000326 class A(C):
327 Adata = 1
328 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000329
330 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000331 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000332 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000333 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000334 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000335 a.adata = 42
336 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000337 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000338 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000339
Tim Peterscaaff8d2001-09-10 23:12:14 +0000340 # Try a module subclass.
341 import sys
342 class M(type(sys)):
343 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000344 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000345 minstance.b = 2
346 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000347 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
348 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000349
350 class M2(M):
351 def getdict(self):
352 return "Not a dict!"
353 __dict__ = property(getdict)
354
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000355 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000356 m2instance.b = 2
357 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000358 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000359 try:
360 dir(m2instance)
361 except TypeError:
362 pass
363
Tim Peters9e6a3992001-10-30 05:45:26 +0000364 # Two essentially featureless objects, just inheriting stuff from
365 # object.
366 vereq(dir(None), dir(Ellipsis))
367
Guido van Rossum44022412002-05-13 18:29:46 +0000368 # Nasty test case for proxied objects
369 class Wrapper(object):
370 def __init__(self, obj):
371 self.__obj = obj
372 def __repr__(self):
373 return "Wrapper(%s)" % repr(self.__obj)
374 def __getitem__(self, key):
375 return Wrapper(self.__obj[key])
376 def __len__(self):
377 return len(self.__obj)
378 def __getattr__(self, name):
379 return Wrapper(getattr(self.__obj, name))
380
381 class C(object):
382 def __getclass(self):
383 return Wrapper(type(self))
384 __class__ = property(__getclass)
385
386 dir(C()) # This used to segfault
387
Tim Peters6d6c1a32001-08-02 04:15:00 +0000388binops = {
389 'add': '+',
390 'sub': '-',
391 'mul': '*',
392 'div': '/',
393 'mod': '%',
394 'divmod': 'divmod',
395 'pow': '**',
396 'lshift': '<<',
397 'rshift': '>>',
398 'and': '&',
399 'xor': '^',
400 'or': '|',
401 'cmp': 'cmp',
402 'lt': '<',
403 'le': '<=',
404 'eq': '==',
405 'ne': '!=',
406 'gt': '>',
407 'ge': '>=',
408 }
409
410for name, expr in binops.items():
411 if expr.islower():
412 expr = expr + "(a, b)"
413 else:
414 expr = 'a %s b' % expr
415 binops[name] = expr
416
417unops = {
418 'pos': '+',
419 'neg': '-',
420 'abs': 'abs',
421 'invert': '~',
422 'int': 'int',
423 'long': 'long',
424 'float': 'float',
425 'oct': 'oct',
426 'hex': 'hex',
427 }
428
429for name, expr in unops.items():
430 if expr.islower():
431 expr = expr + "(a)"
432 else:
433 expr = '%s a' % expr
434 unops[name] = expr
435
436def numops(a, b, skip=[]):
437 dict = {'a': a, 'b': b}
438 for name, expr in binops.items():
439 if name not in skip:
440 name = "__%s__" % name
441 if hasattr(a, name):
442 res = eval(expr, dict)
443 testbinop(a, b, res, expr, name)
444 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000445 if name not in skip:
446 name = "__%s__" % name
447 if hasattr(a, name):
448 res = eval(expr, dict)
449 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450
451def ints():
452 if verbose: print "Testing int operations..."
453 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000454 # The following crashes in Python 2.2
455 vereq((1).__nonzero__(), 1)
456 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000457 # This returns 'NotImplemented' in Python 2.2
458 class C(int):
459 def __add__(self, other):
460 return NotImplemented
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000461 vereq(C(5L), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000462 try:
463 C() + ""
464 except TypeError:
465 pass
466 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000467 raise TestFailed, "NotImplemented should have caused TypeError"
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000468 import sys
469 try:
470 C(sys.maxint+1)
471 except OverflowError:
472 pass
473 else:
474 raise TestFailed, "should have raised OverflowError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475
476def longs():
477 if verbose: print "Testing long operations..."
478 numops(100L, 3L)
479
480def floats():
481 if verbose: print "Testing float operations..."
482 numops(100.0, 3.0)
483
484def complexes():
485 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000486 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000487 class Number(complex):
488 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000489 def __new__(cls, *args, **kwds):
490 result = complex.__new__(cls, *args)
491 result.prec = kwds.get('prec', 12)
492 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493 def __repr__(self):
494 prec = self.prec
495 if self.imag == 0.0:
496 return "%.*g" % (prec, self.real)
497 if self.real == 0.0:
498 return "%.*gj" % (prec, self.imag)
499 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
500 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000501
Tim Peters6d6c1a32001-08-02 04:15:00 +0000502 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000503 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000504 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000505
Tim Peters3f996e72001-09-13 19:18:27 +0000506 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000507 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000508 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000509
510 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000511 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000512 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000513
Tim Peters6d6c1a32001-08-02 04:15:00 +0000514def spamlists():
515 if verbose: print "Testing spamlist operations..."
516 import copy, xxsubtype as spam
517 def spamlist(l, memo=None):
518 import xxsubtype as spam
519 return spam.spamlist(l)
520 # This is an ugly hack:
521 copy._deepcopy_dispatch[spam.spamlist] = spamlist
522
523 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
524 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
525 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
526 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
527 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
528 "a[b:c]", "__getslice__")
529 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
530 "a+=b", "__iadd__")
531 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
532 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
533 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
534 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
535 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
536 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
537 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
538 # Test subclassing
539 class C(spam.spamlist):
540 def foo(self): return 1
541 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000542 vereq(a, [])
543 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000544 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000545 vereq(a, [100])
546 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000548 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549
550def spamdicts():
551 if verbose: print "Testing spamdict operations..."
552 import copy, xxsubtype as spam
553 def spamdict(d, memo=None):
554 import xxsubtype as spam
555 sd = spam.spamdict()
556 for k, v in d.items(): sd[k] = v
557 return sd
558 # This is an ugly hack:
559 copy._deepcopy_dispatch[spam.spamdict] = spamdict
560
561 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
562 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
563 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
564 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
565 d = spamdict({1:2,3:4})
566 l1 = []
567 for i in d.keys(): l1.append(i)
568 l = []
569 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000570 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000571 l = []
572 for i in d.__iter__(): 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 type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000576 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 straightd = {1:2, 3:4}
578 spamd = spamdict(straightd)
579 testunop(spamd, 2, "len(a)", "__len__")
580 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
581 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
582 "a[b]=c", "__setitem__")
583 # Test subclassing
584 class C(spam.spamdict):
585 def foo(self): return 1
586 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000587 vereq(a.items(), [])
588 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a.items(), [('foo', 'bar')])
591 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000594
595def pydicts():
596 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000597 verify(issubclass(dict, dict))
598 verify(isinstance({}, dict))
599 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000600 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000601 verify(d.__class__ is dict)
602 verify(isinstance(d, dict))
603 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604 state = -1
605 def __init__(self, *a, **kw):
606 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000607 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000608 self.state = a[0]
609 if kw:
610 for k, v in kw.items(): self[v] = k
611 def __getitem__(self, key):
612 return self.get(key, 0)
613 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000614 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000615 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000616 def setstate(self, state):
617 self.state = state
618 def getstate(self):
619 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000620 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000622 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000624 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000625 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000626 vereq(a.state, -1)
627 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a.state, 0)
630 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000631 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000632 vereq(a.state, 10)
633 vereq(a.getstate(), 10)
634 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000635 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000636 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637 if verbose: print "pydict stress test ..."
638 N = 50
639 for i in range(N):
640 a[i] = C()
641 for j in range(N):
642 a[i][j] = i*j
643 for i in range(N):
644 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000645 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000646
647def pylists():
648 if verbose: print "Testing Python subclass of list..."
649 class C(list):
650 def __getitem__(self, i):
651 return list.__getitem__(self, i) + 100
652 def __getslice__(self, i, j):
653 return (i, j)
654 a = C()
655 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000656 vereq(a[0], 100)
657 vereq(a[1], 101)
658 vereq(a[2], 102)
659 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000660
661def metaclass():
662 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000663 class C:
664 __metaclass__ = type
665 def __init__(self):
666 self.__state = 0
667 def getstate(self):
668 return self.__state
669 def setstate(self, state):
670 self.__state = state
671 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000672 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 class D:
676 class __metaclass__(type):
677 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000678 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000679 d = D()
680 verify(d.__class__ is D)
681 class M1(type):
682 def __new__(cls, name, bases, dict):
683 dict['__spam__'] = 1
684 return type.__new__(cls, name, bases, dict)
685 class C:
686 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000687 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000688 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000689 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000690
Guido van Rossum309b5662001-08-17 11:43:17 +0000691 class _instance(object):
692 pass
693 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000694 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000695 def __new__(cls, name, bases, dict):
696 self = object.__new__(cls)
697 self.name = name
698 self.bases = bases
699 self.dict = dict
700 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000701 def __call__(self):
702 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000703 # Early binding of methods
704 for key in self.dict:
705 if key.startswith("__"):
706 continue
707 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000708 return it
709 class C:
710 __metaclass__ = M2
711 def spam(self):
712 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000713 vereq(C.name, 'C')
714 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000715 verify('spam' in C.dict)
716 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000717 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000718
Guido van Rossum91ee7982001-08-30 20:52:40 +0000719 # More metaclass examples
720
721 class autosuper(type):
722 # Automatically add __super to the class
723 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000724 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000725 cls = super(autosuper, metaclass).__new__(metaclass,
726 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000727 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000728 while name[:1] == "_":
729 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000730 if name:
731 name = "_%s__super" % name
732 else:
733 name = "__super"
734 setattr(cls, name, super(cls))
735 return cls
736 class A:
737 __metaclass__ = autosuper
738 def meth(self):
739 return "A"
740 class B(A):
741 def meth(self):
742 return "B" + self.__super.meth()
743 class C(A):
744 def meth(self):
745 return "C" + self.__super.meth()
746 class D(C, B):
747 def meth(self):
748 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000749 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000750 class E(B, C):
751 def meth(self):
752 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000753 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000754
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000755 class autoproperty(type):
756 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000757 # named _get_x and/or _set_x are found
758 def __new__(metaclass, name, bases, dict):
759 hits = {}
760 for key, val in dict.iteritems():
761 if key.startswith("_get_"):
762 key = key[5:]
763 get, set = hits.get(key, (None, None))
764 get = val
765 hits[key] = get, set
766 elif key.startswith("_set_"):
767 key = key[5:]
768 get, set = hits.get(key, (None, None))
769 set = val
770 hits[key] = get, set
771 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000772 dict[key] = property(get, set)
773 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000774 name, bases, dict)
775 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000776 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000777 def _get_x(self):
778 return -self.__x
779 def _set_x(self, x):
780 self.__x = -x
781 a = A()
782 verify(not hasattr(a, "x"))
783 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000784 vereq(a.x, 12)
785 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000786
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000787 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000788 # Merge of multiple cooperating metaclasses
789 pass
790 class A:
791 __metaclass__ = multimetaclass
792 def _get_x(self):
793 return "A"
794 class B(A):
795 def _get_x(self):
796 return "B" + self.__super._get_x()
797 class C(A):
798 def _get_x(self):
799 return "C" + self.__super._get_x()
800 class D(C, B):
801 def _get_x(self):
802 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000803 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000804
Guido van Rossumf76de622001-10-18 15:49:21 +0000805 # Make sure type(x) doesn't call x.__class__.__init__
806 class T(type):
807 counter = 0
808 def __init__(self, *args):
809 T.counter += 1
810 class C:
811 __metaclass__ = T
812 vereq(T.counter, 1)
813 a = C()
814 vereq(type(a), C)
815 vereq(T.counter, 1)
816
Guido van Rossum29d26062001-12-11 04:37:34 +0000817 class C(object): pass
818 c = C()
819 try: c()
820 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000821 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000822
Tim Peters6d6c1a32001-08-02 04:15:00 +0000823def pymods():
824 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000826 import sys
827 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000829 def __init__(self, name):
830 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000831 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000832 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000833 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 def __setattr__(self, name, value):
835 log.append(("setattr", name, value))
836 MT.__setattr__(self, name, value)
837 def __delattr__(self, name):
838 log.append(("delattr", name))
839 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000840 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841 a.foo = 12
842 x = a.foo
843 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000844 vereq(log, [("setattr", "foo", 12),
845 ("getattr", "foo"),
846 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847
848def multi():
849 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 class C(object):
851 def __init__(self):
852 self.__state = 0
853 def getstate(self):
854 return self.__state
855 def setstate(self, state):
856 self.__state = state
857 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000858 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000860 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000861 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862 def __init__(self):
863 type({}).__init__(self)
864 C.__init__(self)
865 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000866 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000868 vereq(d.items(), [("hello", "world")])
869 vereq(d["hello"], "world")
870 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000871 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000872 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000873 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874
Guido van Rossume45763a2001-08-10 21:28:46 +0000875 # SF bug #442833
876 class Node(object):
877 def __int__(self):
878 return int(self.foo())
879 def foo(self):
880 return "23"
881 class Frag(Node, list):
882 def foo(self):
883 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000884 vereq(Node().__int__(), 23)
885 vereq(int(Node()), 23)
886 vereq(Frag().__int__(), 42)
887 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000888
Tim Petersa91e9642001-11-14 23:32:33 +0000889 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000890
891 class A:
892 x = 1
893
894 class B(A):
895 pass
896
897 class C(A):
898 x = 2
899
900 class D(B, C):
901 pass
902 vereq(D.x, 1)
903
904 # Classic MRO is preserved for a classic base class.
905 class E(D, object):
906 pass
907 vereq(E.__mro__, (E, D, B, A, C, object))
908 vereq(E.x, 1)
909
910 # But with a mix of classic bases, their MROs are combined using
911 # new-style MRO.
912 class F(B, C, object):
913 pass
914 vereq(F.__mro__, (F, B, C, A, object))
915 vereq(F.x, 2)
916
917 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000918 class C:
919 def cmethod(self):
920 return "C a"
921 def all_method(self):
922 return "C b"
923
924 class M1(C, object):
925 def m1method(self):
926 return "M1 a"
927 def all_method(self):
928 return "M1 b"
929
930 vereq(M1.__mro__, (M1, C, object))
931 m = M1()
932 vereq(m.cmethod(), "C a")
933 vereq(m.m1method(), "M1 a")
934 vereq(m.all_method(), "M1 b")
935
936 class D(C):
937 def dmethod(self):
938 return "D a"
939 def all_method(self):
940 return "D b"
941
Guido van Rossum9a818922002-11-14 19:50:14 +0000942 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000943 def m2method(self):
944 return "M2 a"
945 def all_method(self):
946 return "M2 b"
947
Guido van Rossum9a818922002-11-14 19:50:14 +0000948 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000949 m = M2()
950 vereq(m.cmethod(), "C a")
951 vereq(m.dmethod(), "D a")
952 vereq(m.m2method(), "M2 a")
953 vereq(m.all_method(), "M2 b")
954
Guido van Rossum9a818922002-11-14 19:50:14 +0000955 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000956 def m3method(self):
957 return "M3 a"
958 def all_method(self):
959 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000960 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000961 m = M3()
962 vereq(m.cmethod(), "C a")
963 vereq(m.dmethod(), "D a")
964 vereq(m.m1method(), "M1 a")
965 vereq(m.m2method(), "M2 a")
966 vereq(m.m3method(), "M3 a")
967 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000968
Guido van Rossume54616c2001-12-14 04:19:56 +0000969 class Classic:
970 pass
971 try:
972 class New(Classic):
973 __metaclass__ = type
974 except TypeError:
975 pass
976 else:
977 raise TestFailed, "new class with only classic bases - shouldn't be"
978
Tim Peters6d6c1a32001-08-02 04:15:00 +0000979def diamond():
980 if verbose: print "Testing multiple inheritance special cases..."
981 class A(object):
982 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000983 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 class B(A):
985 def boo(self): return "B"
986 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000987 vereq(B().spam(), "B")
988 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989 class C(A):
990 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000991 vereq(C().spam(), "A")
992 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000993 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000994 vereq(D().spam(), "B")
995 vereq(D().boo(), "B")
996 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000998 vereq(E().spam(), "B")
999 vereq(E().boo(), "C")
1000 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +00001001 # MRO order disagreement
1002 try:
1003 class F(D, E): pass
1004 except TypeError:
1005 pass
1006 else:
1007 raise TestFailed, "expected MRO order disagreement (F)"
1008 try:
1009 class G(E, D): pass
1010 except TypeError:
1011 pass
1012 else:
1013 raise TestFailed, "expected MRO order disagreement (G)"
1014
1015
1016# see thread python-dev/2002-October/029035.html
1017def ex5():
1018 if verbose: print "Testing ex5 from C3 switch discussion..."
1019 class A(object): pass
1020 class B(object): pass
1021 class C(object): pass
1022 class X(A): pass
1023 class Y(A): pass
1024 class Z(X,B,Y,C): pass
1025 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1026
1027# see "A Monotonic Superclass Linearization for Dylan",
1028# by Kim Barrett et al. (OOPSLA 1996)
1029def monotonicity():
1030 if verbose: print "Testing MRO monotonicity..."
1031 class Boat(object): pass
1032 class DayBoat(Boat): pass
1033 class WheelBoat(Boat): pass
1034 class EngineLess(DayBoat): pass
1035 class SmallMultihull(DayBoat): pass
1036 class PedalWheelBoat(EngineLess,WheelBoat): pass
1037 class SmallCatamaran(SmallMultihull): pass
1038 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1039
1040 vereq(PedalWheelBoat.__mro__,
1041 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1042 object))
1043 vereq(SmallCatamaran.__mro__,
1044 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1045
1046 vereq(Pedalo.__mro__,
1047 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1048 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1049
1050# see "A Monotonic Superclass Linearization for Dylan",
1051# by Kim Barrett et al. (OOPSLA 1996)
1052def consistency_with_epg():
1053 if verbose: print "Testing consistentcy with EPG..."
1054 class Pane(object): pass
1055 class ScrollingMixin(object): pass
1056 class EditingMixin(object): pass
1057 class ScrollablePane(Pane,ScrollingMixin): pass
1058 class EditablePane(Pane,EditingMixin): pass
1059 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1060
1061 vereq(EditableScrollablePane.__mro__,
1062 (EditableScrollablePane, ScrollablePane, EditablePane,
1063 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001064
Raymond Hettingerf394df42003-04-06 19:13:41 +00001065mro_err_msg = """Cannot create a consistent method resolution
1066order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +00001067
Guido van Rossumd32047f2002-11-25 21:38:52 +00001068def mro_disagreement():
1069 if verbose: print "Testing error messages for MRO disagreement..."
1070 def raises(exc, expected, callable, *args):
1071 try:
1072 callable(*args)
1073 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001074 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001075 raise TestFailed, "Message %r, expected %r" % (str(msg),
1076 expected)
1077 else:
1078 raise TestFailed, "Expected %s" % exc
1079 class A(object): pass
1080 class B(A): pass
1081 class C(object): pass
1082 # Test some very simple errors
1083 raises(TypeError, "duplicate base class A",
1084 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001085 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001086 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001087 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001088 type, "X", (A, C, B), {})
1089 # Test a slightly more complex error
1090 class GridLayout(object): pass
1091 class HorizontalGrid(GridLayout): pass
1092 class VerticalGrid(GridLayout): pass
1093 class HVGrid(HorizontalGrid, VerticalGrid): pass
1094 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +00001095 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001096 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1097
Guido van Rossum37202612001-08-09 19:45:21 +00001098def objects():
1099 if verbose: print "Testing object class..."
1100 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001101 vereq(a.__class__, object)
1102 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001103 b = object()
1104 verify(a is not b)
1105 verify(not hasattr(a, "foo"))
1106 try:
1107 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001108 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001109 pass
1110 else:
1111 verify(0, "object() should not allow setting a foo attribute")
1112 verify(not hasattr(object(), "__dict__"))
1113
1114 class Cdict(object):
1115 pass
1116 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001117 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001118 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001119 vereq(x.foo, 1)
1120 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001121
Tim Peters6d6c1a32001-08-02 04:15:00 +00001122def slots():
1123 if verbose: print "Testing __slots__..."
1124 class C0(object):
1125 __slots__ = []
1126 x = C0()
1127 verify(not hasattr(x, "__dict__"))
1128 verify(not hasattr(x, "foo"))
1129
1130 class C1(object):
1131 __slots__ = ['a']
1132 x = C1()
1133 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001134 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001135 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001136 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001137 x.a = None
1138 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001139 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001140 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001141
1142 class C3(object):
1143 __slots__ = ['a', 'b', 'c']
1144 x = C3()
1145 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001146 verify(not hasattr(x, 'a'))
1147 verify(not hasattr(x, 'b'))
1148 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001149 x.a = 1
1150 x.b = 2
1151 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001152 vereq(x.a, 1)
1153 vereq(x.b, 2)
1154 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001156 class C4(object):
1157 """Validate name mangling"""
1158 __slots__ = ['__a']
1159 def __init__(self, value):
1160 self.__a = value
1161 def get(self):
1162 return self.__a
1163 x = C4(5)
1164 verify(not hasattr(x, '__dict__'))
1165 verify(not hasattr(x, '__a'))
1166 vereq(x.get(), 5)
1167 try:
1168 x.__a = 6
1169 except AttributeError:
1170 pass
1171 else:
1172 raise TestFailed, "Double underscored names not mangled"
1173
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001174 # Make sure slot names are proper identifiers
1175 try:
1176 class C(object):
1177 __slots__ = [None]
1178 except TypeError:
1179 pass
1180 else:
1181 raise TestFailed, "[None] slots not caught"
1182 try:
1183 class C(object):
1184 __slots__ = ["foo bar"]
1185 except TypeError:
1186 pass
1187 else:
1188 raise TestFailed, "['foo bar'] slots not caught"
1189 try:
1190 class C(object):
1191 __slots__ = ["foo\0bar"]
1192 except TypeError:
1193 pass
1194 else:
1195 raise TestFailed, "['foo\\0bar'] slots not caught"
1196 try:
1197 class C(object):
1198 __slots__ = ["1"]
1199 except TypeError:
1200 pass
1201 else:
1202 raise TestFailed, "['1'] slots not caught"
1203 try:
1204 class C(object):
1205 __slots__ = [""]
1206 except TypeError:
1207 pass
1208 else:
1209 raise TestFailed, "[''] slots not caught"
1210 class C(object):
1211 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1212
Žiga Seilnacht94c88722007-03-14 12:34:30 +00001213 # Test unicode slot names
1214 try:
1215 unichr
1216 except NameError:
1217 pass
1218 else:
1219 # _unicode_to_string used to modify slots in certain circumstances
1220 slots = (unicode("foo"), unicode("bar"))
1221 class C(object):
1222 __slots__ = slots
1223 x = C()
1224 x.foo = 5
1225 vereq(x.foo, 5)
1226 veris(type(slots[0]), unicode)
1227 # this used to leak references
1228 try:
1229 class C(object):
1230 __slots__ = [unichr(128)]
1231 except (TypeError, UnicodeEncodeError):
1232 pass
1233 else:
1234 raise TestFailed, "[unichr(128)] slots not caught"
1235
Guido van Rossum33bab012001-12-05 22:45:48 +00001236 # Test leaks
1237 class Counted(object):
1238 counter = 0 # counts the number of instances alive
1239 def __init__(self):
1240 Counted.counter += 1
1241 def __del__(self):
1242 Counted.counter -= 1
1243 class C(object):
1244 __slots__ = ['a', 'b', 'c']
1245 x = C()
1246 x.a = Counted()
1247 x.b = Counted()
1248 x.c = Counted()
1249 vereq(Counted.counter, 3)
1250 del x
1251 vereq(Counted.counter, 0)
1252 class D(C):
1253 pass
1254 x = D()
1255 x.a = Counted()
1256 x.z = Counted()
1257 vereq(Counted.counter, 2)
1258 del x
1259 vereq(Counted.counter, 0)
1260 class E(D):
1261 __slots__ = ['e']
1262 x = E()
1263 x.a = Counted()
1264 x.z = Counted()
1265 x.e = Counted()
1266 vereq(Counted.counter, 3)
1267 del x
1268 vereq(Counted.counter, 0)
1269
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001270 # Test cyclical leaks [SF bug 519621]
1271 class F(object):
1272 __slots__ = ['a', 'b']
1273 log = []
1274 s = F()
1275 s.a = [Counted(), s]
1276 vereq(Counted.counter, 1)
1277 s = None
1278 import gc
1279 gc.collect()
1280 vereq(Counted.counter, 0)
1281
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001282 # Test lookup leaks [SF bug 572567]
1283 import sys,gc
1284 class G(object):
1285 def __cmp__(self, other):
1286 return 0
1287 g = G()
1288 orig_objects = len(gc.get_objects())
1289 for i in xrange(10):
1290 g==g
1291 new_objects = len(gc.get_objects())
1292 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001293 class H(object):
1294 __slots__ = ['a', 'b']
1295 def __init__(self):
1296 self.a = 1
1297 self.b = 2
1298 def __del__(self):
1299 assert self.a == 1
1300 assert self.b == 2
1301
1302 save_stderr = sys.stderr
1303 sys.stderr = sys.stdout
1304 h = H()
1305 try:
1306 del h
1307 finally:
1308 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001309
Guido van Rossum8b056da2002-08-13 18:26:26 +00001310def slotspecials():
1311 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1312
1313 class D(object):
1314 __slots__ = ["__dict__"]
1315 a = D()
1316 verify(hasattr(a, "__dict__"))
1317 verify(not hasattr(a, "__weakref__"))
1318 a.foo = 42
1319 vereq(a.__dict__, {"foo": 42})
1320
1321 class W(object):
1322 __slots__ = ["__weakref__"]
1323 a = W()
1324 verify(hasattr(a, "__weakref__"))
1325 verify(not hasattr(a, "__dict__"))
1326 try:
1327 a.foo = 42
1328 except AttributeError:
1329 pass
1330 else:
1331 raise TestFailed, "shouldn't be allowed to set a.foo"
1332
1333 class C1(W, D):
1334 __slots__ = []
1335 a = C1()
1336 verify(hasattr(a, "__dict__"))
1337 verify(hasattr(a, "__weakref__"))
1338 a.foo = 42
1339 vereq(a.__dict__, {"foo": 42})
1340
1341 class C2(D, W):
1342 __slots__ = []
1343 a = C2()
1344 verify(hasattr(a, "__dict__"))
1345 verify(hasattr(a, "__weakref__"))
1346 a.foo = 42
1347 vereq(a.__dict__, {"foo": 42})
1348
Guido van Rossum9a818922002-11-14 19:50:14 +00001349# MRO order disagreement
1350#
1351# class C3(C1, C2):
1352# __slots__ = []
1353#
1354# class C4(C2, C1):
1355# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001356
Tim Peters6d6c1a32001-08-02 04:15:00 +00001357def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001358 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001359 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001361 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001362 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001363 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001365 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001366 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001367 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001368 vereq(E.foo, 1)
1369 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001370 # Test dynamic instances
1371 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001372 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001373 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001374 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001375 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001376 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001377 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001378 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001379 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001380 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001381 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001382 vereq(int(a), 100)
1383 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001384 verify(not hasattr(a, "spam"))
1385 def mygetattr(self, name):
1386 if name == "spam":
1387 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001388 raise AttributeError
1389 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001390 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001391 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001392 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001393 def mysetattr(self, name, value):
1394 if name == "spam":
1395 raise AttributeError
1396 return object.__setattr__(self, name, value)
1397 C.__setattr__ = mysetattr
1398 try:
1399 a.spam = "not spam"
1400 except AttributeError:
1401 pass
1402 else:
1403 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001404 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001405 class D(C):
1406 pass
1407 d = D()
1408 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001409 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001410
Guido van Rossum7e35d572001-09-15 03:14:32 +00001411 # Test handling of int*seq and seq*int
1412 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001413 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001414 vereq("a"*I(2), "aa")
1415 vereq(I(2)*"a", "aa")
1416 vereq(2*I(3), 6)
1417 vereq(I(3)*2, 6)
1418 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001419
1420 # Test handling of long*seq and seq*long
1421 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001422 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001423 vereq("a"*L(2L), "aa")
1424 vereq(L(2L)*"a", "aa")
1425 vereq(2*L(3), 6)
1426 vereq(L(3)*2, 6)
1427 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001428
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001429 # Test comparison of classes with dynamic metaclasses
1430 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001431 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001432 class someclass:
1433 __metaclass__ = dynamicmetaclass
1434 verify(someclass != object)
1435
Tim Peters6d6c1a32001-08-02 04:15:00 +00001436def errors():
1437 if verbose: print "Testing errors..."
1438
1439 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001440 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001441 pass
1442 except TypeError:
1443 pass
1444 else:
1445 verify(0, "inheritance from both list and dict should be illegal")
1446
1447 try:
1448 class C(object, None):
1449 pass
1450 except TypeError:
1451 pass
1452 else:
1453 verify(0, "inheritance from non-type should be illegal")
1454 class Classic:
1455 pass
1456
1457 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001458 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001459 pass
1460 except TypeError:
1461 pass
1462 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001463 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001464
1465 try:
1466 class C(object):
1467 __slots__ = 1
1468 except TypeError:
1469 pass
1470 else:
1471 verify(0, "__slots__ = 1 should be illegal")
1472
1473 try:
1474 class C(object):
1475 __slots__ = [1]
1476 except TypeError:
1477 pass
1478 else:
1479 verify(0, "__slots__ = [1] should be illegal")
1480
1481def classmethods():
1482 if verbose: print "Testing class methods..."
1483 class C(object):
1484 def foo(*a): return a
1485 goo = classmethod(foo)
1486 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001487 vereq(C.goo(1), (C, 1))
1488 vereq(c.goo(1), (C, 1))
1489 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001490 class D(C):
1491 pass
1492 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001493 vereq(D.goo(1), (D, 1))
1494 vereq(d.goo(1), (D, 1))
1495 vereq(d.foo(1), (d, 1))
1496 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001497 # Test for a specific crash (SF bug 528132)
1498 def f(cls, arg): return (cls, arg)
1499 ff = classmethod(f)
1500 vereq(ff.__get__(0, int)(42), (int, 42))
1501 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001502
Guido van Rossum155db9a2002-04-02 17:53:47 +00001503 # Test super() with classmethods (SF bug 535444)
1504 veris(C.goo.im_self, C)
1505 veris(D.goo.im_self, D)
1506 veris(super(D,D).goo.im_self, D)
1507 veris(super(D,d).goo.im_self, D)
1508 vereq(super(D,D).goo(), (D,))
1509 vereq(super(D,d).goo(), (D,))
1510
Raymond Hettingerbe971532003-06-18 01:13:41 +00001511 # Verify that argument is checked for callability (SF bug 753451)
1512 try:
1513 classmethod(1).__get__(1)
1514 except TypeError:
1515 pass
1516 else:
1517 raise TestFailed, "classmethod should check for callability"
1518
Georg Brandl6a29c322006-02-21 22:17:46 +00001519 # Verify that classmethod() doesn't allow keyword args
1520 try:
1521 classmethod(f, kw=1)
1522 except TypeError:
1523 pass
1524 else:
1525 raise TestFailed, "classmethod shouldn't accept keyword args"
1526
Fred Drakef841aa62002-03-28 15:49:54 +00001527def classmethods_in_c():
1528 if verbose: print "Testing C-based class methods..."
1529 import xxsubtype as spam
1530 a = (1, 2, 3)
1531 d = {'abc': 123}
1532 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001533 veris(x, spam.spamlist)
1534 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001535 vereq(d, d1)
1536 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001537 veris(x, spam.spamlist)
1538 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001539 vereq(d, d1)
1540
Tim Peters6d6c1a32001-08-02 04:15:00 +00001541def staticmethods():
1542 if verbose: print "Testing static methods..."
1543 class C(object):
1544 def foo(*a): return a
1545 goo = staticmethod(foo)
1546 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001547 vereq(C.goo(1), (1,))
1548 vereq(c.goo(1), (1,))
1549 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001550 class D(C):
1551 pass
1552 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001553 vereq(D.goo(1), (1,))
1554 vereq(d.goo(1), (1,))
1555 vereq(d.foo(1), (d, 1))
1556 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001557
Fred Drakef841aa62002-03-28 15:49:54 +00001558def staticmethods_in_c():
1559 if verbose: print "Testing C-based static methods..."
1560 import xxsubtype as spam
1561 a = (1, 2, 3)
1562 d = {"abc": 123}
1563 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1564 veris(x, None)
1565 vereq(a, a1)
1566 vereq(d, d1)
1567 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1568 veris(x, None)
1569 vereq(a, a1)
1570 vereq(d, d1)
1571
Tim Peters6d6c1a32001-08-02 04:15:00 +00001572def classic():
1573 if verbose: print "Testing classic classes..."
1574 class C:
1575 def foo(*a): return a
1576 goo = classmethod(foo)
1577 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001578 vereq(C.goo(1), (C, 1))
1579 vereq(c.goo(1), (C, 1))
1580 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001581 class D(C):
1582 pass
1583 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001584 vereq(D.goo(1), (D, 1))
1585 vereq(d.goo(1), (D, 1))
1586 vereq(d.foo(1), (d, 1))
1587 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001588 class E: # *not* subclassing from C
1589 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001590 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001591 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001592
1593def compattr():
1594 if verbose: print "Testing computed attributes..."
1595 class C(object):
1596 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001597 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001598 self.__get = get
1599 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001600 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001601 def __get__(self, obj, type=None):
1602 return self.__get(obj)
1603 def __set__(self, obj, value):
1604 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001605 def __delete__(self, obj):
1606 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001607 def __init__(self):
1608 self.__x = 0
1609 def __get_x(self):
1610 x = self.__x
1611 self.__x = x+1
1612 return x
1613 def __set_x(self, x):
1614 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001615 def __delete_x(self):
1616 del self.__x
1617 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001618 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001619 vereq(a.x, 0)
1620 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001621 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001622 vereq(a.x, 10)
1623 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001624 del a.x
1625 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001626
1627def newslot():
1628 if verbose: print "Testing __new__ slot override..."
1629 class C(list):
1630 def __new__(cls):
1631 self = list.__new__(cls)
1632 self.foo = 1
1633 return self
1634 def __init__(self):
1635 self.foo = self.foo + 2
1636 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001637 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001638 verify(a.__class__ is C)
1639 class D(C):
1640 pass
1641 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001642 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001643 verify(b.__class__ is D)
1644
Tim Peters6d6c1a32001-08-02 04:15:00 +00001645def altmro():
1646 if verbose: print "Testing mro() and overriding it..."
1647 class A(object):
1648 def f(self): return "A"
1649 class B(A):
1650 pass
1651 class C(A):
1652 def f(self): return "C"
1653 class D(B, C):
1654 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001655 vereq(D.mro(), [D, B, C, A, object])
1656 vereq(D.__mro__, (D, B, C, A, object))
1657 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001658
Guido van Rossumd3077402001-08-12 05:24:18 +00001659 class PerverseMetaType(type):
1660 def mro(cls):
1661 L = type.mro(cls)
1662 L.reverse()
1663 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001664 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(X.__mro__, (object, A, C, B, D, X))
1667 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001668
Armin Rigo037d1e02005-12-29 17:07:39 +00001669 try:
1670 class X(object):
1671 class __metaclass__(type):
1672 def mro(self):
1673 return [self, dict, object]
1674 except TypeError:
1675 pass
1676 else:
1677 raise TestFailed, "devious mro() return not caught"
1678
1679 try:
1680 class X(object):
1681 class __metaclass__(type):
1682 def mro(self):
1683 return [1]
1684 except TypeError:
1685 pass
1686 else:
1687 raise TestFailed, "non-class mro() return not caught"
1688
1689 try:
1690 class X(object):
1691 class __metaclass__(type):
1692 def mro(self):
1693 return 1
1694 except TypeError:
1695 pass
1696 else:
1697 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001698
Armin Rigo037d1e02005-12-29 17:07:39 +00001699
Tim Peters6d6c1a32001-08-02 04:15:00 +00001700def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001701 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001702
1703 class B(object):
1704 "Intermediate class because object doesn't have a __setattr__"
1705
1706 class C(B):
1707
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001708 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001709 if name == "foo":
1710 return ("getattr", name)
1711 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001712 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001713 def __setattr__(self, name, value):
1714 if name == "foo":
1715 self.setattr = (name, value)
1716 else:
1717 return B.__setattr__(self, name, value)
1718 def __delattr__(self, name):
1719 if name == "foo":
1720 self.delattr = name
1721 else:
1722 return B.__delattr__(self, name)
1723
1724 def __getitem__(self, key):
1725 return ("getitem", key)
1726 def __setitem__(self, key, value):
1727 self.setitem = (key, value)
1728 def __delitem__(self, key):
1729 self.delitem = key
1730
1731 def __getslice__(self, i, j):
1732 return ("getslice", i, j)
1733 def __setslice__(self, i, j, value):
1734 self.setslice = (i, j, value)
1735 def __delslice__(self, i, j):
1736 self.delslice = (i, j)
1737
1738 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001739 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001740 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001741 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001742 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001743 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001744
Guido van Rossum45704552001-10-08 16:35:45 +00001745 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001746 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001747 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001748 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001749 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001750
Guido van Rossum45704552001-10-08 16:35:45 +00001751 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001752 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001753 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001754 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001755 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001756
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001757def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001758 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001759 class C(object):
1760 def __init__(self, x):
1761 self.x = x
1762 def foo(self):
1763 return self.x
1764 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001765 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001766 class D(C):
1767 boo = C.foo
1768 goo = c1.foo
1769 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001770 vereq(d2.foo(), 2)
1771 vereq(d2.boo(), 2)
1772 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001773 class E(object):
1774 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001775 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001776 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001777
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001778def specials():
1779 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001780 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001781 # Test the default behavior for static classes
1782 class C(object):
1783 def __getitem__(self, i):
1784 if 0 <= i < 10: return i
1785 raise IndexError
1786 c1 = C()
1787 c2 = C()
1788 verify(not not c1)
Tim Peters85b362f2006-04-11 01:21:00 +00001789 verify(id(c1) != id(c2))
1790 hash(c1)
1791 hash(c2)
Guido van Rossum45704552001-10-08 16:35:45 +00001792 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1793 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001794 verify(c1 != c2)
1795 verify(not c1 != c1)
1796 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001797 # Note that the module name appears in str/repr, and that varies
1798 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001799 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001800 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001801 verify(-1 not in c1)
1802 for i in range(10):
1803 verify(i in c1)
1804 verify(10 not in c1)
1805 # Test the default behavior for dynamic classes
1806 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001807 def __getitem__(self, i):
1808 if 0 <= i < 10: return i
1809 raise IndexError
1810 d1 = D()
1811 d2 = D()
1812 verify(not not d1)
Tim Peters85b362f2006-04-11 01:21:00 +00001813 verify(id(d1) != id(d2))
1814 hash(d1)
1815 hash(d2)
Guido van Rossum45704552001-10-08 16:35:45 +00001816 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1817 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001818 verify(d1 != d2)
1819 verify(not d1 != d1)
1820 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001821 # Note that the module name appears in str/repr, and that varies
1822 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001823 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001824 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001825 verify(-1 not in d1)
1826 for i in range(10):
1827 verify(i in d1)
1828 verify(10 not in d1)
1829 # Test overridden behavior for static classes
1830 class Proxy(object):
1831 def __init__(self, x):
1832 self.x = x
1833 def __nonzero__(self):
1834 return not not self.x
1835 def __hash__(self):
1836 return hash(self.x)
1837 def __eq__(self, other):
1838 return self.x == other
1839 def __ne__(self, other):
1840 return self.x != other
1841 def __cmp__(self, other):
1842 return cmp(self.x, other.x)
1843 def __str__(self):
1844 return "Proxy:%s" % self.x
1845 def __repr__(self):
1846 return "Proxy(%r)" % self.x
1847 def __contains__(self, value):
1848 return value in self.x
1849 p0 = Proxy(0)
1850 p1 = Proxy(1)
1851 p_1 = Proxy(-1)
1852 verify(not p0)
1853 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001854 vereq(hash(p0), hash(0))
1855 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001856 verify(p0 != p1)
1857 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001858 vereq(not p0, p1)
1859 vereq(cmp(p0, p1), -1)
1860 vereq(cmp(p0, p0), 0)
1861 vereq(cmp(p0, p_1), 1)
1862 vereq(str(p0), "Proxy:0")
1863 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001864 p10 = Proxy(range(10))
1865 verify(-1 not in p10)
1866 for i in range(10):
1867 verify(i in p10)
1868 verify(10 not in p10)
1869 # Test overridden behavior for dynamic classes
1870 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001871 def __init__(self, x):
1872 self.x = x
1873 def __nonzero__(self):
1874 return not not self.x
1875 def __hash__(self):
1876 return hash(self.x)
1877 def __eq__(self, other):
1878 return self.x == other
1879 def __ne__(self, other):
1880 return self.x != other
1881 def __cmp__(self, other):
1882 return cmp(self.x, other.x)
1883 def __str__(self):
1884 return "DProxy:%s" % self.x
1885 def __repr__(self):
1886 return "DProxy(%r)" % self.x
1887 def __contains__(self, value):
1888 return value in self.x
1889 p0 = DProxy(0)
1890 p1 = DProxy(1)
1891 p_1 = DProxy(-1)
1892 verify(not p0)
1893 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001894 vereq(hash(p0), hash(0))
1895 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001896 verify(p0 != p1)
1897 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001898 vereq(not p0, p1)
1899 vereq(cmp(p0, p1), -1)
1900 vereq(cmp(p0, p0), 0)
1901 vereq(cmp(p0, p_1), 1)
1902 vereq(str(p0), "DProxy:0")
1903 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001904 p10 = DProxy(range(10))
1905 verify(-1 not in p10)
1906 for i in range(10):
1907 verify(i in p10)
1908 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001909 # Safety test for __cmp__
1910 def unsafecmp(a, b):
1911 try:
1912 a.__class__.__cmp__(a, b)
1913 except TypeError:
1914 pass
1915 else:
1916 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1917 a.__class__, a, b)
1918 unsafecmp(u"123", "123")
1919 unsafecmp("123", u"123")
1920 unsafecmp(1, 1.0)
1921 unsafecmp(1.0, 1)
1922 unsafecmp(1, 1L)
1923 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001924
Neal Norwitz1a997502003-01-13 20:13:12 +00001925 class Letter(str):
1926 def __new__(cls, letter):
1927 if letter == 'EPS':
1928 return str.__new__(cls)
1929 return str.__new__(cls, letter)
1930 def __str__(self):
1931 if not self:
1932 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001933 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001934
1935 # sys.stdout needs to be the original to trigger the recursion bug
1936 import sys
1937 test_stdout = sys.stdout
1938 sys.stdout = get_original_stdout()
1939 try:
1940 # nothing should actually be printed, this should raise an exception
1941 print Letter('w')
1942 except RuntimeError:
1943 pass
1944 else:
1945 raise TestFailed, "expected a RuntimeError for print recursion"
1946 sys.stdout = test_stdout
1947
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001948def weakrefs():
1949 if verbose: print "Testing weak references..."
1950 import weakref
1951 class C(object):
1952 pass
1953 c = C()
1954 r = weakref.ref(c)
1955 verify(r() is c)
1956 del c
1957 verify(r() is None)
1958 del r
1959 class NoWeak(object):
1960 __slots__ = ['foo']
1961 no = NoWeak()
1962 try:
1963 weakref.ref(no)
1964 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001965 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001966 else:
1967 verify(0, "weakref.ref(no) should be illegal")
1968 class Weak(object):
1969 __slots__ = ['foo', '__weakref__']
1970 yes = Weak()
1971 r = weakref.ref(yes)
1972 verify(r() is yes)
1973 del yes
1974 verify(r() is None)
1975 del r
1976
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001977def properties():
1978 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001979 class C(object):
1980 def getx(self):
1981 return self.__x
1982 def setx(self, value):
1983 self.__x = value
1984 def delx(self):
1985 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001986 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001987 a = C()
1988 verify(not hasattr(a, "x"))
1989 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001990 vereq(a._C__x, 42)
1991 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001992 del a.x
1993 verify(not hasattr(a, "x"))
1994 verify(not hasattr(a, "_C__x"))
1995 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001996 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001997 C.x.__delete__(a)
1998 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001999
Tim Peters66c1a522001-09-24 21:17:50 +00002000 raw = C.__dict__['x']
2001 verify(isinstance(raw, property))
2002
2003 attrs = dir(raw)
2004 verify("__doc__" in attrs)
2005 verify("fget" in attrs)
2006 verify("fset" in attrs)
2007 verify("fdel" in attrs)
2008
Guido van Rossum45704552001-10-08 16:35:45 +00002009 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00002010 verify(raw.fget is C.__dict__['getx'])
2011 verify(raw.fset is C.__dict__['setx'])
2012 verify(raw.fdel is C.__dict__['delx'])
2013
2014 for attr in "__doc__", "fget", "fset", "fdel":
2015 try:
2016 setattr(raw, attr, 42)
2017 except TypeError, msg:
2018 if str(msg).find('readonly') < 0:
2019 raise TestFailed("when setting readonly attr %r on a "
2020 "property, got unexpected TypeError "
2021 "msg %r" % (attr, str(msg)))
2022 else:
2023 raise TestFailed("expected TypeError from trying to set "
2024 "readonly %r attr on a property" % attr)
2025
Neal Norwitz673cd822002-10-18 16:33:13 +00002026 class D(object):
2027 __getitem__ = property(lambda s: 1/0)
2028
2029 d = D()
2030 try:
2031 for i in d:
2032 str(i)
2033 except ZeroDivisionError:
2034 pass
2035 else:
2036 raise TestFailed, "expected ZeroDivisionError from bad property"
2037
Georg Brandl533ff6f2006-03-08 18:09:27 +00002038 class E(object):
2039 def getter(self):
2040 "getter method"
2041 return 0
2042 def setter(self, value):
2043 "setter method"
2044 pass
2045 prop = property(getter)
2046 vereq(prop.__doc__, "getter method")
2047 prop2 = property(fset=setter)
2048 vereq(prop2.__doc__, None)
2049
Georg Brandle9462c72006-08-04 18:03:37 +00002050 # this segfaulted in 2.5b2
2051 try:
2052 import _testcapi
2053 except ImportError:
2054 pass
2055 else:
2056 class X(object):
2057 p = property(_testcapi.test_with_docstring)
2058
2059
Guido van Rossumc4a18802001-08-24 16:55:27 +00002060def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00002061 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00002062
2063 class A(object):
2064 def meth(self, a):
2065 return "A(%r)" % a
2066
Guido van Rossum45704552001-10-08 16:35:45 +00002067 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002068
2069 class B(A):
2070 def __init__(self):
2071 self.__super = super(B, self)
2072 def meth(self, a):
2073 return "B(%r)" % a + self.__super.meth(a)
2074
Guido van Rossum45704552001-10-08 16:35:45 +00002075 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002076
2077 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002078 def meth(self, a):
2079 return "C(%r)" % a + self.__super.meth(a)
2080 C._C__super = super(C)
2081
Guido van Rossum45704552001-10-08 16:35:45 +00002082 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002083
2084 class D(C, B):
2085 def meth(self, a):
2086 return "D(%r)" % a + super(D, self).meth(a)
2087
Guido van Rossum5b443c62001-12-03 15:38:28 +00002088 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2089
2090 # Test for subclassing super
2091
2092 class mysuper(super):
2093 def __init__(self, *args):
2094 return super(mysuper, self).__init__(*args)
2095
2096 class E(D):
2097 def meth(self, a):
2098 return "E(%r)" % a + mysuper(E, self).meth(a)
2099
2100 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2101
2102 class F(E):
2103 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002104 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002105 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2106 F._F__super = mysuper(F)
2107
2108 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2109
2110 # Make sure certain errors are raised
2111
2112 try:
2113 super(D, 42)
2114 except TypeError:
2115 pass
2116 else:
2117 raise TestFailed, "shouldn't allow super(D, 42)"
2118
2119 try:
2120 super(D, C())
2121 except TypeError:
2122 pass
2123 else:
2124 raise TestFailed, "shouldn't allow super(D, C())"
2125
2126 try:
2127 super(D).__get__(12)
2128 except TypeError:
2129 pass
2130 else:
2131 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2132
2133 try:
2134 super(D).__get__(C())
2135 except TypeError:
2136 pass
2137 else:
2138 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002139
Guido van Rossuma4541a32003-04-16 20:02:22 +00002140 # Make sure data descriptors can be overridden and accessed via super
2141 # (new feature in Python 2.3)
2142
2143 class DDbase(object):
2144 def getx(self): return 42
2145 x = property(getx)
2146
2147 class DDsub(DDbase):
2148 def getx(self): return "hello"
2149 x = property(getx)
2150
2151 dd = DDsub()
2152 vereq(dd.x, "hello")
2153 vereq(super(DDsub, dd).x, 42)
2154
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002155 # Ensure that super() lookup of descriptor from classmethod
2156 # works (SF ID# 743627)
2157
2158 class Base(object):
2159 aProp = property(lambda self: "foo")
2160
2161 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002162 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002163 def test(klass):
2164 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002165
2166 veris(Sub.test(), Base.aProp)
2167
Georg Brandlaf4337a2006-09-30 08:43:50 +00002168 # Verify that super() doesn't allow keyword args
2169 try:
2170 super(Base, kw=1)
2171 except TypeError:
2172 pass
2173 else:
2174 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002175
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002176def inherits():
2177 if verbose: print "Testing inheritance from basic types..."
2178
2179 class hexint(int):
2180 def __repr__(self):
2181 return hex(self)
2182 def __add__(self, other):
2183 return hexint(int.__add__(self, other))
2184 # (Note that overriding __radd__ doesn't work,
2185 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002186 vereq(repr(hexint(7) + 9), "0x10")
2187 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002188 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002189 vereq(a, 12345)
2190 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002191 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002192 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002193 verify((+a).__class__ is int)
2194 verify((a >> 0).__class__ is int)
2195 verify((a << 0).__class__ is int)
2196 verify((hexint(0) << 12).__class__ is int)
2197 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002198
2199 class octlong(long):
2200 __slots__ = []
2201 def __str__(self):
2202 s = oct(self)
2203 if s[-1] == 'L':
2204 s = s[:-1]
2205 return s
2206 def __add__(self, other):
2207 return self.__class__(super(octlong, self).__add__(other))
2208 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002209 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002210 # (Note that overriding __radd__ here only seems to work
2211 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002212 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002213 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(a, 12345L)
2215 vereq(long(a), 12345L)
2216 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002217 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002218 verify((+a).__class__ is long)
2219 verify((-a).__class__ is long)
2220 verify((-octlong(0)).__class__ is long)
2221 verify((a >> 0).__class__ is long)
2222 verify((a << 0).__class__ is long)
2223 verify((a - 0).__class__ is long)
2224 verify((a * 1).__class__ is long)
2225 verify((a ** 1).__class__ is long)
2226 verify((a // 1).__class__ is long)
2227 verify((1 * a).__class__ is long)
2228 verify((a | 0).__class__ is long)
2229 verify((a ^ 0).__class__ is long)
2230 verify((a & -1L).__class__ is long)
2231 verify((octlong(0) << 12).__class__ is long)
2232 verify((octlong(0) >> 12).__class__ is long)
2233 verify(abs(octlong(0)).__class__ is long)
2234
2235 # Because octlong overrides __add__, we can't check the absence of +0
2236 # optimizations using octlong.
2237 class longclone(long):
2238 pass
2239 a = longclone(1)
2240 verify((a + 0).__class__ is long)
2241 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002242
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002243 # Check that negative clones don't segfault
2244 a = longclone(-1)
2245 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002246 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002247
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002248 class precfloat(float):
2249 __slots__ = ['prec']
2250 def __init__(self, value=0.0, prec=12):
2251 self.prec = int(prec)
2252 float.__init__(value)
2253 def __repr__(self):
2254 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002255 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002256 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002257 vereq(a, 12345.0)
2258 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002259 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002261 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002262
Tim Peters2400fa42001-09-12 19:12:49 +00002263 class madcomplex(complex):
2264 def __repr__(self):
2265 return "%.17gj%+.17g" % (self.imag, self.real)
2266 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002267 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002268 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002269 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq(a, base)
2271 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002272 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002273 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(repr(a), "4j-3")
2275 vereq(a, base)
2276 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002277 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002279 veris((+a).__class__, complex)
2280 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002282 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002284 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002285 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002286 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002288
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002289 class madtuple(tuple):
2290 _rev = None
2291 def rev(self):
2292 if self._rev is not None:
2293 return self._rev
2294 L = list(self)
2295 L.reverse()
2296 self._rev = self.__class__(L)
2297 return self._rev
2298 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002299 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2300 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2301 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002302 for i in range(512):
2303 t = madtuple(range(i))
2304 u = t.rev()
2305 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002306 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002307 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002308 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002309 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002310 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002311 verify(a[:].__class__ is tuple)
2312 verify((a * 1).__class__ is tuple)
2313 verify((a * 0).__class__ is tuple)
2314 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002315 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002316 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002317 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002318 verify((a + a).__class__ is tuple)
2319 verify((a * 0).__class__ is tuple)
2320 verify((a * 1).__class__ is tuple)
2321 verify((a * 2).__class__ is tuple)
2322 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002323
2324 class madstring(str):
2325 _rev = None
2326 def rev(self):
2327 if self._rev is not None:
2328 return self._rev
2329 L = list(self)
2330 L.reverse()
2331 self._rev = self.__class__("".join(L))
2332 return self._rev
2333 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002334 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2335 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2336 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002337 for i in range(256):
2338 s = madstring("".join(map(chr, range(i))))
2339 t = s.rev()
2340 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002341 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002342 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002344 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002345
Tim Peters8fa5dd02001-09-12 02:18:30 +00002346 base = "\x00" * 5
2347 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(s, base)
2349 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002350 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002351 vereq(hash(s), hash(base))
2352 vereq({s: 1}[base], 1)
2353 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002354 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002356 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002358 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002359 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002360 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002361 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002362 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002363 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002364 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002365 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002366 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002367 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002368 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002369 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002370 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002371 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002372 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002373 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002374 identitytab = ''.join([chr(i) for i in range(256)])
2375 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002376 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002377 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002378 vereq(s.translate(identitytab, "x"), base)
2379 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002380 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002381 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002382 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002383 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002384 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002385 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002386 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002387 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002388 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002389 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002390
Guido van Rossum91ee7982001-08-30 20:52:40 +00002391 class madunicode(unicode):
2392 _rev = None
2393 def rev(self):
2394 if self._rev is not None:
2395 return self._rev
2396 L = list(self)
2397 L.reverse()
2398 self._rev = self.__class__(u"".join(L))
2399 return self._rev
2400 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002401 vereq(u, u"ABCDEF")
2402 vereq(u.rev(), madunicode(u"FEDCBA"))
2403 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002404 base = u"12345"
2405 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002406 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002407 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002408 vereq(hash(u), hash(base))
2409 vereq({u: 1}[base], 1)
2410 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002411 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002412 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002413 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002414 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002415 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002416 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002417 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002418 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002419 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002420 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002421 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002422 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002423 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002424 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002425 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002426 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002427 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002428 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002429 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002430 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002431 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002432 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002433 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002434 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002435 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002436 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002437 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002439 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002440 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002441 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002442 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002443 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002444 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002445 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002446 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002447 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002448 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002449
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002450 class sublist(list):
2451 pass
2452 a = sublist(range(5))
2453 vereq(a, range(5))
2454 a.append("hello")
2455 vereq(a, range(5) + ["hello"])
2456 a[5] = 5
2457 vereq(a, range(6))
2458 a.extend(range(6, 20))
2459 vereq(a, range(20))
2460 a[-5:] = []
2461 vereq(a, range(15))
2462 del a[10:15]
2463 vereq(len(a), 10)
2464 vereq(a, range(10))
2465 vereq(list(a), range(10))
2466 vereq(a[0], 0)
2467 vereq(a[9], 9)
2468 vereq(a[-10], 0)
2469 vereq(a[-1], 9)
2470 vereq(a[:5], range(5))
2471
Tim Peters59c9a642001-09-13 05:38:56 +00002472 class CountedInput(file):
2473 """Counts lines read by self.readline().
2474
2475 self.lineno is the 0-based ordinal of the last line read, up to
2476 a maximum of one greater than the number of lines in the file.
2477
2478 self.ateof is true if and only if the final "" line has been read,
2479 at which point self.lineno stops incrementing, and further calls
2480 to readline() continue to return "".
2481 """
2482
2483 lineno = 0
2484 ateof = 0
2485 def readline(self):
2486 if self.ateof:
2487 return ""
2488 s = file.readline(self)
2489 # Next line works too.
2490 # s = super(CountedInput, self).readline()
2491 self.lineno += 1
2492 if s == "":
2493 self.ateof = 1
2494 return s
2495
Tim Peters561f8992001-09-13 19:36:36 +00002496 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002497 lines = ['a\n', 'b\n', 'c\n']
2498 try:
2499 f.writelines(lines)
2500 f.close()
2501 f = CountedInput(TESTFN)
2502 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2503 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002504 vereq(expected, got)
2505 vereq(f.lineno, i)
2506 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002507 f.close()
2508 finally:
2509 try:
2510 f.close()
2511 except:
2512 pass
2513 try:
2514 import os
2515 os.unlink(TESTFN)
2516 except:
2517 pass
2518
Tim Peters808b94e2001-09-13 19:33:07 +00002519def keywords():
2520 if verbose:
2521 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002522 vereq(int(x=1), 1)
2523 vereq(float(x=2), 2.0)
2524 vereq(long(x=3), 3L)
2525 vereq(complex(imag=42, real=666), complex(666, 42))
2526 vereq(str(object=500), '500')
2527 vereq(unicode(string='abc', errors='strict'), u'abc')
2528 vereq(tuple(sequence=range(3)), (0, 1, 2))
2529 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002530 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002531
2532 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002533 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002534 try:
2535 constructor(bogus_keyword_arg=1)
2536 except TypeError:
2537 pass
2538 else:
2539 raise TestFailed("expected TypeError from bogus keyword "
2540 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002541
Tim Peters8fa45672001-09-13 21:01:29 +00002542def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002543 # XXX This test is disabled because rexec is not deemed safe
2544 return
Tim Peters8fa45672001-09-13 21:01:29 +00002545 import rexec
2546 if verbose:
2547 print "Testing interaction with restricted execution ..."
2548
2549 sandbox = rexec.RExec()
2550
2551 code1 = """f = open(%r, 'w')""" % TESTFN
2552 code2 = """f = file(%r, 'w')""" % TESTFN
2553 code3 = """\
2554f = open(%r)
2555t = type(f) # a sneaky way to get the file() constructor
2556f.close()
2557f = t(%r, 'w') # rexec can't catch this by itself
2558""" % (TESTFN, TESTFN)
2559
2560 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2561 f.close()
2562
2563 try:
2564 for code in code1, code2, code3:
2565 try:
2566 sandbox.r_exec(code)
2567 except IOError, msg:
2568 if str(msg).find("restricted") >= 0:
2569 outcome = "OK"
2570 else:
2571 outcome = "got an exception, but not an expected one"
2572 else:
2573 outcome = "expected a restricted-execution exception"
2574
2575 if outcome != "OK":
2576 raise TestFailed("%s, in %r" % (outcome, code))
2577
2578 finally:
2579 try:
2580 import os
2581 os.unlink(TESTFN)
2582 except:
2583 pass
2584
Tim Peters0ab085c2001-09-14 00:25:33 +00002585def str_subclass_as_dict_key():
2586 if verbose:
2587 print "Testing a str subclass used as dict key .."
2588
2589 class cistr(str):
2590 """Sublcass of str that computes __eq__ case-insensitively.
2591
2592 Also computes a hash code of the string in canonical form.
2593 """
2594
2595 def __init__(self, value):
2596 self.canonical = value.lower()
2597 self.hashcode = hash(self.canonical)
2598
2599 def __eq__(self, other):
2600 if not isinstance(other, cistr):
2601 other = cistr(other)
2602 return self.canonical == other.canonical
2603
2604 def __hash__(self):
2605 return self.hashcode
2606
Guido van Rossum45704552001-10-08 16:35:45 +00002607 vereq(cistr('ABC'), 'abc')
2608 vereq('aBc', cistr('ABC'))
2609 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002610
2611 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002612 vereq(d[cistr('one')], 1)
2613 vereq(d[cistr('tWo')], 2)
2614 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002615 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002616 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002617
Guido van Rossumab3b0342001-09-18 20:38:53 +00002618def classic_comparisons():
2619 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002620 class classic:
2621 pass
2622 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002623 if verbose: print " (base = %s)" % base
2624 class C(base):
2625 def __init__(self, value):
2626 self.value = int(value)
2627 def __cmp__(self, other):
2628 if isinstance(other, C):
2629 return cmp(self.value, other.value)
2630 if isinstance(other, int) or isinstance(other, long):
2631 return cmp(self.value, other)
2632 return NotImplemented
2633 c1 = C(1)
2634 c2 = C(2)
2635 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002636 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002637 c = {1: c1, 2: c2, 3: c3}
2638 for x in 1, 2, 3:
2639 for y in 1, 2, 3:
2640 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2641 for op in "<", "<=", "==", "!=", ">", ">=":
2642 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2643 "x=%d, y=%d" % (x, y))
2644 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2645 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2646
Guido van Rossum0639f592001-09-18 21:06:04 +00002647def rich_comparisons():
2648 if verbose:
2649 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002650 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002651 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002652 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002653 vereq(z, 1+0j)
2654 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002655 class ZZ(complex):
2656 def __eq__(self, other):
2657 try:
2658 return abs(self - other) <= 1e-6
2659 except:
2660 return NotImplemented
2661 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002662 vereq(zz, 1+0j)
2663 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002664
Guido van Rossum0639f592001-09-18 21:06:04 +00002665 class classic:
2666 pass
2667 for base in (classic, int, object, list):
2668 if verbose: print " (base = %s)" % base
2669 class C(base):
2670 def __init__(self, value):
2671 self.value = int(value)
2672 def __cmp__(self, other):
2673 raise TestFailed, "shouldn't call __cmp__"
2674 def __eq__(self, other):
2675 if isinstance(other, C):
2676 return self.value == other.value
2677 if isinstance(other, int) or isinstance(other, long):
2678 return self.value == other
2679 return NotImplemented
2680 def __ne__(self, other):
2681 if isinstance(other, C):
2682 return self.value != other.value
2683 if isinstance(other, int) or isinstance(other, long):
2684 return self.value != other
2685 return NotImplemented
2686 def __lt__(self, other):
2687 if isinstance(other, C):
2688 return self.value < other.value
2689 if isinstance(other, int) or isinstance(other, long):
2690 return self.value < other
2691 return NotImplemented
2692 def __le__(self, other):
2693 if isinstance(other, C):
2694 return self.value <= other.value
2695 if isinstance(other, int) or isinstance(other, long):
2696 return self.value <= other
2697 return NotImplemented
2698 def __gt__(self, other):
2699 if isinstance(other, C):
2700 return self.value > other.value
2701 if isinstance(other, int) or isinstance(other, long):
2702 return self.value > other
2703 return NotImplemented
2704 def __ge__(self, other):
2705 if isinstance(other, C):
2706 return self.value >= other.value
2707 if isinstance(other, int) or isinstance(other, long):
2708 return self.value >= other
2709 return NotImplemented
2710 c1 = C(1)
2711 c2 = C(2)
2712 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002713 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002714 c = {1: c1, 2: c2, 3: c3}
2715 for x in 1, 2, 3:
2716 for y in 1, 2, 3:
2717 for op in "<", "<=", "==", "!=", ">", ">=":
2718 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2719 "x=%d, y=%d" % (x, y))
2720 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2721 "x=%d, y=%d" % (x, y))
2722 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2723 "x=%d, y=%d" % (x, y))
2724
Guido van Rossum1952e382001-09-19 01:25:16 +00002725def coercions():
2726 if verbose: print "Testing coercions..."
2727 class I(int): pass
2728 coerce(I(0), 0)
2729 coerce(0, I(0))
2730 class L(long): pass
2731 coerce(L(0), 0)
2732 coerce(L(0), 0L)
2733 coerce(0, L(0))
2734 coerce(0L, L(0))
2735 class F(float): pass
2736 coerce(F(0), 0)
2737 coerce(F(0), 0L)
2738 coerce(F(0), 0.)
2739 coerce(0, F(0))
2740 coerce(0L, F(0))
2741 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002742 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002743 coerce(C(0), 0)
2744 coerce(C(0), 0L)
2745 coerce(C(0), 0.)
2746 coerce(C(0), 0j)
2747 coerce(0, C(0))
2748 coerce(0L, C(0))
2749 coerce(0., C(0))
2750 coerce(0j, C(0))
2751
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002752def descrdoc():
2753 if verbose: print "Testing descriptor doc strings..."
2754 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002755 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002756 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002757 check(file.name, "file name") # member descriptor
2758
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002759def setclass():
2760 if verbose: print "Testing __class__ assignment..."
2761 class C(object): pass
2762 class D(object): pass
2763 class E(object): pass
2764 class F(D, E): pass
2765 for cls in C, D, E, F:
2766 for cls2 in C, D, E, F:
2767 x = cls()
2768 x.__class__ = cls2
2769 verify(x.__class__ is cls2)
2770 x.__class__ = cls
2771 verify(x.__class__ is cls)
2772 def cant(x, C):
2773 try:
2774 x.__class__ = C
2775 except TypeError:
2776 pass
2777 else:
2778 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002779 try:
2780 delattr(x, "__class__")
2781 except TypeError:
2782 pass
2783 else:
2784 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002785 cant(C(), list)
2786 cant(list(), C)
2787 cant(C(), 1)
2788 cant(C(), object)
2789 cant(object(), list)
2790 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002791 class Int(int): __slots__ = []
2792 cant(2, Int)
2793 cant(Int(), int)
2794 cant(True, int)
2795 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002796 o = object()
2797 cant(o, type(1))
2798 cant(o, type(None))
2799 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002800
Guido van Rossum6661be32001-10-26 04:26:12 +00002801def setdict():
2802 if verbose: print "Testing __dict__ assignment..."
2803 class C(object): pass
2804 a = C()
2805 a.__dict__ = {'b': 1}
2806 vereq(a.b, 1)
2807 def cant(x, dict):
2808 try:
2809 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002810 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002811 pass
2812 else:
2813 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2814 cant(a, None)
2815 cant(a, [])
2816 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002817 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002818 # Classes don't allow __dict__ assignment
2819 cant(C, {})
2820
Guido van Rossum3926a632001-09-25 16:25:58 +00002821def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002822 if verbose:
2823 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002824 import pickle, cPickle
2825
2826 def sorteditems(d):
2827 L = d.items()
2828 L.sort()
2829 return L
2830
2831 global C
2832 class C(object):
2833 def __init__(self, a, b):
2834 super(C, self).__init__()
2835 self.a = a
2836 self.b = b
2837 def __repr__(self):
2838 return "C(%r, %r)" % (self.a, self.b)
2839
2840 global C1
2841 class C1(list):
2842 def __new__(cls, a, b):
2843 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002844 def __getnewargs__(self):
2845 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002846 def __init__(self, a, b):
2847 self.a = a
2848 self.b = b
2849 def __repr__(self):
2850 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2851
2852 global C2
2853 class C2(int):
2854 def __new__(cls, a, b, val=0):
2855 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002856 def __getnewargs__(self):
2857 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002858 def __init__(self, a, b, val=0):
2859 self.a = a
2860 self.b = b
2861 def __repr__(self):
2862 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2863
Guido van Rossum90c45142001-11-24 21:07:01 +00002864 global C3
2865 class C3(object):
2866 def __init__(self, foo):
2867 self.foo = foo
2868 def __getstate__(self):
2869 return self.foo
2870 def __setstate__(self, foo):
2871 self.foo = foo
2872
2873 global C4classic, C4
2874 class C4classic: # classic
2875 pass
2876 class C4(C4classic, object): # mixed inheritance
2877 pass
2878
Guido van Rossum3926a632001-09-25 16:25:58 +00002879 for p in pickle, cPickle:
2880 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002881 if verbose:
2882 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002883
2884 for cls in C, C1, C2:
2885 s = p.dumps(cls, bin)
2886 cls2 = p.loads(s)
2887 verify(cls2 is cls)
2888
2889 a = C1(1, 2); a.append(42); a.append(24)
2890 b = C2("hello", "world", 42)
2891 s = p.dumps((a, b), bin)
2892 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002893 vereq(x.__class__, a.__class__)
2894 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2895 vereq(y.__class__, b.__class__)
2896 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002897 vereq(repr(x), repr(a))
2898 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002899 if verbose:
2900 print "a = x =", a
2901 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002902 # Test for __getstate__ and __setstate__ on new style class
2903 u = C3(42)
2904 s = p.dumps(u, bin)
2905 v = p.loads(s)
2906 veris(u.__class__, v.__class__)
2907 vereq(u.foo, v.foo)
2908 # Test for picklability of hybrid class
2909 u = C4()
2910 u.foo = 42
2911 s = p.dumps(u, bin)
2912 v = p.loads(s)
2913 veris(u.__class__, v.__class__)
2914 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002915
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002916 # Testing copy.deepcopy()
2917 if verbose:
2918 print "deepcopy"
2919 import copy
2920 for cls in C, C1, C2:
2921 cls2 = copy.deepcopy(cls)
2922 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002923
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002924 a = C1(1, 2); a.append(42); a.append(24)
2925 b = C2("hello", "world", 42)
2926 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002927 vereq(x.__class__, a.__class__)
2928 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2929 vereq(y.__class__, b.__class__)
2930 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002931 vereq(repr(x), repr(a))
2932 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002933 if verbose:
2934 print "a = x =", a
2935 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002936
Guido van Rossum8c842552002-03-14 23:05:54 +00002937def pickleslots():
2938 if verbose: print "Testing pickling of classes with __slots__ ..."
2939 import pickle, cPickle
2940 # Pickling of classes with __slots__ but without __getstate__ should fail
2941 global B, C, D, E
2942 class B(object):
2943 pass
2944 for base in [object, B]:
2945 class C(base):
2946 __slots__ = ['a']
2947 class D(C):
2948 pass
2949 try:
2950 pickle.dumps(C())
2951 except TypeError:
2952 pass
2953 else:
2954 raise TestFailed, "should fail: pickle C instance - %s" % base
2955 try:
2956 cPickle.dumps(C())
2957 except TypeError:
2958 pass
2959 else:
2960 raise TestFailed, "should fail: cPickle C instance - %s" % base
2961 try:
2962 pickle.dumps(C())
2963 except TypeError:
2964 pass
2965 else:
2966 raise TestFailed, "should fail: pickle D instance - %s" % base
2967 try:
2968 cPickle.dumps(D())
2969 except TypeError:
2970 pass
2971 else:
2972 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002973 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002974 class C(base):
2975 __slots__ = ['a']
2976 def __getstate__(self):
2977 try:
2978 d = self.__dict__.copy()
2979 except AttributeError:
2980 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002981 for cls in self.__class__.__mro__:
2982 for sn in cls.__dict__.get('__slots__', ()):
2983 try:
2984 d[sn] = getattr(self, sn)
2985 except AttributeError:
2986 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002987 return d
2988 def __setstate__(self, d):
2989 for k, v in d.items():
2990 setattr(self, k, v)
2991 class D(C):
2992 pass
2993 # Now it should work
2994 x = C()
2995 y = pickle.loads(pickle.dumps(x))
2996 vereq(hasattr(y, 'a'), 0)
2997 y = cPickle.loads(cPickle.dumps(x))
2998 vereq(hasattr(y, 'a'), 0)
2999 x.a = 42
3000 y = pickle.loads(pickle.dumps(x))
3001 vereq(y.a, 42)
3002 y = cPickle.loads(cPickle.dumps(x))
3003 vereq(y.a, 42)
3004 x = D()
3005 x.a = 42
3006 x.b = 100
3007 y = pickle.loads(pickle.dumps(x))
3008 vereq(y.a + y.b, 142)
3009 y = cPickle.loads(cPickle.dumps(x))
3010 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003011 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003012 class E(C):
3013 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003014 x = E()
3015 x.a = 42
3016 x.b = "foo"
3017 y = pickle.loads(pickle.dumps(x))
3018 vereq(y.a, x.a)
3019 vereq(y.b, x.b)
3020 y = cPickle.loads(cPickle.dumps(x))
3021 vereq(y.a, x.a)
3022 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003023
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003024def copies():
3025 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
3026 import copy
3027 class C(object):
3028 pass
3029
3030 a = C()
3031 a.foo = 12
3032 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003033 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003034
3035 a.bar = [1,2,3]
3036 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003037 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003038 verify(c.bar is a.bar)
3039
3040 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003041 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003042 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003043 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003044
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003045def binopoverride():
3046 if verbose: print "Testing overrides of binary operations..."
3047 class I(int):
3048 def __repr__(self):
3049 return "I(%r)" % int(self)
3050 def __add__(self, other):
3051 return I(int(self) + int(other))
3052 __radd__ = __add__
3053 def __pow__(self, other, mod=None):
3054 if mod is None:
3055 return I(pow(int(self), int(other)))
3056 else:
3057 return I(pow(int(self), int(other), int(mod)))
3058 def __rpow__(self, other, mod=None):
3059 if mod is None:
3060 return I(pow(int(other), int(self), mod))
3061 else:
3062 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003063
Walter Dörwald70a6b492004-02-12 17:35:32 +00003064 vereq(repr(I(1) + I(2)), "I(3)")
3065 vereq(repr(I(1) + 2), "I(3)")
3066 vereq(repr(1 + I(2)), "I(3)")
3067 vereq(repr(I(2) ** I(3)), "I(8)")
3068 vereq(repr(2 ** I(3)), "I(8)")
3069 vereq(repr(I(2) ** 3), "I(8)")
3070 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003071 class S(str):
3072 def __eq__(self, other):
3073 return self.lower() == other.lower()
3074
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003075def subclasspropagation():
3076 if verbose: print "Testing propagation of slot functions to subclasses..."
3077 class A(object):
3078 pass
3079 class B(A):
3080 pass
3081 class C(A):
3082 pass
3083 class D(B, C):
3084 pass
3085 d = D()
Tim Peters171b8682006-04-11 01:59:34 +00003086 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003087 A.__hash__ = lambda self: 42
3088 vereq(hash(d), 42)
3089 C.__hash__ = lambda self: 314
3090 vereq(hash(d), 314)
3091 B.__hash__ = lambda self: 144
3092 vereq(hash(d), 144)
3093 D.__hash__ = lambda self: 100
3094 vereq(hash(d), 100)
3095 del D.__hash__
3096 vereq(hash(d), 144)
3097 del B.__hash__
3098 vereq(hash(d), 314)
3099 del C.__hash__
3100 vereq(hash(d), 42)
3101 del A.__hash__
Tim Peters171b8682006-04-11 01:59:34 +00003102 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003103 d.foo = 42
3104 d.bar = 42
3105 vereq(d.foo, 42)
3106 vereq(d.bar, 42)
3107 def __getattribute__(self, name):
3108 if name == "foo":
3109 return 24
3110 return object.__getattribute__(self, name)
3111 A.__getattribute__ = __getattribute__
3112 vereq(d.foo, 24)
3113 vereq(d.bar, 42)
3114 def __getattr__(self, name):
3115 if name in ("spam", "foo", "bar"):
3116 return "hello"
3117 raise AttributeError, name
3118 B.__getattr__ = __getattr__
3119 vereq(d.spam, "hello")
3120 vereq(d.foo, 24)
3121 vereq(d.bar, 42)
3122 del A.__getattribute__
3123 vereq(d.foo, 42)
3124 del d.foo
3125 vereq(d.foo, "hello")
3126 vereq(d.bar, 42)
3127 del B.__getattr__
3128 try:
3129 d.foo
3130 except AttributeError:
3131 pass
3132 else:
3133 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003134
Guido van Rossume7f3e242002-06-14 02:35:45 +00003135 # Test a nasty bug in recurse_down_subclasses()
3136 import gc
3137 class A(object):
3138 pass
3139 class B(A):
3140 pass
3141 del B
3142 gc.collect()
3143 A.__setitem__ = lambda *a: None # crash
3144
Tim Petersfc57ccb2001-10-12 02:38:24 +00003145def buffer_inherit():
3146 import binascii
3147 # SF bug [#470040] ParseTuple t# vs subclasses.
3148 if verbose:
3149 print "Testing that buffer interface is inherited ..."
3150
3151 class MyStr(str):
3152 pass
3153 base = 'abc'
3154 m = MyStr(base)
3155 # b2a_hex uses the buffer interface to get its argument's value, via
3156 # PyArg_ParseTuple 't#' code.
3157 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3158
3159 # It's not clear that unicode will continue to support the character
3160 # buffer interface, and this test will fail if that's taken away.
3161 class MyUni(unicode):
3162 pass
3163 base = u'abc'
3164 m = MyUni(base)
3165 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3166
3167 class MyInt(int):
3168 pass
3169 m = MyInt(42)
3170 try:
3171 binascii.b2a_hex(m)
3172 raise TestFailed('subclass of int should not have a buffer interface')
3173 except TypeError:
3174 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003175
Tim Petersc9933152001-10-16 20:18:24 +00003176def str_of_str_subclass():
3177 import binascii
3178 import cStringIO
3179
3180 if verbose:
3181 print "Testing __str__ defined in subclass of str ..."
3182
3183 class octetstring(str):
3184 def __str__(self):
3185 return binascii.b2a_hex(self)
3186 def __repr__(self):
3187 return self + " repr"
3188
3189 o = octetstring('A')
3190 vereq(type(o), octetstring)
3191 vereq(type(str(o)), str)
3192 vereq(type(repr(o)), str)
3193 vereq(ord(o), 0x41)
3194 vereq(str(o), '41')
3195 vereq(repr(o), 'A repr')
3196 vereq(o.__str__(), '41')
3197 vereq(o.__repr__(), 'A repr')
3198
3199 capture = cStringIO.StringIO()
3200 # Calling str() or not exercises different internal paths.
3201 print >> capture, o
3202 print >> capture, str(o)
3203 vereq(capture.getvalue(), '41\n41\n')
3204 capture.close()
3205
Guido van Rossumc8e56452001-10-22 00:43:43 +00003206def kwdargs():
3207 if verbose: print "Testing keyword arguments to __init__, __call__..."
3208 def f(a): return a
3209 vereq(f.__call__(a=42), 42)
3210 a = []
3211 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003212 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003213
Brett Cannon22565aa2006-06-09 22:31:23 +00003214def recursive__call__():
3215 if verbose: print ("Testing recursive __call__() by setting to instance of "
3216 "class ...")
3217 class A(object):
3218 pass
3219
3220 A.__call__ = A()
3221 try:
3222 A()()
3223 except RuntimeError:
3224 pass
3225 else:
3226 raise TestFailed("Recursion limit should have been reached for "
3227 "__call__()")
3228
Guido van Rossumed87ad82001-10-30 02:33:02 +00003229def delhook():
3230 if verbose: print "Testing __del__ hook..."
3231 log = []
3232 class C(object):
3233 def __del__(self):
3234 log.append(1)
3235 c = C()
3236 vereq(log, [])
3237 del c
3238 vereq(log, [1])
3239
Guido van Rossum29d26062001-12-11 04:37:34 +00003240 class D(object): pass
3241 d = D()
3242 try: del d[0]
3243 except TypeError: pass
3244 else: raise TestFailed, "invalid del() didn't raise TypeError"
3245
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003246def hashinherit():
3247 if verbose: print "Testing hash of mutable subclasses..."
3248
3249 class mydict(dict):
3250 pass
3251 d = mydict()
3252 try:
3253 hash(d)
3254 except TypeError:
3255 pass
3256 else:
3257 raise TestFailed, "hash() of dict subclass should fail"
3258
3259 class mylist(list):
3260 pass
3261 d = mylist()
3262 try:
3263 hash(d)
3264 except TypeError:
3265 pass
3266 else:
3267 raise TestFailed, "hash() of list subclass should fail"
3268
Guido van Rossum29d26062001-12-11 04:37:34 +00003269def strops():
3270 try: 'a' + 5
3271 except TypeError: pass
3272 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3273
3274 try: ''.split('')
3275 except ValueError: pass
3276 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3277
3278 try: ''.join([0])
3279 except TypeError: pass
3280 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3281
3282 try: ''.rindex('5')
3283 except ValueError: pass
3284 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3285
Guido van Rossum29d26062001-12-11 04:37:34 +00003286 try: '%(n)s' % None
3287 except TypeError: pass
3288 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3289
3290 try: '%(n' % {}
3291 except ValueError: pass
3292 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3293
3294 try: '%*s' % ('abc')
3295 except TypeError: pass
3296 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3297
3298 try: '%*.*s' % ('abc', 5)
3299 except TypeError: pass
3300 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3301
3302 try: '%s' % (1, 2)
3303 except TypeError: pass
3304 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3305
3306 try: '%' % None
3307 except ValueError: pass
3308 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3309
3310 vereq('534253'.isdigit(), 1)
3311 vereq('534253x'.isdigit(), 0)
3312 vereq('%c' % 5, '\x05')
3313 vereq('%c' % '5', '5')
3314
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003315def deepcopyrecursive():
3316 if verbose: print "Testing deepcopy of recursive objects..."
3317 class Node:
3318 pass
3319 a = Node()
3320 b = Node()
3321 a.b = b
3322 b.a = a
3323 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003324
Guido van Rossumd7035672002-03-12 20:43:31 +00003325def modules():
3326 if verbose: print "Testing uninitialized module objects..."
3327 from types import ModuleType as M
3328 m = M.__new__(M)
3329 str(m)
3330 vereq(hasattr(m, "__name__"), 0)
3331 vereq(hasattr(m, "__file__"), 0)
3332 vereq(hasattr(m, "foo"), 0)
3333 vereq(m.__dict__, None)
3334 m.foo = 1
3335 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003336
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003337def dictproxyiterkeys():
3338 class C(object):
3339 def meth(self):
3340 pass
3341 if verbose: print "Testing dict-proxy iterkeys..."
3342 keys = [ key for key in C.__dict__.iterkeys() ]
3343 keys.sort()
3344 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3345
3346def dictproxyitervalues():
3347 class C(object):
3348 def meth(self):
3349 pass
3350 if verbose: print "Testing dict-proxy itervalues..."
3351 values = [ values for values in C.__dict__.itervalues() ]
3352 vereq(len(values), 5)
3353
3354def dictproxyiteritems():
3355 class C(object):
3356 def meth(self):
3357 pass
3358 if verbose: print "Testing dict-proxy iteritems..."
3359 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3360 keys.sort()
3361 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3362
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003363def funnynew():
3364 if verbose: print "Testing __new__ returning something unexpected..."
3365 class C(object):
3366 def __new__(cls, arg):
3367 if isinstance(arg, str): return [1, 2, 3]
3368 elif isinstance(arg, int): return object.__new__(D)
3369 else: return object.__new__(cls)
3370 class D(C):
3371 def __init__(self, arg):
3372 self.foo = arg
3373 vereq(C("1"), [1, 2, 3])
3374 vereq(D("1"), [1, 2, 3])
3375 d = D(None)
3376 veris(d.foo, None)
3377 d = C(1)
3378 vereq(isinstance(d, D), True)
3379 vereq(d.foo, 1)
3380 d = D(1)
3381 vereq(isinstance(d, D), True)
3382 vereq(d.foo, 1)
3383
Guido van Rossume8fc6402002-04-16 16:44:51 +00003384def imulbug():
3385 # SF bug 544647
3386 if verbose: print "Testing for __imul__ problems..."
3387 class C(object):
3388 def __imul__(self, other):
3389 return (self, other)
3390 x = C()
3391 y = x
3392 y *= 1.0
3393 vereq(y, (x, 1.0))
3394 y = x
3395 y *= 2
3396 vereq(y, (x, 2))
3397 y = x
3398 y *= 3L
3399 vereq(y, (x, 3L))
3400 y = x
3401 y *= 1L<<100
3402 vereq(y, (x, 1L<<100))
3403 y = x
3404 y *= None
3405 vereq(y, (x, None))
3406 y = x
3407 y *= "foo"
3408 vereq(y, (x, "foo"))
3409
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003410def docdescriptor():
3411 # SF bug 542984
3412 if verbose: print "Testing __doc__ descriptor..."
3413 class DocDescr(object):
3414 def __get__(self, object, otype):
3415 if object:
3416 object = object.__class__.__name__ + ' instance'
3417 if otype:
3418 otype = otype.__name__
3419 return 'object=%s; type=%s' % (object, otype)
3420 class OldClass:
3421 __doc__ = DocDescr()
3422 class NewClass(object):
3423 __doc__ = DocDescr()
3424 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3425 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3426 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3427 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3428
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003429def copy_setstate():
3430 if verbose:
3431 print "Testing that copy.*copy() correctly uses __setstate__..."
3432 import copy
3433 class C(object):
3434 def __init__(self, foo=None):
3435 self.foo = foo
3436 self.__foo = foo
3437 def setfoo(self, foo=None):
3438 self.foo = foo
3439 def getfoo(self):
3440 return self.__foo
3441 def __getstate__(self):
3442 return [self.foo]
3443 def __setstate__(self, lst):
3444 assert len(lst) == 1
3445 self.__foo = self.foo = lst[0]
3446 a = C(42)
3447 a.setfoo(24)
3448 vereq(a.foo, 24)
3449 vereq(a.getfoo(), 42)
3450 b = copy.copy(a)
3451 vereq(b.foo, 24)
3452 vereq(b.getfoo(), 24)
3453 b = copy.deepcopy(a)
3454 vereq(b.foo, 24)
3455 vereq(b.getfoo(), 24)
3456
Guido van Rossum09638c12002-06-13 19:17:46 +00003457def slices():
3458 if verbose:
3459 print "Testing cases with slices and overridden __getitem__ ..."
3460 # Strings
3461 vereq("hello"[:4], "hell")
3462 vereq("hello"[slice(4)], "hell")
3463 vereq(str.__getitem__("hello", slice(4)), "hell")
3464 class S(str):
3465 def __getitem__(self, x):
3466 return str.__getitem__(self, x)
3467 vereq(S("hello")[:4], "hell")
3468 vereq(S("hello")[slice(4)], "hell")
3469 vereq(S("hello").__getitem__(slice(4)), "hell")
3470 # Tuples
3471 vereq((1,2,3)[:2], (1,2))
3472 vereq((1,2,3)[slice(2)], (1,2))
3473 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3474 class T(tuple):
3475 def __getitem__(self, x):
3476 return tuple.__getitem__(self, x)
3477 vereq(T((1,2,3))[:2], (1,2))
3478 vereq(T((1,2,3))[slice(2)], (1,2))
3479 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3480 # Lists
3481 vereq([1,2,3][:2], [1,2])
3482 vereq([1,2,3][slice(2)], [1,2])
3483 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3484 class L(list):
3485 def __getitem__(self, x):
3486 return list.__getitem__(self, x)
3487 vereq(L([1,2,3])[:2], [1,2])
3488 vereq(L([1,2,3])[slice(2)], [1,2])
3489 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3490 # Now do lists and __setitem__
3491 a = L([1,2,3])
3492 a[slice(1, 3)] = [3,2]
3493 vereq(a, [1,3,2])
3494 a[slice(0, 2, 1)] = [3,1]
3495 vereq(a, [3,1,2])
3496 a.__setitem__(slice(1, 3), [2,1])
3497 vereq(a, [3,2,1])
3498 a.__setitem__(slice(0, 2, 1), [2,3])
3499 vereq(a, [2,3,1])
3500
Tim Peters2484aae2002-07-11 06:56:07 +00003501def subtype_resurrection():
3502 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003503 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003504
3505 class C(object):
3506 container = []
3507
3508 def __del__(self):
3509 # resurrect the instance
3510 C.container.append(self)
3511
3512 c = C()
3513 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003514 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003515 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003516 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003517
3518 # If that didn't blow up, it's also interesting to see whether clearing
3519 # the last container slot works: that will attempt to delete c again,
3520 # which will cause c to get appended back to the container again "during"
3521 # the del.
3522 del C.container[-1]
3523 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003524 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003525
Tim Peters14cb1e12002-07-11 18:26:21 +00003526 # Make c mortal again, so that the test framework with -l doesn't report
3527 # it as a leak.
3528 del C.__del__
3529
Guido van Rossum2d702462002-08-06 21:28:28 +00003530def slottrash():
3531 # Deallocating deeply nested slotted trash caused stack overflows
3532 if verbose:
3533 print "Testing slot trash..."
3534 class trash(object):
3535 __slots__ = ['x']
3536 def __init__(self, x):
3537 self.x = x
3538 o = None
3539 for i in xrange(50000):
3540 o = trash(o)
3541 del o
3542
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003543def slotmultipleinheritance():
3544 # SF bug 575229, multiple inheritance w/ slots dumps core
3545 class A(object):
3546 __slots__=()
3547 class B(object):
3548 pass
3549 class C(A,B) :
3550 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003551 vereq(C.__basicsize__, B.__basicsize__)
3552 verify(hasattr(C, '__dict__'))
3553 verify(hasattr(C, '__weakref__'))
3554 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003555
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003556def testrmul():
3557 # SF patch 592646
3558 if verbose:
3559 print "Testing correct invocation of __rmul__..."
3560 class C(object):
3561 def __mul__(self, other):
3562 return "mul"
3563 def __rmul__(self, other):
3564 return "rmul"
3565 a = C()
3566 vereq(a*2, "mul")
3567 vereq(a*2.2, "mul")
3568 vereq(2*a, "rmul")
3569 vereq(2.2*a, "rmul")
3570
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003571def testipow():
3572 # [SF bug 620179]
3573 if verbose:
3574 print "Testing correct invocation of __ipow__..."
3575 class C(object):
3576 def __ipow__(self, other):
3577 pass
3578 a = C()
3579 a **= 2
3580
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003581def do_this_first():
3582 if verbose:
3583 print "Testing SF bug 551412 ..."
3584 # This dumps core when SF bug 551412 isn't fixed --
3585 # but only when test_descr.py is run separately.
3586 # (That can't be helped -- as soon as PyType_Ready()
3587 # is called for PyLong_Type, the bug is gone.)
3588 class UserLong(object):
3589 def __pow__(self, *args):
3590 pass
3591 try:
3592 pow(0L, UserLong(), 0L)
3593 except:
3594 pass
3595
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003596 if verbose:
3597 print "Testing SF bug 570483..."
3598 # Another segfault only when run early
3599 # (before PyType_Ready(tuple) is called)
3600 type.mro(tuple)
3601
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003602def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003603 if verbose:
3604 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003605 # stuff that should work:
3606 class C(object):
3607 pass
3608 class C2(object):
3609 def __getattribute__(self, attr):
3610 if attr == 'a':
3611 return 2
3612 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003613 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003614 def meth(self):
3615 return 1
3616 class D(C):
3617 pass
3618 class E(D):
3619 pass
3620 d = D()
3621 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003622 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003623 D.__bases__ = (C2,)
3624 vereq(d.meth(), 1)
3625 vereq(e.meth(), 1)
3626 vereq(d.a, 2)
3627 vereq(e.a, 2)
3628 vereq(C2.__subclasses__(), [D])
3629
3630 # stuff that shouldn't:
3631 class L(list):
3632 pass
3633
3634 try:
3635 L.__bases__ = (dict,)
3636 except TypeError:
3637 pass
3638 else:
3639 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3640
3641 try:
3642 list.__bases__ = (dict,)
3643 except TypeError:
3644 pass
3645 else:
3646 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3647
3648 try:
3649 del D.__bases__
3650 except TypeError:
3651 pass
3652 else:
3653 raise TestFailed, "shouldn't be able to delete .__bases__"
3654
3655 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003656 D.__bases__ = ()
3657 except TypeError, msg:
3658 if str(msg) == "a new-style class can't have only classic bases":
3659 raise TestFailed, "wrong error message for .__bases__ = ()"
3660 else:
3661 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3662
3663 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003664 D.__bases__ = (D,)
3665 except TypeError:
3666 pass
3667 else:
3668 # actually, we'll have crashed by here...
3669 raise TestFailed, "shouldn't be able to create inheritance cycles"
3670
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003671 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003672 D.__bases__ = (C, C)
3673 except TypeError:
3674 pass
3675 else:
3676 raise TestFailed, "didn't detect repeated base classes"
3677
3678 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003679 D.__bases__ = (E,)
3680 except TypeError:
3681 pass
3682 else:
3683 raise TestFailed, "shouldn't be able to create inheritance cycles"
3684
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003685 # let's throw a classic class into the mix:
3686 class Classic:
3687 def meth2(self):
3688 return 3
3689
3690 D.__bases__ = (C, Classic)
3691
3692 vereq(d.meth2(), 3)
3693 vereq(e.meth2(), 3)
3694 try:
3695 d.a
3696 except AttributeError:
3697 pass
3698 else:
3699 raise TestFailed, "attribute should have vanished"
3700
3701 try:
3702 D.__bases__ = (Classic,)
3703 except TypeError:
3704 pass
3705 else:
3706 raise TestFailed, "new-style class must have a new-style base"
3707
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003708def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003709 if verbose:
3710 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003711 class WorkOnce(type):
3712 def __new__(self, name, bases, ns):
3713 self.flag = 0
3714 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3715 def mro(self):
3716 if self.flag > 0:
3717 raise RuntimeError, "bozo"
3718 else:
3719 self.flag += 1
3720 return type.mro(self)
3721
3722 class WorkAlways(type):
3723 def mro(self):
3724 # this is here to make sure that .mro()s aren't called
3725 # with an exception set (which was possible at one point).
3726 # An error message will be printed in a debug build.
3727 # What's a good way to test for this?
3728 return type.mro(self)
3729
3730 class C(object):
3731 pass
3732
3733 class C2(object):
3734 pass
3735
3736 class D(C):
3737 pass
3738
3739 class E(D):
3740 pass
3741
3742 class F(D):
3743 __metaclass__ = WorkOnce
3744
3745 class G(D):
3746 __metaclass__ = WorkAlways
3747
3748 # Immediate subclasses have their mro's adjusted in alphabetical
3749 # order, so E's will get adjusted before adjusting F's fails. We
3750 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003751
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003752 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003753 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003754
3755 try:
3756 D.__bases__ = (C2,)
3757 except RuntimeError:
3758 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003759 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003760 else:
3761 raise TestFailed, "exception not propagated"
3762
3763def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003764 if verbose:
3765 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003766 class A(object):
3767 pass
3768
3769 class B(object):
3770 pass
3771
3772 class C(A, B):
3773 pass
3774
3775 class D(A, B):
3776 pass
3777
3778 class E(C, D):
3779 pass
3780
3781 try:
3782 C.__bases__ = (B, A)
3783 except TypeError:
3784 pass
3785 else:
3786 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003787
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003788def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003789 if verbose:
3790 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003791 class C(object):
3792 pass
3793
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003794 # C.__module__ could be 'test_descr' or '__main__'
3795 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003796
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003797 C.__name__ = 'D'
3798 vereq((C.__module__, C.__name__), (mod, 'D'))
3799
3800 C.__name__ = 'D.E'
3801 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003802
Guido van Rossum613f24f2003-01-06 23:00:59 +00003803def subclass_right_op():
3804 if verbose:
3805 print "Testing correct dispatch of subclass overloading __r<op>__..."
3806
3807 # This code tests various cases where right-dispatch of a subclass
3808 # should be preferred over left-dispatch of a base class.
3809
3810 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3811
3812 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003813 def __floordiv__(self, other):
3814 return "B.__floordiv__"
3815 def __rfloordiv__(self, other):
3816 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003817
Guido van Rossumf389c772003-02-27 20:04:19 +00003818 vereq(B(1) // 1, "B.__floordiv__")
3819 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003820
3821 # Case 2: subclass of object; this is just the baseline for case 3
3822
3823 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003824 def __floordiv__(self, other):
3825 return "C.__floordiv__"
3826 def __rfloordiv__(self, other):
3827 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003828
Guido van Rossumf389c772003-02-27 20:04:19 +00003829 vereq(C() // 1, "C.__floordiv__")
3830 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003831
3832 # Case 3: subclass of new-style class; here it gets interesting
3833
3834 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003835 def __floordiv__(self, other):
3836 return "D.__floordiv__"
3837 def __rfloordiv__(self, other):
3838 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003839
Guido van Rossumf389c772003-02-27 20:04:19 +00003840 vereq(D() // C(), "D.__floordiv__")
3841 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003842
3843 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3844
3845 class E(C):
3846 pass
3847
Guido van Rossumf389c772003-02-27 20:04:19 +00003848 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003849
Guido van Rossumf389c772003-02-27 20:04:19 +00003850 vereq(E() // 1, "C.__floordiv__")
3851 vereq(1 // E(), "C.__rfloordiv__")
3852 vereq(E() // C(), "C.__floordiv__")
3853 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003854
Guido van Rossum373c7412003-01-07 13:41:37 +00003855def dict_type_with_metaclass():
3856 if verbose:
3857 print "Testing type of __dict__ when __metaclass__ set..."
3858
3859 class B(object):
3860 pass
3861 class M(type):
3862 pass
3863 class C:
3864 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3865 __metaclass__ = M
3866 veris(type(C.__dict__), type(B.__dict__))
3867
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003868def meth_class_get():
3869 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003870 if verbose:
3871 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003872 # Baseline
3873 arg = [1, 2, 3]
3874 res = {1: None, 2: None, 3: None}
3875 vereq(dict.fromkeys(arg), res)
3876 vereq({}.fromkeys(arg), res)
3877 # Now get the descriptor
3878 descr = dict.__dict__["fromkeys"]
3879 # More baseline using the descriptor directly
3880 vereq(descr.__get__(None, dict)(arg), res)
3881 vereq(descr.__get__({})(arg), res)
3882 # Now check various error cases
3883 try:
3884 descr.__get__(None, None)
3885 except TypeError:
3886 pass
3887 else:
3888 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3889 try:
3890 descr.__get__(42)
3891 except TypeError:
3892 pass
3893 else:
3894 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3895 try:
3896 descr.__get__(None, 42)
3897 except TypeError:
3898 pass
3899 else:
3900 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3901 try:
3902 descr.__get__(None, int)
3903 except TypeError:
3904 pass
3905 else:
3906 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3907
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003908def isinst_isclass():
3909 if verbose:
3910 print "Testing proxy isinstance() and isclass()..."
3911 class Proxy(object):
3912 def __init__(self, obj):
3913 self.__obj = obj
3914 def __getattribute__(self, name):
3915 if name.startswith("_Proxy__"):
3916 return object.__getattribute__(self, name)
3917 else:
3918 return getattr(self.__obj, name)
3919 # Test with a classic class
3920 class C:
3921 pass
3922 a = C()
3923 pa = Proxy(a)
3924 verify(isinstance(a, C)) # Baseline
3925 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003926 # Test with a classic subclass
3927 class D(C):
3928 pass
3929 a = D()
3930 pa = Proxy(a)
3931 verify(isinstance(a, C)) # Baseline
3932 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003933 # Test with a new-style class
3934 class C(object):
3935 pass
3936 a = C()
3937 pa = Proxy(a)
3938 verify(isinstance(a, C)) # Baseline
3939 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003940 # Test with a new-style subclass
3941 class D(C):
3942 pass
3943 a = D()
3944 pa = Proxy(a)
3945 verify(isinstance(a, C)) # Baseline
3946 verify(isinstance(pa, C)) # Test
3947
3948def proxysuper():
3949 if verbose:
3950 print "Testing super() for a proxy object..."
3951 class Proxy(object):
3952 def __init__(self, obj):
3953 self.__obj = obj
3954 def __getattribute__(self, name):
3955 if name.startswith("_Proxy__"):
3956 return object.__getattribute__(self, name)
3957 else:
3958 return getattr(self.__obj, name)
3959
3960 class B(object):
3961 def f(self):
3962 return "B.f"
3963
3964 class C(B):
3965 def f(self):
3966 return super(C, self).f() + "->C.f"
3967
3968 obj = C()
3969 p = Proxy(obj)
3970 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003971
Guido van Rossum52b27052003-04-15 20:05:10 +00003972def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003973 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00003974 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003975 try:
3976 object.__setattr__(str, "foo", 42)
3977 except TypeError:
3978 pass
3979 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003980 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003981 try:
3982 object.__delattr__(str, "lower")
3983 except TypeError:
3984 pass
3985 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003986 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003987
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003988def weakref_segfault():
3989 # SF 742911
3990 if verbose:
3991 print "Testing weakref segfault..."
3992
3993 import weakref
3994
3995 class Provoker:
3996 def __init__(self, referrent):
3997 self.ref = weakref.ref(referrent)
3998
3999 def __del__(self):
4000 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004001
4002 class Oops(object):
4003 pass
4004
4005 o = Oops()
4006 o.whatever = Provoker(o)
4007 del o
4008
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004009def wrapper_segfault():
4010 # SF 927248: deeply nested wrappers could cause stack overflow
4011 f = lambda:None
4012 for i in xrange(1000000):
4013 f = f.__call__
4014 f = None
4015
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004016# Fix SF #762455, segfault when sys.stdout is changed in getattr
4017def filefault():
4018 if verbose:
4019 print "Testing sys.stdout is changed in getattr..."
4020 import sys
4021 class StdoutGuard:
4022 def __getattr__(self, attr):
4023 sys.stdout = sys.__stdout__
4024 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4025 sys.stdout = StdoutGuard()
4026 try:
4027 print "Oops!"
4028 except RuntimeError:
4029 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004030
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004031def vicious_descriptor_nonsense():
4032 # A potential segfault spotted by Thomas Wouters in mail to
4033 # python-dev 2003-04-17, turned into an example & fixed by Michael
4034 # Hudson just less than four months later...
4035 if verbose:
4036 print "Testing vicious_descriptor_nonsense..."
4037
4038 class Evil(object):
4039 def __hash__(self):
4040 return hash('attr')
4041 def __eq__(self, other):
4042 del C.attr
4043 return 0
4044
4045 class Descr(object):
4046 def __get__(self, ob, type=None):
4047 return 1
4048
4049 class C(object):
4050 attr = Descr()
4051
4052 c = C()
4053 c.__dict__[Evil()] = 0
4054
4055 vereq(c.attr, 1)
4056 # this makes a crash more likely:
4057 import gc; gc.collect()
4058 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004059
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004060def test_init():
4061 # SF 1155938
4062 class Foo(object):
4063 def __init__(self):
4064 return 10
4065 try:
4066 Foo()
4067 except TypeError:
4068 pass
4069 else:
4070 raise TestFailed, "did not test __init__() for None return"
4071
Armin Rigoc6686b72005-11-07 08:38:00 +00004072def methodwrapper():
4073 # <type 'method-wrapper'> did not support any reflection before 2.5
4074 if verbose:
4075 print "Testing method-wrapper objects..."
4076
4077 l = []
4078 vereq(l.__add__, l.__add__)
Armin Rigofd01d792006-06-08 10:56:24 +00004079 vereq(l.__add__, [].__add__)
4080 verify(l.__add__ != [5].__add__)
4081 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004082 verify(l.__add__.__name__ == '__add__')
4083 verify(l.__add__.__self__ is l)
4084 verify(l.__add__.__objclass__ is list)
4085 vereq(l.__add__.__doc__, list.__add__.__doc__)
Armin Rigofd01d792006-06-08 10:56:24 +00004086 try:
4087 hash(l.__add__)
4088 except TypeError:
4089 pass
4090 else:
4091 raise TestFailed("no TypeError from hash([].__add__)")
4092
4093 t = ()
4094 t += (7,)
4095 vereq(t.__add__, (7,).__add__)
4096 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004097
Armin Rigofd163f92005-12-29 15:59:19 +00004098def notimplemented():
4099 # all binary methods should be able to return a NotImplemented
4100 if verbose:
4101 print "Testing NotImplemented..."
4102
4103 import sys
4104 import types
4105 import operator
4106
4107 def specialmethod(self, other):
4108 return NotImplemented
4109
4110 def check(expr, x, y):
4111 try:
4112 exec expr in {'x': x, 'y': y, 'operator': operator}
4113 except TypeError:
4114 pass
4115 else:
4116 raise TestFailed("no TypeError from %r" % (expr,))
4117
4118 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
4119 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4120 # ValueErrors instead of TypeErrors
4121 for metaclass in [type, types.ClassType]:
4122 for name, expr, iexpr in [
4123 ('__add__', 'x + y', 'x += y'),
4124 ('__sub__', 'x - y', 'x -= y'),
4125 ('__mul__', 'x * y', 'x *= y'),
4126 ('__truediv__', 'operator.truediv(x, y)', None),
4127 ('__floordiv__', 'operator.floordiv(x, y)', None),
4128 ('__div__', 'x / y', 'x /= y'),
4129 ('__mod__', 'x % y', 'x %= y'),
4130 ('__divmod__', 'divmod(x, y)', None),
4131 ('__pow__', 'x ** y', 'x **= y'),
4132 ('__lshift__', 'x << y', 'x <<= y'),
4133 ('__rshift__', 'x >> y', 'x >>= y'),
4134 ('__and__', 'x & y', 'x &= y'),
4135 ('__or__', 'x | y', 'x |= y'),
4136 ('__xor__', 'x ^ y', 'x ^= y'),
4137 ('__coerce__', 'coerce(x, y)', None)]:
4138 if name == '__coerce__':
4139 rname = name
4140 else:
4141 rname = '__r' + name[2:]
4142 A = metaclass('A', (), {name: specialmethod})
4143 B = metaclass('B', (), {rname: specialmethod})
4144 a = A()
4145 b = B()
4146 check(expr, a, a)
4147 check(expr, a, b)
4148 check(expr, b, a)
4149 check(expr, b, b)
4150 check(expr, a, N1)
4151 check(expr, a, N2)
4152 check(expr, N1, b)
4153 check(expr, N2, b)
4154 if iexpr:
4155 check(iexpr, a, a)
4156 check(iexpr, a, b)
4157 check(iexpr, b, a)
4158 check(iexpr, b, b)
4159 check(iexpr, a, N1)
4160 check(iexpr, a, N2)
4161 iname = '__i' + name[2:]
4162 C = metaclass('C', (), {iname: specialmethod})
4163 c = C()
4164 check(iexpr, c, a)
4165 check(iexpr, c, b)
4166 check(iexpr, c, N1)
4167 check(iexpr, c, N2)
4168
Georg Brandl0ea89162007-03-05 22:28:13 +00004169def test_assign_slice():
4170 # ceval.c's assign_slice used to check for
4171 # tp->tp_as_sequence->sq_slice instead of
4172 # tp->tp_as_sequence->sq_ass_slice
4173
4174 class C(object):
4175 def __setslice__(self, start, stop, value):
4176 self.value = value
4177
4178 c = C()
4179 c[1:2] = 3
4180 vereq(c.value, 3)
4181
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004182def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004183 weakref_segfault() # Must be first, somehow
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004184 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004185 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004186 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004187 lists()
4188 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004189 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004190 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004191 ints()
4192 longs()
4193 floats()
4194 complexes()
4195 spamlists()
4196 spamdicts()
4197 pydicts()
4198 pylists()
4199 metaclass()
4200 pymods()
4201 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004202 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004203 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004204 ex5()
4205 monotonicity()
4206 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004207 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004208 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004209 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004210 dynamics()
4211 errors()
4212 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004213 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004214 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004215 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004216 classic()
4217 compattr()
4218 newslot()
4219 altmro()
4220 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004221 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004222 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004223 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004224 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004225 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004226 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004227 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004228 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004229 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004230 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004231 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004232 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004233 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004234 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004235 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004236 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004237 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004238 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004239 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004240 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004241 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004242 kwdargs()
Brett Cannon22565aa2006-06-09 22:31:23 +00004243 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004244 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004245 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004246 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004247 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004248 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004249 dictproxyiterkeys()
4250 dictproxyitervalues()
4251 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004252 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004253 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004254 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004255 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004256 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004257 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004258 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004259 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004260 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004261 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004262 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004263 test_mutable_bases()
4264 test_mutable_bases_with_failing_mro()
4265 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004266 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004267 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004268 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004269 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004270 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004271 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004272 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004273 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004274 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004275 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004276 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004277 notimplemented()
Georg Brandl0ea89162007-03-05 22:28:13 +00004278 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004279
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004280 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004281
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004282if __name__ == "__main__":
4283 test_main()