blob: 57cef44097218fca6054b77bea28a6beeb676492 [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
Armin Rigo9790a272007-05-02 19:23:31 +00006import types
Tim Peters4d9b4662002-04-16 01:59:17 +00007
8warnings.filterwarnings("ignore",
9 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +000010 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000011
Guido van Rossum875eeaa2001-10-11 18:33:53 +000012def veris(a, b):
13 if a is not b:
14 raise TestFailed, "%r is %r" % (a, b)
15
Tim Peters6d6c1a32001-08-02 04:15:00 +000016def testunop(a, res, expr="len(a)", meth="__len__"):
17 if verbose: print "checking", expr
18 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000019 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000020 t = type(a)
21 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000022 while meth not in t.__dict__:
23 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000024 vereq(m, t.__dict__[meth])
25 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000026 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000027 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000028
29def testbinop(a, b, res, expr="a+b", meth="__add__"):
30 if verbose: print "checking", expr
31 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000032
33 # XXX Hack so this passes before 2.3 when -Qnew is specified.
34 if meth == "__div__" and 1/2 == 0.5:
35 meth = "__truediv__"
36
Guido van Rossum45704552001-10-08 16:35:45 +000037 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000038 t = type(a)
39 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000040 while meth not in t.__dict__:
41 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000042 vereq(m, t.__dict__[meth])
43 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000045 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046
47def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
48 if verbose: print "checking", expr
49 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000050 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000051 t = type(a)
52 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000053 while meth not in t.__dict__:
54 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000055 vereq(m, t.__dict__[meth])
56 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000057 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000058 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000059
60def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
61 if verbose: print "checking", stmt
62 dict = {'a': deepcopy(a), 'b': b}
63 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000064 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000065 t = type(a)
66 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000067 while meth not in t.__dict__:
68 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000069 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000070 dict['a'] = deepcopy(a)
71 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000072 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000073 dict['a'] = deepcopy(a)
74 bm = getattr(dict['a'], meth)
75 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000076 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000077
78def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
79 if verbose: print "checking", stmt
80 dict = {'a': deepcopy(a), 'b': b, 'c': c}
81 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000082 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000083 t = type(a)
84 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000085 while meth not in t.__dict__:
86 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000087 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000088 dict['a'] = deepcopy(a)
89 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000090 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000091 dict['a'] = deepcopy(a)
92 bm = getattr(dict['a'], meth)
93 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000094 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000095
96def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
97 if verbose: print "checking", stmt
98 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
99 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +0000100 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000102 while meth not in t.__dict__:
103 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000104 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000105 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106 dict['a'] = deepcopy(a)
107 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000108 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000109 dict['a'] = deepcopy(a)
110 bm = getattr(dict['a'], meth)
111 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000112 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000113
Tim Peters2f93e282001-10-04 05:27:00 +0000114def class_docstrings():
115 class Classic:
116 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000117 vereq(Classic.__doc__, "A classic docstring.")
118 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000119
120 class Classic2:
121 pass
122 verify(Classic2.__doc__ is None)
123
Tim Peters4fb1fe82001-10-04 05:48:13 +0000124 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000125 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000126 vereq(NewStatic.__doc__, "Another docstring.")
127 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000128
Tim Peters4fb1fe82001-10-04 05:48:13 +0000129 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000130 pass
131 verify(NewStatic2.__doc__ is None)
132
Tim Peters4fb1fe82001-10-04 05:48:13 +0000133 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000134 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000135 vereq(NewDynamic.__doc__, "Another docstring.")
136 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000137
Tim Peters4fb1fe82001-10-04 05:48:13 +0000138 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000139 pass
140 verify(NewDynamic2.__doc__ is None)
141
Tim Peters6d6c1a32001-08-02 04:15:00 +0000142def lists():
143 if verbose: print "Testing list operations..."
144 testbinop([1], [2], [1,2], "a+b", "__add__")
145 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
146 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
147 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
148 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
149 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
150 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
151 testunop([1,2,3], 3, "len(a)", "__len__")
152 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
153 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
154 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
155 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
156
157def dicts():
158 if verbose: print "Testing dict operations..."
159 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
160 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
161 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
162 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
163 d = {1:2,3:4}
164 l1 = []
165 for i in d.keys(): l1.append(i)
166 l = []
167 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000168 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000169 l = []
170 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000171 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000172 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000173 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000174 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000175 d = {1:2, 3:4}
176 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000177 vereq(eval(repr(d), {}), d)
178 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000179 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
180
Tim Peters25786c02001-09-02 08:22:48 +0000181def dict_constructor():
182 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 print "Testing dict constructor ..."
184 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000185 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000186 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000187 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000188 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000189 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000190 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000191 vereq(d, dict(d.iteritems()))
192 d = dict({'one':1, 'two':2})
193 vereq(d, dict(one=1, two=2))
194 vereq(d, dict(**d))
195 vereq(d, dict({"one": 1}, two=2))
196 vereq(d, dict([("two", 2)], one=1))
197 vereq(d, dict([("one", 100), ("two", 200)], **d))
198 verify(d is not dict(**d))
Tim Peters25786c02001-09-02 08:22:48 +0000199 for badarg in 0, 0L, 0j, "0", [0], (0,):
200 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000201 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000202 except TypeError:
203 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000204 except ValueError:
205 if badarg == "0":
206 # It's a sequence, and its elements are also sequences (gotta
207 # love strings <wink>), but they aren't of length 2, so this
208 # one seemed better as a ValueError than a TypeError.
209 pass
210 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000211 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000212 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000213 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000214
215 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000216 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000217 except TypeError:
218 pass
219 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000220 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000221
222 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000223 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000224 dict = {1:2, 3:4, 'a':1j}
225
Tim Peters25786c02001-09-02 08:22:48 +0000226 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000227 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000228 except TypeError:
229 pass
230 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000231 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000232
233 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000234 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000235 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000236 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000237
Tim Peters1fc240e2001-10-26 05:06:50 +0000238 # Init from sequence of iterable objects, each producing a 2-sequence.
239 class AddressBookEntry:
240 def __init__(self, first, last):
241 self.first = first
242 self.last = last
243 def __iter__(self):
244 return iter([self.first, self.last])
245
Tim Petersa427a2b2001-10-29 22:25:45 +0000246 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000247 AddressBookEntry('Barry', 'Peters'),
248 AddressBookEntry('Tim', 'Peters'),
249 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000250 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
251
Tim Petersa427a2b2001-10-29 22:25:45 +0000252 d = dict(zip(range(4), range(1, 5)))
253 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000254
255 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000256 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000257 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000258 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000259 except ValueError:
260 pass
261 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000262 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000263
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264def test_dir():
265 if verbose:
266 print "Testing dir() ..."
267 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000268 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000269 del junk
270
271 # Just make sure these don't blow up!
272 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
273 dir(arg)
274
Tim Peters37a309d2001-09-04 01:20:04 +0000275 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000276 class C:
277 Cdata = 1
278 def Cmethod(self): pass
279
280 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000281 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000282 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000283
284 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000285 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000286
287 c.cdata = 2
288 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000289 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000290 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291
292 class A(C):
293 Adata = 1
294 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000295
Tim Peters37a309d2001-09-04 01:20:04 +0000296 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000297 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000298 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000299 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000300 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000301 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000302 a.adata = 42
303 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000304 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000305
306 # The same, but with new-style classes. Since these have object as a
307 # base class, a lot more gets sucked in.
308 def interesting(strings):
309 return [s for s in strings if not s.startswith('_')]
310
Tim Peters5d2b77c2001-09-03 05:47:38 +0000311 class C(object):
312 Cdata = 1
313 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000314
315 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000316 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000317
318 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000319 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000320 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000321
322 c.cdata = 2
323 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000324 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000325 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000326
Tim Peters5d2b77c2001-09-03 05:47:38 +0000327 class A(C):
328 Adata = 1
329 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000330
331 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000332 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000333 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000334 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000335 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000336 a.adata = 42
337 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000338 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000339 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000340
Tim Peterscaaff8d2001-09-10 23:12:14 +0000341 # Try a module subclass.
342 import sys
343 class M(type(sys)):
344 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000345 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000346 minstance.b = 2
347 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000348 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
349 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000350
351 class M2(M):
352 def getdict(self):
353 return "Not a dict!"
354 __dict__ = property(getdict)
355
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000356 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000357 m2instance.b = 2
358 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000359 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000360 try:
361 dir(m2instance)
362 except TypeError:
363 pass
364
Tim Peters9e6a3992001-10-30 05:45:26 +0000365 # Two essentially featureless objects, just inheriting stuff from
366 # object.
367 vereq(dir(None), dir(Ellipsis))
368
Guido van Rossum44022412002-05-13 18:29:46 +0000369 # Nasty test case for proxied objects
370 class Wrapper(object):
371 def __init__(self, obj):
372 self.__obj = obj
373 def __repr__(self):
374 return "Wrapper(%s)" % repr(self.__obj)
375 def __getitem__(self, key):
376 return Wrapper(self.__obj[key])
377 def __len__(self):
378 return len(self.__obj)
379 def __getattr__(self, name):
380 return Wrapper(getattr(self.__obj, name))
381
382 class C(object):
383 def __getclass(self):
384 return Wrapper(type(self))
385 __class__ = property(__getclass)
386
387 dir(C()) # This used to segfault
388
Tim Peters6d6c1a32001-08-02 04:15:00 +0000389binops = {
390 'add': '+',
391 'sub': '-',
392 'mul': '*',
393 'div': '/',
394 'mod': '%',
395 'divmod': 'divmod',
396 'pow': '**',
397 'lshift': '<<',
398 'rshift': '>>',
399 'and': '&',
400 'xor': '^',
401 'or': '|',
402 'cmp': 'cmp',
403 'lt': '<',
404 'le': '<=',
405 'eq': '==',
406 'ne': '!=',
407 'gt': '>',
408 'ge': '>=',
409 }
410
411for name, expr in binops.items():
412 if expr.islower():
413 expr = expr + "(a, b)"
414 else:
415 expr = 'a %s b' % expr
416 binops[name] = expr
417
418unops = {
419 'pos': '+',
420 'neg': '-',
421 'abs': 'abs',
422 'invert': '~',
423 'int': 'int',
424 'long': 'long',
425 'float': 'float',
426 'oct': 'oct',
427 'hex': 'hex',
428 }
429
430for name, expr in unops.items():
431 if expr.islower():
432 expr = expr + "(a)"
433 else:
434 expr = '%s a' % expr
435 unops[name] = expr
436
437def numops(a, b, skip=[]):
438 dict = {'a': a, 'b': b}
439 for name, expr in binops.items():
440 if name not in skip:
441 name = "__%s__" % name
442 if hasattr(a, name):
443 res = eval(expr, dict)
444 testbinop(a, b, res, expr, name)
445 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000446 if name not in skip:
447 name = "__%s__" % name
448 if hasattr(a, name):
449 res = eval(expr, dict)
450 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451
452def ints():
453 if verbose: print "Testing int operations..."
454 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000455 # The following crashes in Python 2.2
456 vereq((1).__nonzero__(), 1)
457 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000458 # This returns 'NotImplemented' in Python 2.2
459 class C(int):
460 def __add__(self, other):
461 return NotImplemented
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000462 vereq(C(5L), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000463 try:
464 C() + ""
465 except TypeError:
466 pass
467 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000468 raise TestFailed, "NotImplemented should have caused TypeError"
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000469 import sys
470 try:
471 C(sys.maxint+1)
472 except OverflowError:
473 pass
474 else:
475 raise TestFailed, "should have raised OverflowError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000476
477def longs():
478 if verbose: print "Testing long operations..."
479 numops(100L, 3L)
480
481def floats():
482 if verbose: print "Testing float operations..."
483 numops(100.0, 3.0)
484
485def complexes():
486 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000487 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000488 class Number(complex):
489 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000490 def __new__(cls, *args, **kwds):
491 result = complex.__new__(cls, *args)
492 result.prec = kwds.get('prec', 12)
493 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494 def __repr__(self):
495 prec = self.prec
496 if self.imag == 0.0:
497 return "%.*g" % (prec, self.real)
498 if self.real == 0.0:
499 return "%.*gj" % (prec, self.imag)
500 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
501 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000502
Tim Peters6d6c1a32001-08-02 04:15:00 +0000503 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000504 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000505 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506
Tim Peters3f996e72001-09-13 19:18:27 +0000507 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000508 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000509 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000510
511 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000512 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000513 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000514
Tim Peters6d6c1a32001-08-02 04:15:00 +0000515def spamlists():
516 if verbose: print "Testing spamlist operations..."
517 import copy, xxsubtype as spam
518 def spamlist(l, memo=None):
519 import xxsubtype as spam
520 return spam.spamlist(l)
521 # This is an ugly hack:
522 copy._deepcopy_dispatch[spam.spamlist] = spamlist
523
524 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
525 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
526 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
527 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
528 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
529 "a[b:c]", "__getslice__")
530 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
531 "a+=b", "__iadd__")
532 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
533 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
534 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
535 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
536 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
537 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
538 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
539 # Test subclassing
540 class C(spam.spamlist):
541 def foo(self): return 1
542 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000543 vereq(a, [])
544 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000545 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000546 vereq(a, [100])
547 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000548 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000549 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000550
551def spamdicts():
552 if verbose: print "Testing spamdict operations..."
553 import copy, xxsubtype as spam
554 def spamdict(d, memo=None):
555 import xxsubtype as spam
556 sd = spam.spamdict()
557 for k, v in d.items(): sd[k] = v
558 return sd
559 # This is an ugly hack:
560 copy._deepcopy_dispatch[spam.spamdict] = spamdict
561
562 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
563 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
564 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
565 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
566 d = spamdict({1:2,3:4})
567 l1 = []
568 for i in d.keys(): l1.append(i)
569 l = []
570 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000571 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000572 l = []
573 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000574 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575 l = []
576 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000577 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 straightd = {1:2, 3:4}
579 spamd = spamdict(straightd)
580 testunop(spamd, 2, "len(a)", "__len__")
581 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
582 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
583 "a[b]=c", "__setitem__")
584 # Test subclassing
585 class C(spam.spamdict):
586 def foo(self): return 1
587 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000588 vereq(a.items(), [])
589 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000590 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000591 vereq(a.items(), [('foo', 'bar')])
592 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000593 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000594 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595
596def pydicts():
597 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000598 verify(issubclass(dict, dict))
599 verify(isinstance({}, dict))
600 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000601 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000602 verify(d.__class__ is dict)
603 verify(isinstance(d, dict))
604 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000605 state = -1
606 def __init__(self, *a, **kw):
607 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000608 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000609 self.state = a[0]
610 if kw:
611 for k, v in kw.items(): self[v] = k
612 def __getitem__(self, key):
613 return self.get(key, 0)
614 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000615 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000616 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617 def setstate(self, state):
618 self.state = state
619 def getstate(self):
620 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000621 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000622 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000623 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000625 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000626 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000627 vereq(a.state, -1)
628 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000630 vereq(a.state, 0)
631 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000632 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000633 vereq(a.state, 10)
634 vereq(a.getstate(), 10)
635 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000636 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000637 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000638 if verbose: print "pydict stress test ..."
639 N = 50
640 for i in range(N):
641 a[i] = C()
642 for j in range(N):
643 a[i][j] = i*j
644 for i in range(N):
645 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000646 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000647
648def pylists():
649 if verbose: print "Testing Python subclass of list..."
650 class C(list):
651 def __getitem__(self, i):
652 return list.__getitem__(self, i) + 100
653 def __getslice__(self, i, j):
654 return (i, j)
655 a = C()
656 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000657 vereq(a[0], 100)
658 vereq(a[1], 101)
659 vereq(a[2], 102)
660 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000661
662def metaclass():
663 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000664 class C:
665 __metaclass__ = type
666 def __init__(self):
667 self.__state = 0
668 def getstate(self):
669 return self.__state
670 def setstate(self, state):
671 self.__state = state
672 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000673 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000674 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000675 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000676 class D:
677 class __metaclass__(type):
678 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000679 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000680 d = D()
681 verify(d.__class__ is D)
682 class M1(type):
683 def __new__(cls, name, bases, dict):
684 dict['__spam__'] = 1
685 return type.__new__(cls, name, bases, dict)
686 class C:
687 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000688 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000689 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000690 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000691
Guido van Rossum309b5662001-08-17 11:43:17 +0000692 class _instance(object):
693 pass
694 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000695 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000696 def __new__(cls, name, bases, dict):
697 self = object.__new__(cls)
698 self.name = name
699 self.bases = bases
700 self.dict = dict
701 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000702 def __call__(self):
703 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000704 # Early binding of methods
705 for key in self.dict:
706 if key.startswith("__"):
707 continue
708 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000709 return it
710 class C:
711 __metaclass__ = M2
712 def spam(self):
713 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000714 vereq(C.name, 'C')
715 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000716 verify('spam' in C.dict)
717 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000718 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000719
Guido van Rossum91ee7982001-08-30 20:52:40 +0000720 # More metaclass examples
721
722 class autosuper(type):
723 # Automatically add __super to the class
724 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000725 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000726 cls = super(autosuper, metaclass).__new__(metaclass,
727 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000728 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000729 while name[:1] == "_":
730 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 if name:
732 name = "_%s__super" % name
733 else:
734 name = "__super"
735 setattr(cls, name, super(cls))
736 return cls
737 class A:
738 __metaclass__ = autosuper
739 def meth(self):
740 return "A"
741 class B(A):
742 def meth(self):
743 return "B" + self.__super.meth()
744 class C(A):
745 def meth(self):
746 return "C" + self.__super.meth()
747 class D(C, B):
748 def meth(self):
749 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000750 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000751 class E(B, C):
752 def meth(self):
753 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000754 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000755
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000756 class autoproperty(type):
757 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000758 # named _get_x and/or _set_x are found
759 def __new__(metaclass, name, bases, dict):
760 hits = {}
761 for key, val in dict.iteritems():
762 if key.startswith("_get_"):
763 key = key[5:]
764 get, set = hits.get(key, (None, None))
765 get = val
766 hits[key] = get, set
767 elif key.startswith("_set_"):
768 key = key[5:]
769 get, set = hits.get(key, (None, None))
770 set = val
771 hits[key] = get, set
772 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000773 dict[key] = property(get, set)
774 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000775 name, bases, dict)
776 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000777 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000778 def _get_x(self):
779 return -self.__x
780 def _set_x(self, x):
781 self.__x = -x
782 a = A()
783 verify(not hasattr(a, "x"))
784 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000785 vereq(a.x, 12)
786 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000787
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000788 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000789 # Merge of multiple cooperating metaclasses
790 pass
791 class A:
792 __metaclass__ = multimetaclass
793 def _get_x(self):
794 return "A"
795 class B(A):
796 def _get_x(self):
797 return "B" + self.__super._get_x()
798 class C(A):
799 def _get_x(self):
800 return "C" + self.__super._get_x()
801 class D(C, B):
802 def _get_x(self):
803 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000804 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000805
Guido van Rossumf76de622001-10-18 15:49:21 +0000806 # Make sure type(x) doesn't call x.__class__.__init__
807 class T(type):
808 counter = 0
809 def __init__(self, *args):
810 T.counter += 1
811 class C:
812 __metaclass__ = T
813 vereq(T.counter, 1)
814 a = C()
815 vereq(type(a), C)
816 vereq(T.counter, 1)
817
Guido van Rossum29d26062001-12-11 04:37:34 +0000818 class C(object): pass
819 c = C()
820 try: c()
821 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000822 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000823
Jeremy Hyltonfa955692007-02-27 18:29:45 +0000824 # Testing code to find most derived baseclass
825 class A(type):
826 def __new__(*args, **kwargs):
827 return type.__new__(*args, **kwargs)
828
829 class B(object):
830 pass
831
832 class C(object):
833 __metaclass__ = A
834
835 # The most derived metaclass of D is A rather than type.
836 class D(B, C):
837 pass
838
839
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840def pymods():
841 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000843 import sys
844 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000845 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000846 def __init__(self, name):
847 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000848 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000849 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000850 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000851 def __setattr__(self, name, value):
852 log.append(("setattr", name, value))
853 MT.__setattr__(self, name, value)
854 def __delattr__(self, name):
855 log.append(("delattr", name))
856 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000857 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000858 a.foo = 12
859 x = a.foo
860 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000861 vereq(log, [("setattr", "foo", 12),
862 ("getattr", "foo"),
863 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864
Armin Rigo9790a272007-05-02 19:23:31 +0000865 # http://python.org/sf/1174712
866 try:
867 class Module(types.ModuleType, str):
868 pass
869 except TypeError:
870 pass
871 else:
872 raise TestFailed("inheriting from ModuleType and str at the "
873 "same time should fail")
874
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875def multi():
876 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000877 class C(object):
878 def __init__(self):
879 self.__state = 0
880 def getstate(self):
881 return self.__state
882 def setstate(self, state):
883 self.__state = state
884 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000885 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000886 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000887 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000888 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000889 def __init__(self):
890 type({}).__init__(self)
891 C.__init__(self)
892 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000893 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000894 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000895 vereq(d.items(), [("hello", "world")])
896 vereq(d["hello"], "world")
897 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000898 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000899 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000900 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000901
Guido van Rossume45763a2001-08-10 21:28:46 +0000902 # SF bug #442833
903 class Node(object):
904 def __int__(self):
905 return int(self.foo())
906 def foo(self):
907 return "23"
908 class Frag(Node, list):
909 def foo(self):
910 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000911 vereq(Node().__int__(), 23)
912 vereq(int(Node()), 23)
913 vereq(Frag().__int__(), 42)
914 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000915
Tim Petersa91e9642001-11-14 23:32:33 +0000916 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000917
918 class A:
919 x = 1
920
921 class B(A):
922 pass
923
924 class C(A):
925 x = 2
926
927 class D(B, C):
928 pass
929 vereq(D.x, 1)
930
931 # Classic MRO is preserved for a classic base class.
932 class E(D, object):
933 pass
934 vereq(E.__mro__, (E, D, B, A, C, object))
935 vereq(E.x, 1)
936
937 # But with a mix of classic bases, their MROs are combined using
938 # new-style MRO.
939 class F(B, C, object):
940 pass
941 vereq(F.__mro__, (F, B, C, A, object))
942 vereq(F.x, 2)
943
944 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000945 class C:
946 def cmethod(self):
947 return "C a"
948 def all_method(self):
949 return "C b"
950
951 class M1(C, object):
952 def m1method(self):
953 return "M1 a"
954 def all_method(self):
955 return "M1 b"
956
957 vereq(M1.__mro__, (M1, C, object))
958 m = M1()
959 vereq(m.cmethod(), "C a")
960 vereq(m.m1method(), "M1 a")
961 vereq(m.all_method(), "M1 b")
962
963 class D(C):
964 def dmethod(self):
965 return "D a"
966 def all_method(self):
967 return "D b"
968
Guido van Rossum9a818922002-11-14 19:50:14 +0000969 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000970 def m2method(self):
971 return "M2 a"
972 def all_method(self):
973 return "M2 b"
974
Guido van Rossum9a818922002-11-14 19:50:14 +0000975 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000976 m = M2()
977 vereq(m.cmethod(), "C a")
978 vereq(m.dmethod(), "D a")
979 vereq(m.m2method(), "M2 a")
980 vereq(m.all_method(), "M2 b")
981
Guido van Rossum9a818922002-11-14 19:50:14 +0000982 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000983 def m3method(self):
984 return "M3 a"
985 def all_method(self):
986 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000987 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000988 m = M3()
989 vereq(m.cmethod(), "C a")
990 vereq(m.dmethod(), "D a")
991 vereq(m.m1method(), "M1 a")
992 vereq(m.m2method(), "M2 a")
993 vereq(m.m3method(), "M3 a")
994 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000995
Guido van Rossume54616c2001-12-14 04:19:56 +0000996 class Classic:
997 pass
998 try:
999 class New(Classic):
1000 __metaclass__ = type
1001 except TypeError:
1002 pass
1003 else:
1004 raise TestFailed, "new class with only classic bases - shouldn't be"
1005
Tim Peters6d6c1a32001-08-02 04:15:00 +00001006def diamond():
1007 if verbose: print "Testing multiple inheritance special cases..."
1008 class A(object):
1009 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +00001010 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001011 class B(A):
1012 def boo(self): return "B"
1013 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +00001014 vereq(B().spam(), "B")
1015 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 class C(A):
1017 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +00001018 vereq(C().spam(), "A")
1019 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001021 vereq(D().spam(), "B")
1022 vereq(D().boo(), "B")
1023 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001024 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001025 vereq(E().spam(), "B")
1026 vereq(E().boo(), "C")
1027 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +00001028 # MRO order disagreement
1029 try:
1030 class F(D, E): pass
1031 except TypeError:
1032 pass
1033 else:
1034 raise TestFailed, "expected MRO order disagreement (F)"
1035 try:
1036 class G(E, D): pass
1037 except TypeError:
1038 pass
1039 else:
1040 raise TestFailed, "expected MRO order disagreement (G)"
1041
1042
1043# see thread python-dev/2002-October/029035.html
1044def ex5():
1045 if verbose: print "Testing ex5 from C3 switch discussion..."
1046 class A(object): pass
1047 class B(object): pass
1048 class C(object): pass
1049 class X(A): pass
1050 class Y(A): pass
1051 class Z(X,B,Y,C): pass
1052 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1053
1054# see "A Monotonic Superclass Linearization for Dylan",
1055# by Kim Barrett et al. (OOPSLA 1996)
1056def monotonicity():
1057 if verbose: print "Testing MRO monotonicity..."
1058 class Boat(object): pass
1059 class DayBoat(Boat): pass
1060 class WheelBoat(Boat): pass
1061 class EngineLess(DayBoat): pass
1062 class SmallMultihull(DayBoat): pass
1063 class PedalWheelBoat(EngineLess,WheelBoat): pass
1064 class SmallCatamaran(SmallMultihull): pass
1065 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1066
1067 vereq(PedalWheelBoat.__mro__,
1068 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1069 object))
1070 vereq(SmallCatamaran.__mro__,
1071 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1072
1073 vereq(Pedalo.__mro__,
1074 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1075 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1076
1077# see "A Monotonic Superclass Linearization for Dylan",
1078# by Kim Barrett et al. (OOPSLA 1996)
1079def consistency_with_epg():
1080 if verbose: print "Testing consistentcy with EPG..."
1081 class Pane(object): pass
1082 class ScrollingMixin(object): pass
1083 class EditingMixin(object): pass
1084 class ScrollablePane(Pane,ScrollingMixin): pass
1085 class EditablePane(Pane,EditingMixin): pass
1086 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1087
1088 vereq(EditableScrollablePane.__mro__,
1089 (EditableScrollablePane, ScrollablePane, EditablePane,
1090 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001091
Raymond Hettingerf394df42003-04-06 19:13:41 +00001092mro_err_msg = """Cannot create a consistent method resolution
1093order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +00001094
Guido van Rossumd32047f2002-11-25 21:38:52 +00001095def mro_disagreement():
1096 if verbose: print "Testing error messages for MRO disagreement..."
1097 def raises(exc, expected, callable, *args):
1098 try:
1099 callable(*args)
1100 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001101 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001102 raise TestFailed, "Message %r, expected %r" % (str(msg),
1103 expected)
1104 else:
1105 raise TestFailed, "Expected %s" % exc
1106 class A(object): pass
1107 class B(A): pass
1108 class C(object): pass
1109 # Test some very simple errors
1110 raises(TypeError, "duplicate base class A",
1111 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001112 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001113 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001114 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001115 type, "X", (A, C, B), {})
1116 # Test a slightly more complex error
1117 class GridLayout(object): pass
1118 class HorizontalGrid(GridLayout): pass
1119 class VerticalGrid(GridLayout): pass
1120 class HVGrid(HorizontalGrid, VerticalGrid): pass
1121 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +00001122 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001123 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1124
Guido van Rossum37202612001-08-09 19:45:21 +00001125def objects():
1126 if verbose: print "Testing object class..."
1127 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001128 vereq(a.__class__, object)
1129 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001130 b = object()
1131 verify(a is not b)
1132 verify(not hasattr(a, "foo"))
1133 try:
1134 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001135 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001136 pass
1137 else:
1138 verify(0, "object() should not allow setting a foo attribute")
1139 verify(not hasattr(object(), "__dict__"))
1140
1141 class Cdict(object):
1142 pass
1143 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001144 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001145 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001146 vereq(x.foo, 1)
1147 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001148
Tim Peters6d6c1a32001-08-02 04:15:00 +00001149def slots():
1150 if verbose: print "Testing __slots__..."
1151 class C0(object):
1152 __slots__ = []
1153 x = C0()
1154 verify(not hasattr(x, "__dict__"))
1155 verify(not hasattr(x, "foo"))
1156
1157 class C1(object):
1158 __slots__ = ['a']
1159 x = C1()
1160 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001161 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001162 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001163 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001164 x.a = None
1165 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001166 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001167 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001168
1169 class C3(object):
1170 __slots__ = ['a', 'b', 'c']
1171 x = C3()
1172 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001173 verify(not hasattr(x, 'a'))
1174 verify(not hasattr(x, 'b'))
1175 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001176 x.a = 1
1177 x.b = 2
1178 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001179 vereq(x.a, 1)
1180 vereq(x.b, 2)
1181 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001182
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001183 class C4(object):
1184 """Validate name mangling"""
1185 __slots__ = ['__a']
1186 def __init__(self, value):
1187 self.__a = value
1188 def get(self):
1189 return self.__a
1190 x = C4(5)
1191 verify(not hasattr(x, '__dict__'))
1192 verify(not hasattr(x, '__a'))
1193 vereq(x.get(), 5)
1194 try:
1195 x.__a = 6
1196 except AttributeError:
1197 pass
1198 else:
1199 raise TestFailed, "Double underscored names not mangled"
1200
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001201 # Make sure slot names are proper identifiers
1202 try:
1203 class C(object):
1204 __slots__ = [None]
1205 except TypeError:
1206 pass
1207 else:
1208 raise TestFailed, "[None] slots not caught"
1209 try:
1210 class C(object):
1211 __slots__ = ["foo bar"]
1212 except TypeError:
1213 pass
1214 else:
1215 raise TestFailed, "['foo bar'] slots not caught"
1216 try:
1217 class C(object):
1218 __slots__ = ["foo\0bar"]
1219 except TypeError:
1220 pass
1221 else:
1222 raise TestFailed, "['foo\\0bar'] slots not caught"
1223 try:
1224 class C(object):
1225 __slots__ = ["1"]
1226 except TypeError:
1227 pass
1228 else:
1229 raise TestFailed, "['1'] slots not caught"
1230 try:
1231 class C(object):
1232 __slots__ = [""]
1233 except TypeError:
1234 pass
1235 else:
1236 raise TestFailed, "[''] slots not caught"
1237 class C(object):
1238 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001239 # XXX(nnorwitz): was there supposed to be something tested
1240 # from the class above?
1241
1242 # Test a single string is not expanded as a sequence.
1243 class C(object):
1244 __slots__ = "abc"
1245 c = C()
1246 c.abc = 5
1247 vereq(c.abc, 5)
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001248
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001249 # Test unicode slot names
1250 try:
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001251 unicode
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001252 except NameError:
1253 pass
1254 else:
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001255 # Test a single unicode string is not expanded as a sequence.
1256 class C(object):
1257 __slots__ = unicode("abc")
1258 c = C()
1259 c.abc = 5
1260 vereq(c.abc, 5)
1261
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001262 # _unicode_to_string used to modify slots in certain circumstances
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001263 slots = (unicode("foo"), unicode("bar"))
1264 class C(object):
1265 __slots__ = slots
1266 x = C()
1267 x.foo = 5
1268 vereq(x.foo, 5)
1269 veris(type(slots[0]), unicode)
1270 # this used to leak references
1271 try:
1272 class C(object):
1273 __slots__ = [unichr(128)]
1274 except (TypeError, UnicodeEncodeError):
1275 pass
1276 else:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001277 raise TestFailed, "[unichr(128)] slots not caught"
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001278
Guido van Rossum33bab012001-12-05 22:45:48 +00001279 # Test leaks
1280 class Counted(object):
1281 counter = 0 # counts the number of instances alive
1282 def __init__(self):
1283 Counted.counter += 1
1284 def __del__(self):
1285 Counted.counter -= 1
1286 class C(object):
1287 __slots__ = ['a', 'b', 'c']
1288 x = C()
1289 x.a = Counted()
1290 x.b = Counted()
1291 x.c = Counted()
1292 vereq(Counted.counter, 3)
1293 del x
1294 vereq(Counted.counter, 0)
1295 class D(C):
1296 pass
1297 x = D()
1298 x.a = Counted()
1299 x.z = Counted()
1300 vereq(Counted.counter, 2)
1301 del x
1302 vereq(Counted.counter, 0)
1303 class E(D):
1304 __slots__ = ['e']
1305 x = E()
1306 x.a = Counted()
1307 x.z = Counted()
1308 x.e = Counted()
1309 vereq(Counted.counter, 3)
1310 del x
1311 vereq(Counted.counter, 0)
1312
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001313 # Test cyclical leaks [SF bug 519621]
1314 class F(object):
1315 __slots__ = ['a', 'b']
1316 log = []
1317 s = F()
1318 s.a = [Counted(), s]
1319 vereq(Counted.counter, 1)
1320 s = None
1321 import gc
1322 gc.collect()
1323 vereq(Counted.counter, 0)
1324
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001325 # Test lookup leaks [SF bug 572567]
1326 import sys,gc
1327 class G(object):
1328 def __cmp__(self, other):
1329 return 0
1330 g = G()
1331 orig_objects = len(gc.get_objects())
1332 for i in xrange(10):
1333 g==g
1334 new_objects = len(gc.get_objects())
1335 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001336 class H(object):
1337 __slots__ = ['a', 'b']
1338 def __init__(self):
1339 self.a = 1
1340 self.b = 2
1341 def __del__(self):
1342 assert self.a == 1
1343 assert self.b == 2
1344
1345 save_stderr = sys.stderr
1346 sys.stderr = sys.stdout
1347 h = H()
1348 try:
1349 del h
1350 finally:
1351 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001352
Guido van Rossum8b056da2002-08-13 18:26:26 +00001353def slotspecials():
1354 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1355
1356 class D(object):
1357 __slots__ = ["__dict__"]
1358 a = D()
1359 verify(hasattr(a, "__dict__"))
1360 verify(not hasattr(a, "__weakref__"))
1361 a.foo = 42
1362 vereq(a.__dict__, {"foo": 42})
1363
1364 class W(object):
1365 __slots__ = ["__weakref__"]
1366 a = W()
1367 verify(hasattr(a, "__weakref__"))
1368 verify(not hasattr(a, "__dict__"))
1369 try:
1370 a.foo = 42
1371 except AttributeError:
1372 pass
1373 else:
1374 raise TestFailed, "shouldn't be allowed to set a.foo"
1375
1376 class C1(W, D):
1377 __slots__ = []
1378 a = C1()
1379 verify(hasattr(a, "__dict__"))
1380 verify(hasattr(a, "__weakref__"))
1381 a.foo = 42
1382 vereq(a.__dict__, {"foo": 42})
1383
1384 class C2(D, W):
1385 __slots__ = []
1386 a = C2()
1387 verify(hasattr(a, "__dict__"))
1388 verify(hasattr(a, "__weakref__"))
1389 a.foo = 42
1390 vereq(a.__dict__, {"foo": 42})
1391
Guido van Rossum9a818922002-11-14 19:50:14 +00001392# MRO order disagreement
1393#
1394# class C3(C1, C2):
1395# __slots__ = []
1396#
1397# class C4(C2, C1):
1398# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001399
Tim Peters6d6c1a32001-08-02 04:15:00 +00001400def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001401 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001402 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001403 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001404 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001405 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001406 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001407 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001408 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001409 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001410 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001411 vereq(E.foo, 1)
1412 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001413 # Test dynamic instances
1414 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001415 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001416 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001417 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001418 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001419 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001420 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001421 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001422 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001423 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001424 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001425 vereq(int(a), 100)
1426 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001427 verify(not hasattr(a, "spam"))
1428 def mygetattr(self, name):
1429 if name == "spam":
1430 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001431 raise AttributeError
1432 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001433 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001434 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001435 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001436 def mysetattr(self, name, value):
1437 if name == "spam":
1438 raise AttributeError
1439 return object.__setattr__(self, name, value)
1440 C.__setattr__ = mysetattr
1441 try:
1442 a.spam = "not spam"
1443 except AttributeError:
1444 pass
1445 else:
1446 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001447 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001448 class D(C):
1449 pass
1450 d = D()
1451 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001452 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001453
Guido van Rossum7e35d572001-09-15 03:14:32 +00001454 # Test handling of int*seq and seq*int
1455 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001456 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001457 vereq("a"*I(2), "aa")
1458 vereq(I(2)*"a", "aa")
1459 vereq(2*I(3), 6)
1460 vereq(I(3)*2, 6)
1461 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001462
1463 # Test handling of long*seq and seq*long
1464 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001465 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001466 vereq("a"*L(2L), "aa")
1467 vereq(L(2L)*"a", "aa")
1468 vereq(2*L(3), 6)
1469 vereq(L(3)*2, 6)
1470 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001471
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001472 # Test comparison of classes with dynamic metaclasses
1473 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001474 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001475 class someclass:
1476 __metaclass__ = dynamicmetaclass
1477 verify(someclass != object)
1478
Tim Peters6d6c1a32001-08-02 04:15:00 +00001479def errors():
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001480 if verbose: print "Testing errors..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001481
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001482 try:
1483 class C(list, dict):
1484 pass
1485 except TypeError:
1486 pass
1487 else:
1488 verify(0, "inheritance from both list and dict should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001489
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001490 try:
1491 class C(object, None):
1492 pass
1493 except TypeError:
1494 pass
1495 else:
1496 verify(0, "inheritance from non-type should be illegal")
1497 class Classic:
1498 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001499
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001500 try:
1501 class C(type(len)):
1502 pass
1503 except TypeError:
1504 pass
1505 else:
1506 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001507
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001508 try:
1509 class C(object):
1510 __slots__ = 1
1511 except TypeError:
1512 pass
1513 else:
1514 verify(0, "__slots__ = 1 should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001515
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001516 try:
1517 class C(object):
1518 __slots__ = [1]
1519 except TypeError:
1520 pass
1521 else:
1522 verify(0, "__slots__ = [1] should be illegal")
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001523
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001524 class M1(type):
1525 pass
1526 class M2(type):
1527 pass
1528 class A1(object):
1529 __metaclass__ = M1
1530 class A2(object):
1531 __metaclass__ = M2
1532 try:
1533 class B(A1, A2):
1534 pass
1535 except TypeError:
1536 pass
1537 else:
1538 verify(0, "finding the most derived metaclass should have failed")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001539
1540def classmethods():
1541 if verbose: print "Testing class methods..."
1542 class C(object):
1543 def foo(*a): return a
1544 goo = classmethod(foo)
1545 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001546 vereq(C.goo(1), (C, 1))
1547 vereq(c.goo(1), (C, 1))
1548 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001549 class D(C):
1550 pass
1551 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001552 vereq(D.goo(1), (D, 1))
1553 vereq(d.goo(1), (D, 1))
1554 vereq(d.foo(1), (d, 1))
1555 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001556 # Test for a specific crash (SF bug 528132)
1557 def f(cls, arg): return (cls, arg)
1558 ff = classmethod(f)
1559 vereq(ff.__get__(0, int)(42), (int, 42))
1560 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001561
Guido van Rossum155db9a2002-04-02 17:53:47 +00001562 # Test super() with classmethods (SF bug 535444)
1563 veris(C.goo.im_self, C)
1564 veris(D.goo.im_self, D)
1565 veris(super(D,D).goo.im_self, D)
1566 veris(super(D,d).goo.im_self, D)
1567 vereq(super(D,D).goo(), (D,))
1568 vereq(super(D,d).goo(), (D,))
1569
Raymond Hettingerbe971532003-06-18 01:13:41 +00001570 # Verify that argument is checked for callability (SF bug 753451)
1571 try:
1572 classmethod(1).__get__(1)
1573 except TypeError:
1574 pass
1575 else:
1576 raise TestFailed, "classmethod should check for callability"
1577
Georg Brandl6a29c322006-02-21 22:17:46 +00001578 # Verify that classmethod() doesn't allow keyword args
1579 try:
1580 classmethod(f, kw=1)
1581 except TypeError:
1582 pass
1583 else:
1584 raise TestFailed, "classmethod shouldn't accept keyword args"
1585
Fred Drakef841aa62002-03-28 15:49:54 +00001586def classmethods_in_c():
1587 if verbose: print "Testing C-based class methods..."
1588 import xxsubtype as spam
1589 a = (1, 2, 3)
1590 d = {'abc': 123}
1591 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001592 veris(x, spam.spamlist)
1593 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001594 vereq(d, d1)
1595 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001596 veris(x, spam.spamlist)
1597 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001598 vereq(d, d1)
1599
Tim Peters6d6c1a32001-08-02 04:15:00 +00001600def staticmethods():
1601 if verbose: print "Testing static methods..."
1602 class C(object):
1603 def foo(*a): return a
1604 goo = staticmethod(foo)
1605 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001606 vereq(C.goo(1), (1,))
1607 vereq(c.goo(1), (1,))
1608 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001609 class D(C):
1610 pass
1611 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001612 vereq(D.goo(1), (1,))
1613 vereq(d.goo(1), (1,))
1614 vereq(d.foo(1), (d, 1))
1615 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001616
Fred Drakef841aa62002-03-28 15:49:54 +00001617def staticmethods_in_c():
1618 if verbose: print "Testing C-based static methods..."
1619 import xxsubtype as spam
1620 a = (1, 2, 3)
1621 d = {"abc": 123}
1622 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1623 veris(x, None)
1624 vereq(a, a1)
1625 vereq(d, d1)
1626 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1627 veris(x, None)
1628 vereq(a, a1)
1629 vereq(d, d1)
1630
Tim Peters6d6c1a32001-08-02 04:15:00 +00001631def classic():
1632 if verbose: print "Testing classic classes..."
1633 class C:
1634 def foo(*a): return a
1635 goo = classmethod(foo)
1636 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001637 vereq(C.goo(1), (C, 1))
1638 vereq(c.goo(1), (C, 1))
1639 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001640 class D(C):
1641 pass
1642 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001643 vereq(D.goo(1), (D, 1))
1644 vereq(d.goo(1), (D, 1))
1645 vereq(d.foo(1), (d, 1))
1646 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001647 class E: # *not* subclassing from C
1648 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001649 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001650 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001651
1652def compattr():
1653 if verbose: print "Testing computed attributes..."
1654 class C(object):
1655 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001656 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001657 self.__get = get
1658 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001659 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001660 def __get__(self, obj, type=None):
1661 return self.__get(obj)
1662 def __set__(self, obj, value):
1663 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001664 def __delete__(self, obj):
1665 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001666 def __init__(self):
1667 self.__x = 0
1668 def __get_x(self):
1669 x = self.__x
1670 self.__x = x+1
1671 return x
1672 def __set_x(self, x):
1673 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001674 def __delete_x(self):
1675 del self.__x
1676 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001677 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001678 vereq(a.x, 0)
1679 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001680 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(a.x, 10)
1682 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001683 del a.x
1684 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001685
1686def newslot():
1687 if verbose: print "Testing __new__ slot override..."
1688 class C(list):
1689 def __new__(cls):
1690 self = list.__new__(cls)
1691 self.foo = 1
1692 return self
1693 def __init__(self):
1694 self.foo = self.foo + 2
1695 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001696 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001697 verify(a.__class__ is C)
1698 class D(C):
1699 pass
1700 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001701 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001702 verify(b.__class__ is D)
1703
Tim Peters6d6c1a32001-08-02 04:15:00 +00001704def altmro():
1705 if verbose: print "Testing mro() and overriding it..."
1706 class A(object):
1707 def f(self): return "A"
1708 class B(A):
1709 pass
1710 class C(A):
1711 def f(self): return "C"
1712 class D(B, C):
1713 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001714 vereq(D.mro(), [D, B, C, A, object])
1715 vereq(D.__mro__, (D, B, C, A, object))
1716 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001717
Guido van Rossumd3077402001-08-12 05:24:18 +00001718 class PerverseMetaType(type):
1719 def mro(cls):
1720 L = type.mro(cls)
1721 L.reverse()
1722 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001723 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001724 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001725 vereq(X.__mro__, (object, A, C, B, D, X))
1726 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001727
Armin Rigo037d1e02005-12-29 17:07:39 +00001728 try:
1729 class X(object):
1730 class __metaclass__(type):
1731 def mro(self):
1732 return [self, dict, object]
1733 except TypeError:
1734 pass
1735 else:
1736 raise TestFailed, "devious mro() return not caught"
1737
1738 try:
1739 class X(object):
1740 class __metaclass__(type):
1741 def mro(self):
1742 return [1]
1743 except TypeError:
1744 pass
1745 else:
1746 raise TestFailed, "non-class mro() return not caught"
1747
1748 try:
1749 class X(object):
1750 class __metaclass__(type):
1751 def mro(self):
1752 return 1
1753 except TypeError:
1754 pass
1755 else:
1756 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001757
Armin Rigo037d1e02005-12-29 17:07:39 +00001758
Tim Peters6d6c1a32001-08-02 04:15:00 +00001759def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001760 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001761
1762 class B(object):
1763 "Intermediate class because object doesn't have a __setattr__"
1764
1765 class C(B):
1766
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001767 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001768 if name == "foo":
1769 return ("getattr", name)
1770 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001771 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001772 def __setattr__(self, name, value):
1773 if name == "foo":
1774 self.setattr = (name, value)
1775 else:
1776 return B.__setattr__(self, name, value)
1777 def __delattr__(self, name):
1778 if name == "foo":
1779 self.delattr = name
1780 else:
1781 return B.__delattr__(self, name)
1782
1783 def __getitem__(self, key):
1784 return ("getitem", key)
1785 def __setitem__(self, key, value):
1786 self.setitem = (key, value)
1787 def __delitem__(self, key):
1788 self.delitem = key
1789
1790 def __getslice__(self, i, j):
1791 return ("getslice", i, j)
1792 def __setslice__(self, i, j, value):
1793 self.setslice = (i, j, value)
1794 def __delslice__(self, i, j):
1795 self.delslice = (i, j)
1796
1797 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001798 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001799 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001800 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001801 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001802 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001803
Guido van Rossum45704552001-10-08 16:35:45 +00001804 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001805 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001806 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001807 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001808 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001809
Guido van Rossum45704552001-10-08 16:35:45 +00001810 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001811 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001812 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001813 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001814 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001815
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001816def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001817 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001818 class C(object):
1819 def __init__(self, x):
1820 self.x = x
1821 def foo(self):
1822 return self.x
1823 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001824 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001825 class D(C):
1826 boo = C.foo
1827 goo = c1.foo
1828 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001829 vereq(d2.foo(), 2)
1830 vereq(d2.boo(), 2)
1831 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001832 class E(object):
1833 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001834 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001835 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001836
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001837def specials():
1838 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001839 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001840 # Test the default behavior for static classes
1841 class C(object):
1842 def __getitem__(self, i):
1843 if 0 <= i < 10: return i
1844 raise IndexError
1845 c1 = C()
1846 c2 = C()
1847 verify(not not c1)
Tim Peters85b362f2006-04-11 01:21:00 +00001848 verify(id(c1) != id(c2))
1849 hash(c1)
1850 hash(c2)
Guido van Rossum45704552001-10-08 16:35:45 +00001851 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1852 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001853 verify(c1 != c2)
1854 verify(not c1 != c1)
1855 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001856 # Note that the module name appears in str/repr, and that varies
1857 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001858 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001859 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001860 verify(-1 not in c1)
1861 for i in range(10):
1862 verify(i in c1)
1863 verify(10 not in c1)
1864 # Test the default behavior for dynamic classes
1865 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001866 def __getitem__(self, i):
1867 if 0 <= i < 10: return i
1868 raise IndexError
1869 d1 = D()
1870 d2 = D()
1871 verify(not not d1)
Tim Peters85b362f2006-04-11 01:21:00 +00001872 verify(id(d1) != id(d2))
1873 hash(d1)
1874 hash(d2)
Guido van Rossum45704552001-10-08 16:35:45 +00001875 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1876 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001877 verify(d1 != d2)
1878 verify(not d1 != d1)
1879 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001880 # Note that the module name appears in str/repr, and that varies
1881 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001882 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001883 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001884 verify(-1 not in d1)
1885 for i in range(10):
1886 verify(i in d1)
1887 verify(10 not in d1)
1888 # Test overridden behavior for static classes
1889 class Proxy(object):
1890 def __init__(self, x):
1891 self.x = x
1892 def __nonzero__(self):
1893 return not not self.x
1894 def __hash__(self):
1895 return hash(self.x)
1896 def __eq__(self, other):
1897 return self.x == other
1898 def __ne__(self, other):
1899 return self.x != other
1900 def __cmp__(self, other):
1901 return cmp(self.x, other.x)
1902 def __str__(self):
1903 return "Proxy:%s" % self.x
1904 def __repr__(self):
1905 return "Proxy(%r)" % self.x
1906 def __contains__(self, value):
1907 return value in self.x
1908 p0 = Proxy(0)
1909 p1 = Proxy(1)
1910 p_1 = Proxy(-1)
1911 verify(not p0)
1912 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001913 vereq(hash(p0), hash(0))
1914 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001915 verify(p0 != p1)
1916 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001917 vereq(not p0, p1)
1918 vereq(cmp(p0, p1), -1)
1919 vereq(cmp(p0, p0), 0)
1920 vereq(cmp(p0, p_1), 1)
1921 vereq(str(p0), "Proxy:0")
1922 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001923 p10 = Proxy(range(10))
1924 verify(-1 not in p10)
1925 for i in range(10):
1926 verify(i in p10)
1927 verify(10 not in p10)
1928 # Test overridden behavior for dynamic classes
1929 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001930 def __init__(self, x):
1931 self.x = x
1932 def __nonzero__(self):
1933 return not not self.x
1934 def __hash__(self):
1935 return hash(self.x)
1936 def __eq__(self, other):
1937 return self.x == other
1938 def __ne__(self, other):
1939 return self.x != other
1940 def __cmp__(self, other):
1941 return cmp(self.x, other.x)
1942 def __str__(self):
1943 return "DProxy:%s" % self.x
1944 def __repr__(self):
1945 return "DProxy(%r)" % self.x
1946 def __contains__(self, value):
1947 return value in self.x
1948 p0 = DProxy(0)
1949 p1 = DProxy(1)
1950 p_1 = DProxy(-1)
1951 verify(not p0)
1952 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001953 vereq(hash(p0), hash(0))
1954 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001955 verify(p0 != p1)
1956 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001957 vereq(not p0, p1)
1958 vereq(cmp(p0, p1), -1)
1959 vereq(cmp(p0, p0), 0)
1960 vereq(cmp(p0, p_1), 1)
1961 vereq(str(p0), "DProxy:0")
1962 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001963 p10 = DProxy(range(10))
1964 verify(-1 not in p10)
1965 for i in range(10):
1966 verify(i in p10)
1967 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001968 # Safety test for __cmp__
1969 def unsafecmp(a, b):
1970 try:
1971 a.__class__.__cmp__(a, b)
1972 except TypeError:
1973 pass
1974 else:
1975 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1976 a.__class__, a, b)
1977 unsafecmp(u"123", "123")
1978 unsafecmp("123", u"123")
1979 unsafecmp(1, 1.0)
1980 unsafecmp(1.0, 1)
1981 unsafecmp(1, 1L)
1982 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001983
Neal Norwitz1a997502003-01-13 20:13:12 +00001984 class Letter(str):
1985 def __new__(cls, letter):
1986 if letter == 'EPS':
1987 return str.__new__(cls)
1988 return str.__new__(cls, letter)
1989 def __str__(self):
1990 if not self:
1991 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001992 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001993
1994 # sys.stdout needs to be the original to trigger the recursion bug
1995 import sys
1996 test_stdout = sys.stdout
1997 sys.stdout = get_original_stdout()
1998 try:
1999 # nothing should actually be printed, this should raise an exception
2000 print Letter('w')
2001 except RuntimeError:
2002 pass
2003 else:
2004 raise TestFailed, "expected a RuntimeError for print recursion"
2005 sys.stdout = test_stdout
2006
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002007def weakrefs():
2008 if verbose: print "Testing weak references..."
2009 import weakref
2010 class C(object):
2011 pass
2012 c = C()
2013 r = weakref.ref(c)
2014 verify(r() is c)
2015 del c
2016 verify(r() is None)
2017 del r
2018 class NoWeak(object):
2019 __slots__ = ['foo']
2020 no = NoWeak()
2021 try:
2022 weakref.ref(no)
2023 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00002024 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002025 else:
2026 verify(0, "weakref.ref(no) should be illegal")
2027 class Weak(object):
2028 __slots__ = ['foo', '__weakref__']
2029 yes = Weak()
2030 r = weakref.ref(yes)
2031 verify(r() is yes)
2032 del yes
2033 verify(r() is None)
2034 del r
2035
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002036def properties():
2037 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002038 class C(object):
2039 def getx(self):
2040 return self.__x
2041 def setx(self, value):
2042 self.__x = value
2043 def delx(self):
2044 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00002045 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002046 a = C()
2047 verify(not hasattr(a, "x"))
2048 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00002049 vereq(a._C__x, 42)
2050 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002051 del a.x
2052 verify(not hasattr(a, "x"))
2053 verify(not hasattr(a, "_C__x"))
2054 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00002055 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00002056 C.x.__delete__(a)
2057 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002058
Tim Peters66c1a522001-09-24 21:17:50 +00002059 raw = C.__dict__['x']
2060 verify(isinstance(raw, property))
2061
2062 attrs = dir(raw)
2063 verify("__doc__" in attrs)
2064 verify("fget" in attrs)
2065 verify("fset" in attrs)
2066 verify("fdel" in attrs)
2067
Guido van Rossum45704552001-10-08 16:35:45 +00002068 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00002069 verify(raw.fget is C.__dict__['getx'])
2070 verify(raw.fset is C.__dict__['setx'])
2071 verify(raw.fdel is C.__dict__['delx'])
2072
2073 for attr in "__doc__", "fget", "fset", "fdel":
2074 try:
2075 setattr(raw, attr, 42)
2076 except TypeError, msg:
2077 if str(msg).find('readonly') < 0:
2078 raise TestFailed("when setting readonly attr %r on a "
2079 "property, got unexpected TypeError "
2080 "msg %r" % (attr, str(msg)))
2081 else:
2082 raise TestFailed("expected TypeError from trying to set "
2083 "readonly %r attr on a property" % attr)
2084
Neal Norwitz673cd822002-10-18 16:33:13 +00002085 class D(object):
2086 __getitem__ = property(lambda s: 1/0)
2087
2088 d = D()
2089 try:
2090 for i in d:
2091 str(i)
2092 except ZeroDivisionError:
2093 pass
2094 else:
2095 raise TestFailed, "expected ZeroDivisionError from bad property"
2096
Georg Brandl533ff6f2006-03-08 18:09:27 +00002097 class E(object):
2098 def getter(self):
2099 "getter method"
2100 return 0
2101 def setter(self, value):
2102 "setter method"
2103 pass
2104 prop = property(getter)
2105 vereq(prop.__doc__, "getter method")
2106 prop2 = property(fset=setter)
2107 vereq(prop2.__doc__, None)
2108
Georg Brandle9462c72006-08-04 18:03:37 +00002109 # this segfaulted in 2.5b2
2110 try:
2111 import _testcapi
2112 except ImportError:
2113 pass
2114 else:
2115 class X(object):
2116 p = property(_testcapi.test_with_docstring)
2117
2118
Guido van Rossumc4a18802001-08-24 16:55:27 +00002119def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00002120 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00002121
2122 class A(object):
2123 def meth(self, a):
2124 return "A(%r)" % a
2125
Guido van Rossum45704552001-10-08 16:35:45 +00002126 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002127
2128 class B(A):
2129 def __init__(self):
2130 self.__super = super(B, self)
2131 def meth(self, a):
2132 return "B(%r)" % a + self.__super.meth(a)
2133
Guido van Rossum45704552001-10-08 16:35:45 +00002134 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002135
2136 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002137 def meth(self, a):
2138 return "C(%r)" % a + self.__super.meth(a)
2139 C._C__super = super(C)
2140
Guido van Rossum45704552001-10-08 16:35:45 +00002141 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002142
2143 class D(C, B):
2144 def meth(self, a):
2145 return "D(%r)" % a + super(D, self).meth(a)
2146
Guido van Rossum5b443c62001-12-03 15:38:28 +00002147 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2148
2149 # Test for subclassing super
2150
2151 class mysuper(super):
2152 def __init__(self, *args):
2153 return super(mysuper, self).__init__(*args)
2154
2155 class E(D):
2156 def meth(self, a):
2157 return "E(%r)" % a + mysuper(E, self).meth(a)
2158
2159 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2160
2161 class F(E):
2162 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002163 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002164 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2165 F._F__super = mysuper(F)
2166
2167 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2168
2169 # Make sure certain errors are raised
2170
2171 try:
2172 super(D, 42)
2173 except TypeError:
2174 pass
2175 else:
2176 raise TestFailed, "shouldn't allow super(D, 42)"
2177
2178 try:
2179 super(D, C())
2180 except TypeError:
2181 pass
2182 else:
2183 raise TestFailed, "shouldn't allow super(D, C())"
2184
2185 try:
2186 super(D).__get__(12)
2187 except TypeError:
2188 pass
2189 else:
2190 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2191
2192 try:
2193 super(D).__get__(C())
2194 except TypeError:
2195 pass
2196 else:
2197 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002198
Guido van Rossuma4541a32003-04-16 20:02:22 +00002199 # Make sure data descriptors can be overridden and accessed via super
2200 # (new feature in Python 2.3)
2201
2202 class DDbase(object):
2203 def getx(self): return 42
2204 x = property(getx)
2205
2206 class DDsub(DDbase):
2207 def getx(self): return "hello"
2208 x = property(getx)
2209
2210 dd = DDsub()
2211 vereq(dd.x, "hello")
2212 vereq(super(DDsub, dd).x, 42)
2213
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002214 # Ensure that super() lookup of descriptor from classmethod
2215 # works (SF ID# 743627)
2216
2217 class Base(object):
2218 aProp = property(lambda self: "foo")
2219
2220 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002221 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002222 def test(klass):
2223 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002224
2225 veris(Sub.test(), Base.aProp)
2226
Georg Brandl5d59c092006-09-30 08:43:30 +00002227 # Verify that super() doesn't allow keyword args
2228 try:
2229 super(Base, kw=1)
2230 except TypeError:
2231 pass
2232 else:
2233 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002234
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002235def inherits():
2236 if verbose: print "Testing inheritance from basic types..."
2237
2238 class hexint(int):
2239 def __repr__(self):
2240 return hex(self)
2241 def __add__(self, other):
2242 return hexint(int.__add__(self, other))
2243 # (Note that overriding __radd__ doesn't work,
2244 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002245 vereq(repr(hexint(7) + 9), "0x10")
2246 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002247 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(a, 12345)
2249 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002250 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002251 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002252 verify((+a).__class__ is int)
2253 verify((a >> 0).__class__ is int)
2254 verify((a << 0).__class__ is int)
2255 verify((hexint(0) << 12).__class__ is int)
2256 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002257
2258 class octlong(long):
2259 __slots__ = []
2260 def __str__(self):
2261 s = oct(self)
2262 if s[-1] == 'L':
2263 s = s[:-1]
2264 return s
2265 def __add__(self, other):
2266 return self.__class__(super(octlong, self).__add__(other))
2267 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002269 # (Note that overriding __radd__ here only seems to work
2270 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002272 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002273 vereq(a, 12345L)
2274 vereq(long(a), 12345L)
2275 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002276 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002277 verify((+a).__class__ is long)
2278 verify((-a).__class__ is long)
2279 verify((-octlong(0)).__class__ is long)
2280 verify((a >> 0).__class__ is long)
2281 verify((a << 0).__class__ is long)
2282 verify((a - 0).__class__ is long)
2283 verify((a * 1).__class__ is long)
2284 verify((a ** 1).__class__ is long)
2285 verify((a // 1).__class__ is long)
2286 verify((1 * a).__class__ is long)
2287 verify((a | 0).__class__ is long)
2288 verify((a ^ 0).__class__ is long)
2289 verify((a & -1L).__class__ is long)
2290 verify((octlong(0) << 12).__class__ is long)
2291 verify((octlong(0) >> 12).__class__ is long)
2292 verify(abs(octlong(0)).__class__ is long)
2293
2294 # Because octlong overrides __add__, we can't check the absence of +0
2295 # optimizations using octlong.
2296 class longclone(long):
2297 pass
2298 a = longclone(1)
2299 verify((a + 0).__class__ is long)
2300 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002301
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002302 # Check that negative clones don't segfault
2303 a = longclone(-1)
2304 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002305 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002306
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002307 class precfloat(float):
2308 __slots__ = ['prec']
2309 def __init__(self, value=0.0, prec=12):
2310 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002311 def __repr__(self):
2312 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002313 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002314 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002315 vereq(a, 12345.0)
2316 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002317 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002318 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002319 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002320
Tim Peters2400fa42001-09-12 19:12:49 +00002321 class madcomplex(complex):
2322 def __repr__(self):
2323 return "%.17gj%+.17g" % (self.imag, self.real)
2324 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002326 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002327 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002328 vereq(a, base)
2329 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002330 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002331 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002332 vereq(repr(a), "4j-3")
2333 vereq(a, base)
2334 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002335 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002336 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002337 veris((+a).__class__, complex)
2338 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002340 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002341 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002342 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002344 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002345 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002346
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002347 class madtuple(tuple):
2348 _rev = None
2349 def rev(self):
2350 if self._rev is not None:
2351 return self._rev
2352 L = list(self)
2353 L.reverse()
2354 self._rev = self.__class__(L)
2355 return self._rev
2356 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2358 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2359 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002360 for i in range(512):
2361 t = madtuple(range(i))
2362 u = t.rev()
2363 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002364 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002365 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002366 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002367 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002368 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002369 verify(a[:].__class__ is tuple)
2370 verify((a * 1).__class__ is tuple)
2371 verify((a * 0).__class__ is tuple)
2372 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002373 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002374 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002375 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002376 verify((a + a).__class__ is tuple)
2377 verify((a * 0).__class__ is tuple)
2378 verify((a * 1).__class__ is tuple)
2379 verify((a * 2).__class__ is tuple)
2380 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002381
2382 class madstring(str):
2383 _rev = None
2384 def rev(self):
2385 if self._rev is not None:
2386 return self._rev
2387 L = list(self)
2388 L.reverse()
2389 self._rev = self.__class__("".join(L))
2390 return self._rev
2391 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002392 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2393 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2394 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002395 for i in range(256):
2396 s = madstring("".join(map(chr, range(i))))
2397 t = s.rev()
2398 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002399 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002400 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002401 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002402 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002403
Tim Peters8fa5dd02001-09-12 02:18:30 +00002404 base = "\x00" * 5
2405 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002406 vereq(s, base)
2407 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002408 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002409 vereq(hash(s), hash(base))
2410 vereq({s: 1}[base], 1)
2411 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002412 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002413 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002414 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002415 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002416 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002417 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002418 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002419 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002420 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002421 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002422 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002423 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002424 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002425 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002426 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002427 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002428 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002429 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002430 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002431 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002432 identitytab = ''.join([chr(i) for i in range(256)])
2433 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002434 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002435 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002436 vereq(s.translate(identitytab, "x"), base)
2437 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002438 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002439 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002440 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002441 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002442 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002443 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002444 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002445 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002446 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002447 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002448
Guido van Rossum91ee7982001-08-30 20:52:40 +00002449 class madunicode(unicode):
2450 _rev = None
2451 def rev(self):
2452 if self._rev is not None:
2453 return self._rev
2454 L = list(self)
2455 L.reverse()
2456 self._rev = self.__class__(u"".join(L))
2457 return self._rev
2458 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002459 vereq(u, u"ABCDEF")
2460 vereq(u.rev(), madunicode(u"FEDCBA"))
2461 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002462 base = u"12345"
2463 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002464 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002465 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002466 vereq(hash(u), hash(base))
2467 vereq({u: 1}[base], 1)
2468 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002469 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002470 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002471 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002472 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002473 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002474 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002475 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002476 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002477 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002478 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002479 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002480 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002481 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002482 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002483 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002484 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002485 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002486 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002487 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002488 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002489 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002490 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002491 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002492 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002493 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002494 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002495 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002496 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002497 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002498 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002499 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002500 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002501 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002502 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002503 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002504 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002505 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002506 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002507
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002508 class sublist(list):
2509 pass
2510 a = sublist(range(5))
2511 vereq(a, range(5))
2512 a.append("hello")
2513 vereq(a, range(5) + ["hello"])
2514 a[5] = 5
2515 vereq(a, range(6))
2516 a.extend(range(6, 20))
2517 vereq(a, range(20))
2518 a[-5:] = []
2519 vereq(a, range(15))
2520 del a[10:15]
2521 vereq(len(a), 10)
2522 vereq(a, range(10))
2523 vereq(list(a), range(10))
2524 vereq(a[0], 0)
2525 vereq(a[9], 9)
2526 vereq(a[-10], 0)
2527 vereq(a[-1], 9)
2528 vereq(a[:5], range(5))
2529
Tim Peters59c9a642001-09-13 05:38:56 +00002530 class CountedInput(file):
2531 """Counts lines read by self.readline().
2532
2533 self.lineno is the 0-based ordinal of the last line read, up to
2534 a maximum of one greater than the number of lines in the file.
2535
2536 self.ateof is true if and only if the final "" line has been read,
2537 at which point self.lineno stops incrementing, and further calls
2538 to readline() continue to return "".
2539 """
2540
2541 lineno = 0
2542 ateof = 0
2543 def readline(self):
2544 if self.ateof:
2545 return ""
2546 s = file.readline(self)
2547 # Next line works too.
2548 # s = super(CountedInput, self).readline()
2549 self.lineno += 1
2550 if s == "":
2551 self.ateof = 1
2552 return s
2553
Tim Peters561f8992001-09-13 19:36:36 +00002554 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002555 lines = ['a\n', 'b\n', 'c\n']
2556 try:
2557 f.writelines(lines)
2558 f.close()
2559 f = CountedInput(TESTFN)
2560 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2561 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002562 vereq(expected, got)
2563 vereq(f.lineno, i)
2564 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002565 f.close()
2566 finally:
2567 try:
2568 f.close()
2569 except:
2570 pass
2571 try:
2572 import os
2573 os.unlink(TESTFN)
2574 except:
2575 pass
2576
Tim Peters808b94e2001-09-13 19:33:07 +00002577def keywords():
2578 if verbose:
2579 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002580 vereq(int(x=1), 1)
2581 vereq(float(x=2), 2.0)
2582 vereq(long(x=3), 3L)
2583 vereq(complex(imag=42, real=666), complex(666, 42))
2584 vereq(str(object=500), '500')
2585 vereq(unicode(string='abc', errors='strict'), u'abc')
2586 vereq(tuple(sequence=range(3)), (0, 1, 2))
2587 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002588 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002589
2590 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002591 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002592 try:
2593 constructor(bogus_keyword_arg=1)
2594 except TypeError:
2595 pass
2596 else:
2597 raise TestFailed("expected TypeError from bogus keyword "
2598 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002599
Tim Peters8fa45672001-09-13 21:01:29 +00002600def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002601 # XXX This test is disabled because rexec is not deemed safe
2602 return
Tim Peters8fa45672001-09-13 21:01:29 +00002603 import rexec
2604 if verbose:
2605 print "Testing interaction with restricted execution ..."
2606
2607 sandbox = rexec.RExec()
2608
2609 code1 = """f = open(%r, 'w')""" % TESTFN
2610 code2 = """f = file(%r, 'w')""" % TESTFN
2611 code3 = """\
2612f = open(%r)
2613t = type(f) # a sneaky way to get the file() constructor
2614f.close()
2615f = t(%r, 'w') # rexec can't catch this by itself
2616""" % (TESTFN, TESTFN)
2617
2618 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2619 f.close()
2620
2621 try:
2622 for code in code1, code2, code3:
2623 try:
2624 sandbox.r_exec(code)
2625 except IOError, msg:
2626 if str(msg).find("restricted") >= 0:
2627 outcome = "OK"
2628 else:
2629 outcome = "got an exception, but not an expected one"
2630 else:
2631 outcome = "expected a restricted-execution exception"
2632
2633 if outcome != "OK":
2634 raise TestFailed("%s, in %r" % (outcome, code))
2635
2636 finally:
2637 try:
2638 import os
2639 os.unlink(TESTFN)
2640 except:
2641 pass
2642
Tim Peters0ab085c2001-09-14 00:25:33 +00002643def str_subclass_as_dict_key():
2644 if verbose:
2645 print "Testing a str subclass used as dict key .."
2646
2647 class cistr(str):
2648 """Sublcass of str that computes __eq__ case-insensitively.
2649
2650 Also computes a hash code of the string in canonical form.
2651 """
2652
2653 def __init__(self, value):
2654 self.canonical = value.lower()
2655 self.hashcode = hash(self.canonical)
2656
2657 def __eq__(self, other):
2658 if not isinstance(other, cistr):
2659 other = cistr(other)
2660 return self.canonical == other.canonical
2661
2662 def __hash__(self):
2663 return self.hashcode
2664
Guido van Rossum45704552001-10-08 16:35:45 +00002665 vereq(cistr('ABC'), 'abc')
2666 vereq('aBc', cistr('ABC'))
2667 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002668
2669 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002670 vereq(d[cistr('one')], 1)
2671 vereq(d[cistr('tWo')], 2)
2672 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002673 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002674 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002675
Guido van Rossumab3b0342001-09-18 20:38:53 +00002676def classic_comparisons():
2677 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002678 class classic:
2679 pass
2680 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002681 if verbose: print " (base = %s)" % base
2682 class C(base):
2683 def __init__(self, value):
2684 self.value = int(value)
2685 def __cmp__(self, other):
2686 if isinstance(other, C):
2687 return cmp(self.value, other.value)
2688 if isinstance(other, int) or isinstance(other, long):
2689 return cmp(self.value, other)
2690 return NotImplemented
2691 c1 = C(1)
2692 c2 = C(2)
2693 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002694 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002695 c = {1: c1, 2: c2, 3: c3}
2696 for x in 1, 2, 3:
2697 for y in 1, 2, 3:
2698 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2699 for op in "<", "<=", "==", "!=", ">", ">=":
2700 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2701 "x=%d, y=%d" % (x, y))
2702 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2703 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2704
Guido van Rossum0639f592001-09-18 21:06:04 +00002705def rich_comparisons():
2706 if verbose:
2707 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002708 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002709 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002710 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002711 vereq(z, 1+0j)
2712 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002713 class ZZ(complex):
2714 def __eq__(self, other):
2715 try:
2716 return abs(self - other) <= 1e-6
2717 except:
2718 return NotImplemented
2719 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002720 vereq(zz, 1+0j)
2721 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002722
Guido van Rossum0639f592001-09-18 21:06:04 +00002723 class classic:
2724 pass
2725 for base in (classic, int, object, list):
2726 if verbose: print " (base = %s)" % base
2727 class C(base):
2728 def __init__(self, value):
2729 self.value = int(value)
2730 def __cmp__(self, other):
2731 raise TestFailed, "shouldn't call __cmp__"
2732 def __eq__(self, other):
2733 if isinstance(other, C):
2734 return self.value == other.value
2735 if isinstance(other, int) or isinstance(other, long):
2736 return self.value == other
2737 return NotImplemented
2738 def __ne__(self, other):
2739 if isinstance(other, C):
2740 return self.value != other.value
2741 if isinstance(other, int) or isinstance(other, long):
2742 return self.value != other
2743 return NotImplemented
2744 def __lt__(self, other):
2745 if isinstance(other, C):
2746 return self.value < other.value
2747 if isinstance(other, int) or isinstance(other, long):
2748 return self.value < other
2749 return NotImplemented
2750 def __le__(self, other):
2751 if isinstance(other, C):
2752 return self.value <= other.value
2753 if isinstance(other, int) or isinstance(other, long):
2754 return self.value <= other
2755 return NotImplemented
2756 def __gt__(self, other):
2757 if isinstance(other, C):
2758 return self.value > other.value
2759 if isinstance(other, int) or isinstance(other, long):
2760 return self.value > other
2761 return NotImplemented
2762 def __ge__(self, other):
2763 if isinstance(other, C):
2764 return self.value >= other.value
2765 if isinstance(other, int) or isinstance(other, long):
2766 return self.value >= other
2767 return NotImplemented
2768 c1 = C(1)
2769 c2 = C(2)
2770 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002771 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002772 c = {1: c1, 2: c2, 3: c3}
2773 for x in 1, 2, 3:
2774 for y in 1, 2, 3:
2775 for op in "<", "<=", "==", "!=", ">", ">=":
2776 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2777 "x=%d, y=%d" % (x, y))
2778 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2779 "x=%d, y=%d" % (x, y))
2780 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2781 "x=%d, y=%d" % (x, y))
2782
Guido van Rossum1952e382001-09-19 01:25:16 +00002783def coercions():
2784 if verbose: print "Testing coercions..."
2785 class I(int): pass
2786 coerce(I(0), 0)
2787 coerce(0, I(0))
2788 class L(long): pass
2789 coerce(L(0), 0)
2790 coerce(L(0), 0L)
2791 coerce(0, L(0))
2792 coerce(0L, L(0))
2793 class F(float): pass
2794 coerce(F(0), 0)
2795 coerce(F(0), 0L)
2796 coerce(F(0), 0.)
2797 coerce(0, F(0))
2798 coerce(0L, F(0))
2799 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002800 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002801 coerce(C(0), 0)
2802 coerce(C(0), 0L)
2803 coerce(C(0), 0.)
2804 coerce(C(0), 0j)
2805 coerce(0, C(0))
2806 coerce(0L, C(0))
2807 coerce(0., C(0))
2808 coerce(0j, C(0))
2809
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002810def descrdoc():
2811 if verbose: print "Testing descriptor doc strings..."
2812 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002813 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002814 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002815 check(file.name, "file name") # member descriptor
2816
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002817def setclass():
2818 if verbose: print "Testing __class__ assignment..."
2819 class C(object): pass
2820 class D(object): pass
2821 class E(object): pass
2822 class F(D, E): pass
2823 for cls in C, D, E, F:
2824 for cls2 in C, D, E, F:
2825 x = cls()
2826 x.__class__ = cls2
2827 verify(x.__class__ is cls2)
2828 x.__class__ = cls
2829 verify(x.__class__ is cls)
2830 def cant(x, C):
2831 try:
2832 x.__class__ = C
2833 except TypeError:
2834 pass
2835 else:
2836 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002837 try:
2838 delattr(x, "__class__")
2839 except TypeError:
2840 pass
2841 else:
2842 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002843 cant(C(), list)
2844 cant(list(), C)
2845 cant(C(), 1)
2846 cant(C(), object)
2847 cant(object(), list)
2848 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002849 class Int(int): __slots__ = []
2850 cant(2, Int)
2851 cant(Int(), int)
2852 cant(True, int)
2853 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002854 o = object()
2855 cant(o, type(1))
2856 cant(o, type(None))
2857 del o
Žiga Seilnacht6f2d09c2007-03-16 11:59:38 +00002858 class G(object):
2859 __slots__ = ["a", "b"]
2860 class H(object):
2861 __slots__ = ["b", "a"]
2862 try:
2863 unicode
2864 except NameError:
2865 class I(object):
2866 __slots__ = ["a", "b"]
2867 else:
2868 class I(object):
2869 __slots__ = [unicode("a"), unicode("b")]
2870 class J(object):
2871 __slots__ = ["c", "b"]
2872 class K(object):
2873 __slots__ = ["a", "b", "d"]
2874 class L(H):
2875 __slots__ = ["e"]
2876 class M(I):
2877 __slots__ = ["e"]
2878 class N(J):
2879 __slots__ = ["__weakref__"]
2880 class P(J):
2881 __slots__ = ["__dict__"]
2882 class Q(J):
2883 pass
2884 class R(J):
2885 __slots__ = ["__dict__", "__weakref__"]
2886
2887 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2888 x = cls()
2889 x.a = 1
2890 x.__class__ = cls2
2891 verify(x.__class__ is cls2,
2892 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2893 vereq(x.a, 1)
2894 x.__class__ = cls
2895 verify(x.__class__ is cls,
2896 "assigning %r as __class__ for %r silently failed" % (cls, x))
2897 vereq(x.a, 1)
2898 for cls in G, J, K, L, M, N, P, R, list, Int:
2899 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2900 if cls is cls2:
2901 continue
2902 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002903
Guido van Rossum6661be32001-10-26 04:26:12 +00002904def setdict():
2905 if verbose: print "Testing __dict__ assignment..."
2906 class C(object): pass
2907 a = C()
2908 a.__dict__ = {'b': 1}
2909 vereq(a.b, 1)
2910 def cant(x, dict):
2911 try:
2912 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002913 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002914 pass
2915 else:
2916 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2917 cant(a, None)
2918 cant(a, [])
2919 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002920 del a.__dict__ # Deleting __dict__ is allowed
Armin Rigo9790a272007-05-02 19:23:31 +00002921
2922 class Base(object):
2923 pass
2924 def verify_dict_readonly(x):
2925 """
2926 x has to be an instance of a class inheriting from Base.
2927 """
2928 cant(x, {})
2929 try:
2930 del x.__dict__
2931 except (AttributeError, TypeError):
2932 pass
2933 else:
2934 raise TestFailed, "shouldn't allow del %r.__dict__" % x
2935 dict_descr = Base.__dict__["__dict__"]
2936 try:
2937 dict_descr.__set__(x, {})
2938 except (AttributeError, TypeError):
2939 pass
2940 else:
2941 raise TestFailed, "dict_descr allowed access to %r's dict" % x
2942
2943 # Classes don't allow __dict__ assignment and have readonly dicts
2944 class Meta1(type, Base):
2945 pass
2946 class Meta2(Base, type):
2947 pass
2948 class D(object):
2949 __metaclass__ = Meta1
2950 class E(object):
2951 __metaclass__ = Meta2
2952 for cls in C, D, E:
2953 verify_dict_readonly(cls)
2954 class_dict = cls.__dict__
2955 try:
2956 class_dict["spam"] = "eggs"
2957 except TypeError:
2958 pass
2959 else:
2960 raise TestFailed, "%r's __dict__ can be modified" % cls
2961
2962 # Modules also disallow __dict__ assignment
2963 class Module1(types.ModuleType, Base):
2964 pass
2965 class Module2(Base, types.ModuleType):
2966 pass
2967 for ModuleType in Module1, Module2:
2968 mod = ModuleType("spam")
2969 verify_dict_readonly(mod)
2970 mod.__dict__["spam"] = "eggs"
2971
2972 # Exception's __dict__ can be replaced, but not deleted
2973 class Exception1(Exception, Base):
2974 pass
2975 class Exception2(Base, Exception):
2976 pass
2977 for ExceptionType in Exception, Exception1, Exception2:
2978 e = ExceptionType()
2979 e.__dict__ = {"a": 1}
2980 vereq(e.a, 1)
2981 try:
2982 del e.__dict__
2983 except (TypeError, AttributeError):
2984 pass
2985 else:
2986 raise TestFaied, "%r's __dict__ can be deleted" % e
2987
Guido van Rossum6661be32001-10-26 04:26:12 +00002988
Guido van Rossum3926a632001-09-25 16:25:58 +00002989def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002990 if verbose:
2991 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002992 import pickle, cPickle
2993
2994 def sorteditems(d):
2995 L = d.items()
2996 L.sort()
2997 return L
2998
2999 global C
3000 class C(object):
3001 def __init__(self, a, b):
3002 super(C, self).__init__()
3003 self.a = a
3004 self.b = b
3005 def __repr__(self):
3006 return "C(%r, %r)" % (self.a, self.b)
3007
3008 global C1
3009 class C1(list):
3010 def __new__(cls, a, b):
3011 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00003012 def __getnewargs__(self):
3013 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00003014 def __init__(self, a, b):
3015 self.a = a
3016 self.b = b
3017 def __repr__(self):
3018 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3019
3020 global C2
3021 class C2(int):
3022 def __new__(cls, a, b, val=0):
3023 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00003024 def __getnewargs__(self):
3025 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00003026 def __init__(self, a, b, val=0):
3027 self.a = a
3028 self.b = b
3029 def __repr__(self):
3030 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3031
Guido van Rossum90c45142001-11-24 21:07:01 +00003032 global C3
3033 class C3(object):
3034 def __init__(self, foo):
3035 self.foo = foo
3036 def __getstate__(self):
3037 return self.foo
3038 def __setstate__(self, foo):
3039 self.foo = foo
3040
3041 global C4classic, C4
3042 class C4classic: # classic
3043 pass
3044 class C4(C4classic, object): # mixed inheritance
3045 pass
3046
Guido van Rossum3926a632001-09-25 16:25:58 +00003047 for p in pickle, cPickle:
3048 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003049 if verbose:
3050 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00003051
3052 for cls in C, C1, C2:
3053 s = p.dumps(cls, bin)
3054 cls2 = p.loads(s)
3055 verify(cls2 is cls)
3056
3057 a = C1(1, 2); a.append(42); a.append(24)
3058 b = C2("hello", "world", 42)
3059 s = p.dumps((a, b), bin)
3060 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00003061 vereq(x.__class__, a.__class__)
3062 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3063 vereq(y.__class__, b.__class__)
3064 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003065 vereq(repr(x), repr(a))
3066 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00003067 if verbose:
3068 print "a = x =", a
3069 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00003070 # Test for __getstate__ and __setstate__ on new style class
3071 u = C3(42)
3072 s = p.dumps(u, bin)
3073 v = p.loads(s)
3074 veris(u.__class__, v.__class__)
3075 vereq(u.foo, v.foo)
3076 # Test for picklability of hybrid class
3077 u = C4()
3078 u.foo = 42
3079 s = p.dumps(u, bin)
3080 v = p.loads(s)
3081 veris(u.__class__, v.__class__)
3082 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003083
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003084 # Testing copy.deepcopy()
3085 if verbose:
3086 print "deepcopy"
3087 import copy
3088 for cls in C, C1, C2:
3089 cls2 = copy.deepcopy(cls)
3090 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003091
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003092 a = C1(1, 2); a.append(42); a.append(24)
3093 b = C2("hello", "world", 42)
3094 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003095 vereq(x.__class__, a.__class__)
3096 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3097 vereq(y.__class__, b.__class__)
3098 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003099 vereq(repr(x), repr(a))
3100 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003101 if verbose:
3102 print "a = x =", a
3103 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003104
Guido van Rossum8c842552002-03-14 23:05:54 +00003105def pickleslots():
3106 if verbose: print "Testing pickling of classes with __slots__ ..."
3107 import pickle, cPickle
3108 # Pickling of classes with __slots__ but without __getstate__ should fail
3109 global B, C, D, E
3110 class B(object):
3111 pass
3112 for base in [object, B]:
3113 class C(base):
3114 __slots__ = ['a']
3115 class D(C):
3116 pass
3117 try:
3118 pickle.dumps(C())
3119 except TypeError:
3120 pass
3121 else:
3122 raise TestFailed, "should fail: pickle C instance - %s" % base
3123 try:
3124 cPickle.dumps(C())
3125 except TypeError:
3126 pass
3127 else:
3128 raise TestFailed, "should fail: cPickle C instance - %s" % base
3129 try:
3130 pickle.dumps(C())
3131 except TypeError:
3132 pass
3133 else:
3134 raise TestFailed, "should fail: pickle D instance - %s" % base
3135 try:
3136 cPickle.dumps(D())
3137 except TypeError:
3138 pass
3139 else:
3140 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003141 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003142 class C(base):
3143 __slots__ = ['a']
3144 def __getstate__(self):
3145 try:
3146 d = self.__dict__.copy()
3147 except AttributeError:
3148 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003149 for cls in self.__class__.__mro__:
3150 for sn in cls.__dict__.get('__slots__', ()):
3151 try:
3152 d[sn] = getattr(self, sn)
3153 except AttributeError:
3154 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003155 return d
3156 def __setstate__(self, d):
3157 for k, v in d.items():
3158 setattr(self, k, v)
3159 class D(C):
3160 pass
3161 # Now it should work
3162 x = C()
3163 y = pickle.loads(pickle.dumps(x))
3164 vereq(hasattr(y, 'a'), 0)
3165 y = cPickle.loads(cPickle.dumps(x))
3166 vereq(hasattr(y, 'a'), 0)
3167 x.a = 42
3168 y = pickle.loads(pickle.dumps(x))
3169 vereq(y.a, 42)
3170 y = cPickle.loads(cPickle.dumps(x))
3171 vereq(y.a, 42)
3172 x = D()
3173 x.a = 42
3174 x.b = 100
3175 y = pickle.loads(pickle.dumps(x))
3176 vereq(y.a + y.b, 142)
3177 y = cPickle.loads(cPickle.dumps(x))
3178 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003179 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003180 class E(C):
3181 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003182 x = E()
3183 x.a = 42
3184 x.b = "foo"
3185 y = pickle.loads(pickle.dumps(x))
3186 vereq(y.a, x.a)
3187 vereq(y.b, x.b)
3188 y = cPickle.loads(cPickle.dumps(x))
3189 vereq(y.a, x.a)
3190 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003191
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003192def copies():
3193 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
3194 import copy
3195 class C(object):
3196 pass
3197
3198 a = C()
3199 a.foo = 12
3200 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003201 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003202
3203 a.bar = [1,2,3]
3204 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003205 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003206 verify(c.bar is a.bar)
3207
3208 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003209 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003210 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003211 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003212
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003213def binopoverride():
3214 if verbose: print "Testing overrides of binary operations..."
3215 class I(int):
3216 def __repr__(self):
3217 return "I(%r)" % int(self)
3218 def __add__(self, other):
3219 return I(int(self) + int(other))
3220 __radd__ = __add__
3221 def __pow__(self, other, mod=None):
3222 if mod is None:
3223 return I(pow(int(self), int(other)))
3224 else:
3225 return I(pow(int(self), int(other), int(mod)))
3226 def __rpow__(self, other, mod=None):
3227 if mod is None:
3228 return I(pow(int(other), int(self), mod))
3229 else:
3230 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003231
Walter Dörwald70a6b492004-02-12 17:35:32 +00003232 vereq(repr(I(1) + I(2)), "I(3)")
3233 vereq(repr(I(1) + 2), "I(3)")
3234 vereq(repr(1 + I(2)), "I(3)")
3235 vereq(repr(I(2) ** I(3)), "I(8)")
3236 vereq(repr(2 ** I(3)), "I(8)")
3237 vereq(repr(I(2) ** 3), "I(8)")
3238 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003239 class S(str):
3240 def __eq__(self, other):
3241 return self.lower() == other.lower()
3242
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003243def subclasspropagation():
3244 if verbose: print "Testing propagation of slot functions to subclasses..."
3245 class A(object):
3246 pass
3247 class B(A):
3248 pass
3249 class C(A):
3250 pass
3251 class D(B, C):
3252 pass
3253 d = D()
Tim Peters171b8682006-04-11 01:59:34 +00003254 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003255 A.__hash__ = lambda self: 42
3256 vereq(hash(d), 42)
3257 C.__hash__ = lambda self: 314
3258 vereq(hash(d), 314)
3259 B.__hash__ = lambda self: 144
3260 vereq(hash(d), 144)
3261 D.__hash__ = lambda self: 100
3262 vereq(hash(d), 100)
3263 del D.__hash__
3264 vereq(hash(d), 144)
3265 del B.__hash__
3266 vereq(hash(d), 314)
3267 del C.__hash__
3268 vereq(hash(d), 42)
3269 del A.__hash__
Tim Peters171b8682006-04-11 01:59:34 +00003270 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003271 d.foo = 42
3272 d.bar = 42
3273 vereq(d.foo, 42)
3274 vereq(d.bar, 42)
3275 def __getattribute__(self, name):
3276 if name == "foo":
3277 return 24
3278 return object.__getattribute__(self, name)
3279 A.__getattribute__ = __getattribute__
3280 vereq(d.foo, 24)
3281 vereq(d.bar, 42)
3282 def __getattr__(self, name):
3283 if name in ("spam", "foo", "bar"):
3284 return "hello"
3285 raise AttributeError, name
3286 B.__getattr__ = __getattr__
3287 vereq(d.spam, "hello")
3288 vereq(d.foo, 24)
3289 vereq(d.bar, 42)
3290 del A.__getattribute__
3291 vereq(d.foo, 42)
3292 del d.foo
3293 vereq(d.foo, "hello")
3294 vereq(d.bar, 42)
3295 del B.__getattr__
3296 try:
3297 d.foo
3298 except AttributeError:
3299 pass
3300 else:
3301 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003302
Guido van Rossume7f3e242002-06-14 02:35:45 +00003303 # Test a nasty bug in recurse_down_subclasses()
3304 import gc
3305 class A(object):
3306 pass
3307 class B(A):
3308 pass
3309 del B
3310 gc.collect()
3311 A.__setitem__ = lambda *a: None # crash
3312
Tim Petersfc57ccb2001-10-12 02:38:24 +00003313def buffer_inherit():
3314 import binascii
3315 # SF bug [#470040] ParseTuple t# vs subclasses.
3316 if verbose:
3317 print "Testing that buffer interface is inherited ..."
3318
3319 class MyStr(str):
3320 pass
3321 base = 'abc'
3322 m = MyStr(base)
3323 # b2a_hex uses the buffer interface to get its argument's value, via
3324 # PyArg_ParseTuple 't#' code.
3325 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3326
3327 # It's not clear that unicode will continue to support the character
3328 # buffer interface, and this test will fail if that's taken away.
3329 class MyUni(unicode):
3330 pass
3331 base = u'abc'
3332 m = MyUni(base)
3333 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3334
3335 class MyInt(int):
3336 pass
3337 m = MyInt(42)
3338 try:
3339 binascii.b2a_hex(m)
3340 raise TestFailed('subclass of int should not have a buffer interface')
3341 except TypeError:
3342 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003343
Tim Petersc9933152001-10-16 20:18:24 +00003344def str_of_str_subclass():
3345 import binascii
3346 import cStringIO
3347
3348 if verbose:
3349 print "Testing __str__ defined in subclass of str ..."
3350
3351 class octetstring(str):
3352 def __str__(self):
3353 return binascii.b2a_hex(self)
3354 def __repr__(self):
3355 return self + " repr"
3356
3357 o = octetstring('A')
3358 vereq(type(o), octetstring)
3359 vereq(type(str(o)), str)
3360 vereq(type(repr(o)), str)
3361 vereq(ord(o), 0x41)
3362 vereq(str(o), '41')
3363 vereq(repr(o), 'A repr')
3364 vereq(o.__str__(), '41')
3365 vereq(o.__repr__(), 'A repr')
3366
3367 capture = cStringIO.StringIO()
3368 # Calling str() or not exercises different internal paths.
3369 print >> capture, o
3370 print >> capture, str(o)
3371 vereq(capture.getvalue(), '41\n41\n')
3372 capture.close()
3373
Guido van Rossumc8e56452001-10-22 00:43:43 +00003374def kwdargs():
3375 if verbose: print "Testing keyword arguments to __init__, __call__..."
3376 def f(a): return a
3377 vereq(f.__call__(a=42), 42)
3378 a = []
3379 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003380 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003381
Brett Cannon22565aa2006-06-09 22:31:23 +00003382def recursive__call__():
3383 if verbose: print ("Testing recursive __call__() by setting to instance of "
3384 "class ...")
3385 class A(object):
3386 pass
3387
3388 A.__call__ = A()
3389 try:
3390 A()()
3391 except RuntimeError:
3392 pass
3393 else:
3394 raise TestFailed("Recursion limit should have been reached for "
3395 "__call__()")
3396
Guido van Rossumed87ad82001-10-30 02:33:02 +00003397def delhook():
3398 if verbose: print "Testing __del__ hook..."
3399 log = []
3400 class C(object):
3401 def __del__(self):
3402 log.append(1)
3403 c = C()
3404 vereq(log, [])
3405 del c
3406 vereq(log, [1])
3407
Guido van Rossum29d26062001-12-11 04:37:34 +00003408 class D(object): pass
3409 d = D()
3410 try: del d[0]
3411 except TypeError: pass
3412 else: raise TestFailed, "invalid del() didn't raise TypeError"
3413
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003414def hashinherit():
3415 if verbose: print "Testing hash of mutable subclasses..."
3416
3417 class mydict(dict):
3418 pass
3419 d = mydict()
3420 try:
3421 hash(d)
3422 except TypeError:
3423 pass
3424 else:
3425 raise TestFailed, "hash() of dict subclass should fail"
3426
3427 class mylist(list):
3428 pass
3429 d = mylist()
3430 try:
3431 hash(d)
3432 except TypeError:
3433 pass
3434 else:
3435 raise TestFailed, "hash() of list subclass should fail"
3436
Guido van Rossum29d26062001-12-11 04:37:34 +00003437def strops():
3438 try: 'a' + 5
3439 except TypeError: pass
3440 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3441
3442 try: ''.split('')
3443 except ValueError: pass
3444 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3445
3446 try: ''.join([0])
3447 except TypeError: pass
3448 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3449
3450 try: ''.rindex('5')
3451 except ValueError: pass
3452 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3453
Guido van Rossum29d26062001-12-11 04:37:34 +00003454 try: '%(n)s' % None
3455 except TypeError: pass
3456 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3457
3458 try: '%(n' % {}
3459 except ValueError: pass
3460 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3461
3462 try: '%*s' % ('abc')
3463 except TypeError: pass
3464 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3465
3466 try: '%*.*s' % ('abc', 5)
3467 except TypeError: pass
3468 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3469
3470 try: '%s' % (1, 2)
3471 except TypeError: pass
3472 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3473
3474 try: '%' % None
3475 except ValueError: pass
3476 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3477
3478 vereq('534253'.isdigit(), 1)
3479 vereq('534253x'.isdigit(), 0)
3480 vereq('%c' % 5, '\x05')
3481 vereq('%c' % '5', '5')
3482
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003483def deepcopyrecursive():
3484 if verbose: print "Testing deepcopy of recursive objects..."
3485 class Node:
3486 pass
3487 a = Node()
3488 b = Node()
3489 a.b = b
3490 b.a = a
3491 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003492
Guido van Rossumd7035672002-03-12 20:43:31 +00003493def modules():
3494 if verbose: print "Testing uninitialized module objects..."
3495 from types import ModuleType as M
3496 m = M.__new__(M)
3497 str(m)
3498 vereq(hasattr(m, "__name__"), 0)
3499 vereq(hasattr(m, "__file__"), 0)
3500 vereq(hasattr(m, "foo"), 0)
3501 vereq(m.__dict__, None)
3502 m.foo = 1
3503 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003504
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003505def dictproxyiterkeys():
3506 class C(object):
3507 def meth(self):
3508 pass
3509 if verbose: print "Testing dict-proxy iterkeys..."
3510 keys = [ key for key in C.__dict__.iterkeys() ]
3511 keys.sort()
3512 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3513
3514def dictproxyitervalues():
3515 class C(object):
3516 def meth(self):
3517 pass
3518 if verbose: print "Testing dict-proxy itervalues..."
3519 values = [ values for values in C.__dict__.itervalues() ]
3520 vereq(len(values), 5)
3521
3522def dictproxyiteritems():
3523 class C(object):
3524 def meth(self):
3525 pass
3526 if verbose: print "Testing dict-proxy iteritems..."
3527 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3528 keys.sort()
3529 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3530
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003531def funnynew():
3532 if verbose: print "Testing __new__ returning something unexpected..."
3533 class C(object):
3534 def __new__(cls, arg):
3535 if isinstance(arg, str): return [1, 2, 3]
3536 elif isinstance(arg, int): return object.__new__(D)
3537 else: return object.__new__(cls)
3538 class D(C):
3539 def __init__(self, arg):
3540 self.foo = arg
3541 vereq(C("1"), [1, 2, 3])
3542 vereq(D("1"), [1, 2, 3])
3543 d = D(None)
3544 veris(d.foo, None)
3545 d = C(1)
3546 vereq(isinstance(d, D), True)
3547 vereq(d.foo, 1)
3548 d = D(1)
3549 vereq(isinstance(d, D), True)
3550 vereq(d.foo, 1)
3551
Guido van Rossume8fc6402002-04-16 16:44:51 +00003552def imulbug():
3553 # SF bug 544647
3554 if verbose: print "Testing for __imul__ problems..."
3555 class C(object):
3556 def __imul__(self, other):
3557 return (self, other)
3558 x = C()
3559 y = x
3560 y *= 1.0
3561 vereq(y, (x, 1.0))
3562 y = x
3563 y *= 2
3564 vereq(y, (x, 2))
3565 y = x
3566 y *= 3L
3567 vereq(y, (x, 3L))
3568 y = x
3569 y *= 1L<<100
3570 vereq(y, (x, 1L<<100))
3571 y = x
3572 y *= None
3573 vereq(y, (x, None))
3574 y = x
3575 y *= "foo"
3576 vereq(y, (x, "foo"))
3577
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003578def docdescriptor():
3579 # SF bug 542984
3580 if verbose: print "Testing __doc__ descriptor..."
3581 class DocDescr(object):
3582 def __get__(self, object, otype):
3583 if object:
3584 object = object.__class__.__name__ + ' instance'
3585 if otype:
3586 otype = otype.__name__
3587 return 'object=%s; type=%s' % (object, otype)
3588 class OldClass:
3589 __doc__ = DocDescr()
3590 class NewClass(object):
3591 __doc__ = DocDescr()
3592 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3593 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3594 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3595 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3596
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003597def copy_setstate():
3598 if verbose:
3599 print "Testing that copy.*copy() correctly uses __setstate__..."
3600 import copy
3601 class C(object):
3602 def __init__(self, foo=None):
3603 self.foo = foo
3604 self.__foo = foo
3605 def setfoo(self, foo=None):
3606 self.foo = foo
3607 def getfoo(self):
3608 return self.__foo
3609 def __getstate__(self):
3610 return [self.foo]
3611 def __setstate__(self, lst):
3612 assert len(lst) == 1
3613 self.__foo = self.foo = lst[0]
3614 a = C(42)
3615 a.setfoo(24)
3616 vereq(a.foo, 24)
3617 vereq(a.getfoo(), 42)
3618 b = copy.copy(a)
3619 vereq(b.foo, 24)
3620 vereq(b.getfoo(), 24)
3621 b = copy.deepcopy(a)
3622 vereq(b.foo, 24)
3623 vereq(b.getfoo(), 24)
3624
Guido van Rossum09638c12002-06-13 19:17:46 +00003625def slices():
3626 if verbose:
3627 print "Testing cases with slices and overridden __getitem__ ..."
3628 # Strings
3629 vereq("hello"[:4], "hell")
3630 vereq("hello"[slice(4)], "hell")
3631 vereq(str.__getitem__("hello", slice(4)), "hell")
3632 class S(str):
3633 def __getitem__(self, x):
3634 return str.__getitem__(self, x)
3635 vereq(S("hello")[:4], "hell")
3636 vereq(S("hello")[slice(4)], "hell")
3637 vereq(S("hello").__getitem__(slice(4)), "hell")
3638 # Tuples
3639 vereq((1,2,3)[:2], (1,2))
3640 vereq((1,2,3)[slice(2)], (1,2))
3641 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3642 class T(tuple):
3643 def __getitem__(self, x):
3644 return tuple.__getitem__(self, x)
3645 vereq(T((1,2,3))[:2], (1,2))
3646 vereq(T((1,2,3))[slice(2)], (1,2))
3647 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3648 # Lists
3649 vereq([1,2,3][:2], [1,2])
3650 vereq([1,2,3][slice(2)], [1,2])
3651 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3652 class L(list):
3653 def __getitem__(self, x):
3654 return list.__getitem__(self, x)
3655 vereq(L([1,2,3])[:2], [1,2])
3656 vereq(L([1,2,3])[slice(2)], [1,2])
3657 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3658 # Now do lists and __setitem__
3659 a = L([1,2,3])
3660 a[slice(1, 3)] = [3,2]
3661 vereq(a, [1,3,2])
3662 a[slice(0, 2, 1)] = [3,1]
3663 vereq(a, [3,1,2])
3664 a.__setitem__(slice(1, 3), [2,1])
3665 vereq(a, [3,2,1])
3666 a.__setitem__(slice(0, 2, 1), [2,3])
3667 vereq(a, [2,3,1])
3668
Tim Peters2484aae2002-07-11 06:56:07 +00003669def subtype_resurrection():
3670 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003671 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003672
3673 class C(object):
3674 container = []
3675
3676 def __del__(self):
3677 # resurrect the instance
3678 C.container.append(self)
3679
3680 c = C()
3681 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003682 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003683 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003684 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003685
3686 # If that didn't blow up, it's also interesting to see whether clearing
3687 # the last container slot works: that will attempt to delete c again,
3688 # which will cause c to get appended back to the container again "during"
3689 # the del.
3690 del C.container[-1]
3691 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003692 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003693
Tim Peters14cb1e12002-07-11 18:26:21 +00003694 # Make c mortal again, so that the test framework with -l doesn't report
3695 # it as a leak.
3696 del C.__del__
3697
Guido van Rossum2d702462002-08-06 21:28:28 +00003698def slottrash():
3699 # Deallocating deeply nested slotted trash caused stack overflows
3700 if verbose:
3701 print "Testing slot trash..."
3702 class trash(object):
3703 __slots__ = ['x']
3704 def __init__(self, x):
3705 self.x = x
3706 o = None
3707 for i in xrange(50000):
3708 o = trash(o)
3709 del o
3710
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003711def slotmultipleinheritance():
3712 # SF bug 575229, multiple inheritance w/ slots dumps core
3713 class A(object):
3714 __slots__=()
3715 class B(object):
3716 pass
3717 class C(A,B) :
3718 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003719 vereq(C.__basicsize__, B.__basicsize__)
3720 verify(hasattr(C, '__dict__'))
3721 verify(hasattr(C, '__weakref__'))
3722 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003723
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003724def testrmul():
3725 # SF patch 592646
3726 if verbose:
3727 print "Testing correct invocation of __rmul__..."
3728 class C(object):
3729 def __mul__(self, other):
3730 return "mul"
3731 def __rmul__(self, other):
3732 return "rmul"
3733 a = C()
3734 vereq(a*2, "mul")
3735 vereq(a*2.2, "mul")
3736 vereq(2*a, "rmul")
3737 vereq(2.2*a, "rmul")
3738
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003739def testipow():
3740 # [SF bug 620179]
3741 if verbose:
3742 print "Testing correct invocation of __ipow__..."
3743 class C(object):
3744 def __ipow__(self, other):
3745 pass
3746 a = C()
3747 a **= 2
3748
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003749def do_this_first():
3750 if verbose:
3751 print "Testing SF bug 551412 ..."
3752 # This dumps core when SF bug 551412 isn't fixed --
3753 # but only when test_descr.py is run separately.
3754 # (That can't be helped -- as soon as PyType_Ready()
3755 # is called for PyLong_Type, the bug is gone.)
3756 class UserLong(object):
3757 def __pow__(self, *args):
3758 pass
3759 try:
3760 pow(0L, UserLong(), 0L)
3761 except:
3762 pass
3763
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003764 if verbose:
3765 print "Testing SF bug 570483..."
3766 # Another segfault only when run early
3767 # (before PyType_Ready(tuple) is called)
3768 type.mro(tuple)
3769
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003770def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003771 if verbose:
3772 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003773 # stuff that should work:
3774 class C(object):
3775 pass
3776 class C2(object):
3777 def __getattribute__(self, attr):
3778 if attr == 'a':
3779 return 2
3780 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003781 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003782 def meth(self):
3783 return 1
3784 class D(C):
3785 pass
3786 class E(D):
3787 pass
3788 d = D()
3789 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003790 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003791 D.__bases__ = (C2,)
3792 vereq(d.meth(), 1)
3793 vereq(e.meth(), 1)
3794 vereq(d.a, 2)
3795 vereq(e.a, 2)
3796 vereq(C2.__subclasses__(), [D])
3797
3798 # stuff that shouldn't:
3799 class L(list):
3800 pass
3801
3802 try:
3803 L.__bases__ = (dict,)
3804 except TypeError:
3805 pass
3806 else:
3807 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3808
3809 try:
3810 list.__bases__ = (dict,)
3811 except TypeError:
3812 pass
3813 else:
3814 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3815
3816 try:
Michael W. Hudsonf3904422006-11-23 13:54:04 +00003817 D.__bases__ = (C2, list)
3818 except TypeError:
3819 pass
3820 else:
3821 assert 0, "best_base calculation found wanting"
3822
3823 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003824 del D.__bases__
3825 except TypeError:
3826 pass
3827 else:
3828 raise TestFailed, "shouldn't be able to delete .__bases__"
3829
3830 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003831 D.__bases__ = ()
3832 except TypeError, msg:
3833 if str(msg) == "a new-style class can't have only classic bases":
3834 raise TestFailed, "wrong error message for .__bases__ = ()"
3835 else:
3836 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3837
3838 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003839 D.__bases__ = (D,)
3840 except TypeError:
3841 pass
3842 else:
3843 # actually, we'll have crashed by here...
3844 raise TestFailed, "shouldn't be able to create inheritance cycles"
3845
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003846 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003847 D.__bases__ = (C, C)
3848 except TypeError:
3849 pass
3850 else:
3851 raise TestFailed, "didn't detect repeated base classes"
3852
3853 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003854 D.__bases__ = (E,)
3855 except TypeError:
3856 pass
3857 else:
3858 raise TestFailed, "shouldn't be able to create inheritance cycles"
3859
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003860 # let's throw a classic class into the mix:
3861 class Classic:
3862 def meth2(self):
3863 return 3
3864
3865 D.__bases__ = (C, Classic)
3866
3867 vereq(d.meth2(), 3)
3868 vereq(e.meth2(), 3)
3869 try:
3870 d.a
3871 except AttributeError:
3872 pass
3873 else:
3874 raise TestFailed, "attribute should have vanished"
3875
3876 try:
3877 D.__bases__ = (Classic,)
3878 except TypeError:
3879 pass
3880 else:
3881 raise TestFailed, "new-style class must have a new-style base"
3882
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003883def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003884 if verbose:
3885 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003886 class WorkOnce(type):
3887 def __new__(self, name, bases, ns):
3888 self.flag = 0
3889 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3890 def mro(self):
3891 if self.flag > 0:
3892 raise RuntimeError, "bozo"
3893 else:
3894 self.flag += 1
3895 return type.mro(self)
3896
3897 class WorkAlways(type):
3898 def mro(self):
3899 # this is here to make sure that .mro()s aren't called
3900 # with an exception set (which was possible at one point).
3901 # An error message will be printed in a debug build.
3902 # What's a good way to test for this?
3903 return type.mro(self)
3904
3905 class C(object):
3906 pass
3907
3908 class C2(object):
3909 pass
3910
3911 class D(C):
3912 pass
3913
3914 class E(D):
3915 pass
3916
3917 class F(D):
3918 __metaclass__ = WorkOnce
3919
3920 class G(D):
3921 __metaclass__ = WorkAlways
3922
3923 # Immediate subclasses have their mro's adjusted in alphabetical
3924 # order, so E's will get adjusted before adjusting F's fails. We
3925 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003926
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003927 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003928 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003929
3930 try:
3931 D.__bases__ = (C2,)
3932 except RuntimeError:
3933 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003934 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003935 else:
3936 raise TestFailed, "exception not propagated"
3937
3938def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003939 if verbose:
3940 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003941 class A(object):
3942 pass
3943
3944 class B(object):
3945 pass
3946
3947 class C(A, B):
3948 pass
3949
3950 class D(A, B):
3951 pass
3952
3953 class E(C, D):
3954 pass
3955
3956 try:
3957 C.__bases__ = (B, A)
3958 except TypeError:
3959 pass
3960 else:
3961 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003962
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003963def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003964 if verbose:
3965 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003966 class C(object):
3967 pass
3968
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003969 # C.__module__ could be 'test_descr' or '__main__'
3970 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003971
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003972 C.__name__ = 'D'
3973 vereq((C.__module__, C.__name__), (mod, 'D'))
3974
3975 C.__name__ = 'D.E'
3976 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003977
Guido van Rossum613f24f2003-01-06 23:00:59 +00003978def subclass_right_op():
3979 if verbose:
3980 print "Testing correct dispatch of subclass overloading __r<op>__..."
3981
3982 # This code tests various cases where right-dispatch of a subclass
3983 # should be preferred over left-dispatch of a base class.
3984
3985 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3986
3987 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003988 def __floordiv__(self, other):
3989 return "B.__floordiv__"
3990 def __rfloordiv__(self, other):
3991 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003992
Guido van Rossumf389c772003-02-27 20:04:19 +00003993 vereq(B(1) // 1, "B.__floordiv__")
3994 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003995
3996 # Case 2: subclass of object; this is just the baseline for case 3
3997
3998 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003999 def __floordiv__(self, other):
4000 return "C.__floordiv__"
4001 def __rfloordiv__(self, other):
4002 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004003
Guido van Rossumf389c772003-02-27 20:04:19 +00004004 vereq(C() // 1, "C.__floordiv__")
4005 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004006
4007 # Case 3: subclass of new-style class; here it gets interesting
4008
4009 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00004010 def __floordiv__(self, other):
4011 return "D.__floordiv__"
4012 def __rfloordiv__(self, other):
4013 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004014
Guido van Rossumf389c772003-02-27 20:04:19 +00004015 vereq(D() // C(), "D.__floordiv__")
4016 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004017
4018 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4019
4020 class E(C):
4021 pass
4022
Guido van Rossumf389c772003-02-27 20:04:19 +00004023 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00004024
Guido van Rossumf389c772003-02-27 20:04:19 +00004025 vereq(E() // 1, "C.__floordiv__")
4026 vereq(1 // E(), "C.__rfloordiv__")
4027 vereq(E() // C(), "C.__floordiv__")
4028 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00004029
Guido van Rossum373c7412003-01-07 13:41:37 +00004030def dict_type_with_metaclass():
4031 if verbose:
4032 print "Testing type of __dict__ when __metaclass__ set..."
4033
4034 class B(object):
4035 pass
4036 class M(type):
4037 pass
4038 class C:
4039 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4040 __metaclass__ = M
4041 veris(type(C.__dict__), type(B.__dict__))
4042
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004043def meth_class_get():
4044 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004045 if verbose:
4046 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004047 # Baseline
4048 arg = [1, 2, 3]
4049 res = {1: None, 2: None, 3: None}
4050 vereq(dict.fromkeys(arg), res)
4051 vereq({}.fromkeys(arg), res)
4052 # Now get the descriptor
4053 descr = dict.__dict__["fromkeys"]
4054 # More baseline using the descriptor directly
4055 vereq(descr.__get__(None, dict)(arg), res)
4056 vereq(descr.__get__({})(arg), res)
4057 # Now check various error cases
4058 try:
4059 descr.__get__(None, None)
4060 except TypeError:
4061 pass
4062 else:
4063 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
4064 try:
4065 descr.__get__(42)
4066 except TypeError:
4067 pass
4068 else:
4069 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
4070 try:
4071 descr.__get__(None, 42)
4072 except TypeError:
4073 pass
4074 else:
4075 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
4076 try:
4077 descr.__get__(None, int)
4078 except TypeError:
4079 pass
4080 else:
4081 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
4082
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004083def isinst_isclass():
4084 if verbose:
4085 print "Testing proxy isinstance() and isclass()..."
4086 class Proxy(object):
4087 def __init__(self, obj):
4088 self.__obj = obj
4089 def __getattribute__(self, name):
4090 if name.startswith("_Proxy__"):
4091 return object.__getattribute__(self, name)
4092 else:
4093 return getattr(self.__obj, name)
4094 # Test with a classic class
4095 class C:
4096 pass
4097 a = C()
4098 pa = Proxy(a)
4099 verify(isinstance(a, C)) # Baseline
4100 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004101 # Test with a classic subclass
4102 class D(C):
4103 pass
4104 a = D()
4105 pa = Proxy(a)
4106 verify(isinstance(a, C)) # Baseline
4107 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004108 # Test with a new-style class
4109 class C(object):
4110 pass
4111 a = C()
4112 pa = Proxy(a)
4113 verify(isinstance(a, C)) # Baseline
4114 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004115 # Test with a new-style subclass
4116 class D(C):
4117 pass
4118 a = D()
4119 pa = Proxy(a)
4120 verify(isinstance(a, C)) # Baseline
4121 verify(isinstance(pa, C)) # Test
4122
4123def proxysuper():
4124 if verbose:
4125 print "Testing super() for a proxy object..."
4126 class Proxy(object):
4127 def __init__(self, obj):
4128 self.__obj = obj
4129 def __getattribute__(self, name):
4130 if name.startswith("_Proxy__"):
4131 return object.__getattribute__(self, name)
4132 else:
4133 return getattr(self.__obj, name)
4134
4135 class B(object):
4136 def f(self):
4137 return "B.f"
4138
4139 class C(B):
4140 def f(self):
4141 return super(C, self).f() + "->C.f"
4142
4143 obj = C()
4144 p = Proxy(obj)
4145 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004146
Guido van Rossum52b27052003-04-15 20:05:10 +00004147def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004148 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00004149 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004150 try:
4151 object.__setattr__(str, "foo", 42)
4152 except TypeError:
4153 pass
4154 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004155 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004156 try:
4157 object.__delattr__(str, "lower")
4158 except TypeError:
4159 pass
4160 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004161 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004162
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004163def weakref_segfault():
4164 # SF 742911
4165 if verbose:
4166 print "Testing weakref segfault..."
4167
4168 import weakref
4169
4170 class Provoker:
4171 def __init__(self, referrent):
4172 self.ref = weakref.ref(referrent)
4173
4174 def __del__(self):
4175 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004176
4177 class Oops(object):
4178 pass
4179
4180 o = Oops()
4181 o.whatever = Provoker(o)
4182 del o
4183
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004184def wrapper_segfault():
4185 # SF 927248: deeply nested wrappers could cause stack overflow
4186 f = lambda:None
4187 for i in xrange(1000000):
4188 f = f.__call__
4189 f = None
4190
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004191# Fix SF #762455, segfault when sys.stdout is changed in getattr
4192def filefault():
4193 if verbose:
4194 print "Testing sys.stdout is changed in getattr..."
4195 import sys
4196 class StdoutGuard:
4197 def __getattr__(self, attr):
4198 sys.stdout = sys.__stdout__
4199 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4200 sys.stdout = StdoutGuard()
4201 try:
4202 print "Oops!"
4203 except RuntimeError:
4204 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004205
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004206def vicious_descriptor_nonsense():
4207 # A potential segfault spotted by Thomas Wouters in mail to
4208 # python-dev 2003-04-17, turned into an example & fixed by Michael
4209 # Hudson just less than four months later...
4210 if verbose:
4211 print "Testing vicious_descriptor_nonsense..."
4212
4213 class Evil(object):
4214 def __hash__(self):
4215 return hash('attr')
4216 def __eq__(self, other):
4217 del C.attr
4218 return 0
4219
4220 class Descr(object):
4221 def __get__(self, ob, type=None):
4222 return 1
4223
4224 class C(object):
4225 attr = Descr()
4226
4227 c = C()
4228 c.__dict__[Evil()] = 0
4229
4230 vereq(c.attr, 1)
4231 # this makes a crash more likely:
4232 import gc; gc.collect()
4233 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004234
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004235def test_init():
4236 # SF 1155938
4237 class Foo(object):
4238 def __init__(self):
4239 return 10
4240 try:
4241 Foo()
4242 except TypeError:
4243 pass
4244 else:
4245 raise TestFailed, "did not test __init__() for None return"
4246
Armin Rigoc6686b72005-11-07 08:38:00 +00004247def methodwrapper():
4248 # <type 'method-wrapper'> did not support any reflection before 2.5
4249 if verbose:
4250 print "Testing method-wrapper objects..."
4251
4252 l = []
4253 vereq(l.__add__, l.__add__)
Armin Rigofd01d792006-06-08 10:56:24 +00004254 vereq(l.__add__, [].__add__)
4255 verify(l.__add__ != [5].__add__)
4256 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004257 verify(l.__add__.__name__ == '__add__')
4258 verify(l.__add__.__self__ is l)
4259 verify(l.__add__.__objclass__ is list)
4260 vereq(l.__add__.__doc__, list.__add__.__doc__)
Armin Rigofd01d792006-06-08 10:56:24 +00004261 try:
4262 hash(l.__add__)
4263 except TypeError:
4264 pass
4265 else:
4266 raise TestFailed("no TypeError from hash([].__add__)")
4267
4268 t = ()
4269 t += (7,)
4270 vereq(t.__add__, (7,).__add__)
4271 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004272
Armin Rigofd163f92005-12-29 15:59:19 +00004273def notimplemented():
4274 # all binary methods should be able to return a NotImplemented
4275 if verbose:
4276 print "Testing NotImplemented..."
4277
4278 import sys
4279 import types
4280 import operator
4281
4282 def specialmethod(self, other):
4283 return NotImplemented
4284
4285 def check(expr, x, y):
4286 try:
4287 exec expr in {'x': x, 'y': y, 'operator': operator}
4288 except TypeError:
4289 pass
4290 else:
4291 raise TestFailed("no TypeError from %r" % (expr,))
4292
4293 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
4294 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4295 # ValueErrors instead of TypeErrors
4296 for metaclass in [type, types.ClassType]:
4297 for name, expr, iexpr in [
4298 ('__add__', 'x + y', 'x += y'),
4299 ('__sub__', 'x - y', 'x -= y'),
4300 ('__mul__', 'x * y', 'x *= y'),
4301 ('__truediv__', 'operator.truediv(x, y)', None),
4302 ('__floordiv__', 'operator.floordiv(x, y)', None),
4303 ('__div__', 'x / y', 'x /= y'),
4304 ('__mod__', 'x % y', 'x %= y'),
4305 ('__divmod__', 'divmod(x, y)', None),
4306 ('__pow__', 'x ** y', 'x **= y'),
4307 ('__lshift__', 'x << y', 'x <<= y'),
4308 ('__rshift__', 'x >> y', 'x >>= y'),
4309 ('__and__', 'x & y', 'x &= y'),
4310 ('__or__', 'x | y', 'x |= y'),
4311 ('__xor__', 'x ^ y', 'x ^= y'),
4312 ('__coerce__', 'coerce(x, y)', None)]:
4313 if name == '__coerce__':
4314 rname = name
4315 else:
4316 rname = '__r' + name[2:]
4317 A = metaclass('A', (), {name: specialmethod})
4318 B = metaclass('B', (), {rname: specialmethod})
4319 a = A()
4320 b = B()
4321 check(expr, a, a)
4322 check(expr, a, b)
4323 check(expr, b, a)
4324 check(expr, b, b)
4325 check(expr, a, N1)
4326 check(expr, a, N2)
4327 check(expr, N1, b)
4328 check(expr, N2, b)
4329 if iexpr:
4330 check(iexpr, a, a)
4331 check(iexpr, a, b)
4332 check(iexpr, b, a)
4333 check(iexpr, b, b)
4334 check(iexpr, a, N1)
4335 check(iexpr, a, N2)
4336 iname = '__i' + name[2:]
4337 C = metaclass('C', (), {iname: specialmethod})
4338 c = C()
4339 check(iexpr, c, a)
4340 check(iexpr, c, b)
4341 check(iexpr, c, N1)
4342 check(iexpr, c, N2)
4343
Georg Brandl0fca97a2007-03-05 22:28:08 +00004344def test_assign_slice():
4345 # ceval.c's assign_slice used to check for
4346 # tp->tp_as_sequence->sq_slice instead of
4347 # tp->tp_as_sequence->sq_ass_slice
4348
4349 class C(object):
4350 def __setslice__(self, start, stop, value):
4351 self.value = value
4352
4353 c = C()
4354 c[1:2] = 3
4355 vereq(c.value, 3)
4356
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004357def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004358 weakref_segfault() # Must be first, somehow
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004359 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004360 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004361 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004362 lists()
4363 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004364 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004365 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004366 ints()
4367 longs()
4368 floats()
4369 complexes()
4370 spamlists()
4371 spamdicts()
4372 pydicts()
4373 pylists()
4374 metaclass()
4375 pymods()
4376 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004377 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004378 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004379 ex5()
4380 monotonicity()
4381 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004382 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004383 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004384 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004385 dynamics()
Armin Rigoc0ba52d2007-04-19 14:44:48 +00004386 errors()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004387 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004388 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004389 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004390 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004391 classic()
4392 compattr()
4393 newslot()
4394 altmro()
4395 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004396 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004397 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004398 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004399 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004400 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004401 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004402 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004403 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004404 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004405 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004406 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004407 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004408 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004409 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004410 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004411 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004412 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004413 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004414 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004415 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004416 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004417 kwdargs()
Brett Cannon22565aa2006-06-09 22:31:23 +00004418 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004419 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004420 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004421 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004422 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004423 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004424 dictproxyiterkeys()
4425 dictproxyitervalues()
4426 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004427 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004428 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004429 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004430 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004431 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004432 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004433 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004434 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004435 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004436 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004437 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004438 test_mutable_bases()
4439 test_mutable_bases_with_failing_mro()
4440 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004441 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004442 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004443 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004444 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004445 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004446 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004447 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004448 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004449 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004450 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004451 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004452 notimplemented()
Georg Brandl0fca97a2007-03-05 22:28:08 +00004453 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004454
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004455 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004456
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004457if __name__ == "__main__":
4458 test_main()