blob: 3c29017ea49a73faa5e8f3b291c4fd3cf0706ecb [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Neal Norwitz1a997502003-01-13 20:13:12 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
Guido van Rossum03706d22008-01-18 21:31:32 +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
Tim Peters6d6c1a32001-08-02 04:15:00 +0000824def pymods():
825 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000826 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000827 import sys
828 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000829 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000830 def __init__(self, name):
831 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000832 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000833 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000834 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000835 def __setattr__(self, name, value):
836 log.append(("setattr", name, value))
837 MT.__setattr__(self, name, value)
838 def __delattr__(self, name):
839 log.append(("delattr", name))
840 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000841 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842 a.foo = 12
843 x = a.foo
844 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000845 vereq(log, [("setattr", "foo", 12),
846 ("getattr", "foo"),
847 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848
Guido van Rossum03706d22008-01-18 21:31:32 +0000849 # http://python.org/sf/1174712
850 try:
851 class Module(types.ModuleType, str):
852 pass
853 except TypeError:
854 pass
855 else:
856 raise TestFailed("inheriting from ModuleType and str at the "
857 "same time should fail")
858
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859def multi():
860 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000861 class C(object):
862 def __init__(self):
863 self.__state = 0
864 def getstate(self):
865 return self.__state
866 def setstate(self, state):
867 self.__state = state
868 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000869 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000870 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000871 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000872 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000873 def __init__(self):
874 type({}).__init__(self)
875 C.__init__(self)
876 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000878 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000879 vereq(d.items(), [("hello", "world")])
880 vereq(d["hello"], "world")
881 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000882 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000883 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000884 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000885
Guido van Rossume45763a2001-08-10 21:28:46 +0000886 # SF bug #442833
887 class Node(object):
888 def __int__(self):
889 return int(self.foo())
890 def foo(self):
891 return "23"
892 class Frag(Node, list):
893 def foo(self):
894 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000895 vereq(Node().__int__(), 23)
896 vereq(int(Node()), 23)
897 vereq(Frag().__int__(), 42)
898 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000899
Tim Petersa91e9642001-11-14 23:32:33 +0000900 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000901
902 class A:
903 x = 1
904
905 class B(A):
906 pass
907
908 class C(A):
909 x = 2
910
911 class D(B, C):
912 pass
913 vereq(D.x, 1)
914
915 # Classic MRO is preserved for a classic base class.
916 class E(D, object):
917 pass
918 vereq(E.__mro__, (E, D, B, A, C, object))
919 vereq(E.x, 1)
920
921 # But with a mix of classic bases, their MROs are combined using
922 # new-style MRO.
923 class F(B, C, object):
924 pass
925 vereq(F.__mro__, (F, B, C, A, object))
926 vereq(F.x, 2)
927
928 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000929 class C:
930 def cmethod(self):
931 return "C a"
932 def all_method(self):
933 return "C b"
934
935 class M1(C, object):
936 def m1method(self):
937 return "M1 a"
938 def all_method(self):
939 return "M1 b"
940
941 vereq(M1.__mro__, (M1, C, object))
942 m = M1()
943 vereq(m.cmethod(), "C a")
944 vereq(m.m1method(), "M1 a")
945 vereq(m.all_method(), "M1 b")
946
947 class D(C):
948 def dmethod(self):
949 return "D a"
950 def all_method(self):
951 return "D b"
952
Guido van Rossum9a818922002-11-14 19:50:14 +0000953 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000954 def m2method(self):
955 return "M2 a"
956 def all_method(self):
957 return "M2 b"
958
Guido van Rossum9a818922002-11-14 19:50:14 +0000959 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000960 m = M2()
961 vereq(m.cmethod(), "C a")
962 vereq(m.dmethod(), "D a")
963 vereq(m.m2method(), "M2 a")
964 vereq(m.all_method(), "M2 b")
965
Guido van Rossum9a818922002-11-14 19:50:14 +0000966 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000967 def m3method(self):
968 return "M3 a"
969 def all_method(self):
970 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000971 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000972 m = M3()
973 vereq(m.cmethod(), "C a")
974 vereq(m.dmethod(), "D a")
975 vereq(m.m1method(), "M1 a")
976 vereq(m.m2method(), "M2 a")
977 vereq(m.m3method(), "M3 a")
978 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000979
Guido van Rossume54616c2001-12-14 04:19:56 +0000980 class Classic:
981 pass
982 try:
983 class New(Classic):
984 __metaclass__ = type
985 except TypeError:
986 pass
987 else:
988 raise TestFailed, "new class with only classic bases - shouldn't be"
989
Tim Peters6d6c1a32001-08-02 04:15:00 +0000990def diamond():
991 if verbose: print "Testing multiple inheritance special cases..."
992 class A(object):
993 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000994 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000995 class B(A):
996 def boo(self): return "B"
997 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000998 vereq(B().spam(), "B")
999 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001000 class C(A):
1001 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +00001002 vereq(C().spam(), "A")
1003 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001004 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001005 vereq(D().spam(), "B")
1006 vereq(D().boo(), "B")
1007 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001009 vereq(E().spam(), "B")
1010 vereq(E().boo(), "C")
1011 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +00001012 # MRO order disagreement
1013 try:
1014 class F(D, E): pass
1015 except TypeError:
1016 pass
1017 else:
1018 raise TestFailed, "expected MRO order disagreement (F)"
1019 try:
1020 class G(E, D): pass
1021 except TypeError:
1022 pass
1023 else:
1024 raise TestFailed, "expected MRO order disagreement (G)"
1025
1026
1027# see thread python-dev/2002-October/029035.html
1028def ex5():
1029 if verbose: print "Testing ex5 from C3 switch discussion..."
1030 class A(object): pass
1031 class B(object): pass
1032 class C(object): pass
1033 class X(A): pass
1034 class Y(A): pass
1035 class Z(X,B,Y,C): pass
1036 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1037
1038# see "A Monotonic Superclass Linearization for Dylan",
1039# by Kim Barrett et al. (OOPSLA 1996)
1040def monotonicity():
1041 if verbose: print "Testing MRO monotonicity..."
1042 class Boat(object): pass
1043 class DayBoat(Boat): pass
1044 class WheelBoat(Boat): pass
1045 class EngineLess(DayBoat): pass
1046 class SmallMultihull(DayBoat): pass
1047 class PedalWheelBoat(EngineLess,WheelBoat): pass
1048 class SmallCatamaran(SmallMultihull): pass
1049 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1050
1051 vereq(PedalWheelBoat.__mro__,
1052 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1053 object))
1054 vereq(SmallCatamaran.__mro__,
1055 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1056
1057 vereq(Pedalo.__mro__,
1058 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1059 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1060
1061# see "A Monotonic Superclass Linearization for Dylan",
1062# by Kim Barrett et al. (OOPSLA 1996)
1063def consistency_with_epg():
1064 if verbose: print "Testing consistentcy with EPG..."
1065 class Pane(object): pass
1066 class ScrollingMixin(object): pass
1067 class EditingMixin(object): pass
1068 class ScrollablePane(Pane,ScrollingMixin): pass
1069 class EditablePane(Pane,EditingMixin): pass
1070 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1071
1072 vereq(EditableScrollablePane.__mro__,
1073 (EditableScrollablePane, ScrollablePane, EditablePane,
1074 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001075
Raymond Hettingerf394df42003-04-06 19:13:41 +00001076mro_err_msg = """Cannot create a consistent method resolution
1077order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +00001078
Guido van Rossumd32047f2002-11-25 21:38:52 +00001079def mro_disagreement():
1080 if verbose: print "Testing error messages for MRO disagreement..."
1081 def raises(exc, expected, callable, *args):
1082 try:
1083 callable(*args)
1084 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001085 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001086 raise TestFailed, "Message %r, expected %r" % (str(msg),
1087 expected)
1088 else:
1089 raise TestFailed, "Expected %s" % exc
1090 class A(object): pass
1091 class B(A): pass
1092 class C(object): pass
1093 # Test some very simple errors
1094 raises(TypeError, "duplicate base class A",
1095 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001096 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001097 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001098 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001099 type, "X", (A, C, B), {})
1100 # Test a slightly more complex error
1101 class GridLayout(object): pass
1102 class HorizontalGrid(GridLayout): pass
1103 class VerticalGrid(GridLayout): pass
1104 class HVGrid(HorizontalGrid, VerticalGrid): pass
1105 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +00001106 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001107 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1108
Guido van Rossum37202612001-08-09 19:45:21 +00001109def objects():
1110 if verbose: print "Testing object class..."
1111 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001112 vereq(a.__class__, object)
1113 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001114 b = object()
1115 verify(a is not b)
1116 verify(not hasattr(a, "foo"))
1117 try:
1118 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001119 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001120 pass
1121 else:
1122 verify(0, "object() should not allow setting a foo attribute")
1123 verify(not hasattr(object(), "__dict__"))
1124
1125 class Cdict(object):
1126 pass
1127 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001128 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001129 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001130 vereq(x.foo, 1)
1131 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001132
Tim Peters6d6c1a32001-08-02 04:15:00 +00001133def slots():
1134 if verbose: print "Testing __slots__..."
1135 class C0(object):
1136 __slots__ = []
1137 x = C0()
1138 verify(not hasattr(x, "__dict__"))
1139 verify(not hasattr(x, "foo"))
1140
1141 class C1(object):
1142 __slots__ = ['a']
1143 x = C1()
1144 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001145 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001146 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001147 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001148 x.a = None
1149 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001151 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001152
1153 class C3(object):
1154 __slots__ = ['a', 'b', 'c']
1155 x = C3()
1156 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001157 verify(not hasattr(x, 'a'))
1158 verify(not hasattr(x, 'b'))
1159 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001160 x.a = 1
1161 x.b = 2
1162 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001163 vereq(x.a, 1)
1164 vereq(x.b, 2)
1165 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001166
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001167 class C4(object):
1168 """Validate name mangling"""
1169 __slots__ = ['__a']
1170 def __init__(self, value):
1171 self.__a = value
1172 def get(self):
1173 return self.__a
1174 x = C4(5)
1175 verify(not hasattr(x, '__dict__'))
1176 verify(not hasattr(x, '__a'))
1177 vereq(x.get(), 5)
1178 try:
1179 x.__a = 6
1180 except AttributeError:
1181 pass
1182 else:
1183 raise TestFailed, "Double underscored names not mangled"
1184
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001185 # Make sure slot names are proper identifiers
1186 try:
1187 class C(object):
1188 __slots__ = [None]
1189 except TypeError:
1190 pass
1191 else:
1192 raise TestFailed, "[None] slots not caught"
1193 try:
1194 class C(object):
1195 __slots__ = ["foo bar"]
1196 except TypeError:
1197 pass
1198 else:
1199 raise TestFailed, "['foo bar'] slots not caught"
1200 try:
1201 class C(object):
1202 __slots__ = ["foo\0bar"]
1203 except TypeError:
1204 pass
1205 else:
1206 raise TestFailed, "['foo\\0bar'] slots not caught"
1207 try:
1208 class C(object):
1209 __slots__ = ["1"]
1210 except TypeError:
1211 pass
1212 else:
1213 raise TestFailed, "['1'] slots not caught"
1214 try:
1215 class C(object):
1216 __slots__ = [""]
1217 except TypeError:
1218 pass
1219 else:
1220 raise TestFailed, "[''] slots not caught"
1221 class C(object):
1222 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1223
Žiga Seilnacht94c88722007-03-14 12:34:30 +00001224 # Test unicode slot names
1225 try:
1226 unichr
1227 except NameError:
1228 pass
1229 else:
Neal Norwitz44dab0a2007-04-25 06:42:41 +00001230 # _unicode_to_string used to modify slots in certain circumstances
Žiga Seilnacht94c88722007-03-14 12:34:30 +00001231 slots = (unicode("foo"), unicode("bar"))
1232 class C(object):
1233 __slots__ = slots
1234 x = C()
1235 x.foo = 5
1236 vereq(x.foo, 5)
1237 veris(type(slots[0]), unicode)
1238 # this used to leak references
1239 try:
1240 class C(object):
1241 __slots__ = [unichr(128)]
1242 except (TypeError, UnicodeEncodeError):
1243 pass
1244 else:
Neal Norwitz44dab0a2007-04-25 06:42:41 +00001245 raise TestFailed, "[unichr(128)] slots not caught"
Žiga Seilnacht94c88722007-03-14 12:34:30 +00001246
Guido van Rossum33bab012001-12-05 22:45:48 +00001247 # Test leaks
1248 class Counted(object):
1249 counter = 0 # counts the number of instances alive
1250 def __init__(self):
1251 Counted.counter += 1
1252 def __del__(self):
1253 Counted.counter -= 1
1254 class C(object):
1255 __slots__ = ['a', 'b', 'c']
1256 x = C()
1257 x.a = Counted()
1258 x.b = Counted()
1259 x.c = Counted()
1260 vereq(Counted.counter, 3)
1261 del x
1262 vereq(Counted.counter, 0)
1263 class D(C):
1264 pass
1265 x = D()
1266 x.a = Counted()
1267 x.z = Counted()
1268 vereq(Counted.counter, 2)
1269 del x
1270 vereq(Counted.counter, 0)
1271 class E(D):
1272 __slots__ = ['e']
1273 x = E()
1274 x.a = Counted()
1275 x.z = Counted()
1276 x.e = Counted()
1277 vereq(Counted.counter, 3)
1278 del x
1279 vereq(Counted.counter, 0)
1280
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001281 # Test cyclical leaks [SF bug 519621]
1282 class F(object):
1283 __slots__ = ['a', 'b']
1284 log = []
1285 s = F()
1286 s.a = [Counted(), s]
1287 vereq(Counted.counter, 1)
1288 s = None
1289 import gc
1290 gc.collect()
1291 vereq(Counted.counter, 0)
1292
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001293 # Test lookup leaks [SF bug 572567]
1294 import sys,gc
1295 class G(object):
1296 def __cmp__(self, other):
1297 return 0
1298 g = G()
1299 orig_objects = len(gc.get_objects())
1300 for i in xrange(10):
1301 g==g
1302 new_objects = len(gc.get_objects())
1303 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001304 class H(object):
1305 __slots__ = ['a', 'b']
1306 def __init__(self):
1307 self.a = 1
1308 self.b = 2
1309 def __del__(self):
1310 assert self.a == 1
1311 assert self.b == 2
1312
1313 save_stderr = sys.stderr
1314 sys.stderr = sys.stdout
1315 h = H()
1316 try:
1317 del h
1318 finally:
1319 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001320
Guido van Rossum8b056da2002-08-13 18:26:26 +00001321def slotspecials():
1322 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1323
1324 class D(object):
1325 __slots__ = ["__dict__"]
1326 a = D()
1327 verify(hasattr(a, "__dict__"))
1328 verify(not hasattr(a, "__weakref__"))
1329 a.foo = 42
1330 vereq(a.__dict__, {"foo": 42})
1331
1332 class W(object):
1333 __slots__ = ["__weakref__"]
1334 a = W()
1335 verify(hasattr(a, "__weakref__"))
1336 verify(not hasattr(a, "__dict__"))
1337 try:
1338 a.foo = 42
1339 except AttributeError:
1340 pass
1341 else:
1342 raise TestFailed, "shouldn't be allowed to set a.foo"
1343
1344 class C1(W, D):
1345 __slots__ = []
1346 a = C1()
1347 verify(hasattr(a, "__dict__"))
1348 verify(hasattr(a, "__weakref__"))
1349 a.foo = 42
1350 vereq(a.__dict__, {"foo": 42})
1351
1352 class C2(D, W):
1353 __slots__ = []
1354 a = C2()
1355 verify(hasattr(a, "__dict__"))
1356 verify(hasattr(a, "__weakref__"))
1357 a.foo = 42
1358 vereq(a.__dict__, {"foo": 42})
1359
Guido van Rossum9a818922002-11-14 19:50:14 +00001360# MRO order disagreement
1361#
1362# class C3(C1, C2):
1363# __slots__ = []
1364#
1365# class C4(C2, C1):
1366# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001367
Tim Peters6d6c1a32001-08-02 04:15:00 +00001368def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001369 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001370 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001371 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001372 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001373 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001374 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001375 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001376 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001377 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001378 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001379 vereq(E.foo, 1)
1380 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001381 # Test dynamic instances
1382 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001383 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001384 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001385 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001386 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001387 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001388 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001389 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001390 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001391 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001392 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001393 vereq(int(a), 100)
1394 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001395 verify(not hasattr(a, "spam"))
1396 def mygetattr(self, name):
1397 if name == "spam":
1398 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001399 raise AttributeError
1400 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001401 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001402 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001403 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001404 def mysetattr(self, name, value):
1405 if name == "spam":
1406 raise AttributeError
1407 return object.__setattr__(self, name, value)
1408 C.__setattr__ = mysetattr
1409 try:
1410 a.spam = "not spam"
1411 except AttributeError:
1412 pass
1413 else:
1414 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001415 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001416 class D(C):
1417 pass
1418 d = D()
1419 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001420 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001421
Guido van Rossum7e35d572001-09-15 03:14:32 +00001422 # Test handling of int*seq and seq*int
1423 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001424 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001425 vereq("a"*I(2), "aa")
1426 vereq(I(2)*"a", "aa")
1427 vereq(2*I(3), 6)
1428 vereq(I(3)*2, 6)
1429 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001430
1431 # Test handling of long*seq and seq*long
1432 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001433 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq("a"*L(2L), "aa")
1435 vereq(L(2L)*"a", "aa")
1436 vereq(2*L(3), 6)
1437 vereq(L(3)*2, 6)
1438 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001439
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001440 # Test comparison of classes with dynamic metaclasses
1441 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001442 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001443 class someclass:
1444 __metaclass__ = dynamicmetaclass
1445 verify(someclass != object)
1446
Tim Peters6d6c1a32001-08-02 04:15:00 +00001447def errors():
1448 if verbose: print "Testing errors..."
1449
1450 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001451 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001452 pass
1453 except TypeError:
1454 pass
1455 else:
1456 verify(0, "inheritance from both list and dict should be illegal")
1457
1458 try:
1459 class C(object, None):
1460 pass
1461 except TypeError:
1462 pass
1463 else:
1464 verify(0, "inheritance from non-type should be illegal")
1465 class Classic:
1466 pass
1467
1468 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001469 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001470 pass
1471 except TypeError:
1472 pass
1473 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001474 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001475
1476 try:
1477 class C(object):
1478 __slots__ = 1
1479 except TypeError:
1480 pass
1481 else:
1482 verify(0, "__slots__ = 1 should be illegal")
1483
1484 try:
1485 class C(object):
1486 __slots__ = [1]
1487 except TypeError:
1488 pass
1489 else:
1490 verify(0, "__slots__ = [1] should be illegal")
1491
1492def classmethods():
1493 if verbose: print "Testing class methods..."
1494 class C(object):
1495 def foo(*a): return a
1496 goo = classmethod(foo)
1497 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001498 vereq(C.goo(1), (C, 1))
1499 vereq(c.goo(1), (C, 1))
1500 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001501 class D(C):
1502 pass
1503 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001504 vereq(D.goo(1), (D, 1))
1505 vereq(d.goo(1), (D, 1))
1506 vereq(d.foo(1), (d, 1))
1507 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001508 # Test for a specific crash (SF bug 528132)
1509 def f(cls, arg): return (cls, arg)
1510 ff = classmethod(f)
1511 vereq(ff.__get__(0, int)(42), (int, 42))
1512 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513
Guido van Rossum155db9a2002-04-02 17:53:47 +00001514 # Test super() with classmethods (SF bug 535444)
1515 veris(C.goo.im_self, C)
1516 veris(D.goo.im_self, D)
1517 veris(super(D,D).goo.im_self, D)
1518 veris(super(D,d).goo.im_self, D)
1519 vereq(super(D,D).goo(), (D,))
1520 vereq(super(D,d).goo(), (D,))
1521
Raymond Hettingerbe971532003-06-18 01:13:41 +00001522 # Verify that argument is checked for callability (SF bug 753451)
1523 try:
1524 classmethod(1).__get__(1)
1525 except TypeError:
1526 pass
1527 else:
1528 raise TestFailed, "classmethod should check for callability"
1529
Georg Brandl6a29c322006-02-21 22:17:46 +00001530 # Verify that classmethod() doesn't allow keyword args
1531 try:
1532 classmethod(f, kw=1)
1533 except TypeError:
1534 pass
1535 else:
1536 raise TestFailed, "classmethod shouldn't accept keyword args"
1537
Fred Drakef841aa62002-03-28 15:49:54 +00001538def classmethods_in_c():
1539 if verbose: print "Testing C-based class methods..."
1540 import xxsubtype as spam
1541 a = (1, 2, 3)
1542 d = {'abc': 123}
1543 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001544 veris(x, spam.spamlist)
1545 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001546 vereq(d, d1)
1547 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001548 veris(x, spam.spamlist)
1549 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001550 vereq(d, d1)
1551
Tim Peters6d6c1a32001-08-02 04:15:00 +00001552def staticmethods():
1553 if verbose: print "Testing static methods..."
1554 class C(object):
1555 def foo(*a): return a
1556 goo = staticmethod(foo)
1557 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001558 vereq(C.goo(1), (1,))
1559 vereq(c.goo(1), (1,))
1560 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001561 class D(C):
1562 pass
1563 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001564 vereq(D.goo(1), (1,))
1565 vereq(d.goo(1), (1,))
1566 vereq(d.foo(1), (d, 1))
1567 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001568
Fred Drakef841aa62002-03-28 15:49:54 +00001569def staticmethods_in_c():
1570 if verbose: print "Testing C-based static methods..."
1571 import xxsubtype as spam
1572 a = (1, 2, 3)
1573 d = {"abc": 123}
1574 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1575 veris(x, None)
1576 vereq(a, a1)
1577 vereq(d, d1)
1578 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1579 veris(x, None)
1580 vereq(a, a1)
1581 vereq(d, d1)
1582
Tim Peters6d6c1a32001-08-02 04:15:00 +00001583def classic():
1584 if verbose: print "Testing classic classes..."
1585 class C:
1586 def foo(*a): return a
1587 goo = classmethod(foo)
1588 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001589 vereq(C.goo(1), (C, 1))
1590 vereq(c.goo(1), (C, 1))
1591 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001592 class D(C):
1593 pass
1594 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001595 vereq(D.goo(1), (D, 1))
1596 vereq(d.goo(1), (D, 1))
1597 vereq(d.foo(1), (d, 1))
1598 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001599 class E: # *not* subclassing from C
1600 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001601 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001602 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001603
1604def compattr():
1605 if verbose: print "Testing computed attributes..."
1606 class C(object):
1607 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001608 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001609 self.__get = get
1610 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001611 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001612 def __get__(self, obj, type=None):
1613 return self.__get(obj)
1614 def __set__(self, obj, value):
1615 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001616 def __delete__(self, obj):
1617 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001618 def __init__(self):
1619 self.__x = 0
1620 def __get_x(self):
1621 x = self.__x
1622 self.__x = x+1
1623 return x
1624 def __set_x(self, x):
1625 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001626 def __delete_x(self):
1627 del self.__x
1628 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001629 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001630 vereq(a.x, 0)
1631 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001632 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001633 vereq(a.x, 10)
1634 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001635 del a.x
1636 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001637
1638def newslot():
1639 if verbose: print "Testing __new__ slot override..."
1640 class C(list):
1641 def __new__(cls):
1642 self = list.__new__(cls)
1643 self.foo = 1
1644 return self
1645 def __init__(self):
1646 self.foo = self.foo + 2
1647 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001648 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001649 verify(a.__class__ is C)
1650 class D(C):
1651 pass
1652 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001654 verify(b.__class__ is D)
1655
Tim Peters6d6c1a32001-08-02 04:15:00 +00001656def altmro():
1657 if verbose: print "Testing mro() and overriding it..."
1658 class A(object):
1659 def f(self): return "A"
1660 class B(A):
1661 pass
1662 class C(A):
1663 def f(self): return "C"
1664 class D(B, C):
1665 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(D.mro(), [D, B, C, A, object])
1667 vereq(D.__mro__, (D, B, C, A, object))
1668 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001669
Guido van Rossumd3077402001-08-12 05:24:18 +00001670 class PerverseMetaType(type):
1671 def mro(cls):
1672 L = type.mro(cls)
1673 L.reverse()
1674 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001675 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001676 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001677 vereq(X.__mro__, (object, A, C, B, D, X))
1678 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001679
Armin Rigo037d1e02005-12-29 17:07:39 +00001680 try:
1681 class X(object):
1682 class __metaclass__(type):
1683 def mro(self):
1684 return [self, dict, object]
1685 except TypeError:
1686 pass
1687 else:
1688 raise TestFailed, "devious mro() return not caught"
1689
1690 try:
1691 class X(object):
1692 class __metaclass__(type):
1693 def mro(self):
1694 return [1]
1695 except TypeError:
1696 pass
1697 else:
1698 raise TestFailed, "non-class mro() return not caught"
1699
1700 try:
1701 class X(object):
1702 class __metaclass__(type):
1703 def mro(self):
1704 return 1
1705 except TypeError:
1706 pass
1707 else:
1708 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001709
Armin Rigo037d1e02005-12-29 17:07:39 +00001710
Tim Peters6d6c1a32001-08-02 04:15:00 +00001711def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001712 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001713
1714 class B(object):
1715 "Intermediate class because object doesn't have a __setattr__"
1716
1717 class C(B):
1718
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001719 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001720 if name == "foo":
1721 return ("getattr", name)
1722 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001723 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001724 def __setattr__(self, name, value):
1725 if name == "foo":
1726 self.setattr = (name, value)
1727 else:
1728 return B.__setattr__(self, name, value)
1729 def __delattr__(self, name):
1730 if name == "foo":
1731 self.delattr = name
1732 else:
1733 return B.__delattr__(self, name)
1734
1735 def __getitem__(self, key):
1736 return ("getitem", key)
1737 def __setitem__(self, key, value):
1738 self.setitem = (key, value)
1739 def __delitem__(self, key):
1740 self.delitem = key
1741
1742 def __getslice__(self, i, j):
1743 return ("getslice", i, j)
1744 def __setslice__(self, i, j, value):
1745 self.setslice = (i, j, value)
1746 def __delslice__(self, i, j):
1747 self.delslice = (i, j)
1748
1749 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001750 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001751 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001752 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001753 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001754 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001755
Guido van Rossum45704552001-10-08 16:35:45 +00001756 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001757 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001758 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001759 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001760 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001761
Guido van Rossum45704552001-10-08 16:35:45 +00001762 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001763 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001764 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001765 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001766 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001767
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001768def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001769 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001770 class C(object):
1771 def __init__(self, x):
1772 self.x = x
1773 def foo(self):
1774 return self.x
1775 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001776 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001777 class D(C):
1778 boo = C.foo
1779 goo = c1.foo
1780 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(d2.foo(), 2)
1782 vereq(d2.boo(), 2)
1783 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001784 class E(object):
1785 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001786 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001787 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001788
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001789def specials():
1790 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001791 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001792 # Test the default behavior for static classes
1793 class C(object):
1794 def __getitem__(self, i):
1795 if 0 <= i < 10: return i
1796 raise IndexError
1797 c1 = C()
1798 c2 = C()
1799 verify(not not c1)
Tim Peters85b362f2006-04-11 01:21:00 +00001800 verify(id(c1) != id(c2))
1801 hash(c1)
1802 hash(c2)
Guido van Rossum45704552001-10-08 16:35:45 +00001803 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1804 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001805 verify(c1 != c2)
1806 verify(not c1 != c1)
1807 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001808 # Note that the module name appears in str/repr, and that varies
1809 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001810 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001812 verify(-1 not in c1)
1813 for i in range(10):
1814 verify(i in c1)
1815 verify(10 not in c1)
1816 # Test the default behavior for dynamic classes
1817 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001818 def __getitem__(self, i):
1819 if 0 <= i < 10: return i
1820 raise IndexError
1821 d1 = D()
1822 d2 = D()
1823 verify(not not d1)
Tim Peters85b362f2006-04-11 01:21:00 +00001824 verify(id(d1) != id(d2))
1825 hash(d1)
1826 hash(d2)
Guido van Rossum45704552001-10-08 16:35:45 +00001827 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1828 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001829 verify(d1 != d2)
1830 verify(not d1 != d1)
1831 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001832 # Note that the module name appears in str/repr, and that varies
1833 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001834 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001835 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001836 verify(-1 not in d1)
1837 for i in range(10):
1838 verify(i in d1)
1839 verify(10 not in d1)
1840 # Test overridden behavior for static classes
1841 class Proxy(object):
1842 def __init__(self, x):
1843 self.x = x
1844 def __nonzero__(self):
1845 return not not self.x
1846 def __hash__(self):
1847 return hash(self.x)
1848 def __eq__(self, other):
1849 return self.x == other
1850 def __ne__(self, other):
1851 return self.x != other
1852 def __cmp__(self, other):
1853 return cmp(self.x, other.x)
1854 def __str__(self):
1855 return "Proxy:%s" % self.x
1856 def __repr__(self):
1857 return "Proxy(%r)" % self.x
1858 def __contains__(self, value):
1859 return value in self.x
1860 p0 = Proxy(0)
1861 p1 = Proxy(1)
1862 p_1 = Proxy(-1)
1863 verify(not p0)
1864 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001865 vereq(hash(p0), hash(0))
1866 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001867 verify(p0 != p1)
1868 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001869 vereq(not p0, p1)
1870 vereq(cmp(p0, p1), -1)
1871 vereq(cmp(p0, p0), 0)
1872 vereq(cmp(p0, p_1), 1)
1873 vereq(str(p0), "Proxy:0")
1874 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001875 p10 = Proxy(range(10))
1876 verify(-1 not in p10)
1877 for i in range(10):
1878 verify(i in p10)
1879 verify(10 not in p10)
1880 # Test overridden behavior for dynamic classes
1881 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001882 def __init__(self, x):
1883 self.x = x
1884 def __nonzero__(self):
1885 return not not self.x
1886 def __hash__(self):
1887 return hash(self.x)
1888 def __eq__(self, other):
1889 return self.x == other
1890 def __ne__(self, other):
1891 return self.x != other
1892 def __cmp__(self, other):
1893 return cmp(self.x, other.x)
1894 def __str__(self):
1895 return "DProxy:%s" % self.x
1896 def __repr__(self):
1897 return "DProxy(%r)" % self.x
1898 def __contains__(self, value):
1899 return value in self.x
1900 p0 = DProxy(0)
1901 p1 = DProxy(1)
1902 p_1 = DProxy(-1)
1903 verify(not p0)
1904 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001905 vereq(hash(p0), hash(0))
1906 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001907 verify(p0 != p1)
1908 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001909 vereq(not p0, p1)
1910 vereq(cmp(p0, p1), -1)
1911 vereq(cmp(p0, p0), 0)
1912 vereq(cmp(p0, p_1), 1)
1913 vereq(str(p0), "DProxy:0")
1914 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001915 p10 = DProxy(range(10))
1916 verify(-1 not in p10)
1917 for i in range(10):
1918 verify(i in p10)
1919 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001920 # Safety test for __cmp__
1921 def unsafecmp(a, b):
1922 try:
1923 a.__class__.__cmp__(a, b)
1924 except TypeError:
1925 pass
1926 else:
1927 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1928 a.__class__, a, b)
1929 unsafecmp(u"123", "123")
1930 unsafecmp("123", u"123")
1931 unsafecmp(1, 1.0)
1932 unsafecmp(1.0, 1)
1933 unsafecmp(1, 1L)
1934 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001935
Neal Norwitz1a997502003-01-13 20:13:12 +00001936 class Letter(str):
1937 def __new__(cls, letter):
1938 if letter == 'EPS':
1939 return str.__new__(cls)
1940 return str.__new__(cls, letter)
1941 def __str__(self):
1942 if not self:
1943 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001944 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001945
1946 # sys.stdout needs to be the original to trigger the recursion bug
1947 import sys
1948 test_stdout = sys.stdout
1949 sys.stdout = get_original_stdout()
1950 try:
1951 # nothing should actually be printed, this should raise an exception
1952 print Letter('w')
1953 except RuntimeError:
1954 pass
1955 else:
1956 raise TestFailed, "expected a RuntimeError for print recursion"
1957 sys.stdout = test_stdout
1958
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001959def weakrefs():
1960 if verbose: print "Testing weak references..."
1961 import weakref
1962 class C(object):
1963 pass
1964 c = C()
1965 r = weakref.ref(c)
1966 verify(r() is c)
1967 del c
1968 verify(r() is None)
1969 del r
1970 class NoWeak(object):
1971 __slots__ = ['foo']
1972 no = NoWeak()
1973 try:
1974 weakref.ref(no)
1975 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001976 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001977 else:
1978 verify(0, "weakref.ref(no) should be illegal")
1979 class Weak(object):
1980 __slots__ = ['foo', '__weakref__']
1981 yes = Weak()
1982 r = weakref.ref(yes)
1983 verify(r() is yes)
1984 del yes
1985 verify(r() is None)
1986 del r
1987
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001988def properties():
1989 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001990 class C(object):
1991 def getx(self):
1992 return self.__x
1993 def setx(self, value):
1994 self.__x = value
1995 def delx(self):
1996 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001997 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001998 a = C()
1999 verify(not hasattr(a, "x"))
2000 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00002001 vereq(a._C__x, 42)
2002 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002003 del a.x
2004 verify(not hasattr(a, "x"))
2005 verify(not hasattr(a, "_C__x"))
2006 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00002007 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00002008 C.x.__delete__(a)
2009 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002010
Tim Peters66c1a522001-09-24 21:17:50 +00002011 raw = C.__dict__['x']
2012 verify(isinstance(raw, property))
2013
2014 attrs = dir(raw)
2015 verify("__doc__" in attrs)
2016 verify("fget" in attrs)
2017 verify("fset" in attrs)
2018 verify("fdel" in attrs)
2019
Guido van Rossum45704552001-10-08 16:35:45 +00002020 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00002021 verify(raw.fget is C.__dict__['getx'])
2022 verify(raw.fset is C.__dict__['setx'])
2023 verify(raw.fdel is C.__dict__['delx'])
2024
2025 for attr in "__doc__", "fget", "fset", "fdel":
2026 try:
2027 setattr(raw, attr, 42)
2028 except TypeError, msg:
2029 if str(msg).find('readonly') < 0:
2030 raise TestFailed("when setting readonly attr %r on a "
2031 "property, got unexpected TypeError "
2032 "msg %r" % (attr, str(msg)))
2033 else:
2034 raise TestFailed("expected TypeError from trying to set "
2035 "readonly %r attr on a property" % attr)
2036
Neal Norwitz673cd822002-10-18 16:33:13 +00002037 class D(object):
2038 __getitem__ = property(lambda s: 1/0)
2039
2040 d = D()
2041 try:
2042 for i in d:
2043 str(i)
2044 except ZeroDivisionError:
2045 pass
2046 else:
2047 raise TestFailed, "expected ZeroDivisionError from bad property"
2048
Georg Brandl533ff6f2006-03-08 18:09:27 +00002049 class E(object):
2050 def getter(self):
2051 "getter method"
2052 return 0
2053 def setter(self, value):
2054 "setter method"
2055 pass
2056 prop = property(getter)
2057 vereq(prop.__doc__, "getter method")
2058 prop2 = property(fset=setter)
2059 vereq(prop2.__doc__, None)
2060
Georg Brandle9462c72006-08-04 18:03:37 +00002061 # this segfaulted in 2.5b2
2062 try:
2063 import _testcapi
2064 except ImportError:
2065 pass
2066 else:
2067 class X(object):
2068 p = property(_testcapi.test_with_docstring)
2069
2070
Guido van Rossumc4a18802001-08-24 16:55:27 +00002071def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00002072 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00002073
2074 class A(object):
2075 def meth(self, a):
2076 return "A(%r)" % a
2077
Guido van Rossum45704552001-10-08 16:35:45 +00002078 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002079
2080 class B(A):
2081 def __init__(self):
2082 self.__super = super(B, self)
2083 def meth(self, a):
2084 return "B(%r)" % a + self.__super.meth(a)
2085
Guido van Rossum45704552001-10-08 16:35:45 +00002086 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002087
2088 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002089 def meth(self, a):
2090 return "C(%r)" % a + self.__super.meth(a)
2091 C._C__super = super(C)
2092
Guido van Rossum45704552001-10-08 16:35:45 +00002093 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002094
2095 class D(C, B):
2096 def meth(self, a):
2097 return "D(%r)" % a + super(D, self).meth(a)
2098
Guido van Rossum5b443c62001-12-03 15:38:28 +00002099 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2100
2101 # Test for subclassing super
2102
2103 class mysuper(super):
2104 def __init__(self, *args):
2105 return super(mysuper, self).__init__(*args)
2106
2107 class E(D):
2108 def meth(self, a):
2109 return "E(%r)" % a + mysuper(E, self).meth(a)
2110
2111 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2112
2113 class F(E):
2114 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002115 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002116 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2117 F._F__super = mysuper(F)
2118
2119 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2120
2121 # Make sure certain errors are raised
2122
2123 try:
2124 super(D, 42)
2125 except TypeError:
2126 pass
2127 else:
2128 raise TestFailed, "shouldn't allow super(D, 42)"
2129
2130 try:
2131 super(D, C())
2132 except TypeError:
2133 pass
2134 else:
2135 raise TestFailed, "shouldn't allow super(D, C())"
2136
2137 try:
2138 super(D).__get__(12)
2139 except TypeError:
2140 pass
2141 else:
2142 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2143
2144 try:
2145 super(D).__get__(C())
2146 except TypeError:
2147 pass
2148 else:
2149 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002150
Guido van Rossuma4541a32003-04-16 20:02:22 +00002151 # Make sure data descriptors can be overridden and accessed via super
2152 # (new feature in Python 2.3)
2153
2154 class DDbase(object):
2155 def getx(self): return 42
2156 x = property(getx)
2157
2158 class DDsub(DDbase):
2159 def getx(self): return "hello"
2160 x = property(getx)
2161
2162 dd = DDsub()
2163 vereq(dd.x, "hello")
2164 vereq(super(DDsub, dd).x, 42)
2165
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002166 # Ensure that super() lookup of descriptor from classmethod
2167 # works (SF ID# 743627)
2168
2169 class Base(object):
2170 aProp = property(lambda self: "foo")
2171
2172 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002173 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002174 def test(klass):
2175 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002176
2177 veris(Sub.test(), Base.aProp)
2178
Georg Brandlaf4337a2006-09-30 08:43:50 +00002179 # Verify that super() doesn't allow keyword args
2180 try:
2181 super(Base, kw=1)
2182 except TypeError:
2183 pass
2184 else:
2185 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002186
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002187def inherits():
2188 if verbose: print "Testing inheritance from basic types..."
2189
2190 class hexint(int):
2191 def __repr__(self):
2192 return hex(self)
2193 def __add__(self, other):
2194 return hexint(int.__add__(self, other))
2195 # (Note that overriding __radd__ doesn't work,
2196 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002197 vereq(repr(hexint(7) + 9), "0x10")
2198 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002199 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq(a, 12345)
2201 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002202 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002203 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002204 verify((+a).__class__ is int)
2205 verify((a >> 0).__class__ is int)
2206 verify((a << 0).__class__ is int)
2207 verify((hexint(0) << 12).__class__ is int)
2208 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002209
2210 class octlong(long):
2211 __slots__ = []
2212 def __str__(self):
2213 s = oct(self)
2214 if s[-1] == 'L':
2215 s = s[:-1]
2216 return s
2217 def __add__(self, other):
2218 return self.__class__(super(octlong, self).__add__(other))
2219 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002220 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002221 # (Note that overriding __radd__ here only seems to work
2222 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002223 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002224 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002225 vereq(a, 12345L)
2226 vereq(long(a), 12345L)
2227 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002228 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002229 verify((+a).__class__ is long)
2230 verify((-a).__class__ is long)
2231 verify((-octlong(0)).__class__ is long)
2232 verify((a >> 0).__class__ is long)
2233 verify((a << 0).__class__ is long)
2234 verify((a - 0).__class__ is long)
2235 verify((a * 1).__class__ is long)
2236 verify((a ** 1).__class__ is long)
2237 verify((a // 1).__class__ is long)
2238 verify((1 * a).__class__ is long)
2239 verify((a | 0).__class__ is long)
2240 verify((a ^ 0).__class__ is long)
2241 verify((a & -1L).__class__ is long)
2242 verify((octlong(0) << 12).__class__ is long)
2243 verify((octlong(0) >> 12).__class__ is long)
2244 verify(abs(octlong(0)).__class__ is long)
2245
2246 # Because octlong overrides __add__, we can't check the absence of +0
2247 # optimizations using octlong.
2248 class longclone(long):
2249 pass
2250 a = longclone(1)
2251 verify((a + 0).__class__ is long)
2252 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002253
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002254 # Check that negative clones don't segfault
2255 a = longclone(-1)
2256 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002257 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002258
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002259 class precfloat(float):
2260 __slots__ = ['prec']
2261 def __init__(self, value=0.0, prec=12):
2262 self.prec = int(prec)
2263 float.__init__(value)
2264 def __repr__(self):
2265 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002267 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(a, 12345.0)
2269 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002270 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002272 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002273
Tim Peters2400fa42001-09-12 19:12:49 +00002274 class madcomplex(complex):
2275 def __repr__(self):
2276 return "%.17gj%+.17g" % (self.imag, self.real)
2277 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002279 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002280 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(a, base)
2282 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002283 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002284 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002285 vereq(repr(a), "4j-3")
2286 vereq(a, base)
2287 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002288 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002290 veris((+a).__class__, complex)
2291 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002292 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002293 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002294 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002295 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002296 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002297 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002298 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002299
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002300 class madtuple(tuple):
2301 _rev = None
2302 def rev(self):
2303 if self._rev is not None:
2304 return self._rev
2305 L = list(self)
2306 L.reverse()
2307 self._rev = self.__class__(L)
2308 return self._rev
2309 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002310 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2311 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2312 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002313 for i in range(512):
2314 t = madtuple(range(i))
2315 u = t.rev()
2316 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002317 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002318 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002319 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002320 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002321 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002322 verify(a[:].__class__ is tuple)
2323 verify((a * 1).__class__ is tuple)
2324 verify((a * 0).__class__ is tuple)
2325 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002326 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002328 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002329 verify((a + a).__class__ is tuple)
2330 verify((a * 0).__class__ is tuple)
2331 verify((a * 1).__class__ is tuple)
2332 verify((a * 2).__class__ is tuple)
2333 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002334
2335 class madstring(str):
2336 _rev = None
2337 def rev(self):
2338 if self._rev is not None:
2339 return self._rev
2340 L = list(self)
2341 L.reverse()
2342 self._rev = self.__class__("".join(L))
2343 return self._rev
2344 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002345 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2346 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2347 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002348 for i in range(256):
2349 s = madstring("".join(map(chr, range(i))))
2350 t = s.rev()
2351 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002352 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002353 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002354 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002355 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002356
Tim Peters8fa5dd02001-09-12 02:18:30 +00002357 base = "\x00" * 5
2358 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002359 vereq(s, base)
2360 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002361 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002362 vereq(hash(s), hash(base))
2363 vereq({s: 1}[base], 1)
2364 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002365 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002366 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002367 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002368 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002369 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002370 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002371 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002372 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002373 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002374 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002375 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002376 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002377 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002378 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002379 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002380 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002381 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002382 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002383 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002384 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002385 identitytab = ''.join([chr(i) for i in range(256)])
2386 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002387 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002388 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002389 vereq(s.translate(identitytab, "x"), base)
2390 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002391 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002392 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002393 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002394 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002395 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002396 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002397 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002398 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002399 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002400 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002401
Guido van Rossum91ee7982001-08-30 20:52:40 +00002402 class madunicode(unicode):
2403 _rev = None
2404 def rev(self):
2405 if self._rev is not None:
2406 return self._rev
2407 L = list(self)
2408 L.reverse()
2409 self._rev = self.__class__(u"".join(L))
2410 return self._rev
2411 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002412 vereq(u, u"ABCDEF")
2413 vereq(u.rev(), madunicode(u"FEDCBA"))
2414 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002415 base = u"12345"
2416 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002417 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002418 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002419 vereq(hash(u), hash(base))
2420 vereq({u: 1}[base], 1)
2421 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002422 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002423 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002424 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002425 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002426 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002427 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002428 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002429 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002430 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002431 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002432 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002433 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002434 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002435 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002436 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002437 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002438 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002439 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002440 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002441 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002442 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002443 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002444 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002445 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002446 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002447 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002448 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002449 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002450 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002451 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002452 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002453 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002454 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002455 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002456 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002457 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002458 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002459 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002460
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002461 class sublist(list):
2462 pass
2463 a = sublist(range(5))
2464 vereq(a, range(5))
2465 a.append("hello")
2466 vereq(a, range(5) + ["hello"])
2467 a[5] = 5
2468 vereq(a, range(6))
2469 a.extend(range(6, 20))
2470 vereq(a, range(20))
2471 a[-5:] = []
2472 vereq(a, range(15))
2473 del a[10:15]
2474 vereq(len(a), 10)
2475 vereq(a, range(10))
2476 vereq(list(a), range(10))
2477 vereq(a[0], 0)
2478 vereq(a[9], 9)
2479 vereq(a[-10], 0)
2480 vereq(a[-1], 9)
2481 vereq(a[:5], range(5))
2482
Tim Peters59c9a642001-09-13 05:38:56 +00002483 class CountedInput(file):
2484 """Counts lines read by self.readline().
2485
2486 self.lineno is the 0-based ordinal of the last line read, up to
2487 a maximum of one greater than the number of lines in the file.
2488
2489 self.ateof is true if and only if the final "" line has been read,
2490 at which point self.lineno stops incrementing, and further calls
2491 to readline() continue to return "".
2492 """
2493
2494 lineno = 0
2495 ateof = 0
2496 def readline(self):
2497 if self.ateof:
2498 return ""
2499 s = file.readline(self)
2500 # Next line works too.
2501 # s = super(CountedInput, self).readline()
2502 self.lineno += 1
2503 if s == "":
2504 self.ateof = 1
2505 return s
2506
Tim Peters561f8992001-09-13 19:36:36 +00002507 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002508 lines = ['a\n', 'b\n', 'c\n']
2509 try:
2510 f.writelines(lines)
2511 f.close()
2512 f = CountedInput(TESTFN)
2513 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2514 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002515 vereq(expected, got)
2516 vereq(f.lineno, i)
2517 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002518 f.close()
2519 finally:
2520 try:
2521 f.close()
2522 except:
2523 pass
2524 try:
2525 import os
2526 os.unlink(TESTFN)
2527 except:
2528 pass
2529
Tim Peters808b94e2001-09-13 19:33:07 +00002530def keywords():
2531 if verbose:
2532 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002533 vereq(int(x=1), 1)
2534 vereq(float(x=2), 2.0)
2535 vereq(long(x=3), 3L)
2536 vereq(complex(imag=42, real=666), complex(666, 42))
2537 vereq(str(object=500), '500')
2538 vereq(unicode(string='abc', errors='strict'), u'abc')
2539 vereq(tuple(sequence=range(3)), (0, 1, 2))
2540 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002541 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002542
2543 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002544 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002545 try:
2546 constructor(bogus_keyword_arg=1)
2547 except TypeError:
2548 pass
2549 else:
2550 raise TestFailed("expected TypeError from bogus keyword "
2551 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002552
Tim Peters8fa45672001-09-13 21:01:29 +00002553def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002554 # XXX This test is disabled because rexec is not deemed safe
2555 return
Tim Peters8fa45672001-09-13 21:01:29 +00002556 import rexec
2557 if verbose:
2558 print "Testing interaction with restricted execution ..."
2559
2560 sandbox = rexec.RExec()
2561
2562 code1 = """f = open(%r, 'w')""" % TESTFN
2563 code2 = """f = file(%r, 'w')""" % TESTFN
2564 code3 = """\
2565f = open(%r)
2566t = type(f) # a sneaky way to get the file() constructor
2567f.close()
2568f = t(%r, 'w') # rexec can't catch this by itself
2569""" % (TESTFN, TESTFN)
2570
2571 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2572 f.close()
2573
2574 try:
2575 for code in code1, code2, code3:
2576 try:
2577 sandbox.r_exec(code)
2578 except IOError, msg:
2579 if str(msg).find("restricted") >= 0:
2580 outcome = "OK"
2581 else:
2582 outcome = "got an exception, but not an expected one"
2583 else:
2584 outcome = "expected a restricted-execution exception"
2585
2586 if outcome != "OK":
2587 raise TestFailed("%s, in %r" % (outcome, code))
2588
2589 finally:
2590 try:
2591 import os
2592 os.unlink(TESTFN)
2593 except:
2594 pass
2595
Tim Peters0ab085c2001-09-14 00:25:33 +00002596def str_subclass_as_dict_key():
2597 if verbose:
2598 print "Testing a str subclass used as dict key .."
2599
2600 class cistr(str):
2601 """Sublcass of str that computes __eq__ case-insensitively.
2602
2603 Also computes a hash code of the string in canonical form.
2604 """
2605
2606 def __init__(self, value):
2607 self.canonical = value.lower()
2608 self.hashcode = hash(self.canonical)
2609
2610 def __eq__(self, other):
2611 if not isinstance(other, cistr):
2612 other = cistr(other)
2613 return self.canonical == other.canonical
2614
2615 def __hash__(self):
2616 return self.hashcode
2617
Guido van Rossum45704552001-10-08 16:35:45 +00002618 vereq(cistr('ABC'), 'abc')
2619 vereq('aBc', cistr('ABC'))
2620 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002621
2622 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002623 vereq(d[cistr('one')], 1)
2624 vereq(d[cistr('tWo')], 2)
2625 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002626 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002627 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002628
Guido van Rossumab3b0342001-09-18 20:38:53 +00002629def classic_comparisons():
2630 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002631 class classic:
2632 pass
2633 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002634 if verbose: print " (base = %s)" % base
2635 class C(base):
2636 def __init__(self, value):
2637 self.value = int(value)
2638 def __cmp__(self, other):
2639 if isinstance(other, C):
2640 return cmp(self.value, other.value)
2641 if isinstance(other, int) or isinstance(other, long):
2642 return cmp(self.value, other)
2643 return NotImplemented
2644 c1 = C(1)
2645 c2 = C(2)
2646 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002647 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002648 c = {1: c1, 2: c2, 3: c3}
2649 for x in 1, 2, 3:
2650 for y in 1, 2, 3:
2651 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2652 for op in "<", "<=", "==", "!=", ">", ">=":
2653 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2654 "x=%d, y=%d" % (x, y))
2655 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2656 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2657
Guido van Rossum0639f592001-09-18 21:06:04 +00002658def rich_comparisons():
2659 if verbose:
2660 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002661 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002662 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002663 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002664 vereq(z, 1+0j)
2665 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002666 class ZZ(complex):
2667 def __eq__(self, other):
2668 try:
2669 return abs(self - other) <= 1e-6
2670 except:
2671 return NotImplemented
2672 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002673 vereq(zz, 1+0j)
2674 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002675
Guido van Rossum0639f592001-09-18 21:06:04 +00002676 class classic:
2677 pass
2678 for base in (classic, int, object, list):
2679 if verbose: print " (base = %s)" % base
2680 class C(base):
2681 def __init__(self, value):
2682 self.value = int(value)
2683 def __cmp__(self, other):
2684 raise TestFailed, "shouldn't call __cmp__"
2685 def __eq__(self, other):
2686 if isinstance(other, C):
2687 return self.value == other.value
2688 if isinstance(other, int) or isinstance(other, long):
2689 return self.value == other
2690 return NotImplemented
2691 def __ne__(self, other):
2692 if isinstance(other, C):
2693 return self.value != other.value
2694 if isinstance(other, int) or isinstance(other, long):
2695 return self.value != other
2696 return NotImplemented
2697 def __lt__(self, other):
2698 if isinstance(other, C):
2699 return self.value < other.value
2700 if isinstance(other, int) or isinstance(other, long):
2701 return self.value < other
2702 return NotImplemented
2703 def __le__(self, other):
2704 if isinstance(other, C):
2705 return self.value <= other.value
2706 if isinstance(other, int) or isinstance(other, long):
2707 return self.value <= other
2708 return NotImplemented
2709 def __gt__(self, other):
2710 if isinstance(other, C):
2711 return self.value > other.value
2712 if isinstance(other, int) or isinstance(other, long):
2713 return self.value > other
2714 return NotImplemented
2715 def __ge__(self, other):
2716 if isinstance(other, C):
2717 return self.value >= other.value
2718 if isinstance(other, int) or isinstance(other, long):
2719 return self.value >= other
2720 return NotImplemented
2721 c1 = C(1)
2722 c2 = C(2)
2723 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002724 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002725 c = {1: c1, 2: c2, 3: c3}
2726 for x in 1, 2, 3:
2727 for y in 1, 2, 3:
2728 for op in "<", "<=", "==", "!=", ">", ">=":
2729 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2730 "x=%d, y=%d" % (x, y))
2731 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2732 "x=%d, y=%d" % (x, y))
2733 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2734 "x=%d, y=%d" % (x, y))
2735
Guido van Rossum1952e382001-09-19 01:25:16 +00002736def coercions():
2737 if verbose: print "Testing coercions..."
2738 class I(int): pass
2739 coerce(I(0), 0)
2740 coerce(0, I(0))
2741 class L(long): pass
2742 coerce(L(0), 0)
2743 coerce(L(0), 0L)
2744 coerce(0, L(0))
2745 coerce(0L, L(0))
2746 class F(float): pass
2747 coerce(F(0), 0)
2748 coerce(F(0), 0L)
2749 coerce(F(0), 0.)
2750 coerce(0, F(0))
2751 coerce(0L, F(0))
2752 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002753 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002754 coerce(C(0), 0)
2755 coerce(C(0), 0L)
2756 coerce(C(0), 0.)
2757 coerce(C(0), 0j)
2758 coerce(0, C(0))
2759 coerce(0L, C(0))
2760 coerce(0., C(0))
2761 coerce(0j, C(0))
2762
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002763def descrdoc():
2764 if verbose: print "Testing descriptor doc strings..."
2765 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002766 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002767 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002768 check(file.name, "file name") # member descriptor
2769
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002770def setclass():
2771 if verbose: print "Testing __class__ assignment..."
2772 class C(object): pass
2773 class D(object): pass
2774 class E(object): pass
2775 class F(D, E): pass
2776 for cls in C, D, E, F:
2777 for cls2 in C, D, E, F:
2778 x = cls()
2779 x.__class__ = cls2
2780 verify(x.__class__ is cls2)
2781 x.__class__ = cls
2782 verify(x.__class__ is cls)
2783 def cant(x, C):
2784 try:
2785 x.__class__ = C
2786 except TypeError:
2787 pass
2788 else:
2789 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002790 try:
2791 delattr(x, "__class__")
2792 except TypeError:
2793 pass
2794 else:
2795 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002796 cant(C(), list)
2797 cant(list(), C)
2798 cant(C(), 1)
2799 cant(C(), object)
2800 cant(object(), list)
2801 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002802 class Int(int): __slots__ = []
2803 cant(2, Int)
2804 cant(Int(), int)
2805 cant(True, int)
2806 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002807 o = object()
2808 cant(o, type(1))
2809 cant(o, type(None))
2810 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002811
Guido van Rossum6661be32001-10-26 04:26:12 +00002812def setdict():
2813 if verbose: print "Testing __dict__ assignment..."
2814 class C(object): pass
2815 a = C()
2816 a.__dict__ = {'b': 1}
2817 vereq(a.b, 1)
2818 def cant(x, dict):
2819 try:
2820 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002821 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002822 pass
2823 else:
2824 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2825 cant(a, None)
2826 cant(a, [])
2827 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002828 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum03706d22008-01-18 21:31:32 +00002829
2830 class Base(object):
2831 pass
2832 def verify_dict_readonly(x):
2833 """
2834 x has to be an instance of a class inheriting from Base.
2835 """
2836 cant(x, {})
2837 try:
2838 del x.__dict__
2839 except (AttributeError, TypeError):
2840 pass
2841 else:
2842 raise TestFailed, "shouldn't allow del %r.__dict__" % x
2843 dict_descr = Base.__dict__["__dict__"]
2844 try:
2845 dict_descr.__set__(x, {})
2846 except (AttributeError, TypeError):
2847 pass
2848 else:
2849 raise TestFailed, "dict_descr allowed access to %r's dict" % x
2850
2851 # Classes don't allow __dict__ assignment and have readonly dicts
2852 class Meta1(type, Base):
2853 pass
2854 class Meta2(Base, type):
2855 pass
2856 class D(object):
2857 __metaclass__ = Meta1
2858 class E(object):
2859 __metaclass__ = Meta2
2860 for cls in C, D, E:
2861 verify_dict_readonly(cls)
2862 class_dict = cls.__dict__
2863 try:
2864 class_dict["spam"] = "eggs"
2865 except TypeError:
2866 pass
2867 else:
2868 raise TestFailed, "%r's __dict__ can be modified" % cls
2869
2870 # Modules also disallow __dict__ assignment
2871 class Module1(types.ModuleType, Base):
2872 pass
2873 class Module2(Base, types.ModuleType):
2874 pass
2875 for ModuleType in Module1, Module2:
2876 mod = ModuleType("spam")
2877 verify_dict_readonly(mod)
2878 mod.__dict__["spam"] = "eggs"
2879
2880 # Exception's __dict__ can be replaced, but not deleted
2881 class Exception1(Exception, Base):
2882 pass
2883 class Exception2(Base, Exception):
2884 pass
2885 for ExceptionType in Exception, Exception1, Exception2:
2886 e = ExceptionType()
2887 e.__dict__ = {"a": 1}
2888 vereq(e.a, 1)
2889 try:
2890 del e.__dict__
2891 except (TypeError, AttributeError):
2892 pass
2893 else:
2894 raise TestFaied, "%r's __dict__ can be deleted" % e
2895
Guido van Rossum6661be32001-10-26 04:26:12 +00002896
Guido van Rossum3926a632001-09-25 16:25:58 +00002897def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002898 if verbose:
2899 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002900 import pickle, cPickle
2901
2902 def sorteditems(d):
2903 L = d.items()
2904 L.sort()
2905 return L
2906
2907 global C
2908 class C(object):
2909 def __init__(self, a, b):
2910 super(C, self).__init__()
2911 self.a = a
2912 self.b = b
2913 def __repr__(self):
2914 return "C(%r, %r)" % (self.a, self.b)
2915
2916 global C1
2917 class C1(list):
2918 def __new__(cls, a, b):
2919 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002920 def __getnewargs__(self):
2921 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002922 def __init__(self, a, b):
2923 self.a = a
2924 self.b = b
2925 def __repr__(self):
2926 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2927
2928 global C2
2929 class C2(int):
2930 def __new__(cls, a, b, val=0):
2931 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002932 def __getnewargs__(self):
2933 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002934 def __init__(self, a, b, val=0):
2935 self.a = a
2936 self.b = b
2937 def __repr__(self):
2938 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2939
Guido van Rossum90c45142001-11-24 21:07:01 +00002940 global C3
2941 class C3(object):
2942 def __init__(self, foo):
2943 self.foo = foo
2944 def __getstate__(self):
2945 return self.foo
2946 def __setstate__(self, foo):
2947 self.foo = foo
2948
2949 global C4classic, C4
2950 class C4classic: # classic
2951 pass
2952 class C4(C4classic, object): # mixed inheritance
2953 pass
2954
Guido van Rossum3926a632001-09-25 16:25:58 +00002955 for p in pickle, cPickle:
2956 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002957 if verbose:
2958 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002959
2960 for cls in C, C1, C2:
2961 s = p.dumps(cls, bin)
2962 cls2 = p.loads(s)
2963 verify(cls2 is cls)
2964
2965 a = C1(1, 2); a.append(42); a.append(24)
2966 b = C2("hello", "world", 42)
2967 s = p.dumps((a, b), bin)
2968 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002969 vereq(x.__class__, a.__class__)
2970 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2971 vereq(y.__class__, b.__class__)
2972 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002973 vereq(repr(x), repr(a))
2974 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002975 if verbose:
2976 print "a = x =", a
2977 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002978 # Test for __getstate__ and __setstate__ on new style class
2979 u = C3(42)
2980 s = p.dumps(u, bin)
2981 v = p.loads(s)
2982 veris(u.__class__, v.__class__)
2983 vereq(u.foo, v.foo)
2984 # Test for picklability of hybrid class
2985 u = C4()
2986 u.foo = 42
2987 s = p.dumps(u, bin)
2988 v = p.loads(s)
2989 veris(u.__class__, v.__class__)
2990 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002991
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002992 # Testing copy.deepcopy()
2993 if verbose:
2994 print "deepcopy"
2995 import copy
2996 for cls in C, C1, C2:
2997 cls2 = copy.deepcopy(cls)
2998 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002999
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003000 a = C1(1, 2); a.append(42); a.append(24)
3001 b = C2("hello", "world", 42)
3002 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003003 vereq(x.__class__, a.__class__)
3004 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3005 vereq(y.__class__, b.__class__)
3006 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003007 vereq(repr(x), repr(a))
3008 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003009 if verbose:
3010 print "a = x =", a
3011 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003012
Guido van Rossum8c842552002-03-14 23:05:54 +00003013def pickleslots():
3014 if verbose: print "Testing pickling of classes with __slots__ ..."
3015 import pickle, cPickle
3016 # Pickling of classes with __slots__ but without __getstate__ should fail
3017 global B, C, D, E
3018 class B(object):
3019 pass
3020 for base in [object, B]:
3021 class C(base):
3022 __slots__ = ['a']
3023 class D(C):
3024 pass
3025 try:
3026 pickle.dumps(C())
3027 except TypeError:
3028 pass
3029 else:
3030 raise TestFailed, "should fail: pickle C instance - %s" % base
3031 try:
3032 cPickle.dumps(C())
3033 except TypeError:
3034 pass
3035 else:
3036 raise TestFailed, "should fail: cPickle C instance - %s" % base
3037 try:
3038 pickle.dumps(C())
3039 except TypeError:
3040 pass
3041 else:
3042 raise TestFailed, "should fail: pickle D instance - %s" % base
3043 try:
3044 cPickle.dumps(D())
3045 except TypeError:
3046 pass
3047 else:
3048 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003049 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003050 class C(base):
3051 __slots__ = ['a']
3052 def __getstate__(self):
3053 try:
3054 d = self.__dict__.copy()
3055 except AttributeError:
3056 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003057 for cls in self.__class__.__mro__:
3058 for sn in cls.__dict__.get('__slots__', ()):
3059 try:
3060 d[sn] = getattr(self, sn)
3061 except AttributeError:
3062 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003063 return d
3064 def __setstate__(self, d):
3065 for k, v in d.items():
3066 setattr(self, k, v)
3067 class D(C):
3068 pass
3069 # Now it should work
3070 x = C()
3071 y = pickle.loads(pickle.dumps(x))
3072 vereq(hasattr(y, 'a'), 0)
3073 y = cPickle.loads(cPickle.dumps(x))
3074 vereq(hasattr(y, 'a'), 0)
3075 x.a = 42
3076 y = pickle.loads(pickle.dumps(x))
3077 vereq(y.a, 42)
3078 y = cPickle.loads(cPickle.dumps(x))
3079 vereq(y.a, 42)
3080 x = D()
3081 x.a = 42
3082 x.b = 100
3083 y = pickle.loads(pickle.dumps(x))
3084 vereq(y.a + y.b, 142)
3085 y = cPickle.loads(cPickle.dumps(x))
3086 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003087 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003088 class E(C):
3089 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003090 x = E()
3091 x.a = 42
3092 x.b = "foo"
3093 y = pickle.loads(pickle.dumps(x))
3094 vereq(y.a, x.a)
3095 vereq(y.b, x.b)
3096 y = cPickle.loads(cPickle.dumps(x))
3097 vereq(y.a, x.a)
3098 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003099
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003100def copies():
3101 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
3102 import copy
3103 class C(object):
3104 pass
3105
3106 a = C()
3107 a.foo = 12
3108 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003109 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003110
3111 a.bar = [1,2,3]
3112 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003113 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003114 verify(c.bar is a.bar)
3115
3116 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003117 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003118 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003119 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003120
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003121def binopoverride():
3122 if verbose: print "Testing overrides of binary operations..."
3123 class I(int):
3124 def __repr__(self):
3125 return "I(%r)" % int(self)
3126 def __add__(self, other):
3127 return I(int(self) + int(other))
3128 __radd__ = __add__
3129 def __pow__(self, other, mod=None):
3130 if mod is None:
3131 return I(pow(int(self), int(other)))
3132 else:
3133 return I(pow(int(self), int(other), int(mod)))
3134 def __rpow__(self, other, mod=None):
3135 if mod is None:
3136 return I(pow(int(other), int(self), mod))
3137 else:
3138 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003139
Walter Dörwald70a6b492004-02-12 17:35:32 +00003140 vereq(repr(I(1) + I(2)), "I(3)")
3141 vereq(repr(I(1) + 2), "I(3)")
3142 vereq(repr(1 + I(2)), "I(3)")
3143 vereq(repr(I(2) ** I(3)), "I(8)")
3144 vereq(repr(2 ** I(3)), "I(8)")
3145 vereq(repr(I(2) ** 3), "I(8)")
3146 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003147 class S(str):
3148 def __eq__(self, other):
3149 return self.lower() == other.lower()
3150
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003151def subclasspropagation():
3152 if verbose: print "Testing propagation of slot functions to subclasses..."
3153 class A(object):
3154 pass
3155 class B(A):
3156 pass
3157 class C(A):
3158 pass
3159 class D(B, C):
3160 pass
3161 d = D()
Tim Peters171b8682006-04-11 01:59:34 +00003162 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003163 A.__hash__ = lambda self: 42
3164 vereq(hash(d), 42)
3165 C.__hash__ = lambda self: 314
3166 vereq(hash(d), 314)
3167 B.__hash__ = lambda self: 144
3168 vereq(hash(d), 144)
3169 D.__hash__ = lambda self: 100
3170 vereq(hash(d), 100)
3171 del D.__hash__
3172 vereq(hash(d), 144)
3173 del B.__hash__
3174 vereq(hash(d), 314)
3175 del C.__hash__
3176 vereq(hash(d), 42)
3177 del A.__hash__
Tim Peters171b8682006-04-11 01:59:34 +00003178 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003179 d.foo = 42
3180 d.bar = 42
3181 vereq(d.foo, 42)
3182 vereq(d.bar, 42)
3183 def __getattribute__(self, name):
3184 if name == "foo":
3185 return 24
3186 return object.__getattribute__(self, name)
3187 A.__getattribute__ = __getattribute__
3188 vereq(d.foo, 24)
3189 vereq(d.bar, 42)
3190 def __getattr__(self, name):
3191 if name in ("spam", "foo", "bar"):
3192 return "hello"
3193 raise AttributeError, name
3194 B.__getattr__ = __getattr__
3195 vereq(d.spam, "hello")
3196 vereq(d.foo, 24)
3197 vereq(d.bar, 42)
3198 del A.__getattribute__
3199 vereq(d.foo, 42)
3200 del d.foo
3201 vereq(d.foo, "hello")
3202 vereq(d.bar, 42)
3203 del B.__getattr__
3204 try:
3205 d.foo
3206 except AttributeError:
3207 pass
3208 else:
3209 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003210
Guido van Rossume7f3e242002-06-14 02:35:45 +00003211 # Test a nasty bug in recurse_down_subclasses()
3212 import gc
3213 class A(object):
3214 pass
3215 class B(A):
3216 pass
3217 del B
3218 gc.collect()
3219 A.__setitem__ = lambda *a: None # crash
3220
Tim Petersfc57ccb2001-10-12 02:38:24 +00003221def buffer_inherit():
3222 import binascii
3223 # SF bug [#470040] ParseTuple t# vs subclasses.
3224 if verbose:
3225 print "Testing that buffer interface is inherited ..."
3226
3227 class MyStr(str):
3228 pass
3229 base = 'abc'
3230 m = MyStr(base)
3231 # b2a_hex uses the buffer interface to get its argument's value, via
3232 # PyArg_ParseTuple 't#' code.
3233 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3234
3235 # It's not clear that unicode will continue to support the character
3236 # buffer interface, and this test will fail if that's taken away.
3237 class MyUni(unicode):
3238 pass
3239 base = u'abc'
3240 m = MyUni(base)
3241 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3242
3243 class MyInt(int):
3244 pass
3245 m = MyInt(42)
3246 try:
3247 binascii.b2a_hex(m)
3248 raise TestFailed('subclass of int should not have a buffer interface')
3249 except TypeError:
3250 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003251
Tim Petersc9933152001-10-16 20:18:24 +00003252def str_of_str_subclass():
3253 import binascii
3254 import cStringIO
3255
3256 if verbose:
3257 print "Testing __str__ defined in subclass of str ..."
3258
3259 class octetstring(str):
3260 def __str__(self):
3261 return binascii.b2a_hex(self)
3262 def __repr__(self):
3263 return self + " repr"
3264
3265 o = octetstring('A')
3266 vereq(type(o), octetstring)
3267 vereq(type(str(o)), str)
3268 vereq(type(repr(o)), str)
3269 vereq(ord(o), 0x41)
3270 vereq(str(o), '41')
3271 vereq(repr(o), 'A repr')
3272 vereq(o.__str__(), '41')
3273 vereq(o.__repr__(), 'A repr')
3274
3275 capture = cStringIO.StringIO()
3276 # Calling str() or not exercises different internal paths.
3277 print >> capture, o
3278 print >> capture, str(o)
3279 vereq(capture.getvalue(), '41\n41\n')
3280 capture.close()
3281
Guido van Rossumc8e56452001-10-22 00:43:43 +00003282def kwdargs():
3283 if verbose: print "Testing keyword arguments to __init__, __call__..."
3284 def f(a): return a
3285 vereq(f.__call__(a=42), 42)
3286 a = []
3287 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003288 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003289
Brett Cannon22565aa2006-06-09 22:31:23 +00003290def recursive__call__():
3291 if verbose: print ("Testing recursive __call__() by setting to instance of "
3292 "class ...")
3293 class A(object):
3294 pass
3295
3296 A.__call__ = A()
3297 try:
3298 A()()
3299 except RuntimeError:
3300 pass
3301 else:
3302 raise TestFailed("Recursion limit should have been reached for "
3303 "__call__()")
3304
Guido van Rossumed87ad82001-10-30 02:33:02 +00003305def delhook():
3306 if verbose: print "Testing __del__ hook..."
3307 log = []
3308 class C(object):
3309 def __del__(self):
3310 log.append(1)
3311 c = C()
3312 vereq(log, [])
3313 del c
3314 vereq(log, [1])
3315
Guido van Rossum29d26062001-12-11 04:37:34 +00003316 class D(object): pass
3317 d = D()
3318 try: del d[0]
3319 except TypeError: pass
3320 else: raise TestFailed, "invalid del() didn't raise TypeError"
3321
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003322def hashinherit():
3323 if verbose: print "Testing hash of mutable subclasses..."
3324
3325 class mydict(dict):
3326 pass
3327 d = mydict()
3328 try:
3329 hash(d)
3330 except TypeError:
3331 pass
3332 else:
3333 raise TestFailed, "hash() of dict subclass should fail"
3334
3335 class mylist(list):
3336 pass
3337 d = mylist()
3338 try:
3339 hash(d)
3340 except TypeError:
3341 pass
3342 else:
3343 raise TestFailed, "hash() of list subclass should fail"
3344
Guido van Rossum29d26062001-12-11 04:37:34 +00003345def strops():
3346 try: 'a' + 5
3347 except TypeError: pass
3348 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3349
3350 try: ''.split('')
3351 except ValueError: pass
3352 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3353
3354 try: ''.join([0])
3355 except TypeError: pass
3356 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3357
3358 try: ''.rindex('5')
3359 except ValueError: pass
3360 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3361
Guido van Rossum29d26062001-12-11 04:37:34 +00003362 try: '%(n)s' % None
3363 except TypeError: pass
3364 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3365
3366 try: '%(n' % {}
3367 except ValueError: pass
3368 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3369
3370 try: '%*s' % ('abc')
3371 except TypeError: pass
3372 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3373
3374 try: '%*.*s' % ('abc', 5)
3375 except TypeError: pass
3376 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3377
3378 try: '%s' % (1, 2)
3379 except TypeError: pass
3380 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3381
3382 try: '%' % None
3383 except ValueError: pass
3384 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3385
3386 vereq('534253'.isdigit(), 1)
3387 vereq('534253x'.isdigit(), 0)
3388 vereq('%c' % 5, '\x05')
3389 vereq('%c' % '5', '5')
3390
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003391def deepcopyrecursive():
3392 if verbose: print "Testing deepcopy of recursive objects..."
3393 class Node:
3394 pass
3395 a = Node()
3396 b = Node()
3397 a.b = b
3398 b.a = a
3399 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003400
Guido van Rossumd7035672002-03-12 20:43:31 +00003401def modules():
3402 if verbose: print "Testing uninitialized module objects..."
3403 from types import ModuleType as M
3404 m = M.__new__(M)
3405 str(m)
3406 vereq(hasattr(m, "__name__"), 0)
3407 vereq(hasattr(m, "__file__"), 0)
3408 vereq(hasattr(m, "foo"), 0)
3409 vereq(m.__dict__, None)
3410 m.foo = 1
3411 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003412
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003413def dictproxyiterkeys():
3414 class C(object):
3415 def meth(self):
3416 pass
3417 if verbose: print "Testing dict-proxy iterkeys..."
3418 keys = [ key for key in C.__dict__.iterkeys() ]
3419 keys.sort()
3420 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3421
3422def dictproxyitervalues():
3423 class C(object):
3424 def meth(self):
3425 pass
3426 if verbose: print "Testing dict-proxy itervalues..."
3427 values = [ values for values in C.__dict__.itervalues() ]
3428 vereq(len(values), 5)
3429
3430def dictproxyiteritems():
3431 class C(object):
3432 def meth(self):
3433 pass
3434 if verbose: print "Testing dict-proxy iteritems..."
3435 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3436 keys.sort()
3437 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3438
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003439def funnynew():
3440 if verbose: print "Testing __new__ returning something unexpected..."
3441 class C(object):
3442 def __new__(cls, arg):
3443 if isinstance(arg, str): return [1, 2, 3]
3444 elif isinstance(arg, int): return object.__new__(D)
3445 else: return object.__new__(cls)
3446 class D(C):
3447 def __init__(self, arg):
3448 self.foo = arg
3449 vereq(C("1"), [1, 2, 3])
3450 vereq(D("1"), [1, 2, 3])
3451 d = D(None)
3452 veris(d.foo, None)
3453 d = C(1)
3454 vereq(isinstance(d, D), True)
3455 vereq(d.foo, 1)
3456 d = D(1)
3457 vereq(isinstance(d, D), True)
3458 vereq(d.foo, 1)
3459
Guido van Rossume8fc6402002-04-16 16:44:51 +00003460def imulbug():
3461 # SF bug 544647
3462 if verbose: print "Testing for __imul__ problems..."
3463 class C(object):
3464 def __imul__(self, other):
3465 return (self, other)
3466 x = C()
3467 y = x
3468 y *= 1.0
3469 vereq(y, (x, 1.0))
3470 y = x
3471 y *= 2
3472 vereq(y, (x, 2))
3473 y = x
3474 y *= 3L
3475 vereq(y, (x, 3L))
3476 y = x
3477 y *= 1L<<100
3478 vereq(y, (x, 1L<<100))
3479 y = x
3480 y *= None
3481 vereq(y, (x, None))
3482 y = x
3483 y *= "foo"
3484 vereq(y, (x, "foo"))
3485
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003486def docdescriptor():
3487 # SF bug 542984
3488 if verbose: print "Testing __doc__ descriptor..."
3489 class DocDescr(object):
3490 def __get__(self, object, otype):
3491 if object:
3492 object = object.__class__.__name__ + ' instance'
3493 if otype:
3494 otype = otype.__name__
3495 return 'object=%s; type=%s' % (object, otype)
3496 class OldClass:
3497 __doc__ = DocDescr()
3498 class NewClass(object):
3499 __doc__ = DocDescr()
3500 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3501 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3502 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3503 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3504
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003505def copy_setstate():
3506 if verbose:
3507 print "Testing that copy.*copy() correctly uses __setstate__..."
3508 import copy
3509 class C(object):
3510 def __init__(self, foo=None):
3511 self.foo = foo
3512 self.__foo = foo
3513 def setfoo(self, foo=None):
3514 self.foo = foo
3515 def getfoo(self):
3516 return self.__foo
3517 def __getstate__(self):
3518 return [self.foo]
3519 def __setstate__(self, lst):
3520 assert len(lst) == 1
3521 self.__foo = self.foo = lst[0]
3522 a = C(42)
3523 a.setfoo(24)
3524 vereq(a.foo, 24)
3525 vereq(a.getfoo(), 42)
3526 b = copy.copy(a)
3527 vereq(b.foo, 24)
3528 vereq(b.getfoo(), 24)
3529 b = copy.deepcopy(a)
3530 vereq(b.foo, 24)
3531 vereq(b.getfoo(), 24)
3532
Guido van Rossum09638c12002-06-13 19:17:46 +00003533def slices():
3534 if verbose:
3535 print "Testing cases with slices and overridden __getitem__ ..."
3536 # Strings
3537 vereq("hello"[:4], "hell")
3538 vereq("hello"[slice(4)], "hell")
3539 vereq(str.__getitem__("hello", slice(4)), "hell")
3540 class S(str):
3541 def __getitem__(self, x):
3542 return str.__getitem__(self, x)
3543 vereq(S("hello")[:4], "hell")
3544 vereq(S("hello")[slice(4)], "hell")
3545 vereq(S("hello").__getitem__(slice(4)), "hell")
3546 # Tuples
3547 vereq((1,2,3)[:2], (1,2))
3548 vereq((1,2,3)[slice(2)], (1,2))
3549 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3550 class T(tuple):
3551 def __getitem__(self, x):
3552 return tuple.__getitem__(self, x)
3553 vereq(T((1,2,3))[:2], (1,2))
3554 vereq(T((1,2,3))[slice(2)], (1,2))
3555 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3556 # Lists
3557 vereq([1,2,3][:2], [1,2])
3558 vereq([1,2,3][slice(2)], [1,2])
3559 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3560 class L(list):
3561 def __getitem__(self, x):
3562 return list.__getitem__(self, x)
3563 vereq(L([1,2,3])[:2], [1,2])
3564 vereq(L([1,2,3])[slice(2)], [1,2])
3565 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3566 # Now do lists and __setitem__
3567 a = L([1,2,3])
3568 a[slice(1, 3)] = [3,2]
3569 vereq(a, [1,3,2])
3570 a[slice(0, 2, 1)] = [3,1]
3571 vereq(a, [3,1,2])
3572 a.__setitem__(slice(1, 3), [2,1])
3573 vereq(a, [3,2,1])
3574 a.__setitem__(slice(0, 2, 1), [2,3])
3575 vereq(a, [2,3,1])
3576
Tim Peters2484aae2002-07-11 06:56:07 +00003577def subtype_resurrection():
3578 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003579 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003580
3581 class C(object):
3582 container = []
3583
3584 def __del__(self):
3585 # resurrect the instance
3586 C.container.append(self)
3587
3588 c = C()
3589 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003590 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003591 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003592 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003593
3594 # If that didn't blow up, it's also interesting to see whether clearing
3595 # the last container slot works: that will attempt to delete c again,
3596 # which will cause c to get appended back to the container again "during"
3597 # the del.
3598 del C.container[-1]
3599 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003600 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003601
Tim Peters14cb1e12002-07-11 18:26:21 +00003602 # Make c mortal again, so that the test framework with -l doesn't report
3603 # it as a leak.
3604 del C.__del__
3605
Guido van Rossum2d702462002-08-06 21:28:28 +00003606def slottrash():
3607 # Deallocating deeply nested slotted trash caused stack overflows
3608 if verbose:
3609 print "Testing slot trash..."
3610 class trash(object):
3611 __slots__ = ['x']
3612 def __init__(self, x):
3613 self.x = x
3614 o = None
3615 for i in xrange(50000):
3616 o = trash(o)
3617 del o
3618
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003619def slotmultipleinheritance():
3620 # SF bug 575229, multiple inheritance w/ slots dumps core
3621 class A(object):
3622 __slots__=()
3623 class B(object):
3624 pass
3625 class C(A,B) :
3626 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003627 vereq(C.__basicsize__, B.__basicsize__)
3628 verify(hasattr(C, '__dict__'))
3629 verify(hasattr(C, '__weakref__'))
3630 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003631
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003632def testrmul():
3633 # SF patch 592646
3634 if verbose:
3635 print "Testing correct invocation of __rmul__..."
3636 class C(object):
3637 def __mul__(self, other):
3638 return "mul"
3639 def __rmul__(self, other):
3640 return "rmul"
3641 a = C()
3642 vereq(a*2, "mul")
3643 vereq(a*2.2, "mul")
3644 vereq(2*a, "rmul")
3645 vereq(2.2*a, "rmul")
3646
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003647def testipow():
3648 # [SF bug 620179]
3649 if verbose:
3650 print "Testing correct invocation of __ipow__..."
3651 class C(object):
3652 def __ipow__(self, other):
3653 pass
3654 a = C()
3655 a **= 2
3656
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003657def do_this_first():
3658 if verbose:
3659 print "Testing SF bug 551412 ..."
3660 # This dumps core when SF bug 551412 isn't fixed --
3661 # but only when test_descr.py is run separately.
3662 # (That can't be helped -- as soon as PyType_Ready()
3663 # is called for PyLong_Type, the bug is gone.)
3664 class UserLong(object):
3665 def __pow__(self, *args):
3666 pass
3667 try:
3668 pow(0L, UserLong(), 0L)
3669 except:
3670 pass
3671
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003672 if verbose:
3673 print "Testing SF bug 570483..."
3674 # Another segfault only when run early
3675 # (before PyType_Ready(tuple) is called)
3676 type.mro(tuple)
3677
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003678def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003679 if verbose:
3680 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003681 # stuff that should work:
3682 class C(object):
3683 pass
3684 class C2(object):
3685 def __getattribute__(self, attr):
3686 if attr == 'a':
3687 return 2
3688 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003689 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003690 def meth(self):
3691 return 1
3692 class D(C):
3693 pass
3694 class E(D):
3695 pass
3696 d = D()
3697 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003698 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003699 D.__bases__ = (C2,)
3700 vereq(d.meth(), 1)
3701 vereq(e.meth(), 1)
3702 vereq(d.a, 2)
3703 vereq(e.a, 2)
3704 vereq(C2.__subclasses__(), [D])
3705
3706 # stuff that shouldn't:
3707 class L(list):
3708 pass
3709
3710 try:
3711 L.__bases__ = (dict,)
3712 except TypeError:
3713 pass
3714 else:
3715 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3716
3717 try:
3718 list.__bases__ = (dict,)
3719 except TypeError:
3720 pass
3721 else:
3722 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3723
3724 try:
3725 del D.__bases__
3726 except TypeError:
3727 pass
3728 else:
3729 raise TestFailed, "shouldn't be able to delete .__bases__"
3730
3731 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003732 D.__bases__ = ()
3733 except TypeError, msg:
3734 if str(msg) == "a new-style class can't have only classic bases":
3735 raise TestFailed, "wrong error message for .__bases__ = ()"
3736 else:
3737 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3738
3739 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003740 D.__bases__ = (D,)
3741 except TypeError:
3742 pass
3743 else:
3744 # actually, we'll have crashed by here...
3745 raise TestFailed, "shouldn't be able to create inheritance cycles"
3746
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003747 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003748 D.__bases__ = (C, C)
3749 except TypeError:
3750 pass
3751 else:
3752 raise TestFailed, "didn't detect repeated base classes"
3753
3754 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003755 D.__bases__ = (E,)
3756 except TypeError:
3757 pass
3758 else:
3759 raise TestFailed, "shouldn't be able to create inheritance cycles"
3760
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003761 # let's throw a classic class into the mix:
3762 class Classic:
3763 def meth2(self):
3764 return 3
3765
3766 D.__bases__ = (C, Classic)
3767
3768 vereq(d.meth2(), 3)
3769 vereq(e.meth2(), 3)
3770 try:
3771 d.a
3772 except AttributeError:
3773 pass
3774 else:
3775 raise TestFailed, "attribute should have vanished"
3776
3777 try:
3778 D.__bases__ = (Classic,)
3779 except TypeError:
3780 pass
3781 else:
3782 raise TestFailed, "new-style class must have a new-style base"
3783
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003784def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003785 if verbose:
3786 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003787 class WorkOnce(type):
3788 def __new__(self, name, bases, ns):
3789 self.flag = 0
3790 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3791 def mro(self):
3792 if self.flag > 0:
3793 raise RuntimeError, "bozo"
3794 else:
3795 self.flag += 1
3796 return type.mro(self)
3797
3798 class WorkAlways(type):
3799 def mro(self):
3800 # this is here to make sure that .mro()s aren't called
3801 # with an exception set (which was possible at one point).
3802 # An error message will be printed in a debug build.
3803 # What's a good way to test for this?
3804 return type.mro(self)
3805
3806 class C(object):
3807 pass
3808
3809 class C2(object):
3810 pass
3811
3812 class D(C):
3813 pass
3814
3815 class E(D):
3816 pass
3817
3818 class F(D):
3819 __metaclass__ = WorkOnce
3820
3821 class G(D):
3822 __metaclass__ = WorkAlways
3823
3824 # Immediate subclasses have their mro's adjusted in alphabetical
3825 # order, so E's will get adjusted before adjusting F's fails. We
3826 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003827
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003828 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003829 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003830
3831 try:
3832 D.__bases__ = (C2,)
3833 except RuntimeError:
3834 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003835 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003836 else:
3837 raise TestFailed, "exception not propagated"
3838
3839def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003840 if verbose:
3841 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003842 class A(object):
3843 pass
3844
3845 class B(object):
3846 pass
3847
3848 class C(A, B):
3849 pass
3850
3851 class D(A, B):
3852 pass
3853
3854 class E(C, D):
3855 pass
3856
3857 try:
3858 C.__bases__ = (B, A)
3859 except TypeError:
3860 pass
3861 else:
3862 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003863
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003864def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003865 if verbose:
3866 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003867 class C(object):
3868 pass
3869
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003870 # C.__module__ could be 'test_descr' or '__main__'
3871 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003872
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003873 C.__name__ = 'D'
3874 vereq((C.__module__, C.__name__), (mod, 'D'))
3875
3876 C.__name__ = 'D.E'
3877 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003878
Guido van Rossum613f24f2003-01-06 23:00:59 +00003879def subclass_right_op():
3880 if verbose:
3881 print "Testing correct dispatch of subclass overloading __r<op>__..."
3882
3883 # This code tests various cases where right-dispatch of a subclass
3884 # should be preferred over left-dispatch of a base class.
3885
3886 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3887
3888 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003889 def __floordiv__(self, other):
3890 return "B.__floordiv__"
3891 def __rfloordiv__(self, other):
3892 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003893
Guido van Rossumf389c772003-02-27 20:04:19 +00003894 vereq(B(1) // 1, "B.__floordiv__")
3895 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003896
3897 # Case 2: subclass of object; this is just the baseline for case 3
3898
3899 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003900 def __floordiv__(self, other):
3901 return "C.__floordiv__"
3902 def __rfloordiv__(self, other):
3903 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003904
Guido van Rossumf389c772003-02-27 20:04:19 +00003905 vereq(C() // 1, "C.__floordiv__")
3906 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003907
3908 # Case 3: subclass of new-style class; here it gets interesting
3909
3910 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003911 def __floordiv__(self, other):
3912 return "D.__floordiv__"
3913 def __rfloordiv__(self, other):
3914 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003915
Guido van Rossumf389c772003-02-27 20:04:19 +00003916 vereq(D() // C(), "D.__floordiv__")
3917 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003918
3919 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3920
3921 class E(C):
3922 pass
3923
Guido van Rossumf389c772003-02-27 20:04:19 +00003924 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003925
Guido van Rossumf389c772003-02-27 20:04:19 +00003926 vereq(E() // 1, "C.__floordiv__")
3927 vereq(1 // E(), "C.__rfloordiv__")
3928 vereq(E() // C(), "C.__floordiv__")
3929 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003930
Guido van Rossum373c7412003-01-07 13:41:37 +00003931def dict_type_with_metaclass():
3932 if verbose:
3933 print "Testing type of __dict__ when __metaclass__ set..."
3934
3935 class B(object):
3936 pass
3937 class M(type):
3938 pass
3939 class C:
3940 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3941 __metaclass__ = M
3942 veris(type(C.__dict__), type(B.__dict__))
3943
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003944def meth_class_get():
3945 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003946 if verbose:
3947 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003948 # Baseline
3949 arg = [1, 2, 3]
3950 res = {1: None, 2: None, 3: None}
3951 vereq(dict.fromkeys(arg), res)
3952 vereq({}.fromkeys(arg), res)
3953 # Now get the descriptor
3954 descr = dict.__dict__["fromkeys"]
3955 # More baseline using the descriptor directly
3956 vereq(descr.__get__(None, dict)(arg), res)
3957 vereq(descr.__get__({})(arg), res)
3958 # Now check various error cases
3959 try:
3960 descr.__get__(None, None)
3961 except TypeError:
3962 pass
3963 else:
3964 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3965 try:
3966 descr.__get__(42)
3967 except TypeError:
3968 pass
3969 else:
3970 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3971 try:
3972 descr.__get__(None, 42)
3973 except TypeError:
3974 pass
3975 else:
3976 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3977 try:
3978 descr.__get__(None, int)
3979 except TypeError:
3980 pass
3981 else:
3982 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3983
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003984def isinst_isclass():
3985 if verbose:
3986 print "Testing proxy isinstance() and isclass()..."
3987 class Proxy(object):
3988 def __init__(self, obj):
3989 self.__obj = obj
3990 def __getattribute__(self, name):
3991 if name.startswith("_Proxy__"):
3992 return object.__getattribute__(self, name)
3993 else:
3994 return getattr(self.__obj, name)
3995 # Test with a classic class
3996 class C:
3997 pass
3998 a = C()
3999 pa = Proxy(a)
4000 verify(isinstance(a, C)) # Baseline
4001 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004002 # Test with a classic subclass
4003 class D(C):
4004 pass
4005 a = D()
4006 pa = Proxy(a)
4007 verify(isinstance(a, C)) # Baseline
4008 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004009 # Test with a new-style class
4010 class C(object):
4011 pass
4012 a = C()
4013 pa = Proxy(a)
4014 verify(isinstance(a, C)) # Baseline
4015 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004016 # Test with a new-style subclass
4017 class D(C):
4018 pass
4019 a = D()
4020 pa = Proxy(a)
4021 verify(isinstance(a, C)) # Baseline
4022 verify(isinstance(pa, C)) # Test
4023
4024def proxysuper():
4025 if verbose:
4026 print "Testing super() for a proxy object..."
4027 class Proxy(object):
4028 def __init__(self, obj):
4029 self.__obj = obj
4030 def __getattribute__(self, name):
4031 if name.startswith("_Proxy__"):
4032 return object.__getattribute__(self, name)
4033 else:
4034 return getattr(self.__obj, name)
4035
4036 class B(object):
4037 def f(self):
4038 return "B.f"
4039
4040 class C(B):
4041 def f(self):
4042 return super(C, self).f() + "->C.f"
4043
4044 obj = C()
4045 p = Proxy(obj)
4046 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004047
Guido van Rossum52b27052003-04-15 20:05:10 +00004048def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004049 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00004050 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004051 try:
4052 object.__setattr__(str, "foo", 42)
4053 except TypeError:
4054 pass
4055 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004056 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004057 try:
4058 object.__delattr__(str, "lower")
4059 except TypeError:
4060 pass
4061 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004062 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004063
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004064def weakref_segfault():
4065 # SF 742911
4066 if verbose:
4067 print "Testing weakref segfault..."
4068
4069 import weakref
4070
4071 class Provoker:
4072 def __init__(self, referrent):
4073 self.ref = weakref.ref(referrent)
4074
4075 def __del__(self):
4076 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004077
4078 class Oops(object):
4079 pass
4080
4081 o = Oops()
4082 o.whatever = Provoker(o)
4083 del o
4084
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004085def wrapper_segfault():
4086 # SF 927248: deeply nested wrappers could cause stack overflow
4087 f = lambda:None
4088 for i in xrange(1000000):
4089 f = f.__call__
4090 f = None
4091
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004092# Fix SF #762455, segfault when sys.stdout is changed in getattr
4093def filefault():
4094 if verbose:
4095 print "Testing sys.stdout is changed in getattr..."
4096 import sys
4097 class StdoutGuard:
4098 def __getattr__(self, attr):
4099 sys.stdout = sys.__stdout__
4100 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4101 sys.stdout = StdoutGuard()
4102 try:
4103 print "Oops!"
4104 except RuntimeError:
4105 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004106
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004107def vicious_descriptor_nonsense():
4108 # A potential segfault spotted by Thomas Wouters in mail to
4109 # python-dev 2003-04-17, turned into an example & fixed by Michael
4110 # Hudson just less than four months later...
4111 if verbose:
4112 print "Testing vicious_descriptor_nonsense..."
4113
4114 class Evil(object):
4115 def __hash__(self):
4116 return hash('attr')
4117 def __eq__(self, other):
4118 del C.attr
4119 return 0
4120
4121 class Descr(object):
4122 def __get__(self, ob, type=None):
4123 return 1
4124
4125 class C(object):
4126 attr = Descr()
4127
4128 c = C()
4129 c.__dict__[Evil()] = 0
4130
4131 vereq(c.attr, 1)
4132 # this makes a crash more likely:
4133 import gc; gc.collect()
4134 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004135
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004136def test_init():
4137 # SF 1155938
4138 class Foo(object):
4139 def __init__(self):
4140 return 10
4141 try:
4142 Foo()
4143 except TypeError:
4144 pass
4145 else:
4146 raise TestFailed, "did not test __init__() for None return"
4147
Armin Rigoc6686b72005-11-07 08:38:00 +00004148def methodwrapper():
4149 # <type 'method-wrapper'> did not support any reflection before 2.5
4150 if verbose:
4151 print "Testing method-wrapper objects..."
4152
4153 l = []
4154 vereq(l.__add__, l.__add__)
Armin Rigofd01d792006-06-08 10:56:24 +00004155 vereq(l.__add__, [].__add__)
4156 verify(l.__add__ != [5].__add__)
4157 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004158 verify(l.__add__.__name__ == '__add__')
4159 verify(l.__add__.__self__ is l)
4160 verify(l.__add__.__objclass__ is list)
4161 vereq(l.__add__.__doc__, list.__add__.__doc__)
Armin Rigofd01d792006-06-08 10:56:24 +00004162 try:
4163 hash(l.__add__)
4164 except TypeError:
4165 pass
4166 else:
4167 raise TestFailed("no TypeError from hash([].__add__)")
4168
4169 t = ()
4170 t += (7,)
4171 vereq(t.__add__, (7,).__add__)
4172 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004173
Armin Rigofd163f92005-12-29 15:59:19 +00004174def notimplemented():
4175 # all binary methods should be able to return a NotImplemented
4176 if verbose:
4177 print "Testing NotImplemented..."
4178
4179 import sys
4180 import types
4181 import operator
4182
4183 def specialmethod(self, other):
4184 return NotImplemented
4185
4186 def check(expr, x, y):
4187 try:
4188 exec expr in {'x': x, 'y': y, 'operator': operator}
4189 except TypeError:
4190 pass
4191 else:
4192 raise TestFailed("no TypeError from %r" % (expr,))
4193
4194 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
4195 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4196 # ValueErrors instead of TypeErrors
4197 for metaclass in [type, types.ClassType]:
4198 for name, expr, iexpr in [
4199 ('__add__', 'x + y', 'x += y'),
4200 ('__sub__', 'x - y', 'x -= y'),
4201 ('__mul__', 'x * y', 'x *= y'),
4202 ('__truediv__', 'operator.truediv(x, y)', None),
4203 ('__floordiv__', 'operator.floordiv(x, y)', None),
4204 ('__div__', 'x / y', 'x /= y'),
4205 ('__mod__', 'x % y', 'x %= y'),
4206 ('__divmod__', 'divmod(x, y)', None),
4207 ('__pow__', 'x ** y', 'x **= y'),
4208 ('__lshift__', 'x << y', 'x <<= y'),
4209 ('__rshift__', 'x >> y', 'x >>= y'),
4210 ('__and__', 'x & y', 'x &= y'),
4211 ('__or__', 'x | y', 'x |= y'),
4212 ('__xor__', 'x ^ y', 'x ^= y'),
4213 ('__coerce__', 'coerce(x, y)', None)]:
4214 if name == '__coerce__':
4215 rname = name
4216 else:
4217 rname = '__r' + name[2:]
4218 A = metaclass('A', (), {name: specialmethod})
4219 B = metaclass('B', (), {rname: specialmethod})
4220 a = A()
4221 b = B()
4222 check(expr, a, a)
4223 check(expr, a, b)
4224 check(expr, b, a)
4225 check(expr, b, b)
4226 check(expr, a, N1)
4227 check(expr, a, N2)
4228 check(expr, N1, b)
4229 check(expr, N2, b)
4230 if iexpr:
4231 check(iexpr, a, a)
4232 check(iexpr, a, b)
4233 check(iexpr, b, a)
4234 check(iexpr, b, b)
4235 check(iexpr, a, N1)
4236 check(iexpr, a, N2)
4237 iname = '__i' + name[2:]
4238 C = metaclass('C', (), {iname: specialmethod})
4239 c = C()
4240 check(iexpr, c, a)
4241 check(iexpr, c, b)
4242 check(iexpr, c, N1)
4243 check(iexpr, c, N2)
4244
Georg Brandl0ea89162007-03-05 22:28:13 +00004245def test_assign_slice():
4246 # ceval.c's assign_slice used to check for
4247 # tp->tp_as_sequence->sq_slice instead of
4248 # tp->tp_as_sequence->sq_ass_slice
4249
4250 class C(object):
4251 def __setslice__(self, start, stop, value):
4252 self.value = value
4253
4254 c = C()
4255 c[1:2] = 3
4256 vereq(c.value, 3)
4257
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004258def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004259 weakref_segfault() # Must be first, somehow
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004260 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004261 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004262 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004263 lists()
4264 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004265 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004266 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004267 ints()
4268 longs()
4269 floats()
4270 complexes()
4271 spamlists()
4272 spamdicts()
4273 pydicts()
4274 pylists()
4275 metaclass()
4276 pymods()
4277 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004278 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004279 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004280 ex5()
4281 monotonicity()
4282 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004283 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004284 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004285 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004286 dynamics()
4287 errors()
4288 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004289 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004290 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004291 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004292 classic()
4293 compattr()
4294 newslot()
4295 altmro()
4296 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004297 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004298 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004299 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004300 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004301 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004302 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004303 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004304 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004305 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004306 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004307 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004308 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004309 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004310 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004311 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004312 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004313 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004314 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004315 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004316 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004317 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004318 kwdargs()
Brett Cannon22565aa2006-06-09 22:31:23 +00004319 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004320 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004321 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004322 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004323 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004324 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004325 dictproxyiterkeys()
4326 dictproxyitervalues()
4327 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004328 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004329 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004330 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004331 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004332 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004333 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004334 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004335 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004336 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004337 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004338 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004339 test_mutable_bases()
4340 test_mutable_bases_with_failing_mro()
4341 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004342 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004343 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004344 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004345 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004346 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004347 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004348 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004349 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004350 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004351 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004352 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004353 notimplemented()
Georg Brandl0ea89162007-03-05 22:28:13 +00004354 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004355
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004356 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004357
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004358if __name__ == "__main__":
4359 test_main()