blob: b108395269267da366e27503bd1547edb3951353 [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
Guido van Rossum33bab012001-12-05 22:45:48 +00001213 # Test leaks
1214 class Counted(object):
1215 counter = 0 # counts the number of instances alive
1216 def __init__(self):
1217 Counted.counter += 1
1218 def __del__(self):
1219 Counted.counter -= 1
1220 class C(object):
1221 __slots__ = ['a', 'b', 'c']
1222 x = C()
1223 x.a = Counted()
1224 x.b = Counted()
1225 x.c = Counted()
1226 vereq(Counted.counter, 3)
1227 del x
1228 vereq(Counted.counter, 0)
1229 class D(C):
1230 pass
1231 x = D()
1232 x.a = Counted()
1233 x.z = Counted()
1234 vereq(Counted.counter, 2)
1235 del x
1236 vereq(Counted.counter, 0)
1237 class E(D):
1238 __slots__ = ['e']
1239 x = E()
1240 x.a = Counted()
1241 x.z = Counted()
1242 x.e = Counted()
1243 vereq(Counted.counter, 3)
1244 del x
1245 vereq(Counted.counter, 0)
1246
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001247 # Test cyclical leaks [SF bug 519621]
1248 class F(object):
1249 __slots__ = ['a', 'b']
1250 log = []
1251 s = F()
1252 s.a = [Counted(), s]
1253 vereq(Counted.counter, 1)
1254 s = None
1255 import gc
1256 gc.collect()
1257 vereq(Counted.counter, 0)
1258
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001259 # Test lookup leaks [SF bug 572567]
1260 import sys,gc
1261 class G(object):
1262 def __cmp__(self, other):
1263 return 0
1264 g = G()
1265 orig_objects = len(gc.get_objects())
1266 for i in xrange(10):
1267 g==g
1268 new_objects = len(gc.get_objects())
1269 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001270 class H(object):
1271 __slots__ = ['a', 'b']
1272 def __init__(self):
1273 self.a = 1
1274 self.b = 2
1275 def __del__(self):
1276 assert self.a == 1
1277 assert self.b == 2
1278
1279 save_stderr = sys.stderr
1280 sys.stderr = sys.stdout
1281 h = H()
1282 try:
1283 del h
1284 finally:
1285 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001286
Guido van Rossum8b056da2002-08-13 18:26:26 +00001287def slotspecials():
1288 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1289
1290 class D(object):
1291 __slots__ = ["__dict__"]
1292 a = D()
1293 verify(hasattr(a, "__dict__"))
1294 verify(not hasattr(a, "__weakref__"))
1295 a.foo = 42
1296 vereq(a.__dict__, {"foo": 42})
1297
1298 class W(object):
1299 __slots__ = ["__weakref__"]
1300 a = W()
1301 verify(hasattr(a, "__weakref__"))
1302 verify(not hasattr(a, "__dict__"))
1303 try:
1304 a.foo = 42
1305 except AttributeError:
1306 pass
1307 else:
1308 raise TestFailed, "shouldn't be allowed to set a.foo"
1309
1310 class C1(W, D):
1311 __slots__ = []
1312 a = C1()
1313 verify(hasattr(a, "__dict__"))
1314 verify(hasattr(a, "__weakref__"))
1315 a.foo = 42
1316 vereq(a.__dict__, {"foo": 42})
1317
1318 class C2(D, W):
1319 __slots__ = []
1320 a = C2()
1321 verify(hasattr(a, "__dict__"))
1322 verify(hasattr(a, "__weakref__"))
1323 a.foo = 42
1324 vereq(a.__dict__, {"foo": 42})
1325
Guido van Rossum9a818922002-11-14 19:50:14 +00001326# MRO order disagreement
1327#
1328# class C3(C1, C2):
1329# __slots__ = []
1330#
1331# class C4(C2, C1):
1332# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001333
Tim Peters6d6c1a32001-08-02 04:15:00 +00001334def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001335 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001337 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001338 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001339 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001340 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001343 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001344 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001345 vereq(E.foo, 1)
1346 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001347 # Test dynamic instances
1348 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001349 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001350 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001351 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001352 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001353 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001354 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001355 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001356 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001357 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001358 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(int(a), 100)
1360 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001361 verify(not hasattr(a, "spam"))
1362 def mygetattr(self, name):
1363 if name == "spam":
1364 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001365 raise AttributeError
1366 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001367 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001368 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001369 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001370 def mysetattr(self, name, value):
1371 if name == "spam":
1372 raise AttributeError
1373 return object.__setattr__(self, name, value)
1374 C.__setattr__ = mysetattr
1375 try:
1376 a.spam = "not spam"
1377 except AttributeError:
1378 pass
1379 else:
1380 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001381 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001382 class D(C):
1383 pass
1384 d = D()
1385 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001386 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001387
Guido van Rossum7e35d572001-09-15 03:14:32 +00001388 # Test handling of int*seq and seq*int
1389 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001390 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001391 vereq("a"*I(2), "aa")
1392 vereq(I(2)*"a", "aa")
1393 vereq(2*I(3), 6)
1394 vereq(I(3)*2, 6)
1395 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001396
1397 # Test handling of long*seq and seq*long
1398 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001399 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001400 vereq("a"*L(2L), "aa")
1401 vereq(L(2L)*"a", "aa")
1402 vereq(2*L(3), 6)
1403 vereq(L(3)*2, 6)
1404 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001405
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001406 # Test comparison of classes with dynamic metaclasses
1407 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001408 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001409 class someclass:
1410 __metaclass__ = dynamicmetaclass
1411 verify(someclass != object)
1412
Tim Peters6d6c1a32001-08-02 04:15:00 +00001413def errors():
1414 if verbose: print "Testing errors..."
1415
1416 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001417 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001418 pass
1419 except TypeError:
1420 pass
1421 else:
1422 verify(0, "inheritance from both list and dict should be illegal")
1423
1424 try:
1425 class C(object, None):
1426 pass
1427 except TypeError:
1428 pass
1429 else:
1430 verify(0, "inheritance from non-type should be illegal")
1431 class Classic:
1432 pass
1433
1434 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001435 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001436 pass
1437 except TypeError:
1438 pass
1439 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001440 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001441
1442 try:
1443 class C(object):
1444 __slots__ = 1
1445 except TypeError:
1446 pass
1447 else:
1448 verify(0, "__slots__ = 1 should be illegal")
1449
1450 try:
1451 class C(object):
1452 __slots__ = [1]
1453 except TypeError:
1454 pass
1455 else:
1456 verify(0, "__slots__ = [1] should be illegal")
1457
1458def classmethods():
1459 if verbose: print "Testing class methods..."
1460 class C(object):
1461 def foo(*a): return a
1462 goo = classmethod(foo)
1463 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001464 vereq(C.goo(1), (C, 1))
1465 vereq(c.goo(1), (C, 1))
1466 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001467 class D(C):
1468 pass
1469 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001470 vereq(D.goo(1), (D, 1))
1471 vereq(d.goo(1), (D, 1))
1472 vereq(d.foo(1), (d, 1))
1473 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001474 # Test for a specific crash (SF bug 528132)
1475 def f(cls, arg): return (cls, arg)
1476 ff = classmethod(f)
1477 vereq(ff.__get__(0, int)(42), (int, 42))
1478 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001479
Guido van Rossum155db9a2002-04-02 17:53:47 +00001480 # Test super() with classmethods (SF bug 535444)
1481 veris(C.goo.im_self, C)
1482 veris(D.goo.im_self, D)
1483 veris(super(D,D).goo.im_self, D)
1484 veris(super(D,d).goo.im_self, D)
1485 vereq(super(D,D).goo(), (D,))
1486 vereq(super(D,d).goo(), (D,))
1487
Raymond Hettingerbe971532003-06-18 01:13:41 +00001488 # Verify that argument is checked for callability (SF bug 753451)
1489 try:
1490 classmethod(1).__get__(1)
1491 except TypeError:
1492 pass
1493 else:
1494 raise TestFailed, "classmethod should check for callability"
1495
Georg Brandl6a29c322006-02-21 22:17:46 +00001496 # Verify that classmethod() doesn't allow keyword args
1497 try:
1498 classmethod(f, kw=1)
1499 except TypeError:
1500 pass
1501 else:
1502 raise TestFailed, "classmethod shouldn't accept keyword args"
1503
Fred Drakef841aa62002-03-28 15:49:54 +00001504def classmethods_in_c():
1505 if verbose: print "Testing C-based class methods..."
1506 import xxsubtype as spam
1507 a = (1, 2, 3)
1508 d = {'abc': 123}
1509 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001510 veris(x, spam.spamlist)
1511 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001512 vereq(d, d1)
1513 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001514 veris(x, spam.spamlist)
1515 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001516 vereq(d, d1)
1517
Tim Peters6d6c1a32001-08-02 04:15:00 +00001518def staticmethods():
1519 if verbose: print "Testing static methods..."
1520 class C(object):
1521 def foo(*a): return a
1522 goo = staticmethod(foo)
1523 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001524 vereq(C.goo(1), (1,))
1525 vereq(c.goo(1), (1,))
1526 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001527 class D(C):
1528 pass
1529 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001530 vereq(D.goo(1), (1,))
1531 vereq(d.goo(1), (1,))
1532 vereq(d.foo(1), (d, 1))
1533 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001534
Fred Drakef841aa62002-03-28 15:49:54 +00001535def staticmethods_in_c():
1536 if verbose: print "Testing C-based static methods..."
1537 import xxsubtype as spam
1538 a = (1, 2, 3)
1539 d = {"abc": 123}
1540 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1541 veris(x, None)
1542 vereq(a, a1)
1543 vereq(d, d1)
1544 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1545 veris(x, None)
1546 vereq(a, a1)
1547 vereq(d, d1)
1548
Tim Peters6d6c1a32001-08-02 04:15:00 +00001549def classic():
1550 if verbose: print "Testing classic classes..."
1551 class C:
1552 def foo(*a): return a
1553 goo = classmethod(foo)
1554 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001555 vereq(C.goo(1), (C, 1))
1556 vereq(c.goo(1), (C, 1))
1557 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001558 class D(C):
1559 pass
1560 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001561 vereq(D.goo(1), (D, 1))
1562 vereq(d.goo(1), (D, 1))
1563 vereq(d.foo(1), (d, 1))
1564 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001565 class E: # *not* subclassing from C
1566 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001567 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001568 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001569
1570def compattr():
1571 if verbose: print "Testing computed attributes..."
1572 class C(object):
1573 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001574 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001575 self.__get = get
1576 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001577 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001578 def __get__(self, obj, type=None):
1579 return self.__get(obj)
1580 def __set__(self, obj, value):
1581 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001582 def __delete__(self, obj):
1583 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001584 def __init__(self):
1585 self.__x = 0
1586 def __get_x(self):
1587 x = self.__x
1588 self.__x = x+1
1589 return x
1590 def __set_x(self, x):
1591 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001592 def __delete_x(self):
1593 del self.__x
1594 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001595 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001596 vereq(a.x, 0)
1597 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001598 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001599 vereq(a.x, 10)
1600 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001601 del a.x
1602 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001603
1604def newslot():
1605 if verbose: print "Testing __new__ slot override..."
1606 class C(list):
1607 def __new__(cls):
1608 self = list.__new__(cls)
1609 self.foo = 1
1610 return self
1611 def __init__(self):
1612 self.foo = self.foo + 2
1613 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001614 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001615 verify(a.__class__ is C)
1616 class D(C):
1617 pass
1618 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001619 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001620 verify(b.__class__ is D)
1621
Tim Peters6d6c1a32001-08-02 04:15:00 +00001622def altmro():
1623 if verbose: print "Testing mro() and overriding it..."
1624 class A(object):
1625 def f(self): return "A"
1626 class B(A):
1627 pass
1628 class C(A):
1629 def f(self): return "C"
1630 class D(B, C):
1631 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001632 vereq(D.mro(), [D, B, C, A, object])
1633 vereq(D.__mro__, (D, B, C, A, object))
1634 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001635
Guido van Rossumd3077402001-08-12 05:24:18 +00001636 class PerverseMetaType(type):
1637 def mro(cls):
1638 L = type.mro(cls)
1639 L.reverse()
1640 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001641 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001642 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001643 vereq(X.__mro__, (object, A, C, B, D, X))
1644 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001645
Armin Rigo037d1e02005-12-29 17:07:39 +00001646 try:
1647 class X(object):
1648 class __metaclass__(type):
1649 def mro(self):
1650 return [self, dict, object]
1651 except TypeError:
1652 pass
1653 else:
1654 raise TestFailed, "devious mro() return not caught"
1655
1656 try:
1657 class X(object):
1658 class __metaclass__(type):
1659 def mro(self):
1660 return [1]
1661 except TypeError:
1662 pass
1663 else:
1664 raise TestFailed, "non-class mro() return not caught"
1665
1666 try:
1667 class X(object):
1668 class __metaclass__(type):
1669 def mro(self):
1670 return 1
1671 except TypeError:
1672 pass
1673 else:
1674 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001675
Armin Rigo037d1e02005-12-29 17:07:39 +00001676
Tim Peters6d6c1a32001-08-02 04:15:00 +00001677def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001678 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001679
1680 class B(object):
1681 "Intermediate class because object doesn't have a __setattr__"
1682
1683 class C(B):
1684
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001685 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001686 if name == "foo":
1687 return ("getattr", name)
1688 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001689 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001690 def __setattr__(self, name, value):
1691 if name == "foo":
1692 self.setattr = (name, value)
1693 else:
1694 return B.__setattr__(self, name, value)
1695 def __delattr__(self, name):
1696 if name == "foo":
1697 self.delattr = name
1698 else:
1699 return B.__delattr__(self, name)
1700
1701 def __getitem__(self, key):
1702 return ("getitem", key)
1703 def __setitem__(self, key, value):
1704 self.setitem = (key, value)
1705 def __delitem__(self, key):
1706 self.delitem = key
1707
1708 def __getslice__(self, i, j):
1709 return ("getslice", i, j)
1710 def __setslice__(self, i, j, value):
1711 self.setslice = (i, j, value)
1712 def __delslice__(self, i, j):
1713 self.delslice = (i, j)
1714
1715 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001716 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001717 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001718 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001719 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001720 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001721
Guido van Rossum45704552001-10-08 16:35:45 +00001722 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001723 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001724 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001725 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001726 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001727
Guido van Rossum45704552001-10-08 16:35:45 +00001728 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001729 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001730 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001731 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001732 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001733
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001734def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001735 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001736 class C(object):
1737 def __init__(self, x):
1738 self.x = x
1739 def foo(self):
1740 return self.x
1741 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001742 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001743 class D(C):
1744 boo = C.foo
1745 goo = c1.foo
1746 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001747 vereq(d2.foo(), 2)
1748 vereq(d2.boo(), 2)
1749 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001750 class E(object):
1751 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001752 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001753 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001754
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001755def specials():
1756 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001757 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001758 # Test the default behavior for static classes
1759 class C(object):
1760 def __getitem__(self, i):
1761 if 0 <= i < 10: return i
1762 raise IndexError
1763 c1 = C()
1764 c2 = C()
1765 verify(not not c1)
Tim Peters85b362f2006-04-11 01:21:00 +00001766 verify(id(c1) != id(c2))
1767 hash(c1)
1768 hash(c2)
Guido van Rossum45704552001-10-08 16:35:45 +00001769 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1770 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001771 verify(c1 != c2)
1772 verify(not c1 != c1)
1773 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001774 # Note that the module name appears in str/repr, and that varies
1775 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001776 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001777 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001778 verify(-1 not in c1)
1779 for i in range(10):
1780 verify(i in c1)
1781 verify(10 not in c1)
1782 # Test the default behavior for dynamic classes
1783 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001784 def __getitem__(self, i):
1785 if 0 <= i < 10: return i
1786 raise IndexError
1787 d1 = D()
1788 d2 = D()
1789 verify(not not d1)
Tim Peters85b362f2006-04-11 01:21:00 +00001790 verify(id(d1) != id(d2))
1791 hash(d1)
1792 hash(d2)
Guido van Rossum45704552001-10-08 16:35:45 +00001793 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1794 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001795 verify(d1 != d2)
1796 verify(not d1 != d1)
1797 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001798 # Note that the module name appears in str/repr, and that varies
1799 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001800 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001801 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001802 verify(-1 not in d1)
1803 for i in range(10):
1804 verify(i in d1)
1805 verify(10 not in d1)
1806 # Test overridden behavior for static classes
1807 class Proxy(object):
1808 def __init__(self, x):
1809 self.x = x
1810 def __nonzero__(self):
1811 return not not self.x
1812 def __hash__(self):
1813 return hash(self.x)
1814 def __eq__(self, other):
1815 return self.x == other
1816 def __ne__(self, other):
1817 return self.x != other
1818 def __cmp__(self, other):
1819 return cmp(self.x, other.x)
1820 def __str__(self):
1821 return "Proxy:%s" % self.x
1822 def __repr__(self):
1823 return "Proxy(%r)" % self.x
1824 def __contains__(self, value):
1825 return value in self.x
1826 p0 = Proxy(0)
1827 p1 = Proxy(1)
1828 p_1 = Proxy(-1)
1829 verify(not p0)
1830 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001831 vereq(hash(p0), hash(0))
1832 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001833 verify(p0 != p1)
1834 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001835 vereq(not p0, p1)
1836 vereq(cmp(p0, p1), -1)
1837 vereq(cmp(p0, p0), 0)
1838 vereq(cmp(p0, p_1), 1)
1839 vereq(str(p0), "Proxy:0")
1840 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001841 p10 = Proxy(range(10))
1842 verify(-1 not in p10)
1843 for i in range(10):
1844 verify(i in p10)
1845 verify(10 not in p10)
1846 # Test overridden behavior for dynamic classes
1847 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001848 def __init__(self, x):
1849 self.x = x
1850 def __nonzero__(self):
1851 return not not self.x
1852 def __hash__(self):
1853 return hash(self.x)
1854 def __eq__(self, other):
1855 return self.x == other
1856 def __ne__(self, other):
1857 return self.x != other
1858 def __cmp__(self, other):
1859 return cmp(self.x, other.x)
1860 def __str__(self):
1861 return "DProxy:%s" % self.x
1862 def __repr__(self):
1863 return "DProxy(%r)" % self.x
1864 def __contains__(self, value):
1865 return value in self.x
1866 p0 = DProxy(0)
1867 p1 = DProxy(1)
1868 p_1 = DProxy(-1)
1869 verify(not p0)
1870 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001871 vereq(hash(p0), hash(0))
1872 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001873 verify(p0 != p1)
1874 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001875 vereq(not p0, p1)
1876 vereq(cmp(p0, p1), -1)
1877 vereq(cmp(p0, p0), 0)
1878 vereq(cmp(p0, p_1), 1)
1879 vereq(str(p0), "DProxy:0")
1880 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001881 p10 = DProxy(range(10))
1882 verify(-1 not in p10)
1883 for i in range(10):
1884 verify(i in p10)
1885 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001886 # Safety test for __cmp__
1887 def unsafecmp(a, b):
1888 try:
1889 a.__class__.__cmp__(a, b)
1890 except TypeError:
1891 pass
1892 else:
1893 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1894 a.__class__, a, b)
1895 unsafecmp(u"123", "123")
1896 unsafecmp("123", u"123")
1897 unsafecmp(1, 1.0)
1898 unsafecmp(1.0, 1)
1899 unsafecmp(1, 1L)
1900 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001901
Neal Norwitz1a997502003-01-13 20:13:12 +00001902 class Letter(str):
1903 def __new__(cls, letter):
1904 if letter == 'EPS':
1905 return str.__new__(cls)
1906 return str.__new__(cls, letter)
1907 def __str__(self):
1908 if not self:
1909 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001910 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001911
1912 # sys.stdout needs to be the original to trigger the recursion bug
1913 import sys
1914 test_stdout = sys.stdout
1915 sys.stdout = get_original_stdout()
1916 try:
1917 # nothing should actually be printed, this should raise an exception
1918 print Letter('w')
1919 except RuntimeError:
1920 pass
1921 else:
1922 raise TestFailed, "expected a RuntimeError for print recursion"
1923 sys.stdout = test_stdout
1924
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001925def weakrefs():
1926 if verbose: print "Testing weak references..."
1927 import weakref
1928 class C(object):
1929 pass
1930 c = C()
1931 r = weakref.ref(c)
1932 verify(r() is c)
1933 del c
1934 verify(r() is None)
1935 del r
1936 class NoWeak(object):
1937 __slots__ = ['foo']
1938 no = NoWeak()
1939 try:
1940 weakref.ref(no)
1941 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001942 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001943 else:
1944 verify(0, "weakref.ref(no) should be illegal")
1945 class Weak(object):
1946 __slots__ = ['foo', '__weakref__']
1947 yes = Weak()
1948 r = weakref.ref(yes)
1949 verify(r() is yes)
1950 del yes
1951 verify(r() is None)
1952 del r
1953
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001954def properties():
1955 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001956 class C(object):
1957 def getx(self):
1958 return self.__x
1959 def setx(self, value):
1960 self.__x = value
1961 def delx(self):
1962 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001963 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001964 a = C()
1965 verify(not hasattr(a, "x"))
1966 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001967 vereq(a._C__x, 42)
1968 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001969 del a.x
1970 verify(not hasattr(a, "x"))
1971 verify(not hasattr(a, "_C__x"))
1972 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001973 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001974 C.x.__delete__(a)
1975 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001976
Tim Peters66c1a522001-09-24 21:17:50 +00001977 raw = C.__dict__['x']
1978 verify(isinstance(raw, property))
1979
1980 attrs = dir(raw)
1981 verify("__doc__" in attrs)
1982 verify("fget" in attrs)
1983 verify("fset" in attrs)
1984 verify("fdel" in attrs)
1985
Guido van Rossum45704552001-10-08 16:35:45 +00001986 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001987 verify(raw.fget is C.__dict__['getx'])
1988 verify(raw.fset is C.__dict__['setx'])
1989 verify(raw.fdel is C.__dict__['delx'])
1990
1991 for attr in "__doc__", "fget", "fset", "fdel":
1992 try:
1993 setattr(raw, attr, 42)
1994 except TypeError, msg:
1995 if str(msg).find('readonly') < 0:
1996 raise TestFailed("when setting readonly attr %r on a "
1997 "property, got unexpected TypeError "
1998 "msg %r" % (attr, str(msg)))
1999 else:
2000 raise TestFailed("expected TypeError from trying to set "
2001 "readonly %r attr on a property" % attr)
2002
Neal Norwitz673cd822002-10-18 16:33:13 +00002003 class D(object):
2004 __getitem__ = property(lambda s: 1/0)
2005
2006 d = D()
2007 try:
2008 for i in d:
2009 str(i)
2010 except ZeroDivisionError:
2011 pass
2012 else:
2013 raise TestFailed, "expected ZeroDivisionError from bad property"
2014
Georg Brandl533ff6f2006-03-08 18:09:27 +00002015 class E(object):
2016 def getter(self):
2017 "getter method"
2018 return 0
2019 def setter(self, value):
2020 "setter method"
2021 pass
2022 prop = property(getter)
2023 vereq(prop.__doc__, "getter method")
2024 prop2 = property(fset=setter)
2025 vereq(prop2.__doc__, None)
2026
Georg Brandle9462c72006-08-04 18:03:37 +00002027 # this segfaulted in 2.5b2
2028 try:
2029 import _testcapi
2030 except ImportError:
2031 pass
2032 else:
2033 class X(object):
2034 p = property(_testcapi.test_with_docstring)
2035
2036
Guido van Rossumc4a18802001-08-24 16:55:27 +00002037def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00002038 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00002039
2040 class A(object):
2041 def meth(self, a):
2042 return "A(%r)" % a
2043
Guido van Rossum45704552001-10-08 16:35:45 +00002044 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002045
2046 class B(A):
2047 def __init__(self):
2048 self.__super = super(B, self)
2049 def meth(self, a):
2050 return "B(%r)" % a + self.__super.meth(a)
2051
Guido van Rossum45704552001-10-08 16:35:45 +00002052 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002053
2054 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002055 def meth(self, a):
2056 return "C(%r)" % a + self.__super.meth(a)
2057 C._C__super = super(C)
2058
Guido van Rossum45704552001-10-08 16:35:45 +00002059 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002060
2061 class D(C, B):
2062 def meth(self, a):
2063 return "D(%r)" % a + super(D, self).meth(a)
2064
Guido van Rossum5b443c62001-12-03 15:38:28 +00002065 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2066
2067 # Test for subclassing super
2068
2069 class mysuper(super):
2070 def __init__(self, *args):
2071 return super(mysuper, self).__init__(*args)
2072
2073 class E(D):
2074 def meth(self, a):
2075 return "E(%r)" % a + mysuper(E, self).meth(a)
2076
2077 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2078
2079 class F(E):
2080 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002081 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002082 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2083 F._F__super = mysuper(F)
2084
2085 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2086
2087 # Make sure certain errors are raised
2088
2089 try:
2090 super(D, 42)
2091 except TypeError:
2092 pass
2093 else:
2094 raise TestFailed, "shouldn't allow super(D, 42)"
2095
2096 try:
2097 super(D, C())
2098 except TypeError:
2099 pass
2100 else:
2101 raise TestFailed, "shouldn't allow super(D, C())"
2102
2103 try:
2104 super(D).__get__(12)
2105 except TypeError:
2106 pass
2107 else:
2108 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2109
2110 try:
2111 super(D).__get__(C())
2112 except TypeError:
2113 pass
2114 else:
2115 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002116
Guido van Rossuma4541a32003-04-16 20:02:22 +00002117 # Make sure data descriptors can be overridden and accessed via super
2118 # (new feature in Python 2.3)
2119
2120 class DDbase(object):
2121 def getx(self): return 42
2122 x = property(getx)
2123
2124 class DDsub(DDbase):
2125 def getx(self): return "hello"
2126 x = property(getx)
2127
2128 dd = DDsub()
2129 vereq(dd.x, "hello")
2130 vereq(super(DDsub, dd).x, 42)
2131
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002132 # Ensure that super() lookup of descriptor from classmethod
2133 # works (SF ID# 743627)
2134
2135 class Base(object):
2136 aProp = property(lambda self: "foo")
2137
2138 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002139 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002140 def test(klass):
2141 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002142
2143 veris(Sub.test(), Base.aProp)
2144
Georg Brandl5d59c092006-09-30 08:43:30 +00002145 # Verify that super() doesn't allow keyword args
2146 try:
2147 super(Base, kw=1)
2148 except TypeError:
2149 pass
2150 else:
2151 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002152
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002153def inherits():
2154 if verbose: print "Testing inheritance from basic types..."
2155
2156 class hexint(int):
2157 def __repr__(self):
2158 return hex(self)
2159 def __add__(self, other):
2160 return hexint(int.__add__(self, other))
2161 # (Note that overriding __radd__ doesn't work,
2162 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002163 vereq(repr(hexint(7) + 9), "0x10")
2164 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002165 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002166 vereq(a, 12345)
2167 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002168 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002169 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002170 verify((+a).__class__ is int)
2171 verify((a >> 0).__class__ is int)
2172 verify((a << 0).__class__ is int)
2173 verify((hexint(0) << 12).__class__ is int)
2174 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002175
2176 class octlong(long):
2177 __slots__ = []
2178 def __str__(self):
2179 s = oct(self)
2180 if s[-1] == 'L':
2181 s = s[:-1]
2182 return s
2183 def __add__(self, other):
2184 return self.__class__(super(octlong, self).__add__(other))
2185 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002186 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002187 # (Note that overriding __radd__ here only seems to work
2188 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002189 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002190 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(a, 12345L)
2192 vereq(long(a), 12345L)
2193 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002194 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002195 verify((+a).__class__ is long)
2196 verify((-a).__class__ is long)
2197 verify((-octlong(0)).__class__ is long)
2198 verify((a >> 0).__class__ is long)
2199 verify((a << 0).__class__ is long)
2200 verify((a - 0).__class__ is long)
2201 verify((a * 1).__class__ is long)
2202 verify((a ** 1).__class__ is long)
2203 verify((a // 1).__class__ is long)
2204 verify((1 * a).__class__ is long)
2205 verify((a | 0).__class__ is long)
2206 verify((a ^ 0).__class__ is long)
2207 verify((a & -1L).__class__ is long)
2208 verify((octlong(0) << 12).__class__ is long)
2209 verify((octlong(0) >> 12).__class__ is long)
2210 verify(abs(octlong(0)).__class__ is long)
2211
2212 # Because octlong overrides __add__, we can't check the absence of +0
2213 # optimizations using octlong.
2214 class longclone(long):
2215 pass
2216 a = longclone(1)
2217 verify((a + 0).__class__ is long)
2218 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002219
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002220 # Check that negative clones don't segfault
2221 a = longclone(-1)
2222 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002223 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002224
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002225 class precfloat(float):
2226 __slots__ = ['prec']
2227 def __init__(self, value=0.0, prec=12):
2228 self.prec = int(prec)
2229 float.__init__(value)
2230 def __repr__(self):
2231 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002232 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002233 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(a, 12345.0)
2235 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002236 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002237 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002238 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002239
Tim Peters2400fa42001-09-12 19:12:49 +00002240 class madcomplex(complex):
2241 def __repr__(self):
2242 return "%.17gj%+.17g" % (self.imag, self.real)
2243 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002244 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002245 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002246 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002247 vereq(a, base)
2248 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002249 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002250 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002251 vereq(repr(a), "4j-3")
2252 vereq(a, base)
2253 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002254 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002255 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002256 veris((+a).__class__, complex)
2257 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002258 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002259 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002261 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002263 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002265
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002266 class madtuple(tuple):
2267 _rev = None
2268 def rev(self):
2269 if self._rev is not None:
2270 return self._rev
2271 L = list(self)
2272 L.reverse()
2273 self._rev = self.__class__(L)
2274 return self._rev
2275 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2277 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2278 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002279 for i in range(512):
2280 t = madtuple(range(i))
2281 u = t.rev()
2282 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002284 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002285 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002286 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002288 verify(a[:].__class__ is tuple)
2289 verify((a * 1).__class__ is tuple)
2290 verify((a * 0).__class__ is tuple)
2291 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002292 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002293 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002294 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002295 verify((a + a).__class__ is tuple)
2296 verify((a * 0).__class__ is tuple)
2297 verify((a * 1).__class__ is tuple)
2298 verify((a * 2).__class__ is tuple)
2299 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002300
2301 class madstring(str):
2302 _rev = None
2303 def rev(self):
2304 if self._rev is not None:
2305 return self._rev
2306 L = list(self)
2307 L.reverse()
2308 self._rev = self.__class__("".join(L))
2309 return self._rev
2310 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002311 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2312 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2313 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002314 for i in range(256):
2315 s = madstring("".join(map(chr, range(i))))
2316 t = s.rev()
2317 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002318 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002319 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002320 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002321 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002322
Tim Peters8fa5dd02001-09-12 02:18:30 +00002323 base = "\x00" * 5
2324 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(s, base)
2326 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002327 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002328 vereq(hash(s), hash(base))
2329 vereq({s: 1}[base], 1)
2330 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002331 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002332 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002333 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002334 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002335 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002336 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002337 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002338 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002339 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002340 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002341 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002342 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002343 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002344 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002345 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002346 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002347 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002349 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002350 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002351 identitytab = ''.join([chr(i) for i in range(256)])
2352 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002353 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002354 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(s.translate(identitytab, "x"), base)
2356 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002357 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002358 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002359 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002360 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002361 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002362 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002363 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002364 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002365 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002366 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002367
Guido van Rossum91ee7982001-08-30 20:52:40 +00002368 class madunicode(unicode):
2369 _rev = None
2370 def rev(self):
2371 if self._rev is not None:
2372 return self._rev
2373 L = list(self)
2374 L.reverse()
2375 self._rev = self.__class__(u"".join(L))
2376 return self._rev
2377 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002378 vereq(u, u"ABCDEF")
2379 vereq(u.rev(), madunicode(u"FEDCBA"))
2380 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002381 base = u"12345"
2382 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002383 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002384 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002385 vereq(hash(u), hash(base))
2386 vereq({u: 1}[base], 1)
2387 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002388 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002389 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002390 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002391 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002392 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002393 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002394 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002395 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002396 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002397 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002398 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002399 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002400 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002401 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002402 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002403 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002404 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002405 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002406 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002407 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002408 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002409 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002410 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002411 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002412 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002413 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002414 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002415 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002416 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002417 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002418 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002419 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002420 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002421 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002422 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002423 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002424 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002425 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002426
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002427 class sublist(list):
2428 pass
2429 a = sublist(range(5))
2430 vereq(a, range(5))
2431 a.append("hello")
2432 vereq(a, range(5) + ["hello"])
2433 a[5] = 5
2434 vereq(a, range(6))
2435 a.extend(range(6, 20))
2436 vereq(a, range(20))
2437 a[-5:] = []
2438 vereq(a, range(15))
2439 del a[10:15]
2440 vereq(len(a), 10)
2441 vereq(a, range(10))
2442 vereq(list(a), range(10))
2443 vereq(a[0], 0)
2444 vereq(a[9], 9)
2445 vereq(a[-10], 0)
2446 vereq(a[-1], 9)
2447 vereq(a[:5], range(5))
2448
Tim Peters59c9a642001-09-13 05:38:56 +00002449 class CountedInput(file):
2450 """Counts lines read by self.readline().
2451
2452 self.lineno is the 0-based ordinal of the last line read, up to
2453 a maximum of one greater than the number of lines in the file.
2454
2455 self.ateof is true if and only if the final "" line has been read,
2456 at which point self.lineno stops incrementing, and further calls
2457 to readline() continue to return "".
2458 """
2459
2460 lineno = 0
2461 ateof = 0
2462 def readline(self):
2463 if self.ateof:
2464 return ""
2465 s = file.readline(self)
2466 # Next line works too.
2467 # s = super(CountedInput, self).readline()
2468 self.lineno += 1
2469 if s == "":
2470 self.ateof = 1
2471 return s
2472
Tim Peters561f8992001-09-13 19:36:36 +00002473 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002474 lines = ['a\n', 'b\n', 'c\n']
2475 try:
2476 f.writelines(lines)
2477 f.close()
2478 f = CountedInput(TESTFN)
2479 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2480 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002481 vereq(expected, got)
2482 vereq(f.lineno, i)
2483 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002484 f.close()
2485 finally:
2486 try:
2487 f.close()
2488 except:
2489 pass
2490 try:
2491 import os
2492 os.unlink(TESTFN)
2493 except:
2494 pass
2495
Tim Peters808b94e2001-09-13 19:33:07 +00002496def keywords():
2497 if verbose:
2498 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002499 vereq(int(x=1), 1)
2500 vereq(float(x=2), 2.0)
2501 vereq(long(x=3), 3L)
2502 vereq(complex(imag=42, real=666), complex(666, 42))
2503 vereq(str(object=500), '500')
2504 vereq(unicode(string='abc', errors='strict'), u'abc')
2505 vereq(tuple(sequence=range(3)), (0, 1, 2))
2506 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002507 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002508
2509 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002510 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002511 try:
2512 constructor(bogus_keyword_arg=1)
2513 except TypeError:
2514 pass
2515 else:
2516 raise TestFailed("expected TypeError from bogus keyword "
2517 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002518
Tim Peters8fa45672001-09-13 21:01:29 +00002519def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002520 # XXX This test is disabled because rexec is not deemed safe
2521 return
Tim Peters8fa45672001-09-13 21:01:29 +00002522 import rexec
2523 if verbose:
2524 print "Testing interaction with restricted execution ..."
2525
2526 sandbox = rexec.RExec()
2527
2528 code1 = """f = open(%r, 'w')""" % TESTFN
2529 code2 = """f = file(%r, 'w')""" % TESTFN
2530 code3 = """\
2531f = open(%r)
2532t = type(f) # a sneaky way to get the file() constructor
2533f.close()
2534f = t(%r, 'w') # rexec can't catch this by itself
2535""" % (TESTFN, TESTFN)
2536
2537 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2538 f.close()
2539
2540 try:
2541 for code in code1, code2, code3:
2542 try:
2543 sandbox.r_exec(code)
2544 except IOError, msg:
2545 if str(msg).find("restricted") >= 0:
2546 outcome = "OK"
2547 else:
2548 outcome = "got an exception, but not an expected one"
2549 else:
2550 outcome = "expected a restricted-execution exception"
2551
2552 if outcome != "OK":
2553 raise TestFailed("%s, in %r" % (outcome, code))
2554
2555 finally:
2556 try:
2557 import os
2558 os.unlink(TESTFN)
2559 except:
2560 pass
2561
Tim Peters0ab085c2001-09-14 00:25:33 +00002562def str_subclass_as_dict_key():
2563 if verbose:
2564 print "Testing a str subclass used as dict key .."
2565
2566 class cistr(str):
2567 """Sublcass of str that computes __eq__ case-insensitively.
2568
2569 Also computes a hash code of the string in canonical form.
2570 """
2571
2572 def __init__(self, value):
2573 self.canonical = value.lower()
2574 self.hashcode = hash(self.canonical)
2575
2576 def __eq__(self, other):
2577 if not isinstance(other, cistr):
2578 other = cistr(other)
2579 return self.canonical == other.canonical
2580
2581 def __hash__(self):
2582 return self.hashcode
2583
Guido van Rossum45704552001-10-08 16:35:45 +00002584 vereq(cistr('ABC'), 'abc')
2585 vereq('aBc', cistr('ABC'))
2586 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002587
2588 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002589 vereq(d[cistr('one')], 1)
2590 vereq(d[cistr('tWo')], 2)
2591 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002592 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002593 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002594
Guido van Rossumab3b0342001-09-18 20:38:53 +00002595def classic_comparisons():
2596 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002597 class classic:
2598 pass
2599 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002600 if verbose: print " (base = %s)" % base
2601 class C(base):
2602 def __init__(self, value):
2603 self.value = int(value)
2604 def __cmp__(self, other):
2605 if isinstance(other, C):
2606 return cmp(self.value, other.value)
2607 if isinstance(other, int) or isinstance(other, long):
2608 return cmp(self.value, other)
2609 return NotImplemented
2610 c1 = C(1)
2611 c2 = C(2)
2612 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002613 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002614 c = {1: c1, 2: c2, 3: c3}
2615 for x in 1, 2, 3:
2616 for y in 1, 2, 3:
2617 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2618 for op in "<", "<=", "==", "!=", ">", ">=":
2619 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2620 "x=%d, y=%d" % (x, y))
2621 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2622 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2623
Guido van Rossum0639f592001-09-18 21:06:04 +00002624def rich_comparisons():
2625 if verbose:
2626 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002627 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002628 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002629 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002630 vereq(z, 1+0j)
2631 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002632 class ZZ(complex):
2633 def __eq__(self, other):
2634 try:
2635 return abs(self - other) <= 1e-6
2636 except:
2637 return NotImplemented
2638 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002639 vereq(zz, 1+0j)
2640 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002641
Guido van Rossum0639f592001-09-18 21:06:04 +00002642 class classic:
2643 pass
2644 for base in (classic, int, object, list):
2645 if verbose: print " (base = %s)" % base
2646 class C(base):
2647 def __init__(self, value):
2648 self.value = int(value)
2649 def __cmp__(self, other):
2650 raise TestFailed, "shouldn't call __cmp__"
2651 def __eq__(self, other):
2652 if isinstance(other, C):
2653 return self.value == other.value
2654 if isinstance(other, int) or isinstance(other, long):
2655 return self.value == other
2656 return NotImplemented
2657 def __ne__(self, other):
2658 if isinstance(other, C):
2659 return self.value != other.value
2660 if isinstance(other, int) or isinstance(other, long):
2661 return self.value != other
2662 return NotImplemented
2663 def __lt__(self, other):
2664 if isinstance(other, C):
2665 return self.value < other.value
2666 if isinstance(other, int) or isinstance(other, long):
2667 return self.value < other
2668 return NotImplemented
2669 def __le__(self, other):
2670 if isinstance(other, C):
2671 return self.value <= other.value
2672 if isinstance(other, int) or isinstance(other, long):
2673 return self.value <= other
2674 return NotImplemented
2675 def __gt__(self, other):
2676 if isinstance(other, C):
2677 return self.value > other.value
2678 if isinstance(other, int) or isinstance(other, long):
2679 return self.value > other
2680 return NotImplemented
2681 def __ge__(self, other):
2682 if isinstance(other, C):
2683 return self.value >= other.value
2684 if isinstance(other, int) or isinstance(other, long):
2685 return self.value >= other
2686 return NotImplemented
2687 c1 = C(1)
2688 c2 = C(2)
2689 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002690 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002691 c = {1: c1, 2: c2, 3: c3}
2692 for x in 1, 2, 3:
2693 for y in 1, 2, 3:
2694 for op in "<", "<=", "==", "!=", ">", ">=":
2695 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2696 "x=%d, y=%d" % (x, y))
2697 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2698 "x=%d, y=%d" % (x, y))
2699 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2700 "x=%d, y=%d" % (x, y))
2701
Guido van Rossum1952e382001-09-19 01:25:16 +00002702def coercions():
2703 if verbose: print "Testing coercions..."
2704 class I(int): pass
2705 coerce(I(0), 0)
2706 coerce(0, I(0))
2707 class L(long): pass
2708 coerce(L(0), 0)
2709 coerce(L(0), 0L)
2710 coerce(0, L(0))
2711 coerce(0L, L(0))
2712 class F(float): pass
2713 coerce(F(0), 0)
2714 coerce(F(0), 0L)
2715 coerce(F(0), 0.)
2716 coerce(0, F(0))
2717 coerce(0L, F(0))
2718 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002719 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002720 coerce(C(0), 0)
2721 coerce(C(0), 0L)
2722 coerce(C(0), 0.)
2723 coerce(C(0), 0j)
2724 coerce(0, C(0))
2725 coerce(0L, C(0))
2726 coerce(0., C(0))
2727 coerce(0j, C(0))
2728
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002729def descrdoc():
2730 if verbose: print "Testing descriptor doc strings..."
2731 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002732 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002733 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002734 check(file.name, "file name") # member descriptor
2735
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002736def setclass():
2737 if verbose: print "Testing __class__ assignment..."
2738 class C(object): pass
2739 class D(object): pass
2740 class E(object): pass
2741 class F(D, E): pass
2742 for cls in C, D, E, F:
2743 for cls2 in C, D, E, F:
2744 x = cls()
2745 x.__class__ = cls2
2746 verify(x.__class__ is cls2)
2747 x.__class__ = cls
2748 verify(x.__class__ is cls)
2749 def cant(x, C):
2750 try:
2751 x.__class__ = C
2752 except TypeError:
2753 pass
2754 else:
2755 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002756 try:
2757 delattr(x, "__class__")
2758 except TypeError:
2759 pass
2760 else:
2761 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002762 cant(C(), list)
2763 cant(list(), C)
2764 cant(C(), 1)
2765 cant(C(), object)
2766 cant(object(), list)
2767 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002768 class Int(int): __slots__ = []
2769 cant(2, Int)
2770 cant(Int(), int)
2771 cant(True, int)
2772 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002773 o = object()
2774 cant(o, type(1))
2775 cant(o, type(None))
2776 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002777
Guido van Rossum6661be32001-10-26 04:26:12 +00002778def setdict():
2779 if verbose: print "Testing __dict__ assignment..."
2780 class C(object): pass
2781 a = C()
2782 a.__dict__ = {'b': 1}
2783 vereq(a.b, 1)
2784 def cant(x, dict):
2785 try:
2786 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002787 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002788 pass
2789 else:
2790 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2791 cant(a, None)
2792 cant(a, [])
2793 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002794 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002795 # Classes don't allow __dict__ assignment
2796 cant(C, {})
2797
Guido van Rossum3926a632001-09-25 16:25:58 +00002798def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002799 if verbose:
2800 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002801 import pickle, cPickle
2802
2803 def sorteditems(d):
2804 L = d.items()
2805 L.sort()
2806 return L
2807
2808 global C
2809 class C(object):
2810 def __init__(self, a, b):
2811 super(C, self).__init__()
2812 self.a = a
2813 self.b = b
2814 def __repr__(self):
2815 return "C(%r, %r)" % (self.a, self.b)
2816
2817 global C1
2818 class C1(list):
2819 def __new__(cls, a, b):
2820 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002821 def __getnewargs__(self):
2822 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002823 def __init__(self, a, b):
2824 self.a = a
2825 self.b = b
2826 def __repr__(self):
2827 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2828
2829 global C2
2830 class C2(int):
2831 def __new__(cls, a, b, val=0):
2832 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002833 def __getnewargs__(self):
2834 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002835 def __init__(self, a, b, val=0):
2836 self.a = a
2837 self.b = b
2838 def __repr__(self):
2839 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2840
Guido van Rossum90c45142001-11-24 21:07:01 +00002841 global C3
2842 class C3(object):
2843 def __init__(self, foo):
2844 self.foo = foo
2845 def __getstate__(self):
2846 return self.foo
2847 def __setstate__(self, foo):
2848 self.foo = foo
2849
2850 global C4classic, C4
2851 class C4classic: # classic
2852 pass
2853 class C4(C4classic, object): # mixed inheritance
2854 pass
2855
Guido van Rossum3926a632001-09-25 16:25:58 +00002856 for p in pickle, cPickle:
2857 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002858 if verbose:
2859 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002860
2861 for cls in C, C1, C2:
2862 s = p.dumps(cls, bin)
2863 cls2 = p.loads(s)
2864 verify(cls2 is cls)
2865
2866 a = C1(1, 2); a.append(42); a.append(24)
2867 b = C2("hello", "world", 42)
2868 s = p.dumps((a, b), bin)
2869 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002870 vereq(x.__class__, a.__class__)
2871 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2872 vereq(y.__class__, b.__class__)
2873 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002874 vereq(repr(x), repr(a))
2875 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002876 if verbose:
2877 print "a = x =", a
2878 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002879 # Test for __getstate__ and __setstate__ on new style class
2880 u = C3(42)
2881 s = p.dumps(u, bin)
2882 v = p.loads(s)
2883 veris(u.__class__, v.__class__)
2884 vereq(u.foo, v.foo)
2885 # Test for picklability of hybrid class
2886 u = C4()
2887 u.foo = 42
2888 s = p.dumps(u, bin)
2889 v = p.loads(s)
2890 veris(u.__class__, v.__class__)
2891 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002892
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002893 # Testing copy.deepcopy()
2894 if verbose:
2895 print "deepcopy"
2896 import copy
2897 for cls in C, C1, C2:
2898 cls2 = copy.deepcopy(cls)
2899 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002900
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002901 a = C1(1, 2); a.append(42); a.append(24)
2902 b = C2("hello", "world", 42)
2903 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002904 vereq(x.__class__, a.__class__)
2905 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2906 vereq(y.__class__, b.__class__)
2907 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002908 vereq(repr(x), repr(a))
2909 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002910 if verbose:
2911 print "a = x =", a
2912 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002913
Guido van Rossum8c842552002-03-14 23:05:54 +00002914def pickleslots():
2915 if verbose: print "Testing pickling of classes with __slots__ ..."
2916 import pickle, cPickle
2917 # Pickling of classes with __slots__ but without __getstate__ should fail
2918 global B, C, D, E
2919 class B(object):
2920 pass
2921 for base in [object, B]:
2922 class C(base):
2923 __slots__ = ['a']
2924 class D(C):
2925 pass
2926 try:
2927 pickle.dumps(C())
2928 except TypeError:
2929 pass
2930 else:
2931 raise TestFailed, "should fail: pickle C instance - %s" % base
2932 try:
2933 cPickle.dumps(C())
2934 except TypeError:
2935 pass
2936 else:
2937 raise TestFailed, "should fail: cPickle C instance - %s" % base
2938 try:
2939 pickle.dumps(C())
2940 except TypeError:
2941 pass
2942 else:
2943 raise TestFailed, "should fail: pickle D instance - %s" % base
2944 try:
2945 cPickle.dumps(D())
2946 except TypeError:
2947 pass
2948 else:
2949 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002950 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002951 class C(base):
2952 __slots__ = ['a']
2953 def __getstate__(self):
2954 try:
2955 d = self.__dict__.copy()
2956 except AttributeError:
2957 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002958 for cls in self.__class__.__mro__:
2959 for sn in cls.__dict__.get('__slots__', ()):
2960 try:
2961 d[sn] = getattr(self, sn)
2962 except AttributeError:
2963 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002964 return d
2965 def __setstate__(self, d):
2966 for k, v in d.items():
2967 setattr(self, k, v)
2968 class D(C):
2969 pass
2970 # Now it should work
2971 x = C()
2972 y = pickle.loads(pickle.dumps(x))
2973 vereq(hasattr(y, 'a'), 0)
2974 y = cPickle.loads(cPickle.dumps(x))
2975 vereq(hasattr(y, 'a'), 0)
2976 x.a = 42
2977 y = pickle.loads(pickle.dumps(x))
2978 vereq(y.a, 42)
2979 y = cPickle.loads(cPickle.dumps(x))
2980 vereq(y.a, 42)
2981 x = D()
2982 x.a = 42
2983 x.b = 100
2984 y = pickle.loads(pickle.dumps(x))
2985 vereq(y.a + y.b, 142)
2986 y = cPickle.loads(cPickle.dumps(x))
2987 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002988 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002989 class E(C):
2990 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002991 x = E()
2992 x.a = 42
2993 x.b = "foo"
2994 y = pickle.loads(pickle.dumps(x))
2995 vereq(y.a, x.a)
2996 vereq(y.b, x.b)
2997 y = cPickle.loads(cPickle.dumps(x))
2998 vereq(y.a, x.a)
2999 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003000
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003001def copies():
3002 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
3003 import copy
3004 class C(object):
3005 pass
3006
3007 a = C()
3008 a.foo = 12
3009 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003010 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003011
3012 a.bar = [1,2,3]
3013 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003014 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003015 verify(c.bar is a.bar)
3016
3017 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003018 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003019 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003020 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003021
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003022def binopoverride():
3023 if verbose: print "Testing overrides of binary operations..."
3024 class I(int):
3025 def __repr__(self):
3026 return "I(%r)" % int(self)
3027 def __add__(self, other):
3028 return I(int(self) + int(other))
3029 __radd__ = __add__
3030 def __pow__(self, other, mod=None):
3031 if mod is None:
3032 return I(pow(int(self), int(other)))
3033 else:
3034 return I(pow(int(self), int(other), int(mod)))
3035 def __rpow__(self, other, mod=None):
3036 if mod is None:
3037 return I(pow(int(other), int(self), mod))
3038 else:
3039 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003040
Walter Dörwald70a6b492004-02-12 17:35:32 +00003041 vereq(repr(I(1) + I(2)), "I(3)")
3042 vereq(repr(I(1) + 2), "I(3)")
3043 vereq(repr(1 + I(2)), "I(3)")
3044 vereq(repr(I(2) ** I(3)), "I(8)")
3045 vereq(repr(2 ** I(3)), "I(8)")
3046 vereq(repr(I(2) ** 3), "I(8)")
3047 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003048 class S(str):
3049 def __eq__(self, other):
3050 return self.lower() == other.lower()
3051
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003052def subclasspropagation():
3053 if verbose: print "Testing propagation of slot functions to subclasses..."
3054 class A(object):
3055 pass
3056 class B(A):
3057 pass
3058 class C(A):
3059 pass
3060 class D(B, C):
3061 pass
3062 d = D()
Tim Peters171b8682006-04-11 01:59:34 +00003063 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003064 A.__hash__ = lambda self: 42
3065 vereq(hash(d), 42)
3066 C.__hash__ = lambda self: 314
3067 vereq(hash(d), 314)
3068 B.__hash__ = lambda self: 144
3069 vereq(hash(d), 144)
3070 D.__hash__ = lambda self: 100
3071 vereq(hash(d), 100)
3072 del D.__hash__
3073 vereq(hash(d), 144)
3074 del B.__hash__
3075 vereq(hash(d), 314)
3076 del C.__hash__
3077 vereq(hash(d), 42)
3078 del A.__hash__
Tim Peters171b8682006-04-11 01:59:34 +00003079 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003080 d.foo = 42
3081 d.bar = 42
3082 vereq(d.foo, 42)
3083 vereq(d.bar, 42)
3084 def __getattribute__(self, name):
3085 if name == "foo":
3086 return 24
3087 return object.__getattribute__(self, name)
3088 A.__getattribute__ = __getattribute__
3089 vereq(d.foo, 24)
3090 vereq(d.bar, 42)
3091 def __getattr__(self, name):
3092 if name in ("spam", "foo", "bar"):
3093 return "hello"
3094 raise AttributeError, name
3095 B.__getattr__ = __getattr__
3096 vereq(d.spam, "hello")
3097 vereq(d.foo, 24)
3098 vereq(d.bar, 42)
3099 del A.__getattribute__
3100 vereq(d.foo, 42)
3101 del d.foo
3102 vereq(d.foo, "hello")
3103 vereq(d.bar, 42)
3104 del B.__getattr__
3105 try:
3106 d.foo
3107 except AttributeError:
3108 pass
3109 else:
3110 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003111
Guido van Rossume7f3e242002-06-14 02:35:45 +00003112 # Test a nasty bug in recurse_down_subclasses()
3113 import gc
3114 class A(object):
3115 pass
3116 class B(A):
3117 pass
3118 del B
3119 gc.collect()
3120 A.__setitem__ = lambda *a: None # crash
3121
Tim Petersfc57ccb2001-10-12 02:38:24 +00003122def buffer_inherit():
3123 import binascii
3124 # SF bug [#470040] ParseTuple t# vs subclasses.
3125 if verbose:
3126 print "Testing that buffer interface is inherited ..."
3127
3128 class MyStr(str):
3129 pass
3130 base = 'abc'
3131 m = MyStr(base)
3132 # b2a_hex uses the buffer interface to get its argument's value, via
3133 # PyArg_ParseTuple 't#' code.
3134 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3135
3136 # It's not clear that unicode will continue to support the character
3137 # buffer interface, and this test will fail if that's taken away.
3138 class MyUni(unicode):
3139 pass
3140 base = u'abc'
3141 m = MyUni(base)
3142 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3143
3144 class MyInt(int):
3145 pass
3146 m = MyInt(42)
3147 try:
3148 binascii.b2a_hex(m)
3149 raise TestFailed('subclass of int should not have a buffer interface')
3150 except TypeError:
3151 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003152
Tim Petersc9933152001-10-16 20:18:24 +00003153def str_of_str_subclass():
3154 import binascii
3155 import cStringIO
3156
3157 if verbose:
3158 print "Testing __str__ defined in subclass of str ..."
3159
3160 class octetstring(str):
3161 def __str__(self):
3162 return binascii.b2a_hex(self)
3163 def __repr__(self):
3164 return self + " repr"
3165
3166 o = octetstring('A')
3167 vereq(type(o), octetstring)
3168 vereq(type(str(o)), str)
3169 vereq(type(repr(o)), str)
3170 vereq(ord(o), 0x41)
3171 vereq(str(o), '41')
3172 vereq(repr(o), 'A repr')
3173 vereq(o.__str__(), '41')
3174 vereq(o.__repr__(), 'A repr')
3175
3176 capture = cStringIO.StringIO()
3177 # Calling str() or not exercises different internal paths.
3178 print >> capture, o
3179 print >> capture, str(o)
3180 vereq(capture.getvalue(), '41\n41\n')
3181 capture.close()
3182
Guido van Rossumc8e56452001-10-22 00:43:43 +00003183def kwdargs():
3184 if verbose: print "Testing keyword arguments to __init__, __call__..."
3185 def f(a): return a
3186 vereq(f.__call__(a=42), 42)
3187 a = []
3188 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003189 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003190
Brett Cannon22565aa2006-06-09 22:31:23 +00003191def recursive__call__():
3192 if verbose: print ("Testing recursive __call__() by setting to instance of "
3193 "class ...")
3194 class A(object):
3195 pass
3196
3197 A.__call__ = A()
3198 try:
3199 A()()
3200 except RuntimeError:
3201 pass
3202 else:
3203 raise TestFailed("Recursion limit should have been reached for "
3204 "__call__()")
3205
Guido van Rossumed87ad82001-10-30 02:33:02 +00003206def delhook():
3207 if verbose: print "Testing __del__ hook..."
3208 log = []
3209 class C(object):
3210 def __del__(self):
3211 log.append(1)
3212 c = C()
3213 vereq(log, [])
3214 del c
3215 vereq(log, [1])
3216
Guido van Rossum29d26062001-12-11 04:37:34 +00003217 class D(object): pass
3218 d = D()
3219 try: del d[0]
3220 except TypeError: pass
3221 else: raise TestFailed, "invalid del() didn't raise TypeError"
3222
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003223def hashinherit():
3224 if verbose: print "Testing hash of mutable subclasses..."
3225
3226 class mydict(dict):
3227 pass
3228 d = mydict()
3229 try:
3230 hash(d)
3231 except TypeError:
3232 pass
3233 else:
3234 raise TestFailed, "hash() of dict subclass should fail"
3235
3236 class mylist(list):
3237 pass
3238 d = mylist()
3239 try:
3240 hash(d)
3241 except TypeError:
3242 pass
3243 else:
3244 raise TestFailed, "hash() of list subclass should fail"
3245
Guido van Rossum29d26062001-12-11 04:37:34 +00003246def strops():
3247 try: 'a' + 5
3248 except TypeError: pass
3249 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3250
3251 try: ''.split('')
3252 except ValueError: pass
3253 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3254
3255 try: ''.join([0])
3256 except TypeError: pass
3257 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3258
3259 try: ''.rindex('5')
3260 except ValueError: pass
3261 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3262
Guido van Rossum29d26062001-12-11 04:37:34 +00003263 try: '%(n)s' % None
3264 except TypeError: pass
3265 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3266
3267 try: '%(n' % {}
3268 except ValueError: pass
3269 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3270
3271 try: '%*s' % ('abc')
3272 except TypeError: pass
3273 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3274
3275 try: '%*.*s' % ('abc', 5)
3276 except TypeError: pass
3277 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3278
3279 try: '%s' % (1, 2)
3280 except TypeError: pass
3281 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3282
3283 try: '%' % None
3284 except ValueError: pass
3285 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3286
3287 vereq('534253'.isdigit(), 1)
3288 vereq('534253x'.isdigit(), 0)
3289 vereq('%c' % 5, '\x05')
3290 vereq('%c' % '5', '5')
3291
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003292def deepcopyrecursive():
3293 if verbose: print "Testing deepcopy of recursive objects..."
3294 class Node:
3295 pass
3296 a = Node()
3297 b = Node()
3298 a.b = b
3299 b.a = a
3300 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003301
Guido van Rossumd7035672002-03-12 20:43:31 +00003302def modules():
3303 if verbose: print "Testing uninitialized module objects..."
3304 from types import ModuleType as M
3305 m = M.__new__(M)
3306 str(m)
3307 vereq(hasattr(m, "__name__"), 0)
3308 vereq(hasattr(m, "__file__"), 0)
3309 vereq(hasattr(m, "foo"), 0)
3310 vereq(m.__dict__, None)
3311 m.foo = 1
3312 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003313
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003314def dictproxyiterkeys():
3315 class C(object):
3316 def meth(self):
3317 pass
3318 if verbose: print "Testing dict-proxy iterkeys..."
3319 keys = [ key for key in C.__dict__.iterkeys() ]
3320 keys.sort()
3321 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3322
3323def dictproxyitervalues():
3324 class C(object):
3325 def meth(self):
3326 pass
3327 if verbose: print "Testing dict-proxy itervalues..."
3328 values = [ values for values in C.__dict__.itervalues() ]
3329 vereq(len(values), 5)
3330
3331def dictproxyiteritems():
3332 class C(object):
3333 def meth(self):
3334 pass
3335 if verbose: print "Testing dict-proxy iteritems..."
3336 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3337 keys.sort()
3338 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3339
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003340def funnynew():
3341 if verbose: print "Testing __new__ returning something unexpected..."
3342 class C(object):
3343 def __new__(cls, arg):
3344 if isinstance(arg, str): return [1, 2, 3]
3345 elif isinstance(arg, int): return object.__new__(D)
3346 else: return object.__new__(cls)
3347 class D(C):
3348 def __init__(self, arg):
3349 self.foo = arg
3350 vereq(C("1"), [1, 2, 3])
3351 vereq(D("1"), [1, 2, 3])
3352 d = D(None)
3353 veris(d.foo, None)
3354 d = C(1)
3355 vereq(isinstance(d, D), True)
3356 vereq(d.foo, 1)
3357 d = D(1)
3358 vereq(isinstance(d, D), True)
3359 vereq(d.foo, 1)
3360
Guido van Rossume8fc6402002-04-16 16:44:51 +00003361def imulbug():
3362 # SF bug 544647
3363 if verbose: print "Testing for __imul__ problems..."
3364 class C(object):
3365 def __imul__(self, other):
3366 return (self, other)
3367 x = C()
3368 y = x
3369 y *= 1.0
3370 vereq(y, (x, 1.0))
3371 y = x
3372 y *= 2
3373 vereq(y, (x, 2))
3374 y = x
3375 y *= 3L
3376 vereq(y, (x, 3L))
3377 y = x
3378 y *= 1L<<100
3379 vereq(y, (x, 1L<<100))
3380 y = x
3381 y *= None
3382 vereq(y, (x, None))
3383 y = x
3384 y *= "foo"
3385 vereq(y, (x, "foo"))
3386
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003387def docdescriptor():
3388 # SF bug 542984
3389 if verbose: print "Testing __doc__ descriptor..."
3390 class DocDescr(object):
3391 def __get__(self, object, otype):
3392 if object:
3393 object = object.__class__.__name__ + ' instance'
3394 if otype:
3395 otype = otype.__name__
3396 return 'object=%s; type=%s' % (object, otype)
3397 class OldClass:
3398 __doc__ = DocDescr()
3399 class NewClass(object):
3400 __doc__ = DocDescr()
3401 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3402 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3403 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3404 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3405
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003406def copy_setstate():
3407 if verbose:
3408 print "Testing that copy.*copy() correctly uses __setstate__..."
3409 import copy
3410 class C(object):
3411 def __init__(self, foo=None):
3412 self.foo = foo
3413 self.__foo = foo
3414 def setfoo(self, foo=None):
3415 self.foo = foo
3416 def getfoo(self):
3417 return self.__foo
3418 def __getstate__(self):
3419 return [self.foo]
3420 def __setstate__(self, lst):
3421 assert len(lst) == 1
3422 self.__foo = self.foo = lst[0]
3423 a = C(42)
3424 a.setfoo(24)
3425 vereq(a.foo, 24)
3426 vereq(a.getfoo(), 42)
3427 b = copy.copy(a)
3428 vereq(b.foo, 24)
3429 vereq(b.getfoo(), 24)
3430 b = copy.deepcopy(a)
3431 vereq(b.foo, 24)
3432 vereq(b.getfoo(), 24)
3433
Guido van Rossum09638c12002-06-13 19:17:46 +00003434def slices():
3435 if verbose:
3436 print "Testing cases with slices and overridden __getitem__ ..."
3437 # Strings
3438 vereq("hello"[:4], "hell")
3439 vereq("hello"[slice(4)], "hell")
3440 vereq(str.__getitem__("hello", slice(4)), "hell")
3441 class S(str):
3442 def __getitem__(self, x):
3443 return str.__getitem__(self, x)
3444 vereq(S("hello")[:4], "hell")
3445 vereq(S("hello")[slice(4)], "hell")
3446 vereq(S("hello").__getitem__(slice(4)), "hell")
3447 # Tuples
3448 vereq((1,2,3)[:2], (1,2))
3449 vereq((1,2,3)[slice(2)], (1,2))
3450 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3451 class T(tuple):
3452 def __getitem__(self, x):
3453 return tuple.__getitem__(self, x)
3454 vereq(T((1,2,3))[:2], (1,2))
3455 vereq(T((1,2,3))[slice(2)], (1,2))
3456 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3457 # Lists
3458 vereq([1,2,3][:2], [1,2])
3459 vereq([1,2,3][slice(2)], [1,2])
3460 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3461 class L(list):
3462 def __getitem__(self, x):
3463 return list.__getitem__(self, x)
3464 vereq(L([1,2,3])[:2], [1,2])
3465 vereq(L([1,2,3])[slice(2)], [1,2])
3466 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3467 # Now do lists and __setitem__
3468 a = L([1,2,3])
3469 a[slice(1, 3)] = [3,2]
3470 vereq(a, [1,3,2])
3471 a[slice(0, 2, 1)] = [3,1]
3472 vereq(a, [3,1,2])
3473 a.__setitem__(slice(1, 3), [2,1])
3474 vereq(a, [3,2,1])
3475 a.__setitem__(slice(0, 2, 1), [2,3])
3476 vereq(a, [2,3,1])
3477
Tim Peters2484aae2002-07-11 06:56:07 +00003478def subtype_resurrection():
3479 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003480 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003481
3482 class C(object):
3483 container = []
3484
3485 def __del__(self):
3486 # resurrect the instance
3487 C.container.append(self)
3488
3489 c = C()
3490 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003491 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003492 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003493 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003494
3495 # If that didn't blow up, it's also interesting to see whether clearing
3496 # the last container slot works: that will attempt to delete c again,
3497 # which will cause c to get appended back to the container again "during"
3498 # the del.
3499 del C.container[-1]
3500 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003501 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003502
Tim Peters14cb1e12002-07-11 18:26:21 +00003503 # Make c mortal again, so that the test framework with -l doesn't report
3504 # it as a leak.
3505 del C.__del__
3506
Guido van Rossum2d702462002-08-06 21:28:28 +00003507def slottrash():
3508 # Deallocating deeply nested slotted trash caused stack overflows
3509 if verbose:
3510 print "Testing slot trash..."
3511 class trash(object):
3512 __slots__ = ['x']
3513 def __init__(self, x):
3514 self.x = x
3515 o = None
3516 for i in xrange(50000):
3517 o = trash(o)
3518 del o
3519
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003520def slotmultipleinheritance():
3521 # SF bug 575229, multiple inheritance w/ slots dumps core
3522 class A(object):
3523 __slots__=()
3524 class B(object):
3525 pass
3526 class C(A,B) :
3527 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003528 vereq(C.__basicsize__, B.__basicsize__)
3529 verify(hasattr(C, '__dict__'))
3530 verify(hasattr(C, '__weakref__'))
3531 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003532
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003533def testrmul():
3534 # SF patch 592646
3535 if verbose:
3536 print "Testing correct invocation of __rmul__..."
3537 class C(object):
3538 def __mul__(self, other):
3539 return "mul"
3540 def __rmul__(self, other):
3541 return "rmul"
3542 a = C()
3543 vereq(a*2, "mul")
3544 vereq(a*2.2, "mul")
3545 vereq(2*a, "rmul")
3546 vereq(2.2*a, "rmul")
3547
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003548def testipow():
3549 # [SF bug 620179]
3550 if verbose:
3551 print "Testing correct invocation of __ipow__..."
3552 class C(object):
3553 def __ipow__(self, other):
3554 pass
3555 a = C()
3556 a **= 2
3557
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003558def do_this_first():
3559 if verbose:
3560 print "Testing SF bug 551412 ..."
3561 # This dumps core when SF bug 551412 isn't fixed --
3562 # but only when test_descr.py is run separately.
3563 # (That can't be helped -- as soon as PyType_Ready()
3564 # is called for PyLong_Type, the bug is gone.)
3565 class UserLong(object):
3566 def __pow__(self, *args):
3567 pass
3568 try:
3569 pow(0L, UserLong(), 0L)
3570 except:
3571 pass
3572
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003573 if verbose:
3574 print "Testing SF bug 570483..."
3575 # Another segfault only when run early
3576 # (before PyType_Ready(tuple) is called)
3577 type.mro(tuple)
3578
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003579def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003580 if verbose:
3581 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003582 # stuff that should work:
3583 class C(object):
3584 pass
3585 class C2(object):
3586 def __getattribute__(self, attr):
3587 if attr == 'a':
3588 return 2
3589 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003590 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003591 def meth(self):
3592 return 1
3593 class D(C):
3594 pass
3595 class E(D):
3596 pass
3597 d = D()
3598 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003599 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003600 D.__bases__ = (C2,)
3601 vereq(d.meth(), 1)
3602 vereq(e.meth(), 1)
3603 vereq(d.a, 2)
3604 vereq(e.a, 2)
3605 vereq(C2.__subclasses__(), [D])
3606
3607 # stuff that shouldn't:
3608 class L(list):
3609 pass
3610
3611 try:
3612 L.__bases__ = (dict,)
3613 except TypeError:
3614 pass
3615 else:
3616 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3617
3618 try:
3619 list.__bases__ = (dict,)
3620 except TypeError:
3621 pass
3622 else:
3623 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3624
3625 try:
3626 del D.__bases__
3627 except TypeError:
3628 pass
3629 else:
3630 raise TestFailed, "shouldn't be able to delete .__bases__"
3631
3632 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003633 D.__bases__ = ()
3634 except TypeError, msg:
3635 if str(msg) == "a new-style class can't have only classic bases":
3636 raise TestFailed, "wrong error message for .__bases__ = ()"
3637 else:
3638 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3639
3640 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003641 D.__bases__ = (D,)
3642 except TypeError:
3643 pass
3644 else:
3645 # actually, we'll have crashed by here...
3646 raise TestFailed, "shouldn't be able to create inheritance cycles"
3647
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003648 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003649 D.__bases__ = (C, C)
3650 except TypeError:
3651 pass
3652 else:
3653 raise TestFailed, "didn't detect repeated base classes"
3654
3655 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003656 D.__bases__ = (E,)
3657 except TypeError:
3658 pass
3659 else:
3660 raise TestFailed, "shouldn't be able to create inheritance cycles"
3661
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003662 # let's throw a classic class into the mix:
3663 class Classic:
3664 def meth2(self):
3665 return 3
3666
3667 D.__bases__ = (C, Classic)
3668
3669 vereq(d.meth2(), 3)
3670 vereq(e.meth2(), 3)
3671 try:
3672 d.a
3673 except AttributeError:
3674 pass
3675 else:
3676 raise TestFailed, "attribute should have vanished"
3677
3678 try:
3679 D.__bases__ = (Classic,)
3680 except TypeError:
3681 pass
3682 else:
3683 raise TestFailed, "new-style class must have a new-style base"
3684
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003685def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003686 if verbose:
3687 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003688 class WorkOnce(type):
3689 def __new__(self, name, bases, ns):
3690 self.flag = 0
3691 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3692 def mro(self):
3693 if self.flag > 0:
3694 raise RuntimeError, "bozo"
3695 else:
3696 self.flag += 1
3697 return type.mro(self)
3698
3699 class WorkAlways(type):
3700 def mro(self):
3701 # this is here to make sure that .mro()s aren't called
3702 # with an exception set (which was possible at one point).
3703 # An error message will be printed in a debug build.
3704 # What's a good way to test for this?
3705 return type.mro(self)
3706
3707 class C(object):
3708 pass
3709
3710 class C2(object):
3711 pass
3712
3713 class D(C):
3714 pass
3715
3716 class E(D):
3717 pass
3718
3719 class F(D):
3720 __metaclass__ = WorkOnce
3721
3722 class G(D):
3723 __metaclass__ = WorkAlways
3724
3725 # Immediate subclasses have their mro's adjusted in alphabetical
3726 # order, so E's will get adjusted before adjusting F's fails. We
3727 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003728
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003729 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003730 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003731
3732 try:
3733 D.__bases__ = (C2,)
3734 except RuntimeError:
3735 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003736 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003737 else:
3738 raise TestFailed, "exception not propagated"
3739
3740def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003741 if verbose:
3742 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003743 class A(object):
3744 pass
3745
3746 class B(object):
3747 pass
3748
3749 class C(A, B):
3750 pass
3751
3752 class D(A, B):
3753 pass
3754
3755 class E(C, D):
3756 pass
3757
3758 try:
3759 C.__bases__ = (B, A)
3760 except TypeError:
3761 pass
3762 else:
3763 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003764
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003765def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003766 if verbose:
3767 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003768 class C(object):
3769 pass
3770
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003771 # C.__module__ could be 'test_descr' or '__main__'
3772 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003773
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003774 C.__name__ = 'D'
3775 vereq((C.__module__, C.__name__), (mod, 'D'))
3776
3777 C.__name__ = 'D.E'
3778 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003779
Guido van Rossum613f24f2003-01-06 23:00:59 +00003780def subclass_right_op():
3781 if verbose:
3782 print "Testing correct dispatch of subclass overloading __r<op>__..."
3783
3784 # This code tests various cases where right-dispatch of a subclass
3785 # should be preferred over left-dispatch of a base class.
3786
3787 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3788
3789 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003790 def __floordiv__(self, other):
3791 return "B.__floordiv__"
3792 def __rfloordiv__(self, other):
3793 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003794
Guido van Rossumf389c772003-02-27 20:04:19 +00003795 vereq(B(1) // 1, "B.__floordiv__")
3796 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003797
3798 # Case 2: subclass of object; this is just the baseline for case 3
3799
3800 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003801 def __floordiv__(self, other):
3802 return "C.__floordiv__"
3803 def __rfloordiv__(self, other):
3804 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003805
Guido van Rossumf389c772003-02-27 20:04:19 +00003806 vereq(C() // 1, "C.__floordiv__")
3807 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003808
3809 # Case 3: subclass of new-style class; here it gets interesting
3810
3811 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003812 def __floordiv__(self, other):
3813 return "D.__floordiv__"
3814 def __rfloordiv__(self, other):
3815 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003816
Guido van Rossumf389c772003-02-27 20:04:19 +00003817 vereq(D() // C(), "D.__floordiv__")
3818 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003819
3820 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3821
3822 class E(C):
3823 pass
3824
Guido van Rossumf389c772003-02-27 20:04:19 +00003825 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003826
Guido van Rossumf389c772003-02-27 20:04:19 +00003827 vereq(E() // 1, "C.__floordiv__")
3828 vereq(1 // E(), "C.__rfloordiv__")
3829 vereq(E() // C(), "C.__floordiv__")
3830 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003831
Guido van Rossum373c7412003-01-07 13:41:37 +00003832def dict_type_with_metaclass():
3833 if verbose:
3834 print "Testing type of __dict__ when __metaclass__ set..."
3835
3836 class B(object):
3837 pass
3838 class M(type):
3839 pass
3840 class C:
3841 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3842 __metaclass__ = M
3843 veris(type(C.__dict__), type(B.__dict__))
3844
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003845def meth_class_get():
3846 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003847 if verbose:
3848 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003849 # Baseline
3850 arg = [1, 2, 3]
3851 res = {1: None, 2: None, 3: None}
3852 vereq(dict.fromkeys(arg), res)
3853 vereq({}.fromkeys(arg), res)
3854 # Now get the descriptor
3855 descr = dict.__dict__["fromkeys"]
3856 # More baseline using the descriptor directly
3857 vereq(descr.__get__(None, dict)(arg), res)
3858 vereq(descr.__get__({})(arg), res)
3859 # Now check various error cases
3860 try:
3861 descr.__get__(None, None)
3862 except TypeError:
3863 pass
3864 else:
3865 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3866 try:
3867 descr.__get__(42)
3868 except TypeError:
3869 pass
3870 else:
3871 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3872 try:
3873 descr.__get__(None, 42)
3874 except TypeError:
3875 pass
3876 else:
3877 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3878 try:
3879 descr.__get__(None, int)
3880 except TypeError:
3881 pass
3882 else:
3883 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3884
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003885def isinst_isclass():
3886 if verbose:
3887 print "Testing proxy isinstance() and isclass()..."
3888 class Proxy(object):
3889 def __init__(self, obj):
3890 self.__obj = obj
3891 def __getattribute__(self, name):
3892 if name.startswith("_Proxy__"):
3893 return object.__getattribute__(self, name)
3894 else:
3895 return getattr(self.__obj, name)
3896 # Test with a classic class
3897 class C:
3898 pass
3899 a = C()
3900 pa = Proxy(a)
3901 verify(isinstance(a, C)) # Baseline
3902 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003903 # Test with a classic subclass
3904 class D(C):
3905 pass
3906 a = D()
3907 pa = Proxy(a)
3908 verify(isinstance(a, C)) # Baseline
3909 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003910 # Test with a new-style class
3911 class C(object):
3912 pass
3913 a = C()
3914 pa = Proxy(a)
3915 verify(isinstance(a, C)) # Baseline
3916 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003917 # Test with a new-style subclass
3918 class D(C):
3919 pass
3920 a = D()
3921 pa = Proxy(a)
3922 verify(isinstance(a, C)) # Baseline
3923 verify(isinstance(pa, C)) # Test
3924
3925def proxysuper():
3926 if verbose:
3927 print "Testing super() for a proxy object..."
3928 class Proxy(object):
3929 def __init__(self, obj):
3930 self.__obj = obj
3931 def __getattribute__(self, name):
3932 if name.startswith("_Proxy__"):
3933 return object.__getattribute__(self, name)
3934 else:
3935 return getattr(self.__obj, name)
3936
3937 class B(object):
3938 def f(self):
3939 return "B.f"
3940
3941 class C(B):
3942 def f(self):
3943 return super(C, self).f() + "->C.f"
3944
3945 obj = C()
3946 p = Proxy(obj)
3947 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003948
Guido van Rossum52b27052003-04-15 20:05:10 +00003949def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003950 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00003951 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003952 try:
3953 object.__setattr__(str, "foo", 42)
3954 except TypeError:
3955 pass
3956 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003957 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003958 try:
3959 object.__delattr__(str, "lower")
3960 except TypeError:
3961 pass
3962 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003963 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003964
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003965def weakref_segfault():
3966 # SF 742911
3967 if verbose:
3968 print "Testing weakref segfault..."
3969
3970 import weakref
3971
3972 class Provoker:
3973 def __init__(self, referrent):
3974 self.ref = weakref.ref(referrent)
3975
3976 def __del__(self):
3977 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003978
3979 class Oops(object):
3980 pass
3981
3982 o = Oops()
3983 o.whatever = Provoker(o)
3984 del o
3985
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00003986def wrapper_segfault():
3987 # SF 927248: deeply nested wrappers could cause stack overflow
3988 f = lambda:None
3989 for i in xrange(1000000):
3990 f = f.__call__
3991 f = None
3992
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003993# Fix SF #762455, segfault when sys.stdout is changed in getattr
3994def filefault():
3995 if verbose:
3996 print "Testing sys.stdout is changed in getattr..."
3997 import sys
3998 class StdoutGuard:
3999 def __getattr__(self, attr):
4000 sys.stdout = sys.__stdout__
4001 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4002 sys.stdout = StdoutGuard()
4003 try:
4004 print "Oops!"
4005 except RuntimeError:
4006 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004007
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004008def vicious_descriptor_nonsense():
4009 # A potential segfault spotted by Thomas Wouters in mail to
4010 # python-dev 2003-04-17, turned into an example & fixed by Michael
4011 # Hudson just less than four months later...
4012 if verbose:
4013 print "Testing vicious_descriptor_nonsense..."
4014
4015 class Evil(object):
4016 def __hash__(self):
4017 return hash('attr')
4018 def __eq__(self, other):
4019 del C.attr
4020 return 0
4021
4022 class Descr(object):
4023 def __get__(self, ob, type=None):
4024 return 1
4025
4026 class C(object):
4027 attr = Descr()
4028
4029 c = C()
4030 c.__dict__[Evil()] = 0
4031
4032 vereq(c.attr, 1)
4033 # this makes a crash more likely:
4034 import gc; gc.collect()
4035 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004036
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004037def test_init():
4038 # SF 1155938
4039 class Foo(object):
4040 def __init__(self):
4041 return 10
4042 try:
4043 Foo()
4044 except TypeError:
4045 pass
4046 else:
4047 raise TestFailed, "did not test __init__() for None return"
4048
Armin Rigoc6686b72005-11-07 08:38:00 +00004049def methodwrapper():
4050 # <type 'method-wrapper'> did not support any reflection before 2.5
4051 if verbose:
4052 print "Testing method-wrapper objects..."
4053
4054 l = []
4055 vereq(l.__add__, l.__add__)
Armin Rigofd01d792006-06-08 10:56:24 +00004056 vereq(l.__add__, [].__add__)
4057 verify(l.__add__ != [5].__add__)
4058 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004059 verify(l.__add__.__name__ == '__add__')
4060 verify(l.__add__.__self__ is l)
4061 verify(l.__add__.__objclass__ is list)
4062 vereq(l.__add__.__doc__, list.__add__.__doc__)
Armin Rigofd01d792006-06-08 10:56:24 +00004063 try:
4064 hash(l.__add__)
4065 except TypeError:
4066 pass
4067 else:
4068 raise TestFailed("no TypeError from hash([].__add__)")
4069
4070 t = ()
4071 t += (7,)
4072 vereq(t.__add__, (7,).__add__)
4073 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004074
Armin Rigofd163f92005-12-29 15:59:19 +00004075def notimplemented():
4076 # all binary methods should be able to return a NotImplemented
4077 if verbose:
4078 print "Testing NotImplemented..."
4079
4080 import sys
4081 import types
4082 import operator
4083
4084 def specialmethod(self, other):
4085 return NotImplemented
4086
4087 def check(expr, x, y):
4088 try:
4089 exec expr in {'x': x, 'y': y, 'operator': operator}
4090 except TypeError:
4091 pass
4092 else:
4093 raise TestFailed("no TypeError from %r" % (expr,))
4094
4095 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
4096 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4097 # ValueErrors instead of TypeErrors
4098 for metaclass in [type, types.ClassType]:
4099 for name, expr, iexpr in [
4100 ('__add__', 'x + y', 'x += y'),
4101 ('__sub__', 'x - y', 'x -= y'),
4102 ('__mul__', 'x * y', 'x *= y'),
4103 ('__truediv__', 'operator.truediv(x, y)', None),
4104 ('__floordiv__', 'operator.floordiv(x, y)', None),
4105 ('__div__', 'x / y', 'x /= y'),
4106 ('__mod__', 'x % y', 'x %= y'),
4107 ('__divmod__', 'divmod(x, y)', None),
4108 ('__pow__', 'x ** y', 'x **= y'),
4109 ('__lshift__', 'x << y', 'x <<= y'),
4110 ('__rshift__', 'x >> y', 'x >>= y'),
4111 ('__and__', 'x & y', 'x &= y'),
4112 ('__or__', 'x | y', 'x |= y'),
4113 ('__xor__', 'x ^ y', 'x ^= y'),
4114 ('__coerce__', 'coerce(x, y)', None)]:
4115 if name == '__coerce__':
4116 rname = name
4117 else:
4118 rname = '__r' + name[2:]
4119 A = metaclass('A', (), {name: specialmethod})
4120 B = metaclass('B', (), {rname: specialmethod})
4121 a = A()
4122 b = B()
4123 check(expr, a, a)
4124 check(expr, a, b)
4125 check(expr, b, a)
4126 check(expr, b, b)
4127 check(expr, a, N1)
4128 check(expr, a, N2)
4129 check(expr, N1, b)
4130 check(expr, N2, b)
4131 if iexpr:
4132 check(iexpr, a, a)
4133 check(iexpr, a, b)
4134 check(iexpr, b, a)
4135 check(iexpr, b, b)
4136 check(iexpr, a, N1)
4137 check(iexpr, a, N2)
4138 iname = '__i' + name[2:]
4139 C = metaclass('C', (), {iname: specialmethod})
4140 c = C()
4141 check(iexpr, c, a)
4142 check(iexpr, c, b)
4143 check(iexpr, c, N1)
4144 check(iexpr, c, N2)
4145
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004146def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004147 weakref_segfault() # Must be first, somehow
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004148 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004149 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004150 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004151 lists()
4152 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004153 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004154 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004155 ints()
4156 longs()
4157 floats()
4158 complexes()
4159 spamlists()
4160 spamdicts()
4161 pydicts()
4162 pylists()
4163 metaclass()
4164 pymods()
4165 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004166 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004167 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004168 ex5()
4169 monotonicity()
4170 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004171 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004172 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004173 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004174 dynamics()
4175 errors()
4176 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004177 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004178 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004179 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004180 classic()
4181 compattr()
4182 newslot()
4183 altmro()
4184 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004185 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004186 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004187 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004188 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004189 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004190 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004191 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004192 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004193 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004194 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004195 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004196 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004197 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004198 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004199 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004200 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004201 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004202 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004203 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004204 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004205 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004206 kwdargs()
Brett Cannon22565aa2006-06-09 22:31:23 +00004207 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004208 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004209 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004210 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004211 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004212 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004213 dictproxyiterkeys()
4214 dictproxyitervalues()
4215 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004216 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004217 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004218 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004219 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004220 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004221 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004222 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004223 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004224 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004225 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004226 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004227 test_mutable_bases()
4228 test_mutable_bases_with_failing_mro()
4229 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004230 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004231 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004232 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004233 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004234 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004235 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004236 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004237 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004238 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004239 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004240 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004241 notimplemented()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004242
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004243 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004244
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004245if __name__ == "__main__":
4246 test_main()