blob: 00a1deaa9da089885ea5ef697188f5497a01a15a [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
Armin Rigoc0ba52d2007-04-19 14:44:48 +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
Jeremy Hyltonfa955692007-02-27 18:29:45 +0000823 # Testing code to find most derived baseclass
824 class A(type):
825 def __new__(*args, **kwargs):
826 return type.__new__(*args, **kwargs)
827
828 class B(object):
829 pass
830
831 class C(object):
832 __metaclass__ = A
833
834 # The most derived metaclass of D is A rather than type.
835 class D(B, C):
836 pass
837
838
Tim Peters6d6c1a32001-08-02 04:15:00 +0000839def pymods():
840 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000842 import sys
843 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000844 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000845 def __init__(self, name):
846 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000847 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000849 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 def __setattr__(self, name, value):
851 log.append(("setattr", name, value))
852 MT.__setattr__(self, name, value)
853 def __delattr__(self, name):
854 log.append(("delattr", name))
855 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000856 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000857 a.foo = 12
858 x = a.foo
859 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000860 vereq(log, [("setattr", "foo", 12),
861 ("getattr", "foo"),
862 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000863
864def multi():
865 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000866 class C(object):
867 def __init__(self):
868 self.__state = 0
869 def getstate(self):
870 return self.__state
871 def setstate(self, state):
872 self.__state = state
873 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000874 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000876 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000877 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000878 def __init__(self):
879 type({}).__init__(self)
880 C.__init__(self)
881 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000882 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000883 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000884 vereq(d.items(), [("hello", "world")])
885 vereq(d["hello"], "world")
886 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000888 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000889 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000890
Guido van Rossume45763a2001-08-10 21:28:46 +0000891 # SF bug #442833
892 class Node(object):
893 def __int__(self):
894 return int(self.foo())
895 def foo(self):
896 return "23"
897 class Frag(Node, list):
898 def foo(self):
899 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000900 vereq(Node().__int__(), 23)
901 vereq(int(Node()), 23)
902 vereq(Frag().__int__(), 42)
903 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000904
Tim Petersa91e9642001-11-14 23:32:33 +0000905 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000906
907 class A:
908 x = 1
909
910 class B(A):
911 pass
912
913 class C(A):
914 x = 2
915
916 class D(B, C):
917 pass
918 vereq(D.x, 1)
919
920 # Classic MRO is preserved for a classic base class.
921 class E(D, object):
922 pass
923 vereq(E.__mro__, (E, D, B, A, C, object))
924 vereq(E.x, 1)
925
926 # But with a mix of classic bases, their MROs are combined using
927 # new-style MRO.
928 class F(B, C, object):
929 pass
930 vereq(F.__mro__, (F, B, C, A, object))
931 vereq(F.x, 2)
932
933 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000934 class C:
935 def cmethod(self):
936 return "C a"
937 def all_method(self):
938 return "C b"
939
940 class M1(C, object):
941 def m1method(self):
942 return "M1 a"
943 def all_method(self):
944 return "M1 b"
945
946 vereq(M1.__mro__, (M1, C, object))
947 m = M1()
948 vereq(m.cmethod(), "C a")
949 vereq(m.m1method(), "M1 a")
950 vereq(m.all_method(), "M1 b")
951
952 class D(C):
953 def dmethod(self):
954 return "D a"
955 def all_method(self):
956 return "D b"
957
Guido van Rossum9a818922002-11-14 19:50:14 +0000958 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000959 def m2method(self):
960 return "M2 a"
961 def all_method(self):
962 return "M2 b"
963
Guido van Rossum9a818922002-11-14 19:50:14 +0000964 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000965 m = M2()
966 vereq(m.cmethod(), "C a")
967 vereq(m.dmethod(), "D a")
968 vereq(m.m2method(), "M2 a")
969 vereq(m.all_method(), "M2 b")
970
Guido van Rossum9a818922002-11-14 19:50:14 +0000971 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000972 def m3method(self):
973 return "M3 a"
974 def all_method(self):
975 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000976 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000977 m = M3()
978 vereq(m.cmethod(), "C a")
979 vereq(m.dmethod(), "D a")
980 vereq(m.m1method(), "M1 a")
981 vereq(m.m2method(), "M2 a")
982 vereq(m.m3method(), "M3 a")
983 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000984
Guido van Rossume54616c2001-12-14 04:19:56 +0000985 class Classic:
986 pass
987 try:
988 class New(Classic):
989 __metaclass__ = type
990 except TypeError:
991 pass
992 else:
993 raise TestFailed, "new class with only classic bases - shouldn't be"
994
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995def diamond():
996 if verbose: print "Testing multiple inheritance special cases..."
997 class A(object):
998 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000999 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001000 class B(A):
1001 def boo(self): return "B"
1002 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +00001003 vereq(B().spam(), "B")
1004 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001005 class C(A):
1006 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +00001007 vereq(C().spam(), "A")
1008 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001010 vereq(D().spam(), "B")
1011 vereq(D().boo(), "B")
1012 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001014 vereq(E().spam(), "B")
1015 vereq(E().boo(), "C")
1016 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +00001017 # MRO order disagreement
1018 try:
1019 class F(D, E): pass
1020 except TypeError:
1021 pass
1022 else:
1023 raise TestFailed, "expected MRO order disagreement (F)"
1024 try:
1025 class G(E, D): pass
1026 except TypeError:
1027 pass
1028 else:
1029 raise TestFailed, "expected MRO order disagreement (G)"
1030
1031
1032# see thread python-dev/2002-October/029035.html
1033def ex5():
1034 if verbose: print "Testing ex5 from C3 switch discussion..."
1035 class A(object): pass
1036 class B(object): pass
1037 class C(object): pass
1038 class X(A): pass
1039 class Y(A): pass
1040 class Z(X,B,Y,C): pass
1041 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1042
1043# see "A Monotonic Superclass Linearization for Dylan",
1044# by Kim Barrett et al. (OOPSLA 1996)
1045def monotonicity():
1046 if verbose: print "Testing MRO monotonicity..."
1047 class Boat(object): pass
1048 class DayBoat(Boat): pass
1049 class WheelBoat(Boat): pass
1050 class EngineLess(DayBoat): pass
1051 class SmallMultihull(DayBoat): pass
1052 class PedalWheelBoat(EngineLess,WheelBoat): pass
1053 class SmallCatamaran(SmallMultihull): pass
1054 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1055
1056 vereq(PedalWheelBoat.__mro__,
1057 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1058 object))
1059 vereq(SmallCatamaran.__mro__,
1060 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1061
1062 vereq(Pedalo.__mro__,
1063 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1064 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1065
1066# see "A Monotonic Superclass Linearization for Dylan",
1067# by Kim Barrett et al. (OOPSLA 1996)
1068def consistency_with_epg():
1069 if verbose: print "Testing consistentcy with EPG..."
1070 class Pane(object): pass
1071 class ScrollingMixin(object): pass
1072 class EditingMixin(object): pass
1073 class ScrollablePane(Pane,ScrollingMixin): pass
1074 class EditablePane(Pane,EditingMixin): pass
1075 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1076
1077 vereq(EditableScrollablePane.__mro__,
1078 (EditableScrollablePane, ScrollablePane, EditablePane,
1079 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001080
Raymond Hettingerf394df42003-04-06 19:13:41 +00001081mro_err_msg = """Cannot create a consistent method resolution
1082order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +00001083
Guido van Rossumd32047f2002-11-25 21:38:52 +00001084def mro_disagreement():
1085 if verbose: print "Testing error messages for MRO disagreement..."
1086 def raises(exc, expected, callable, *args):
1087 try:
1088 callable(*args)
1089 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001090 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001091 raise TestFailed, "Message %r, expected %r" % (str(msg),
1092 expected)
1093 else:
1094 raise TestFailed, "Expected %s" % exc
1095 class A(object): pass
1096 class B(A): pass
1097 class C(object): pass
1098 # Test some very simple errors
1099 raises(TypeError, "duplicate base class A",
1100 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001101 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001102 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001103 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001104 type, "X", (A, C, B), {})
1105 # Test a slightly more complex error
1106 class GridLayout(object): pass
1107 class HorizontalGrid(GridLayout): pass
1108 class VerticalGrid(GridLayout): pass
1109 class HVGrid(HorizontalGrid, VerticalGrid): pass
1110 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +00001111 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001112 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1113
Guido van Rossum37202612001-08-09 19:45:21 +00001114def objects():
1115 if verbose: print "Testing object class..."
1116 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001117 vereq(a.__class__, object)
1118 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001119 b = object()
1120 verify(a is not b)
1121 verify(not hasattr(a, "foo"))
1122 try:
1123 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001124 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001125 pass
1126 else:
1127 verify(0, "object() should not allow setting a foo attribute")
1128 verify(not hasattr(object(), "__dict__"))
1129
1130 class Cdict(object):
1131 pass
1132 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001133 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001134 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001135 vereq(x.foo, 1)
1136 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001137
Tim Peters6d6c1a32001-08-02 04:15:00 +00001138def slots():
1139 if verbose: print "Testing __slots__..."
1140 class C0(object):
1141 __slots__ = []
1142 x = C0()
1143 verify(not hasattr(x, "__dict__"))
1144 verify(not hasattr(x, "foo"))
1145
1146 class C1(object):
1147 __slots__ = ['a']
1148 x = C1()
1149 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001150 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001151 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001152 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001153 x.a = None
1154 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001156 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001157
1158 class C3(object):
1159 __slots__ = ['a', 'b', 'c']
1160 x = C3()
1161 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001162 verify(not hasattr(x, 'a'))
1163 verify(not hasattr(x, 'b'))
1164 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001165 x.a = 1
1166 x.b = 2
1167 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001168 vereq(x.a, 1)
1169 vereq(x.b, 2)
1170 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001171
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001172 class C4(object):
1173 """Validate name mangling"""
1174 __slots__ = ['__a']
1175 def __init__(self, value):
1176 self.__a = value
1177 def get(self):
1178 return self.__a
1179 x = C4(5)
1180 verify(not hasattr(x, '__dict__'))
1181 verify(not hasattr(x, '__a'))
1182 vereq(x.get(), 5)
1183 try:
1184 x.__a = 6
1185 except AttributeError:
1186 pass
1187 else:
1188 raise TestFailed, "Double underscored names not mangled"
1189
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001190 # Make sure slot names are proper identifiers
1191 try:
1192 class C(object):
1193 __slots__ = [None]
1194 except TypeError:
1195 pass
1196 else:
1197 raise TestFailed, "[None] slots not caught"
1198 try:
1199 class C(object):
1200 __slots__ = ["foo bar"]
1201 except TypeError:
1202 pass
1203 else:
1204 raise TestFailed, "['foo bar'] slots not caught"
1205 try:
1206 class C(object):
1207 __slots__ = ["foo\0bar"]
1208 except TypeError:
1209 pass
1210 else:
1211 raise TestFailed, "['foo\\0bar'] slots not caught"
1212 try:
1213 class C(object):
1214 __slots__ = ["1"]
1215 except TypeError:
1216 pass
1217 else:
1218 raise TestFailed, "['1'] slots not caught"
1219 try:
1220 class C(object):
1221 __slots__ = [""]
1222 except TypeError:
1223 pass
1224 else:
1225 raise TestFailed, "[''] slots not caught"
1226 class C(object):
1227 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001228 # XXX(nnorwitz): was there supposed to be something tested
1229 # from the class above?
1230
1231 # Test a single string is not expanded as a sequence.
1232 class C(object):
1233 __slots__ = "abc"
1234 c = C()
1235 c.abc = 5
1236 vereq(c.abc, 5)
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001237
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001238 # Test unicode slot names
1239 try:
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001240 unicode
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001241 except NameError:
1242 pass
1243 else:
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001244 # Test a single unicode string is not expanded as a sequence.
1245 class C(object):
1246 __slots__ = unicode("abc")
1247 c = C()
1248 c.abc = 5
1249 vereq(c.abc, 5)
1250
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001251 # _unicode_to_string used to modify slots in certain circumstances
1252 slots = (unicode("foo"), unicode("bar"))
1253 class C(object):
1254 __slots__ = slots
1255 x = C()
1256 x.foo = 5
1257 vereq(x.foo, 5)
1258 veris(type(slots[0]), unicode)
1259 # this used to leak references
1260 try:
1261 class C(object):
1262 __slots__ = [unichr(128)]
1263 except (TypeError, UnicodeEncodeError):
1264 pass
1265 else:
1266 raise TestFailed, "[unichr(128)] slots not caught"
1267
Guido van Rossum33bab012001-12-05 22:45:48 +00001268 # Test leaks
1269 class Counted(object):
1270 counter = 0 # counts the number of instances alive
1271 def __init__(self):
1272 Counted.counter += 1
1273 def __del__(self):
1274 Counted.counter -= 1
1275 class C(object):
1276 __slots__ = ['a', 'b', 'c']
1277 x = C()
1278 x.a = Counted()
1279 x.b = Counted()
1280 x.c = Counted()
1281 vereq(Counted.counter, 3)
1282 del x
1283 vereq(Counted.counter, 0)
1284 class D(C):
1285 pass
1286 x = D()
1287 x.a = Counted()
1288 x.z = Counted()
1289 vereq(Counted.counter, 2)
1290 del x
1291 vereq(Counted.counter, 0)
1292 class E(D):
1293 __slots__ = ['e']
1294 x = E()
1295 x.a = Counted()
1296 x.z = Counted()
1297 x.e = Counted()
1298 vereq(Counted.counter, 3)
1299 del x
1300 vereq(Counted.counter, 0)
1301
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001302 # Test cyclical leaks [SF bug 519621]
1303 class F(object):
1304 __slots__ = ['a', 'b']
1305 log = []
1306 s = F()
1307 s.a = [Counted(), s]
1308 vereq(Counted.counter, 1)
1309 s = None
1310 import gc
1311 gc.collect()
1312 vereq(Counted.counter, 0)
1313
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001314 # Test lookup leaks [SF bug 572567]
1315 import sys,gc
1316 class G(object):
1317 def __cmp__(self, other):
1318 return 0
1319 g = G()
1320 orig_objects = len(gc.get_objects())
1321 for i in xrange(10):
1322 g==g
1323 new_objects = len(gc.get_objects())
1324 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001325 class H(object):
1326 __slots__ = ['a', 'b']
1327 def __init__(self):
1328 self.a = 1
1329 self.b = 2
1330 def __del__(self):
1331 assert self.a == 1
1332 assert self.b == 2
1333
1334 save_stderr = sys.stderr
1335 sys.stderr = sys.stdout
1336 h = H()
1337 try:
1338 del h
1339 finally:
1340 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001341
Guido van Rossum8b056da2002-08-13 18:26:26 +00001342def slotspecials():
1343 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1344
1345 class D(object):
1346 __slots__ = ["__dict__"]
1347 a = D()
1348 verify(hasattr(a, "__dict__"))
1349 verify(not hasattr(a, "__weakref__"))
1350 a.foo = 42
1351 vereq(a.__dict__, {"foo": 42})
1352
1353 class W(object):
1354 __slots__ = ["__weakref__"]
1355 a = W()
1356 verify(hasattr(a, "__weakref__"))
1357 verify(not hasattr(a, "__dict__"))
1358 try:
1359 a.foo = 42
1360 except AttributeError:
1361 pass
1362 else:
1363 raise TestFailed, "shouldn't be allowed to set a.foo"
1364
1365 class C1(W, D):
1366 __slots__ = []
1367 a = C1()
1368 verify(hasattr(a, "__dict__"))
1369 verify(hasattr(a, "__weakref__"))
1370 a.foo = 42
1371 vereq(a.__dict__, {"foo": 42})
1372
1373 class C2(D, W):
1374 __slots__ = []
1375 a = C2()
1376 verify(hasattr(a, "__dict__"))
1377 verify(hasattr(a, "__weakref__"))
1378 a.foo = 42
1379 vereq(a.__dict__, {"foo": 42})
1380
Guido van Rossum9a818922002-11-14 19:50:14 +00001381# MRO order disagreement
1382#
1383# class C3(C1, C2):
1384# __slots__ = []
1385#
1386# class C4(C2, C1):
1387# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001388
Tim Peters6d6c1a32001-08-02 04:15:00 +00001389def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001390 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001391 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001392 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001393 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001394 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001395 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001396 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001397 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001398 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001399 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001400 vereq(E.foo, 1)
1401 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001402 # Test dynamic instances
1403 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001404 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001405 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001406 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001407 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001408 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001409 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001410 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001411 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001412 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001413 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001414 vereq(int(a), 100)
1415 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001416 verify(not hasattr(a, "spam"))
1417 def mygetattr(self, name):
1418 if name == "spam":
1419 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001420 raise AttributeError
1421 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001422 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001423 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001424 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001425 def mysetattr(self, name, value):
1426 if name == "spam":
1427 raise AttributeError
1428 return object.__setattr__(self, name, value)
1429 C.__setattr__ = mysetattr
1430 try:
1431 a.spam = "not spam"
1432 except AttributeError:
1433 pass
1434 else:
1435 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001436 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001437 class D(C):
1438 pass
1439 d = D()
1440 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001441 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001442
Guido van Rossum7e35d572001-09-15 03:14:32 +00001443 # Test handling of int*seq and seq*int
1444 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001445 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001446 vereq("a"*I(2), "aa")
1447 vereq(I(2)*"a", "aa")
1448 vereq(2*I(3), 6)
1449 vereq(I(3)*2, 6)
1450 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001451
1452 # Test handling of long*seq and seq*long
1453 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001454 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001455 vereq("a"*L(2L), "aa")
1456 vereq(L(2L)*"a", "aa")
1457 vereq(2*L(3), 6)
1458 vereq(L(3)*2, 6)
1459 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001460
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001461 # Test comparison of classes with dynamic metaclasses
1462 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001463 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001464 class someclass:
1465 __metaclass__ = dynamicmetaclass
1466 verify(someclass != object)
1467
Tim Peters6d6c1a32001-08-02 04:15:00 +00001468def errors():
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001469 if verbose: print "Testing errors..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001470
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001471 try:
1472 class C(list, dict):
1473 pass
1474 except TypeError:
1475 pass
1476 else:
1477 verify(0, "inheritance from both list and dict should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001478
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001479 try:
1480 class C(object, None):
1481 pass
1482 except TypeError:
1483 pass
1484 else:
1485 verify(0, "inheritance from non-type should be illegal")
1486 class Classic:
1487 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001488
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001489 try:
1490 class C(type(len)):
1491 pass
1492 except TypeError:
1493 pass
1494 else:
1495 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001496
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001497 try:
1498 class C(object):
1499 __slots__ = 1
1500 except TypeError:
1501 pass
1502 else:
1503 verify(0, "__slots__ = 1 should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001504
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001505 try:
1506 class C(object):
1507 __slots__ = [1]
1508 except TypeError:
1509 pass
1510 else:
1511 verify(0, "__slots__ = [1] should be illegal")
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001512
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001513 class M1(type):
1514 pass
1515 class M2(type):
1516 pass
1517 class A1(object):
1518 __metaclass__ = M1
1519 class A2(object):
1520 __metaclass__ = M2
1521 try:
1522 class B(A1, A2):
1523 pass
1524 except TypeError:
1525 pass
1526 else:
1527 verify(0, "finding the most derived metaclass should have failed")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001528
1529def classmethods():
1530 if verbose: print "Testing class methods..."
1531 class C(object):
1532 def foo(*a): return a
1533 goo = classmethod(foo)
1534 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001535 vereq(C.goo(1), (C, 1))
1536 vereq(c.goo(1), (C, 1))
1537 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001538 class D(C):
1539 pass
1540 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001541 vereq(D.goo(1), (D, 1))
1542 vereq(d.goo(1), (D, 1))
1543 vereq(d.foo(1), (d, 1))
1544 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001545 # Test for a specific crash (SF bug 528132)
1546 def f(cls, arg): return (cls, arg)
1547 ff = classmethod(f)
1548 vereq(ff.__get__(0, int)(42), (int, 42))
1549 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001550
Guido van Rossum155db9a2002-04-02 17:53:47 +00001551 # Test super() with classmethods (SF bug 535444)
1552 veris(C.goo.im_self, C)
1553 veris(D.goo.im_self, D)
1554 veris(super(D,D).goo.im_self, D)
1555 veris(super(D,d).goo.im_self, D)
1556 vereq(super(D,D).goo(), (D,))
1557 vereq(super(D,d).goo(), (D,))
1558
Raymond Hettingerbe971532003-06-18 01:13:41 +00001559 # Verify that argument is checked for callability (SF bug 753451)
1560 try:
1561 classmethod(1).__get__(1)
1562 except TypeError:
1563 pass
1564 else:
1565 raise TestFailed, "classmethod should check for callability"
1566
Georg Brandl6a29c322006-02-21 22:17:46 +00001567 # Verify that classmethod() doesn't allow keyword args
1568 try:
1569 classmethod(f, kw=1)
1570 except TypeError:
1571 pass
1572 else:
1573 raise TestFailed, "classmethod shouldn't accept keyword args"
1574
Fred Drakef841aa62002-03-28 15:49:54 +00001575def classmethods_in_c():
1576 if verbose: print "Testing C-based class methods..."
1577 import xxsubtype as spam
1578 a = (1, 2, 3)
1579 d = {'abc': 123}
1580 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001581 veris(x, spam.spamlist)
1582 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001583 vereq(d, d1)
1584 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001585 veris(x, spam.spamlist)
1586 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001587 vereq(d, d1)
1588
Tim Peters6d6c1a32001-08-02 04:15:00 +00001589def staticmethods():
1590 if verbose: print "Testing static methods..."
1591 class C(object):
1592 def foo(*a): return a
1593 goo = staticmethod(foo)
1594 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001595 vereq(C.goo(1), (1,))
1596 vereq(c.goo(1), (1,))
1597 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001598 class D(C):
1599 pass
1600 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001601 vereq(D.goo(1), (1,))
1602 vereq(d.goo(1), (1,))
1603 vereq(d.foo(1), (d, 1))
1604 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001605
Fred Drakef841aa62002-03-28 15:49:54 +00001606def staticmethods_in_c():
1607 if verbose: print "Testing C-based static methods..."
1608 import xxsubtype as spam
1609 a = (1, 2, 3)
1610 d = {"abc": 123}
1611 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1612 veris(x, None)
1613 vereq(a, a1)
1614 vereq(d, d1)
1615 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1616 veris(x, None)
1617 vereq(a, a1)
1618 vereq(d, d1)
1619
Tim Peters6d6c1a32001-08-02 04:15:00 +00001620def classic():
1621 if verbose: print "Testing classic classes..."
1622 class C:
1623 def foo(*a): return a
1624 goo = classmethod(foo)
1625 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001626 vereq(C.goo(1), (C, 1))
1627 vereq(c.goo(1), (C, 1))
1628 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001629 class D(C):
1630 pass
1631 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001632 vereq(D.goo(1), (D, 1))
1633 vereq(d.goo(1), (D, 1))
1634 vereq(d.foo(1), (d, 1))
1635 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001636 class E: # *not* subclassing from C
1637 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001638 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001639 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001640
1641def compattr():
1642 if verbose: print "Testing computed attributes..."
1643 class C(object):
1644 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001645 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001646 self.__get = get
1647 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001648 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001649 def __get__(self, obj, type=None):
1650 return self.__get(obj)
1651 def __set__(self, obj, value):
1652 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001653 def __delete__(self, obj):
1654 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001655 def __init__(self):
1656 self.__x = 0
1657 def __get_x(self):
1658 x = self.__x
1659 self.__x = x+1
1660 return x
1661 def __set_x(self, x):
1662 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001663 def __delete_x(self):
1664 del self.__x
1665 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001666 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(a.x, 0)
1668 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001669 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001670 vereq(a.x, 10)
1671 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001672 del a.x
1673 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001674
1675def newslot():
1676 if verbose: print "Testing __new__ slot override..."
1677 class C(list):
1678 def __new__(cls):
1679 self = list.__new__(cls)
1680 self.foo = 1
1681 return self
1682 def __init__(self):
1683 self.foo = self.foo + 2
1684 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001685 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001686 verify(a.__class__ is C)
1687 class D(C):
1688 pass
1689 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001690 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001691 verify(b.__class__ is D)
1692
Tim Peters6d6c1a32001-08-02 04:15:00 +00001693def altmro():
1694 if verbose: print "Testing mro() and overriding it..."
1695 class A(object):
1696 def f(self): return "A"
1697 class B(A):
1698 pass
1699 class C(A):
1700 def f(self): return "C"
1701 class D(B, C):
1702 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001703 vereq(D.mro(), [D, B, C, A, object])
1704 vereq(D.__mro__, (D, B, C, A, object))
1705 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001706
Guido van Rossumd3077402001-08-12 05:24:18 +00001707 class PerverseMetaType(type):
1708 def mro(cls):
1709 L = type.mro(cls)
1710 L.reverse()
1711 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001712 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001713 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001714 vereq(X.__mro__, (object, A, C, B, D, X))
1715 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001716
Armin Rigo037d1e02005-12-29 17:07:39 +00001717 try:
1718 class X(object):
1719 class __metaclass__(type):
1720 def mro(self):
1721 return [self, dict, object]
1722 except TypeError:
1723 pass
1724 else:
1725 raise TestFailed, "devious mro() return not caught"
1726
1727 try:
1728 class X(object):
1729 class __metaclass__(type):
1730 def mro(self):
1731 return [1]
1732 except TypeError:
1733 pass
1734 else:
1735 raise TestFailed, "non-class mro() return not caught"
1736
1737 try:
1738 class X(object):
1739 class __metaclass__(type):
1740 def mro(self):
1741 return 1
1742 except TypeError:
1743 pass
1744 else:
1745 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001746
Armin Rigo037d1e02005-12-29 17:07:39 +00001747
Tim Peters6d6c1a32001-08-02 04:15:00 +00001748def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001749 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001750
1751 class B(object):
1752 "Intermediate class because object doesn't have a __setattr__"
1753
1754 class C(B):
1755
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001756 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001757 if name == "foo":
1758 return ("getattr", name)
1759 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001760 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001761 def __setattr__(self, name, value):
1762 if name == "foo":
1763 self.setattr = (name, value)
1764 else:
1765 return B.__setattr__(self, name, value)
1766 def __delattr__(self, name):
1767 if name == "foo":
1768 self.delattr = name
1769 else:
1770 return B.__delattr__(self, name)
1771
1772 def __getitem__(self, key):
1773 return ("getitem", key)
1774 def __setitem__(self, key, value):
1775 self.setitem = (key, value)
1776 def __delitem__(self, key):
1777 self.delitem = key
1778
1779 def __getslice__(self, i, j):
1780 return ("getslice", i, j)
1781 def __setslice__(self, i, j, value):
1782 self.setslice = (i, j, value)
1783 def __delslice__(self, i, j):
1784 self.delslice = (i, j)
1785
1786 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001787 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001788 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001789 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001790 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001791 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001792
Guido van Rossum45704552001-10-08 16:35:45 +00001793 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001794 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001795 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001796 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001797 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001798
Guido van Rossum45704552001-10-08 16:35:45 +00001799 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001800 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001801 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001802 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001803 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001804
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001805def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001806 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001807 class C(object):
1808 def __init__(self, x):
1809 self.x = x
1810 def foo(self):
1811 return self.x
1812 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001814 class D(C):
1815 boo = C.foo
1816 goo = c1.foo
1817 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001818 vereq(d2.foo(), 2)
1819 vereq(d2.boo(), 2)
1820 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001821 class E(object):
1822 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001823 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001824 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001825
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001826def specials():
1827 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001828 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001829 # Test the default behavior for static classes
1830 class C(object):
1831 def __getitem__(self, i):
1832 if 0 <= i < 10: return i
1833 raise IndexError
1834 c1 = C()
1835 c2 = C()
1836 verify(not not c1)
Tim Peters85b362f2006-04-11 01:21:00 +00001837 verify(id(c1) != id(c2))
1838 hash(c1)
1839 hash(c2)
Guido van Rossum45704552001-10-08 16:35:45 +00001840 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1841 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001842 verify(c1 != c2)
1843 verify(not c1 != c1)
1844 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001845 # Note that the module name appears in str/repr, and that varies
1846 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001847 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001848 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001849 verify(-1 not in c1)
1850 for i in range(10):
1851 verify(i in c1)
1852 verify(10 not in c1)
1853 # Test the default behavior for dynamic classes
1854 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001855 def __getitem__(self, i):
1856 if 0 <= i < 10: return i
1857 raise IndexError
1858 d1 = D()
1859 d2 = D()
1860 verify(not not d1)
Tim Peters85b362f2006-04-11 01:21:00 +00001861 verify(id(d1) != id(d2))
1862 hash(d1)
1863 hash(d2)
Guido van Rossum45704552001-10-08 16:35:45 +00001864 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1865 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001866 verify(d1 != d2)
1867 verify(not d1 != d1)
1868 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001869 # Note that the module name appears in str/repr, and that varies
1870 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001871 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001872 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001873 verify(-1 not in d1)
1874 for i in range(10):
1875 verify(i in d1)
1876 verify(10 not in d1)
1877 # Test overridden behavior for static classes
1878 class Proxy(object):
1879 def __init__(self, x):
1880 self.x = x
1881 def __nonzero__(self):
1882 return not not self.x
1883 def __hash__(self):
1884 return hash(self.x)
1885 def __eq__(self, other):
1886 return self.x == other
1887 def __ne__(self, other):
1888 return self.x != other
1889 def __cmp__(self, other):
1890 return cmp(self.x, other.x)
1891 def __str__(self):
1892 return "Proxy:%s" % self.x
1893 def __repr__(self):
1894 return "Proxy(%r)" % self.x
1895 def __contains__(self, value):
1896 return value in self.x
1897 p0 = Proxy(0)
1898 p1 = Proxy(1)
1899 p_1 = Proxy(-1)
1900 verify(not p0)
1901 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001902 vereq(hash(p0), hash(0))
1903 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001904 verify(p0 != p1)
1905 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001906 vereq(not p0, p1)
1907 vereq(cmp(p0, p1), -1)
1908 vereq(cmp(p0, p0), 0)
1909 vereq(cmp(p0, p_1), 1)
1910 vereq(str(p0), "Proxy:0")
1911 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001912 p10 = Proxy(range(10))
1913 verify(-1 not in p10)
1914 for i in range(10):
1915 verify(i in p10)
1916 verify(10 not in p10)
1917 # Test overridden behavior for dynamic classes
1918 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001919 def __init__(self, x):
1920 self.x = x
1921 def __nonzero__(self):
1922 return not not self.x
1923 def __hash__(self):
1924 return hash(self.x)
1925 def __eq__(self, other):
1926 return self.x == other
1927 def __ne__(self, other):
1928 return self.x != other
1929 def __cmp__(self, other):
1930 return cmp(self.x, other.x)
1931 def __str__(self):
1932 return "DProxy:%s" % self.x
1933 def __repr__(self):
1934 return "DProxy(%r)" % self.x
1935 def __contains__(self, value):
1936 return value in self.x
1937 p0 = DProxy(0)
1938 p1 = DProxy(1)
1939 p_1 = DProxy(-1)
1940 verify(not p0)
1941 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001942 vereq(hash(p0), hash(0))
1943 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001944 verify(p0 != p1)
1945 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001946 vereq(not p0, p1)
1947 vereq(cmp(p0, p1), -1)
1948 vereq(cmp(p0, p0), 0)
1949 vereq(cmp(p0, p_1), 1)
1950 vereq(str(p0), "DProxy:0")
1951 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001952 p10 = DProxy(range(10))
1953 verify(-1 not in p10)
1954 for i in range(10):
1955 verify(i in p10)
1956 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001957 # Safety test for __cmp__
1958 def unsafecmp(a, b):
1959 try:
1960 a.__class__.__cmp__(a, b)
1961 except TypeError:
1962 pass
1963 else:
1964 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1965 a.__class__, a, b)
1966 unsafecmp(u"123", "123")
1967 unsafecmp("123", u"123")
1968 unsafecmp(1, 1.0)
1969 unsafecmp(1.0, 1)
1970 unsafecmp(1, 1L)
1971 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001972
Neal Norwitz1a997502003-01-13 20:13:12 +00001973 class Letter(str):
1974 def __new__(cls, letter):
1975 if letter == 'EPS':
1976 return str.__new__(cls)
1977 return str.__new__(cls, letter)
1978 def __str__(self):
1979 if not self:
1980 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001981 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001982
1983 # sys.stdout needs to be the original to trigger the recursion bug
1984 import sys
1985 test_stdout = sys.stdout
1986 sys.stdout = get_original_stdout()
1987 try:
1988 # nothing should actually be printed, this should raise an exception
1989 print Letter('w')
1990 except RuntimeError:
1991 pass
1992 else:
1993 raise TestFailed, "expected a RuntimeError for print recursion"
1994 sys.stdout = test_stdout
1995
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001996def weakrefs():
1997 if verbose: print "Testing weak references..."
1998 import weakref
1999 class C(object):
2000 pass
2001 c = C()
2002 r = weakref.ref(c)
2003 verify(r() is c)
2004 del c
2005 verify(r() is None)
2006 del r
2007 class NoWeak(object):
2008 __slots__ = ['foo']
2009 no = NoWeak()
2010 try:
2011 weakref.ref(no)
2012 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00002013 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002014 else:
2015 verify(0, "weakref.ref(no) should be illegal")
2016 class Weak(object):
2017 __slots__ = ['foo', '__weakref__']
2018 yes = Weak()
2019 r = weakref.ref(yes)
2020 verify(r() is yes)
2021 del yes
2022 verify(r() is None)
2023 del r
2024
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002025def properties():
2026 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002027 class C(object):
2028 def getx(self):
2029 return self.__x
2030 def setx(self, value):
2031 self.__x = value
2032 def delx(self):
2033 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00002034 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002035 a = C()
2036 verify(not hasattr(a, "x"))
2037 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00002038 vereq(a._C__x, 42)
2039 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002040 del a.x
2041 verify(not hasattr(a, "x"))
2042 verify(not hasattr(a, "_C__x"))
2043 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00002044 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00002045 C.x.__delete__(a)
2046 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002047
Tim Peters66c1a522001-09-24 21:17:50 +00002048 raw = C.__dict__['x']
2049 verify(isinstance(raw, property))
2050
2051 attrs = dir(raw)
2052 verify("__doc__" in attrs)
2053 verify("fget" in attrs)
2054 verify("fset" in attrs)
2055 verify("fdel" in attrs)
2056
Guido van Rossum45704552001-10-08 16:35:45 +00002057 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00002058 verify(raw.fget is C.__dict__['getx'])
2059 verify(raw.fset is C.__dict__['setx'])
2060 verify(raw.fdel is C.__dict__['delx'])
2061
2062 for attr in "__doc__", "fget", "fset", "fdel":
2063 try:
2064 setattr(raw, attr, 42)
2065 except TypeError, msg:
2066 if str(msg).find('readonly') < 0:
2067 raise TestFailed("when setting readonly attr %r on a "
2068 "property, got unexpected TypeError "
2069 "msg %r" % (attr, str(msg)))
2070 else:
2071 raise TestFailed("expected TypeError from trying to set "
2072 "readonly %r attr on a property" % attr)
2073
Neal Norwitz673cd822002-10-18 16:33:13 +00002074 class D(object):
2075 __getitem__ = property(lambda s: 1/0)
2076
2077 d = D()
2078 try:
2079 for i in d:
2080 str(i)
2081 except ZeroDivisionError:
2082 pass
2083 else:
2084 raise TestFailed, "expected ZeroDivisionError from bad property"
2085
Georg Brandl533ff6f2006-03-08 18:09:27 +00002086 class E(object):
2087 def getter(self):
2088 "getter method"
2089 return 0
2090 def setter(self, value):
2091 "setter method"
2092 pass
2093 prop = property(getter)
2094 vereq(prop.__doc__, "getter method")
2095 prop2 = property(fset=setter)
2096 vereq(prop2.__doc__, None)
2097
Georg Brandle9462c72006-08-04 18:03:37 +00002098 # this segfaulted in 2.5b2
2099 try:
2100 import _testcapi
2101 except ImportError:
2102 pass
2103 else:
2104 class X(object):
2105 p = property(_testcapi.test_with_docstring)
2106
2107
Guido van Rossumc4a18802001-08-24 16:55:27 +00002108def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00002109 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00002110
2111 class A(object):
2112 def meth(self, a):
2113 return "A(%r)" % a
2114
Guido van Rossum45704552001-10-08 16:35:45 +00002115 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002116
2117 class B(A):
2118 def __init__(self):
2119 self.__super = super(B, self)
2120 def meth(self, a):
2121 return "B(%r)" % a + self.__super.meth(a)
2122
Guido van Rossum45704552001-10-08 16:35:45 +00002123 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002124
2125 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002126 def meth(self, a):
2127 return "C(%r)" % a + self.__super.meth(a)
2128 C._C__super = super(C)
2129
Guido van Rossum45704552001-10-08 16:35:45 +00002130 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002131
2132 class D(C, B):
2133 def meth(self, a):
2134 return "D(%r)" % a + super(D, self).meth(a)
2135
Guido van Rossum5b443c62001-12-03 15:38:28 +00002136 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2137
2138 # Test for subclassing super
2139
2140 class mysuper(super):
2141 def __init__(self, *args):
2142 return super(mysuper, self).__init__(*args)
2143
2144 class E(D):
2145 def meth(self, a):
2146 return "E(%r)" % a + mysuper(E, self).meth(a)
2147
2148 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2149
2150 class F(E):
2151 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002152 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002153 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2154 F._F__super = mysuper(F)
2155
2156 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2157
2158 # Make sure certain errors are raised
2159
2160 try:
2161 super(D, 42)
2162 except TypeError:
2163 pass
2164 else:
2165 raise TestFailed, "shouldn't allow super(D, 42)"
2166
2167 try:
2168 super(D, C())
2169 except TypeError:
2170 pass
2171 else:
2172 raise TestFailed, "shouldn't allow super(D, C())"
2173
2174 try:
2175 super(D).__get__(12)
2176 except TypeError:
2177 pass
2178 else:
2179 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2180
2181 try:
2182 super(D).__get__(C())
2183 except TypeError:
2184 pass
2185 else:
2186 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002187
Guido van Rossuma4541a32003-04-16 20:02:22 +00002188 # Make sure data descriptors can be overridden and accessed via super
2189 # (new feature in Python 2.3)
2190
2191 class DDbase(object):
2192 def getx(self): return 42
2193 x = property(getx)
2194
2195 class DDsub(DDbase):
2196 def getx(self): return "hello"
2197 x = property(getx)
2198
2199 dd = DDsub()
2200 vereq(dd.x, "hello")
2201 vereq(super(DDsub, dd).x, 42)
2202
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002203 # Ensure that super() lookup of descriptor from classmethod
2204 # works (SF ID# 743627)
2205
2206 class Base(object):
2207 aProp = property(lambda self: "foo")
2208
2209 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002210 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002211 def test(klass):
2212 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002213
2214 veris(Sub.test(), Base.aProp)
2215
Georg Brandl5d59c092006-09-30 08:43:30 +00002216 # Verify that super() doesn't allow keyword args
2217 try:
2218 super(Base, kw=1)
2219 except TypeError:
2220 pass
2221 else:
2222 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002223
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002224def inherits():
2225 if verbose: print "Testing inheritance from basic types..."
2226
2227 class hexint(int):
2228 def __repr__(self):
2229 return hex(self)
2230 def __add__(self, other):
2231 return hexint(int.__add__(self, other))
2232 # (Note that overriding __radd__ doesn't work,
2233 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(repr(hexint(7) + 9), "0x10")
2235 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002236 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002237 vereq(a, 12345)
2238 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002239 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002240 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002241 verify((+a).__class__ is int)
2242 verify((a >> 0).__class__ is int)
2243 verify((a << 0).__class__ is int)
2244 verify((hexint(0) << 12).__class__ is int)
2245 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002246
2247 class octlong(long):
2248 __slots__ = []
2249 def __str__(self):
2250 s = oct(self)
2251 if s[-1] == 'L':
2252 s = s[:-1]
2253 return s
2254 def __add__(self, other):
2255 return self.__class__(super(octlong, self).__add__(other))
2256 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002257 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002258 # (Note that overriding __radd__ here only seems to work
2259 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002261 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(a, 12345L)
2263 vereq(long(a), 12345L)
2264 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002265 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002266 verify((+a).__class__ is long)
2267 verify((-a).__class__ is long)
2268 verify((-octlong(0)).__class__ is long)
2269 verify((a >> 0).__class__ is long)
2270 verify((a << 0).__class__ is long)
2271 verify((a - 0).__class__ is long)
2272 verify((a * 1).__class__ is long)
2273 verify((a ** 1).__class__ is long)
2274 verify((a // 1).__class__ is long)
2275 verify((1 * a).__class__ is long)
2276 verify((a | 0).__class__ is long)
2277 verify((a ^ 0).__class__ is long)
2278 verify((a & -1L).__class__ is long)
2279 verify((octlong(0) << 12).__class__ is long)
2280 verify((octlong(0) >> 12).__class__ is long)
2281 verify(abs(octlong(0)).__class__ is long)
2282
2283 # Because octlong overrides __add__, we can't check the absence of +0
2284 # optimizations using octlong.
2285 class longclone(long):
2286 pass
2287 a = longclone(1)
2288 verify((a + 0).__class__ is long)
2289 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002290
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002291 # Check that negative clones don't segfault
2292 a = longclone(-1)
2293 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002294 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002295
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002296 class precfloat(float):
2297 __slots__ = ['prec']
2298 def __init__(self, value=0.0, prec=12):
2299 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002300 def __repr__(self):
2301 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002302 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002303 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002304 vereq(a, 12345.0)
2305 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002306 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002307 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002308 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002309
Tim Peters2400fa42001-09-12 19:12:49 +00002310 class madcomplex(complex):
2311 def __repr__(self):
2312 return "%.17gj%+.17g" % (self.imag, self.real)
2313 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002314 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002315 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002316 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002317 vereq(a, base)
2318 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002319 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002320 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002321 vereq(repr(a), "4j-3")
2322 vereq(a, base)
2323 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002324 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002326 veris((+a).__class__, complex)
2327 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002328 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002329 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002330 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002331 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002332 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002333 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002334 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002335
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002336 class madtuple(tuple):
2337 _rev = None
2338 def rev(self):
2339 if self._rev is not None:
2340 return self._rev
2341 L = list(self)
2342 L.reverse()
2343 self._rev = self.__class__(L)
2344 return self._rev
2345 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002346 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2347 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2348 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002349 for i in range(512):
2350 t = madtuple(range(i))
2351 u = t.rev()
2352 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002353 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002354 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002356 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002358 verify(a[:].__class__ is tuple)
2359 verify((a * 1).__class__ is tuple)
2360 verify((a * 0).__class__ is tuple)
2361 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002362 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002363 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002364 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002365 verify((a + a).__class__ is tuple)
2366 verify((a * 0).__class__ is tuple)
2367 verify((a * 1).__class__ is tuple)
2368 verify((a * 2).__class__ is tuple)
2369 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002370
2371 class madstring(str):
2372 _rev = None
2373 def rev(self):
2374 if self._rev is not None:
2375 return self._rev
2376 L = list(self)
2377 L.reverse()
2378 self._rev = self.__class__("".join(L))
2379 return self._rev
2380 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002381 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2382 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2383 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002384 for i in range(256):
2385 s = madstring("".join(map(chr, range(i))))
2386 t = s.rev()
2387 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002388 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002389 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002390 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002391 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002392
Tim Peters8fa5dd02001-09-12 02:18:30 +00002393 base = "\x00" * 5
2394 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002395 vereq(s, base)
2396 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002397 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002398 vereq(hash(s), hash(base))
2399 vereq({s: 1}[base], 1)
2400 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002401 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002402 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002403 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002404 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002405 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002406 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002407 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002408 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002409 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002410 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002411 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002412 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002413 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002414 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002415 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002416 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002417 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002418 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002419 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002420 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002421 identitytab = ''.join([chr(i) for i in range(256)])
2422 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002423 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002424 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002425 vereq(s.translate(identitytab, "x"), base)
2426 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002427 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002428 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002429 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002430 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002431 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002432 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002433 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002434 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002435 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002436 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002437
Guido van Rossum91ee7982001-08-30 20:52:40 +00002438 class madunicode(unicode):
2439 _rev = None
2440 def rev(self):
2441 if self._rev is not None:
2442 return self._rev
2443 L = list(self)
2444 L.reverse()
2445 self._rev = self.__class__(u"".join(L))
2446 return self._rev
2447 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002448 vereq(u, u"ABCDEF")
2449 vereq(u.rev(), madunicode(u"FEDCBA"))
2450 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002451 base = u"12345"
2452 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002453 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002454 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002455 vereq(hash(u), hash(base))
2456 vereq({u: 1}[base], 1)
2457 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002458 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002459 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002460 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002461 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002462 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002463 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002464 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002465 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002466 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002467 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002468 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002469 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002470 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002471 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002472 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002473 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002474 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002475 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002476 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002477 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002478 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002479 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002480 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002481 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002482 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002483 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002484 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002485 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002486 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002487 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002488 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002489 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002490 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002491 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002492 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002493 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002494 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002495 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002496
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002497 class sublist(list):
2498 pass
2499 a = sublist(range(5))
2500 vereq(a, range(5))
2501 a.append("hello")
2502 vereq(a, range(5) + ["hello"])
2503 a[5] = 5
2504 vereq(a, range(6))
2505 a.extend(range(6, 20))
2506 vereq(a, range(20))
2507 a[-5:] = []
2508 vereq(a, range(15))
2509 del a[10:15]
2510 vereq(len(a), 10)
2511 vereq(a, range(10))
2512 vereq(list(a), range(10))
2513 vereq(a[0], 0)
2514 vereq(a[9], 9)
2515 vereq(a[-10], 0)
2516 vereq(a[-1], 9)
2517 vereq(a[:5], range(5))
2518
Tim Peters59c9a642001-09-13 05:38:56 +00002519 class CountedInput(file):
2520 """Counts lines read by self.readline().
2521
2522 self.lineno is the 0-based ordinal of the last line read, up to
2523 a maximum of one greater than the number of lines in the file.
2524
2525 self.ateof is true if and only if the final "" line has been read,
2526 at which point self.lineno stops incrementing, and further calls
2527 to readline() continue to return "".
2528 """
2529
2530 lineno = 0
2531 ateof = 0
2532 def readline(self):
2533 if self.ateof:
2534 return ""
2535 s = file.readline(self)
2536 # Next line works too.
2537 # s = super(CountedInput, self).readline()
2538 self.lineno += 1
2539 if s == "":
2540 self.ateof = 1
2541 return s
2542
Tim Peters561f8992001-09-13 19:36:36 +00002543 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002544 lines = ['a\n', 'b\n', 'c\n']
2545 try:
2546 f.writelines(lines)
2547 f.close()
2548 f = CountedInput(TESTFN)
2549 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2550 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002551 vereq(expected, got)
2552 vereq(f.lineno, i)
2553 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002554 f.close()
2555 finally:
2556 try:
2557 f.close()
2558 except:
2559 pass
2560 try:
2561 import os
2562 os.unlink(TESTFN)
2563 except:
2564 pass
2565
Tim Peters808b94e2001-09-13 19:33:07 +00002566def keywords():
2567 if verbose:
2568 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002569 vereq(int(x=1), 1)
2570 vereq(float(x=2), 2.0)
2571 vereq(long(x=3), 3L)
2572 vereq(complex(imag=42, real=666), complex(666, 42))
2573 vereq(str(object=500), '500')
2574 vereq(unicode(string='abc', errors='strict'), u'abc')
2575 vereq(tuple(sequence=range(3)), (0, 1, 2))
2576 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002577 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002578
2579 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002580 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002581 try:
2582 constructor(bogus_keyword_arg=1)
2583 except TypeError:
2584 pass
2585 else:
2586 raise TestFailed("expected TypeError from bogus keyword "
2587 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002588
Tim Peters8fa45672001-09-13 21:01:29 +00002589def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002590 # XXX This test is disabled because rexec is not deemed safe
2591 return
Tim Peters8fa45672001-09-13 21:01:29 +00002592 import rexec
2593 if verbose:
2594 print "Testing interaction with restricted execution ..."
2595
2596 sandbox = rexec.RExec()
2597
2598 code1 = """f = open(%r, 'w')""" % TESTFN
2599 code2 = """f = file(%r, 'w')""" % TESTFN
2600 code3 = """\
2601f = open(%r)
2602t = type(f) # a sneaky way to get the file() constructor
2603f.close()
2604f = t(%r, 'w') # rexec can't catch this by itself
2605""" % (TESTFN, TESTFN)
2606
2607 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2608 f.close()
2609
2610 try:
2611 for code in code1, code2, code3:
2612 try:
2613 sandbox.r_exec(code)
2614 except IOError, msg:
2615 if str(msg).find("restricted") >= 0:
2616 outcome = "OK"
2617 else:
2618 outcome = "got an exception, but not an expected one"
2619 else:
2620 outcome = "expected a restricted-execution exception"
2621
2622 if outcome != "OK":
2623 raise TestFailed("%s, in %r" % (outcome, code))
2624
2625 finally:
2626 try:
2627 import os
2628 os.unlink(TESTFN)
2629 except:
2630 pass
2631
Tim Peters0ab085c2001-09-14 00:25:33 +00002632def str_subclass_as_dict_key():
2633 if verbose:
2634 print "Testing a str subclass used as dict key .."
2635
2636 class cistr(str):
2637 """Sublcass of str that computes __eq__ case-insensitively.
2638
2639 Also computes a hash code of the string in canonical form.
2640 """
2641
2642 def __init__(self, value):
2643 self.canonical = value.lower()
2644 self.hashcode = hash(self.canonical)
2645
2646 def __eq__(self, other):
2647 if not isinstance(other, cistr):
2648 other = cistr(other)
2649 return self.canonical == other.canonical
2650
2651 def __hash__(self):
2652 return self.hashcode
2653
Guido van Rossum45704552001-10-08 16:35:45 +00002654 vereq(cistr('ABC'), 'abc')
2655 vereq('aBc', cistr('ABC'))
2656 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002657
2658 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002659 vereq(d[cistr('one')], 1)
2660 vereq(d[cistr('tWo')], 2)
2661 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002662 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002663 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002664
Guido van Rossumab3b0342001-09-18 20:38:53 +00002665def classic_comparisons():
2666 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002667 class classic:
2668 pass
2669 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002670 if verbose: print " (base = %s)" % base
2671 class C(base):
2672 def __init__(self, value):
2673 self.value = int(value)
2674 def __cmp__(self, other):
2675 if isinstance(other, C):
2676 return cmp(self.value, other.value)
2677 if isinstance(other, int) or isinstance(other, long):
2678 return cmp(self.value, other)
2679 return NotImplemented
2680 c1 = C(1)
2681 c2 = C(2)
2682 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002683 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002684 c = {1: c1, 2: c2, 3: c3}
2685 for x in 1, 2, 3:
2686 for y in 1, 2, 3:
2687 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2688 for op in "<", "<=", "==", "!=", ">", ">=":
2689 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2690 "x=%d, y=%d" % (x, y))
2691 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2692 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2693
Guido van Rossum0639f592001-09-18 21:06:04 +00002694def rich_comparisons():
2695 if verbose:
2696 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002697 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002698 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002699 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002700 vereq(z, 1+0j)
2701 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002702 class ZZ(complex):
2703 def __eq__(self, other):
2704 try:
2705 return abs(self - other) <= 1e-6
2706 except:
2707 return NotImplemented
2708 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002709 vereq(zz, 1+0j)
2710 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002711
Guido van Rossum0639f592001-09-18 21:06:04 +00002712 class classic:
2713 pass
2714 for base in (classic, int, object, list):
2715 if verbose: print " (base = %s)" % base
2716 class C(base):
2717 def __init__(self, value):
2718 self.value = int(value)
2719 def __cmp__(self, other):
2720 raise TestFailed, "shouldn't call __cmp__"
2721 def __eq__(self, other):
2722 if isinstance(other, C):
2723 return self.value == other.value
2724 if isinstance(other, int) or isinstance(other, long):
2725 return self.value == other
2726 return NotImplemented
2727 def __ne__(self, other):
2728 if isinstance(other, C):
2729 return self.value != other.value
2730 if isinstance(other, int) or isinstance(other, long):
2731 return self.value != other
2732 return NotImplemented
2733 def __lt__(self, other):
2734 if isinstance(other, C):
2735 return self.value < other.value
2736 if isinstance(other, int) or isinstance(other, long):
2737 return self.value < other
2738 return NotImplemented
2739 def __le__(self, other):
2740 if isinstance(other, C):
2741 return self.value <= other.value
2742 if isinstance(other, int) or isinstance(other, long):
2743 return self.value <= other
2744 return NotImplemented
2745 def __gt__(self, other):
2746 if isinstance(other, C):
2747 return self.value > other.value
2748 if isinstance(other, int) or isinstance(other, long):
2749 return self.value > other
2750 return NotImplemented
2751 def __ge__(self, other):
2752 if isinstance(other, C):
2753 return self.value >= other.value
2754 if isinstance(other, int) or isinstance(other, long):
2755 return self.value >= other
2756 return NotImplemented
2757 c1 = C(1)
2758 c2 = C(2)
2759 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002760 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002761 c = {1: c1, 2: c2, 3: c3}
2762 for x in 1, 2, 3:
2763 for y in 1, 2, 3:
2764 for op in "<", "<=", "==", "!=", ">", ">=":
2765 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2766 "x=%d, y=%d" % (x, y))
2767 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2768 "x=%d, y=%d" % (x, y))
2769 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2770 "x=%d, y=%d" % (x, y))
2771
Guido van Rossum1952e382001-09-19 01:25:16 +00002772def coercions():
2773 if verbose: print "Testing coercions..."
2774 class I(int): pass
2775 coerce(I(0), 0)
2776 coerce(0, I(0))
2777 class L(long): pass
2778 coerce(L(0), 0)
2779 coerce(L(0), 0L)
2780 coerce(0, L(0))
2781 coerce(0L, L(0))
2782 class F(float): pass
2783 coerce(F(0), 0)
2784 coerce(F(0), 0L)
2785 coerce(F(0), 0.)
2786 coerce(0, F(0))
2787 coerce(0L, F(0))
2788 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002789 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002790 coerce(C(0), 0)
2791 coerce(C(0), 0L)
2792 coerce(C(0), 0.)
2793 coerce(C(0), 0j)
2794 coerce(0, C(0))
2795 coerce(0L, C(0))
2796 coerce(0., C(0))
2797 coerce(0j, C(0))
2798
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002799def descrdoc():
2800 if verbose: print "Testing descriptor doc strings..."
2801 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002802 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002803 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002804 check(file.name, "file name") # member descriptor
2805
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002806def setclass():
2807 if verbose: print "Testing __class__ assignment..."
2808 class C(object): pass
2809 class D(object): pass
2810 class E(object): pass
2811 class F(D, E): pass
2812 for cls in C, D, E, F:
2813 for cls2 in C, D, E, F:
2814 x = cls()
2815 x.__class__ = cls2
2816 verify(x.__class__ is cls2)
2817 x.__class__ = cls
2818 verify(x.__class__ is cls)
2819 def cant(x, C):
2820 try:
2821 x.__class__ = C
2822 except TypeError:
2823 pass
2824 else:
2825 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002826 try:
2827 delattr(x, "__class__")
2828 except TypeError:
2829 pass
2830 else:
2831 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002832 cant(C(), list)
2833 cant(list(), C)
2834 cant(C(), 1)
2835 cant(C(), object)
2836 cant(object(), list)
2837 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002838 class Int(int): __slots__ = []
2839 cant(2, Int)
2840 cant(Int(), int)
2841 cant(True, int)
2842 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002843 o = object()
2844 cant(o, type(1))
2845 cant(o, type(None))
2846 del o
Žiga Seilnacht6f2d09c2007-03-16 11:59:38 +00002847 class G(object):
2848 __slots__ = ["a", "b"]
2849 class H(object):
2850 __slots__ = ["b", "a"]
2851 try:
2852 unicode
2853 except NameError:
2854 class I(object):
2855 __slots__ = ["a", "b"]
2856 else:
2857 class I(object):
2858 __slots__ = [unicode("a"), unicode("b")]
2859 class J(object):
2860 __slots__ = ["c", "b"]
2861 class K(object):
2862 __slots__ = ["a", "b", "d"]
2863 class L(H):
2864 __slots__ = ["e"]
2865 class M(I):
2866 __slots__ = ["e"]
2867 class N(J):
2868 __slots__ = ["__weakref__"]
2869 class P(J):
2870 __slots__ = ["__dict__"]
2871 class Q(J):
2872 pass
2873 class R(J):
2874 __slots__ = ["__dict__", "__weakref__"]
2875
2876 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2877 x = cls()
2878 x.a = 1
2879 x.__class__ = cls2
2880 verify(x.__class__ is cls2,
2881 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2882 vereq(x.a, 1)
2883 x.__class__ = cls
2884 verify(x.__class__ is cls,
2885 "assigning %r as __class__ for %r silently failed" % (cls, x))
2886 vereq(x.a, 1)
2887 for cls in G, J, K, L, M, N, P, R, list, Int:
2888 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2889 if cls is cls2:
2890 continue
2891 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002892
Guido van Rossum6661be32001-10-26 04:26:12 +00002893def setdict():
2894 if verbose: print "Testing __dict__ assignment..."
2895 class C(object): pass
2896 a = C()
2897 a.__dict__ = {'b': 1}
2898 vereq(a.b, 1)
2899 def cant(x, dict):
2900 try:
2901 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002902 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002903 pass
2904 else:
2905 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2906 cant(a, None)
2907 cant(a, [])
2908 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002909 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002910 # Classes don't allow __dict__ assignment
2911 cant(C, {})
2912
Guido van Rossum3926a632001-09-25 16:25:58 +00002913def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002914 if verbose:
2915 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002916 import pickle, cPickle
2917
2918 def sorteditems(d):
2919 L = d.items()
2920 L.sort()
2921 return L
2922
2923 global C
2924 class C(object):
2925 def __init__(self, a, b):
2926 super(C, self).__init__()
2927 self.a = a
2928 self.b = b
2929 def __repr__(self):
2930 return "C(%r, %r)" % (self.a, self.b)
2931
2932 global C1
2933 class C1(list):
2934 def __new__(cls, a, b):
2935 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002936 def __getnewargs__(self):
2937 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002938 def __init__(self, a, b):
2939 self.a = a
2940 self.b = b
2941 def __repr__(self):
2942 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2943
2944 global C2
2945 class C2(int):
2946 def __new__(cls, a, b, val=0):
2947 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002948 def __getnewargs__(self):
2949 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002950 def __init__(self, a, b, val=0):
2951 self.a = a
2952 self.b = b
2953 def __repr__(self):
2954 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2955
Guido van Rossum90c45142001-11-24 21:07:01 +00002956 global C3
2957 class C3(object):
2958 def __init__(self, foo):
2959 self.foo = foo
2960 def __getstate__(self):
2961 return self.foo
2962 def __setstate__(self, foo):
2963 self.foo = foo
2964
2965 global C4classic, C4
2966 class C4classic: # classic
2967 pass
2968 class C4(C4classic, object): # mixed inheritance
2969 pass
2970
Guido van Rossum3926a632001-09-25 16:25:58 +00002971 for p in pickle, cPickle:
2972 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002973 if verbose:
2974 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002975
2976 for cls in C, C1, C2:
2977 s = p.dumps(cls, bin)
2978 cls2 = p.loads(s)
2979 verify(cls2 is cls)
2980
2981 a = C1(1, 2); a.append(42); a.append(24)
2982 b = C2("hello", "world", 42)
2983 s = p.dumps((a, b), bin)
2984 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002985 vereq(x.__class__, a.__class__)
2986 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2987 vereq(y.__class__, b.__class__)
2988 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002989 vereq(repr(x), repr(a))
2990 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002991 if verbose:
2992 print "a = x =", a
2993 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002994 # Test for __getstate__ and __setstate__ on new style class
2995 u = C3(42)
2996 s = p.dumps(u, bin)
2997 v = p.loads(s)
2998 veris(u.__class__, v.__class__)
2999 vereq(u.foo, v.foo)
3000 # Test for picklability of hybrid class
3001 u = C4()
3002 u.foo = 42
3003 s = p.dumps(u, bin)
3004 v = p.loads(s)
3005 veris(u.__class__, v.__class__)
3006 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003007
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003008 # Testing copy.deepcopy()
3009 if verbose:
3010 print "deepcopy"
3011 import copy
3012 for cls in C, C1, C2:
3013 cls2 = copy.deepcopy(cls)
3014 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003015
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003016 a = C1(1, 2); a.append(42); a.append(24)
3017 b = C2("hello", "world", 42)
3018 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003019 vereq(x.__class__, a.__class__)
3020 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3021 vereq(y.__class__, b.__class__)
3022 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003023 vereq(repr(x), repr(a))
3024 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003025 if verbose:
3026 print "a = x =", a
3027 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003028
Guido van Rossum8c842552002-03-14 23:05:54 +00003029def pickleslots():
3030 if verbose: print "Testing pickling of classes with __slots__ ..."
3031 import pickle, cPickle
3032 # Pickling of classes with __slots__ but without __getstate__ should fail
3033 global B, C, D, E
3034 class B(object):
3035 pass
3036 for base in [object, B]:
3037 class C(base):
3038 __slots__ = ['a']
3039 class D(C):
3040 pass
3041 try:
3042 pickle.dumps(C())
3043 except TypeError:
3044 pass
3045 else:
3046 raise TestFailed, "should fail: pickle C instance - %s" % base
3047 try:
3048 cPickle.dumps(C())
3049 except TypeError:
3050 pass
3051 else:
3052 raise TestFailed, "should fail: cPickle C instance - %s" % base
3053 try:
3054 pickle.dumps(C())
3055 except TypeError:
3056 pass
3057 else:
3058 raise TestFailed, "should fail: pickle D instance - %s" % base
3059 try:
3060 cPickle.dumps(D())
3061 except TypeError:
3062 pass
3063 else:
3064 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003065 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003066 class C(base):
3067 __slots__ = ['a']
3068 def __getstate__(self):
3069 try:
3070 d = self.__dict__.copy()
3071 except AttributeError:
3072 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003073 for cls in self.__class__.__mro__:
3074 for sn in cls.__dict__.get('__slots__', ()):
3075 try:
3076 d[sn] = getattr(self, sn)
3077 except AttributeError:
3078 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003079 return d
3080 def __setstate__(self, d):
3081 for k, v in d.items():
3082 setattr(self, k, v)
3083 class D(C):
3084 pass
3085 # Now it should work
3086 x = C()
3087 y = pickle.loads(pickle.dumps(x))
3088 vereq(hasattr(y, 'a'), 0)
3089 y = cPickle.loads(cPickle.dumps(x))
3090 vereq(hasattr(y, 'a'), 0)
3091 x.a = 42
3092 y = pickle.loads(pickle.dumps(x))
3093 vereq(y.a, 42)
3094 y = cPickle.loads(cPickle.dumps(x))
3095 vereq(y.a, 42)
3096 x = D()
3097 x.a = 42
3098 x.b = 100
3099 y = pickle.loads(pickle.dumps(x))
3100 vereq(y.a + y.b, 142)
3101 y = cPickle.loads(cPickle.dumps(x))
3102 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003103 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003104 class E(C):
3105 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003106 x = E()
3107 x.a = 42
3108 x.b = "foo"
3109 y = pickle.loads(pickle.dumps(x))
3110 vereq(y.a, x.a)
3111 vereq(y.b, x.b)
3112 y = cPickle.loads(cPickle.dumps(x))
3113 vereq(y.a, x.a)
3114 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003115
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003116def copies():
3117 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
3118 import copy
3119 class C(object):
3120 pass
3121
3122 a = C()
3123 a.foo = 12
3124 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003125 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003126
3127 a.bar = [1,2,3]
3128 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003129 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003130 verify(c.bar is a.bar)
3131
3132 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003133 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003134 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003135 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003136
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003137def binopoverride():
3138 if verbose: print "Testing overrides of binary operations..."
3139 class I(int):
3140 def __repr__(self):
3141 return "I(%r)" % int(self)
3142 def __add__(self, other):
3143 return I(int(self) + int(other))
3144 __radd__ = __add__
3145 def __pow__(self, other, mod=None):
3146 if mod is None:
3147 return I(pow(int(self), int(other)))
3148 else:
3149 return I(pow(int(self), int(other), int(mod)))
3150 def __rpow__(self, other, mod=None):
3151 if mod is None:
3152 return I(pow(int(other), int(self), mod))
3153 else:
3154 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003155
Walter Dörwald70a6b492004-02-12 17:35:32 +00003156 vereq(repr(I(1) + I(2)), "I(3)")
3157 vereq(repr(I(1) + 2), "I(3)")
3158 vereq(repr(1 + I(2)), "I(3)")
3159 vereq(repr(I(2) ** I(3)), "I(8)")
3160 vereq(repr(2 ** I(3)), "I(8)")
3161 vereq(repr(I(2) ** 3), "I(8)")
3162 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003163 class S(str):
3164 def __eq__(self, other):
3165 return self.lower() == other.lower()
3166
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003167def subclasspropagation():
3168 if verbose: print "Testing propagation of slot functions to subclasses..."
3169 class A(object):
3170 pass
3171 class B(A):
3172 pass
3173 class C(A):
3174 pass
3175 class D(B, C):
3176 pass
3177 d = D()
Tim Peters171b8682006-04-11 01:59:34 +00003178 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003179 A.__hash__ = lambda self: 42
3180 vereq(hash(d), 42)
3181 C.__hash__ = lambda self: 314
3182 vereq(hash(d), 314)
3183 B.__hash__ = lambda self: 144
3184 vereq(hash(d), 144)
3185 D.__hash__ = lambda self: 100
3186 vereq(hash(d), 100)
3187 del D.__hash__
3188 vereq(hash(d), 144)
3189 del B.__hash__
3190 vereq(hash(d), 314)
3191 del C.__hash__
3192 vereq(hash(d), 42)
3193 del A.__hash__
Tim Peters171b8682006-04-11 01:59:34 +00003194 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003195 d.foo = 42
3196 d.bar = 42
3197 vereq(d.foo, 42)
3198 vereq(d.bar, 42)
3199 def __getattribute__(self, name):
3200 if name == "foo":
3201 return 24
3202 return object.__getattribute__(self, name)
3203 A.__getattribute__ = __getattribute__
3204 vereq(d.foo, 24)
3205 vereq(d.bar, 42)
3206 def __getattr__(self, name):
3207 if name in ("spam", "foo", "bar"):
3208 return "hello"
3209 raise AttributeError, name
3210 B.__getattr__ = __getattr__
3211 vereq(d.spam, "hello")
3212 vereq(d.foo, 24)
3213 vereq(d.bar, 42)
3214 del A.__getattribute__
3215 vereq(d.foo, 42)
3216 del d.foo
3217 vereq(d.foo, "hello")
3218 vereq(d.bar, 42)
3219 del B.__getattr__
3220 try:
3221 d.foo
3222 except AttributeError:
3223 pass
3224 else:
3225 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003226
Guido van Rossume7f3e242002-06-14 02:35:45 +00003227 # Test a nasty bug in recurse_down_subclasses()
3228 import gc
3229 class A(object):
3230 pass
3231 class B(A):
3232 pass
3233 del B
3234 gc.collect()
3235 A.__setitem__ = lambda *a: None # crash
3236
Tim Petersfc57ccb2001-10-12 02:38:24 +00003237def buffer_inherit():
3238 import binascii
3239 # SF bug [#470040] ParseTuple t# vs subclasses.
3240 if verbose:
3241 print "Testing that buffer interface is inherited ..."
3242
3243 class MyStr(str):
3244 pass
3245 base = 'abc'
3246 m = MyStr(base)
3247 # b2a_hex uses the buffer interface to get its argument's value, via
3248 # PyArg_ParseTuple 't#' code.
3249 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3250
3251 # It's not clear that unicode will continue to support the character
3252 # buffer interface, and this test will fail if that's taken away.
3253 class MyUni(unicode):
3254 pass
3255 base = u'abc'
3256 m = MyUni(base)
3257 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3258
3259 class MyInt(int):
3260 pass
3261 m = MyInt(42)
3262 try:
3263 binascii.b2a_hex(m)
3264 raise TestFailed('subclass of int should not have a buffer interface')
3265 except TypeError:
3266 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003267
Tim Petersc9933152001-10-16 20:18:24 +00003268def str_of_str_subclass():
3269 import binascii
3270 import cStringIO
3271
3272 if verbose:
3273 print "Testing __str__ defined in subclass of str ..."
3274
3275 class octetstring(str):
3276 def __str__(self):
3277 return binascii.b2a_hex(self)
3278 def __repr__(self):
3279 return self + " repr"
3280
3281 o = octetstring('A')
3282 vereq(type(o), octetstring)
3283 vereq(type(str(o)), str)
3284 vereq(type(repr(o)), str)
3285 vereq(ord(o), 0x41)
3286 vereq(str(o), '41')
3287 vereq(repr(o), 'A repr')
3288 vereq(o.__str__(), '41')
3289 vereq(o.__repr__(), 'A repr')
3290
3291 capture = cStringIO.StringIO()
3292 # Calling str() or not exercises different internal paths.
3293 print >> capture, o
3294 print >> capture, str(o)
3295 vereq(capture.getvalue(), '41\n41\n')
3296 capture.close()
3297
Guido van Rossumc8e56452001-10-22 00:43:43 +00003298def kwdargs():
3299 if verbose: print "Testing keyword arguments to __init__, __call__..."
3300 def f(a): return a
3301 vereq(f.__call__(a=42), 42)
3302 a = []
3303 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003304 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003305
Brett Cannon22565aa2006-06-09 22:31:23 +00003306def recursive__call__():
3307 if verbose: print ("Testing recursive __call__() by setting to instance of "
3308 "class ...")
3309 class A(object):
3310 pass
3311
3312 A.__call__ = A()
3313 try:
3314 A()()
3315 except RuntimeError:
3316 pass
3317 else:
3318 raise TestFailed("Recursion limit should have been reached for "
3319 "__call__()")
3320
Guido van Rossumed87ad82001-10-30 02:33:02 +00003321def delhook():
3322 if verbose: print "Testing __del__ hook..."
3323 log = []
3324 class C(object):
3325 def __del__(self):
3326 log.append(1)
3327 c = C()
3328 vereq(log, [])
3329 del c
3330 vereq(log, [1])
3331
Guido van Rossum29d26062001-12-11 04:37:34 +00003332 class D(object): pass
3333 d = D()
3334 try: del d[0]
3335 except TypeError: pass
3336 else: raise TestFailed, "invalid del() didn't raise TypeError"
3337
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003338def hashinherit():
3339 if verbose: print "Testing hash of mutable subclasses..."
3340
3341 class mydict(dict):
3342 pass
3343 d = mydict()
3344 try:
3345 hash(d)
3346 except TypeError:
3347 pass
3348 else:
3349 raise TestFailed, "hash() of dict subclass should fail"
3350
3351 class mylist(list):
3352 pass
3353 d = mylist()
3354 try:
3355 hash(d)
3356 except TypeError:
3357 pass
3358 else:
3359 raise TestFailed, "hash() of list subclass should fail"
3360
Guido van Rossum29d26062001-12-11 04:37:34 +00003361def strops():
3362 try: 'a' + 5
3363 except TypeError: pass
3364 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3365
3366 try: ''.split('')
3367 except ValueError: pass
3368 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3369
3370 try: ''.join([0])
3371 except TypeError: pass
3372 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3373
3374 try: ''.rindex('5')
3375 except ValueError: pass
3376 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3377
Guido van Rossum29d26062001-12-11 04:37:34 +00003378 try: '%(n)s' % None
3379 except TypeError: pass
3380 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3381
3382 try: '%(n' % {}
3383 except ValueError: pass
3384 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3385
3386 try: '%*s' % ('abc')
3387 except TypeError: pass
3388 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3389
3390 try: '%*.*s' % ('abc', 5)
3391 except TypeError: pass
3392 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3393
3394 try: '%s' % (1, 2)
3395 except TypeError: pass
3396 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3397
3398 try: '%' % None
3399 except ValueError: pass
3400 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3401
3402 vereq('534253'.isdigit(), 1)
3403 vereq('534253x'.isdigit(), 0)
3404 vereq('%c' % 5, '\x05')
3405 vereq('%c' % '5', '5')
3406
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003407def deepcopyrecursive():
3408 if verbose: print "Testing deepcopy of recursive objects..."
3409 class Node:
3410 pass
3411 a = Node()
3412 b = Node()
3413 a.b = b
3414 b.a = a
3415 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003416
Guido van Rossumd7035672002-03-12 20:43:31 +00003417def modules():
3418 if verbose: print "Testing uninitialized module objects..."
3419 from types import ModuleType as M
3420 m = M.__new__(M)
3421 str(m)
3422 vereq(hasattr(m, "__name__"), 0)
3423 vereq(hasattr(m, "__file__"), 0)
3424 vereq(hasattr(m, "foo"), 0)
3425 vereq(m.__dict__, None)
3426 m.foo = 1
3427 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003428
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003429def dictproxyiterkeys():
3430 class C(object):
3431 def meth(self):
3432 pass
3433 if verbose: print "Testing dict-proxy iterkeys..."
3434 keys = [ key for key in C.__dict__.iterkeys() ]
3435 keys.sort()
3436 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3437
3438def dictproxyitervalues():
3439 class C(object):
3440 def meth(self):
3441 pass
3442 if verbose: print "Testing dict-proxy itervalues..."
3443 values = [ values for values in C.__dict__.itervalues() ]
3444 vereq(len(values), 5)
3445
3446def dictproxyiteritems():
3447 class C(object):
3448 def meth(self):
3449 pass
3450 if verbose: print "Testing dict-proxy iteritems..."
3451 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3452 keys.sort()
3453 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3454
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003455def funnynew():
3456 if verbose: print "Testing __new__ returning something unexpected..."
3457 class C(object):
3458 def __new__(cls, arg):
3459 if isinstance(arg, str): return [1, 2, 3]
3460 elif isinstance(arg, int): return object.__new__(D)
3461 else: return object.__new__(cls)
3462 class D(C):
3463 def __init__(self, arg):
3464 self.foo = arg
3465 vereq(C("1"), [1, 2, 3])
3466 vereq(D("1"), [1, 2, 3])
3467 d = D(None)
3468 veris(d.foo, None)
3469 d = C(1)
3470 vereq(isinstance(d, D), True)
3471 vereq(d.foo, 1)
3472 d = D(1)
3473 vereq(isinstance(d, D), True)
3474 vereq(d.foo, 1)
3475
Guido van Rossume8fc6402002-04-16 16:44:51 +00003476def imulbug():
3477 # SF bug 544647
3478 if verbose: print "Testing for __imul__ problems..."
3479 class C(object):
3480 def __imul__(self, other):
3481 return (self, other)
3482 x = C()
3483 y = x
3484 y *= 1.0
3485 vereq(y, (x, 1.0))
3486 y = x
3487 y *= 2
3488 vereq(y, (x, 2))
3489 y = x
3490 y *= 3L
3491 vereq(y, (x, 3L))
3492 y = x
3493 y *= 1L<<100
3494 vereq(y, (x, 1L<<100))
3495 y = x
3496 y *= None
3497 vereq(y, (x, None))
3498 y = x
3499 y *= "foo"
3500 vereq(y, (x, "foo"))
3501
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003502def docdescriptor():
3503 # SF bug 542984
3504 if verbose: print "Testing __doc__ descriptor..."
3505 class DocDescr(object):
3506 def __get__(self, object, otype):
3507 if object:
3508 object = object.__class__.__name__ + ' instance'
3509 if otype:
3510 otype = otype.__name__
3511 return 'object=%s; type=%s' % (object, otype)
3512 class OldClass:
3513 __doc__ = DocDescr()
3514 class NewClass(object):
3515 __doc__ = DocDescr()
3516 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3517 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3518 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3519 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3520
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003521def copy_setstate():
3522 if verbose:
3523 print "Testing that copy.*copy() correctly uses __setstate__..."
3524 import copy
3525 class C(object):
3526 def __init__(self, foo=None):
3527 self.foo = foo
3528 self.__foo = foo
3529 def setfoo(self, foo=None):
3530 self.foo = foo
3531 def getfoo(self):
3532 return self.__foo
3533 def __getstate__(self):
3534 return [self.foo]
3535 def __setstate__(self, lst):
3536 assert len(lst) == 1
3537 self.__foo = self.foo = lst[0]
3538 a = C(42)
3539 a.setfoo(24)
3540 vereq(a.foo, 24)
3541 vereq(a.getfoo(), 42)
3542 b = copy.copy(a)
3543 vereq(b.foo, 24)
3544 vereq(b.getfoo(), 24)
3545 b = copy.deepcopy(a)
3546 vereq(b.foo, 24)
3547 vereq(b.getfoo(), 24)
3548
Guido van Rossum09638c12002-06-13 19:17:46 +00003549def slices():
3550 if verbose:
3551 print "Testing cases with slices and overridden __getitem__ ..."
3552 # Strings
3553 vereq("hello"[:4], "hell")
3554 vereq("hello"[slice(4)], "hell")
3555 vereq(str.__getitem__("hello", slice(4)), "hell")
3556 class S(str):
3557 def __getitem__(self, x):
3558 return str.__getitem__(self, x)
3559 vereq(S("hello")[:4], "hell")
3560 vereq(S("hello")[slice(4)], "hell")
3561 vereq(S("hello").__getitem__(slice(4)), "hell")
3562 # Tuples
3563 vereq((1,2,3)[:2], (1,2))
3564 vereq((1,2,3)[slice(2)], (1,2))
3565 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3566 class T(tuple):
3567 def __getitem__(self, x):
3568 return tuple.__getitem__(self, x)
3569 vereq(T((1,2,3))[:2], (1,2))
3570 vereq(T((1,2,3))[slice(2)], (1,2))
3571 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3572 # Lists
3573 vereq([1,2,3][:2], [1,2])
3574 vereq([1,2,3][slice(2)], [1,2])
3575 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3576 class L(list):
3577 def __getitem__(self, x):
3578 return list.__getitem__(self, x)
3579 vereq(L([1,2,3])[:2], [1,2])
3580 vereq(L([1,2,3])[slice(2)], [1,2])
3581 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3582 # Now do lists and __setitem__
3583 a = L([1,2,3])
3584 a[slice(1, 3)] = [3,2]
3585 vereq(a, [1,3,2])
3586 a[slice(0, 2, 1)] = [3,1]
3587 vereq(a, [3,1,2])
3588 a.__setitem__(slice(1, 3), [2,1])
3589 vereq(a, [3,2,1])
3590 a.__setitem__(slice(0, 2, 1), [2,3])
3591 vereq(a, [2,3,1])
3592
Tim Peters2484aae2002-07-11 06:56:07 +00003593def subtype_resurrection():
3594 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003595 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003596
3597 class C(object):
3598 container = []
3599
3600 def __del__(self):
3601 # resurrect the instance
3602 C.container.append(self)
3603
3604 c = C()
3605 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003606 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003607 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003608 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003609
3610 # If that didn't blow up, it's also interesting to see whether clearing
3611 # the last container slot works: that will attempt to delete c again,
3612 # which will cause c to get appended back to the container again "during"
3613 # the del.
3614 del C.container[-1]
3615 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003616 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003617
Tim Peters14cb1e12002-07-11 18:26:21 +00003618 # Make c mortal again, so that the test framework with -l doesn't report
3619 # it as a leak.
3620 del C.__del__
3621
Guido van Rossum2d702462002-08-06 21:28:28 +00003622def slottrash():
3623 # Deallocating deeply nested slotted trash caused stack overflows
3624 if verbose:
3625 print "Testing slot trash..."
3626 class trash(object):
3627 __slots__ = ['x']
3628 def __init__(self, x):
3629 self.x = x
3630 o = None
3631 for i in xrange(50000):
3632 o = trash(o)
3633 del o
3634
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003635def slotmultipleinheritance():
3636 # SF bug 575229, multiple inheritance w/ slots dumps core
3637 class A(object):
3638 __slots__=()
3639 class B(object):
3640 pass
3641 class C(A,B) :
3642 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003643 vereq(C.__basicsize__, B.__basicsize__)
3644 verify(hasattr(C, '__dict__'))
3645 verify(hasattr(C, '__weakref__'))
3646 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003647
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003648def testrmul():
3649 # SF patch 592646
3650 if verbose:
3651 print "Testing correct invocation of __rmul__..."
3652 class C(object):
3653 def __mul__(self, other):
3654 return "mul"
3655 def __rmul__(self, other):
3656 return "rmul"
3657 a = C()
3658 vereq(a*2, "mul")
3659 vereq(a*2.2, "mul")
3660 vereq(2*a, "rmul")
3661 vereq(2.2*a, "rmul")
3662
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003663def testipow():
3664 # [SF bug 620179]
3665 if verbose:
3666 print "Testing correct invocation of __ipow__..."
3667 class C(object):
3668 def __ipow__(self, other):
3669 pass
3670 a = C()
3671 a **= 2
3672
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003673def do_this_first():
3674 if verbose:
3675 print "Testing SF bug 551412 ..."
3676 # This dumps core when SF bug 551412 isn't fixed --
3677 # but only when test_descr.py is run separately.
3678 # (That can't be helped -- as soon as PyType_Ready()
3679 # is called for PyLong_Type, the bug is gone.)
3680 class UserLong(object):
3681 def __pow__(self, *args):
3682 pass
3683 try:
3684 pow(0L, UserLong(), 0L)
3685 except:
3686 pass
3687
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003688 if verbose:
3689 print "Testing SF bug 570483..."
3690 # Another segfault only when run early
3691 # (before PyType_Ready(tuple) is called)
3692 type.mro(tuple)
3693
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003694def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003695 if verbose:
3696 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003697 # stuff that should work:
3698 class C(object):
3699 pass
3700 class C2(object):
3701 def __getattribute__(self, attr):
3702 if attr == 'a':
3703 return 2
3704 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003705 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003706 def meth(self):
3707 return 1
3708 class D(C):
3709 pass
3710 class E(D):
3711 pass
3712 d = D()
3713 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003714 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003715 D.__bases__ = (C2,)
3716 vereq(d.meth(), 1)
3717 vereq(e.meth(), 1)
3718 vereq(d.a, 2)
3719 vereq(e.a, 2)
3720 vereq(C2.__subclasses__(), [D])
3721
3722 # stuff that shouldn't:
3723 class L(list):
3724 pass
3725
3726 try:
3727 L.__bases__ = (dict,)
3728 except TypeError:
3729 pass
3730 else:
3731 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3732
3733 try:
3734 list.__bases__ = (dict,)
3735 except TypeError:
3736 pass
3737 else:
3738 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3739
3740 try:
Michael W. Hudsonf3904422006-11-23 13:54:04 +00003741 D.__bases__ = (C2, list)
3742 except TypeError:
3743 pass
3744 else:
3745 assert 0, "best_base calculation found wanting"
3746
3747 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003748 del D.__bases__
3749 except TypeError:
3750 pass
3751 else:
3752 raise TestFailed, "shouldn't be able to delete .__bases__"
3753
3754 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003755 D.__bases__ = ()
3756 except TypeError, msg:
3757 if str(msg) == "a new-style class can't have only classic bases":
3758 raise TestFailed, "wrong error message for .__bases__ = ()"
3759 else:
3760 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3761
3762 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003763 D.__bases__ = (D,)
3764 except TypeError:
3765 pass
3766 else:
3767 # actually, we'll have crashed by here...
3768 raise TestFailed, "shouldn't be able to create inheritance cycles"
3769
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003770 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003771 D.__bases__ = (C, C)
3772 except TypeError:
3773 pass
3774 else:
3775 raise TestFailed, "didn't detect repeated base classes"
3776
3777 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003778 D.__bases__ = (E,)
3779 except TypeError:
3780 pass
3781 else:
3782 raise TestFailed, "shouldn't be able to create inheritance cycles"
3783
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003784 # let's throw a classic class into the mix:
3785 class Classic:
3786 def meth2(self):
3787 return 3
3788
3789 D.__bases__ = (C, Classic)
3790
3791 vereq(d.meth2(), 3)
3792 vereq(e.meth2(), 3)
3793 try:
3794 d.a
3795 except AttributeError:
3796 pass
3797 else:
3798 raise TestFailed, "attribute should have vanished"
3799
3800 try:
3801 D.__bases__ = (Classic,)
3802 except TypeError:
3803 pass
3804 else:
3805 raise TestFailed, "new-style class must have a new-style base"
3806
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003807def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003808 if verbose:
3809 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003810 class WorkOnce(type):
3811 def __new__(self, name, bases, ns):
3812 self.flag = 0
3813 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3814 def mro(self):
3815 if self.flag > 0:
3816 raise RuntimeError, "bozo"
3817 else:
3818 self.flag += 1
3819 return type.mro(self)
3820
3821 class WorkAlways(type):
3822 def mro(self):
3823 # this is here to make sure that .mro()s aren't called
3824 # with an exception set (which was possible at one point).
3825 # An error message will be printed in a debug build.
3826 # What's a good way to test for this?
3827 return type.mro(self)
3828
3829 class C(object):
3830 pass
3831
3832 class C2(object):
3833 pass
3834
3835 class D(C):
3836 pass
3837
3838 class E(D):
3839 pass
3840
3841 class F(D):
3842 __metaclass__ = WorkOnce
3843
3844 class G(D):
3845 __metaclass__ = WorkAlways
3846
3847 # Immediate subclasses have their mro's adjusted in alphabetical
3848 # order, so E's will get adjusted before adjusting F's fails. We
3849 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003850
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003851 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003852 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003853
3854 try:
3855 D.__bases__ = (C2,)
3856 except RuntimeError:
3857 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003858 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003859 else:
3860 raise TestFailed, "exception not propagated"
3861
3862def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003863 if verbose:
3864 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003865 class A(object):
3866 pass
3867
3868 class B(object):
3869 pass
3870
3871 class C(A, B):
3872 pass
3873
3874 class D(A, B):
3875 pass
3876
3877 class E(C, D):
3878 pass
3879
3880 try:
3881 C.__bases__ = (B, A)
3882 except TypeError:
3883 pass
3884 else:
3885 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003886
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003887def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003888 if verbose:
3889 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003890 class C(object):
3891 pass
3892
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003893 # C.__module__ could be 'test_descr' or '__main__'
3894 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003895
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003896 C.__name__ = 'D'
3897 vereq((C.__module__, C.__name__), (mod, 'D'))
3898
3899 C.__name__ = 'D.E'
3900 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003901
Guido van Rossum613f24f2003-01-06 23:00:59 +00003902def subclass_right_op():
3903 if verbose:
3904 print "Testing correct dispatch of subclass overloading __r<op>__..."
3905
3906 # This code tests various cases where right-dispatch of a subclass
3907 # should be preferred over left-dispatch of a base class.
3908
3909 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3910
3911 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003912 def __floordiv__(self, other):
3913 return "B.__floordiv__"
3914 def __rfloordiv__(self, other):
3915 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003916
Guido van Rossumf389c772003-02-27 20:04:19 +00003917 vereq(B(1) // 1, "B.__floordiv__")
3918 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003919
3920 # Case 2: subclass of object; this is just the baseline for case 3
3921
3922 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003923 def __floordiv__(self, other):
3924 return "C.__floordiv__"
3925 def __rfloordiv__(self, other):
3926 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003927
Guido van Rossumf389c772003-02-27 20:04:19 +00003928 vereq(C() // 1, "C.__floordiv__")
3929 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003930
3931 # Case 3: subclass of new-style class; here it gets interesting
3932
3933 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003934 def __floordiv__(self, other):
3935 return "D.__floordiv__"
3936 def __rfloordiv__(self, other):
3937 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003938
Guido van Rossumf389c772003-02-27 20:04:19 +00003939 vereq(D() // C(), "D.__floordiv__")
3940 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003941
3942 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3943
3944 class E(C):
3945 pass
3946
Guido van Rossumf389c772003-02-27 20:04:19 +00003947 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003948
Guido van Rossumf389c772003-02-27 20:04:19 +00003949 vereq(E() // 1, "C.__floordiv__")
3950 vereq(1 // E(), "C.__rfloordiv__")
3951 vereq(E() // C(), "C.__floordiv__")
3952 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003953
Guido van Rossum373c7412003-01-07 13:41:37 +00003954def dict_type_with_metaclass():
3955 if verbose:
3956 print "Testing type of __dict__ when __metaclass__ set..."
3957
3958 class B(object):
3959 pass
3960 class M(type):
3961 pass
3962 class C:
3963 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3964 __metaclass__ = M
3965 veris(type(C.__dict__), type(B.__dict__))
3966
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003967def meth_class_get():
3968 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003969 if verbose:
3970 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003971 # Baseline
3972 arg = [1, 2, 3]
3973 res = {1: None, 2: None, 3: None}
3974 vereq(dict.fromkeys(arg), res)
3975 vereq({}.fromkeys(arg), res)
3976 # Now get the descriptor
3977 descr = dict.__dict__["fromkeys"]
3978 # More baseline using the descriptor directly
3979 vereq(descr.__get__(None, dict)(arg), res)
3980 vereq(descr.__get__({})(arg), res)
3981 # Now check various error cases
3982 try:
3983 descr.__get__(None, None)
3984 except TypeError:
3985 pass
3986 else:
3987 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3988 try:
3989 descr.__get__(42)
3990 except TypeError:
3991 pass
3992 else:
3993 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3994 try:
3995 descr.__get__(None, 42)
3996 except TypeError:
3997 pass
3998 else:
3999 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
4000 try:
4001 descr.__get__(None, int)
4002 except TypeError:
4003 pass
4004 else:
4005 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
4006
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004007def isinst_isclass():
4008 if verbose:
4009 print "Testing proxy isinstance() and isclass()..."
4010 class Proxy(object):
4011 def __init__(self, obj):
4012 self.__obj = obj
4013 def __getattribute__(self, name):
4014 if name.startswith("_Proxy__"):
4015 return object.__getattribute__(self, name)
4016 else:
4017 return getattr(self.__obj, name)
4018 # Test with a classic class
4019 class C:
4020 pass
4021 a = C()
4022 pa = Proxy(a)
4023 verify(isinstance(a, C)) # Baseline
4024 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004025 # Test with a classic subclass
4026 class D(C):
4027 pass
4028 a = D()
4029 pa = Proxy(a)
4030 verify(isinstance(a, C)) # Baseline
4031 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004032 # Test with a new-style class
4033 class C(object):
4034 pass
4035 a = C()
4036 pa = Proxy(a)
4037 verify(isinstance(a, C)) # Baseline
4038 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004039 # Test with a new-style subclass
4040 class D(C):
4041 pass
4042 a = D()
4043 pa = Proxy(a)
4044 verify(isinstance(a, C)) # Baseline
4045 verify(isinstance(pa, C)) # Test
4046
4047def proxysuper():
4048 if verbose:
4049 print "Testing super() for a proxy object..."
4050 class Proxy(object):
4051 def __init__(self, obj):
4052 self.__obj = obj
4053 def __getattribute__(self, name):
4054 if name.startswith("_Proxy__"):
4055 return object.__getattribute__(self, name)
4056 else:
4057 return getattr(self.__obj, name)
4058
4059 class B(object):
4060 def f(self):
4061 return "B.f"
4062
4063 class C(B):
4064 def f(self):
4065 return super(C, self).f() + "->C.f"
4066
4067 obj = C()
4068 p = Proxy(obj)
4069 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004070
Guido van Rossum52b27052003-04-15 20:05:10 +00004071def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004072 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00004073 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004074 try:
4075 object.__setattr__(str, "foo", 42)
4076 except TypeError:
4077 pass
4078 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004079 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004080 try:
4081 object.__delattr__(str, "lower")
4082 except TypeError:
4083 pass
4084 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004085 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004086
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004087def weakref_segfault():
4088 # SF 742911
4089 if verbose:
4090 print "Testing weakref segfault..."
4091
4092 import weakref
4093
4094 class Provoker:
4095 def __init__(self, referrent):
4096 self.ref = weakref.ref(referrent)
4097
4098 def __del__(self):
4099 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004100
4101 class Oops(object):
4102 pass
4103
4104 o = Oops()
4105 o.whatever = Provoker(o)
4106 del o
4107
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004108def wrapper_segfault():
4109 # SF 927248: deeply nested wrappers could cause stack overflow
4110 f = lambda:None
4111 for i in xrange(1000000):
4112 f = f.__call__
4113 f = None
4114
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004115# Fix SF #762455, segfault when sys.stdout is changed in getattr
4116def filefault():
4117 if verbose:
4118 print "Testing sys.stdout is changed in getattr..."
4119 import sys
4120 class StdoutGuard:
4121 def __getattr__(self, attr):
4122 sys.stdout = sys.__stdout__
4123 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4124 sys.stdout = StdoutGuard()
4125 try:
4126 print "Oops!"
4127 except RuntimeError:
4128 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004129
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004130def vicious_descriptor_nonsense():
4131 # A potential segfault spotted by Thomas Wouters in mail to
4132 # python-dev 2003-04-17, turned into an example & fixed by Michael
4133 # Hudson just less than four months later...
4134 if verbose:
4135 print "Testing vicious_descriptor_nonsense..."
4136
4137 class Evil(object):
4138 def __hash__(self):
4139 return hash('attr')
4140 def __eq__(self, other):
4141 del C.attr
4142 return 0
4143
4144 class Descr(object):
4145 def __get__(self, ob, type=None):
4146 return 1
4147
4148 class C(object):
4149 attr = Descr()
4150
4151 c = C()
4152 c.__dict__[Evil()] = 0
4153
4154 vereq(c.attr, 1)
4155 # this makes a crash more likely:
4156 import gc; gc.collect()
4157 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004158
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004159def test_init():
4160 # SF 1155938
4161 class Foo(object):
4162 def __init__(self):
4163 return 10
4164 try:
4165 Foo()
4166 except TypeError:
4167 pass
4168 else:
4169 raise TestFailed, "did not test __init__() for None return"
4170
Armin Rigoc6686b72005-11-07 08:38:00 +00004171def methodwrapper():
4172 # <type 'method-wrapper'> did not support any reflection before 2.5
4173 if verbose:
4174 print "Testing method-wrapper objects..."
4175
4176 l = []
4177 vereq(l.__add__, l.__add__)
Armin Rigofd01d792006-06-08 10:56:24 +00004178 vereq(l.__add__, [].__add__)
4179 verify(l.__add__ != [5].__add__)
4180 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004181 verify(l.__add__.__name__ == '__add__')
4182 verify(l.__add__.__self__ is l)
4183 verify(l.__add__.__objclass__ is list)
4184 vereq(l.__add__.__doc__, list.__add__.__doc__)
Armin Rigofd01d792006-06-08 10:56:24 +00004185 try:
4186 hash(l.__add__)
4187 except TypeError:
4188 pass
4189 else:
4190 raise TestFailed("no TypeError from hash([].__add__)")
4191
4192 t = ()
4193 t += (7,)
4194 vereq(t.__add__, (7,).__add__)
4195 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004196
Armin Rigofd163f92005-12-29 15:59:19 +00004197def notimplemented():
4198 # all binary methods should be able to return a NotImplemented
4199 if verbose:
4200 print "Testing NotImplemented..."
4201
4202 import sys
4203 import types
4204 import operator
4205
4206 def specialmethod(self, other):
4207 return NotImplemented
4208
4209 def check(expr, x, y):
4210 try:
4211 exec expr in {'x': x, 'y': y, 'operator': operator}
4212 except TypeError:
4213 pass
4214 else:
4215 raise TestFailed("no TypeError from %r" % (expr,))
4216
4217 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
4218 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4219 # ValueErrors instead of TypeErrors
4220 for metaclass in [type, types.ClassType]:
4221 for name, expr, iexpr in [
4222 ('__add__', 'x + y', 'x += y'),
4223 ('__sub__', 'x - y', 'x -= y'),
4224 ('__mul__', 'x * y', 'x *= y'),
4225 ('__truediv__', 'operator.truediv(x, y)', None),
4226 ('__floordiv__', 'operator.floordiv(x, y)', None),
4227 ('__div__', 'x / y', 'x /= y'),
4228 ('__mod__', 'x % y', 'x %= y'),
4229 ('__divmod__', 'divmod(x, y)', None),
4230 ('__pow__', 'x ** y', 'x **= y'),
4231 ('__lshift__', 'x << y', 'x <<= y'),
4232 ('__rshift__', 'x >> y', 'x >>= y'),
4233 ('__and__', 'x & y', 'x &= y'),
4234 ('__or__', 'x | y', 'x |= y'),
4235 ('__xor__', 'x ^ y', 'x ^= y'),
4236 ('__coerce__', 'coerce(x, y)', None)]:
4237 if name == '__coerce__':
4238 rname = name
4239 else:
4240 rname = '__r' + name[2:]
4241 A = metaclass('A', (), {name: specialmethod})
4242 B = metaclass('B', (), {rname: specialmethod})
4243 a = A()
4244 b = B()
4245 check(expr, a, a)
4246 check(expr, a, b)
4247 check(expr, b, a)
4248 check(expr, b, b)
4249 check(expr, a, N1)
4250 check(expr, a, N2)
4251 check(expr, N1, b)
4252 check(expr, N2, b)
4253 if iexpr:
4254 check(iexpr, a, a)
4255 check(iexpr, a, b)
4256 check(iexpr, b, a)
4257 check(iexpr, b, b)
4258 check(iexpr, a, N1)
4259 check(iexpr, a, N2)
4260 iname = '__i' + name[2:]
4261 C = metaclass('C', (), {iname: specialmethod})
4262 c = C()
4263 check(iexpr, c, a)
4264 check(iexpr, c, b)
4265 check(iexpr, c, N1)
4266 check(iexpr, c, N2)
4267
Georg Brandl0fca97a2007-03-05 22:28:08 +00004268def test_assign_slice():
4269 # ceval.c's assign_slice used to check for
4270 # tp->tp_as_sequence->sq_slice instead of
4271 # tp->tp_as_sequence->sq_ass_slice
4272
4273 class C(object):
4274 def __setslice__(self, start, stop, value):
4275 self.value = value
4276
4277 c = C()
4278 c[1:2] = 3
4279 vereq(c.value, 3)
4280
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004281def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004282 weakref_segfault() # Must be first, somehow
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004283 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004284 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004285 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004286 lists()
4287 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004288 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004289 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004290 ints()
4291 longs()
4292 floats()
4293 complexes()
4294 spamlists()
4295 spamdicts()
4296 pydicts()
4297 pylists()
4298 metaclass()
4299 pymods()
4300 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004301 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004302 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004303 ex5()
4304 monotonicity()
4305 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004306 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004307 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004308 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004309 dynamics()
Armin Rigoc0ba52d2007-04-19 14:44:48 +00004310 errors()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004311 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004312 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004313 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004314 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004315 classic()
4316 compattr()
4317 newslot()
4318 altmro()
4319 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004320 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004321 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004322 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004323 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004324 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004325 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004326 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004327 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004328 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004329 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004330 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004331 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004332 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004333 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004334 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004335 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004336 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004337 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004338 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004339 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004340 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004341 kwdargs()
Brett Cannon22565aa2006-06-09 22:31:23 +00004342 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004343 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004344 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004345 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004346 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004347 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004348 dictproxyiterkeys()
4349 dictproxyitervalues()
4350 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004351 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004352 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004353 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004354 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004355 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004356 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004357 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004358 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004359 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004360 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004361 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004362 test_mutable_bases()
4363 test_mutable_bases_with_failing_mro()
4364 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004365 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004366 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004367 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004368 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004369 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004370 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004371 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004372 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004373 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004374 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004375 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004376 notimplemented()
Georg Brandl0fca97a2007-03-05 22:28:08 +00004377 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004378
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004379 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004380
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004381if __name__ == "__main__":
4382 test_main()