blob: 9a45cf1760b75c9d2d68734fe94b014e358025e6 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Armin Rigoc0ba52d2007-04-19 14:44:48 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
Armin Rigo9790a272007-05-02 19:23:31 +00006import types
Brett Cannon1e534b52007-09-07 04:18:30 +00007import new
Tim Peters4d9b4662002-04-16 01:59:17 +00008
9warnings.filterwarnings("ignore",
10 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +000011 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000012
Guido van Rossum875eeaa2001-10-11 18:33:53 +000013def veris(a, b):
14 if a is not b:
15 raise TestFailed, "%r is %r" % (a, b)
16
Tim Peters6d6c1a32001-08-02 04:15:00 +000017def testunop(a, res, expr="len(a)", meth="__len__"):
18 if verbose: print "checking", expr
19 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000020 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000021 t = type(a)
22 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000023 while meth not in t.__dict__:
24 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000025 vereq(m, t.__dict__[meth])
26 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000028 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000029
30def testbinop(a, b, res, expr="a+b", meth="__add__"):
31 if verbose: print "checking", expr
32 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000033
34 # XXX Hack so this passes before 2.3 when -Qnew is specified.
35 if meth == "__div__" and 1/2 == 0.5:
36 meth = "__truediv__"
37
Guido van Rossum45704552001-10-08 16:35:45 +000038 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039 t = type(a)
40 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000041 while meth not in t.__dict__:
42 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000043 vereq(m, t.__dict__[meth])
44 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000046 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000047
48def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
49 if verbose: print "checking", expr
50 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000051 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052 t = type(a)
53 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000054 while meth not in t.__dict__:
55 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000056 vereq(m, t.__dict__[meth])
57 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000059 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000060
61def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
62 if verbose: print "checking", stmt
63 dict = {'a': deepcopy(a), 'b': b}
64 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000065 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066 t = type(a)
67 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000068 while meth not in t.__dict__:
69 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000070 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000071 dict['a'] = deepcopy(a)
72 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000073 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000074 dict['a'] = deepcopy(a)
75 bm = getattr(dict['a'], meth)
76 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000077 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000078
79def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
80 if verbose: print "checking", stmt
81 dict = {'a': deepcopy(a), 'b': b, 'c': c}
82 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000083 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000084 t = type(a)
85 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000086 while meth not in t.__dict__:
87 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000088 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000089 dict['a'] = deepcopy(a)
90 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000091 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000092 dict['a'] = deepcopy(a)
93 bm = getattr(dict['a'], meth)
94 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000095 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000096
97def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
98 if verbose: print "checking", stmt
99 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
100 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +0000101 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000102 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000103 while meth not in t.__dict__:
104 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000106 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000107 dict['a'] = deepcopy(a)
108 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000109 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000110 dict['a'] = deepcopy(a)
111 bm = getattr(dict['a'], meth)
112 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000113 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000114
Tim Peters2f93e282001-10-04 05:27:00 +0000115def class_docstrings():
116 class Classic:
117 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000118 vereq(Classic.__doc__, "A classic docstring.")
119 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000120
121 class Classic2:
122 pass
123 verify(Classic2.__doc__ is None)
124
Tim Peters4fb1fe82001-10-04 05:48:13 +0000125 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000126 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000127 vereq(NewStatic.__doc__, "Another docstring.")
128 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000129
Tim Peters4fb1fe82001-10-04 05:48:13 +0000130 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000131 pass
132 verify(NewStatic2.__doc__ is None)
133
Tim Peters4fb1fe82001-10-04 05:48:13 +0000134 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000135 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000136 vereq(NewDynamic.__doc__, "Another docstring.")
137 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000138
Tim Peters4fb1fe82001-10-04 05:48:13 +0000139 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000140 pass
141 verify(NewDynamic2.__doc__ is None)
142
Tim Peters6d6c1a32001-08-02 04:15:00 +0000143def lists():
144 if verbose: print "Testing list operations..."
145 testbinop([1], [2], [1,2], "a+b", "__add__")
146 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
147 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
148 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
149 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
150 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
151 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
152 testunop([1,2,3], 3, "len(a)", "__len__")
153 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
154 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
155 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
156 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
157
158def dicts():
159 if verbose: print "Testing dict operations..."
160 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
161 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
162 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
163 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
164 d = {1:2,3:4}
165 l1 = []
166 for i in d.keys(): l1.append(i)
167 l = []
168 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000169 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 l = []
171 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000172 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000173 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000174 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000175 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000176 d = {1:2, 3:4}
177 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000178 vereq(eval(repr(d), {}), d)
179 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000180 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
181
Tim Peters25786c02001-09-02 08:22:48 +0000182def dict_constructor():
183 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000184 print "Testing dict constructor ..."
185 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000186 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000187 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000188 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000189 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000190 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000191 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000192 vereq(d, dict(d.iteritems()))
193 d = dict({'one':1, 'two':2})
194 vereq(d, dict(one=1, two=2))
195 vereq(d, dict(**d))
196 vereq(d, dict({"one": 1}, two=2))
197 vereq(d, dict([("two", 2)], one=1))
198 vereq(d, dict([("one", 100), ("two", 200)], **d))
199 verify(d is not dict(**d))
Tim Peters25786c02001-09-02 08:22:48 +0000200 for badarg in 0, 0L, 0j, "0", [0], (0,):
201 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000202 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000203 except TypeError:
204 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000205 except ValueError:
206 if badarg == "0":
207 # It's a sequence, and its elements are also sequences (gotta
208 # love strings <wink>), but they aren't of length 2, so this
209 # one seemed better as a ValueError than a TypeError.
210 pass
211 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000212 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000213 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000214 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000215
216 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000217 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000218 except TypeError:
219 pass
220 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000221 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000222
223 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000224 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000225 dict = {1:2, 3:4, 'a':1j}
226
Tim Peters25786c02001-09-02 08:22:48 +0000227 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000228 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000229 except TypeError:
230 pass
231 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000232 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000233
234 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000235 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000236 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000237 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000238
Tim Peters1fc240e2001-10-26 05:06:50 +0000239 # Init from sequence of iterable objects, each producing a 2-sequence.
240 class AddressBookEntry:
241 def __init__(self, first, last):
242 self.first = first
243 self.last = last
244 def __iter__(self):
245 return iter([self.first, self.last])
246
Tim Petersa427a2b2001-10-29 22:25:45 +0000247 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000248 AddressBookEntry('Barry', 'Peters'),
249 AddressBookEntry('Tim', 'Peters'),
250 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000251 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
252
Tim Petersa427a2b2001-10-29 22:25:45 +0000253 d = dict(zip(range(4), range(1, 5)))
254 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000255
256 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000257 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000258 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000259 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000260 except ValueError:
261 pass
262 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000263 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000264
Tim Peters5d2b77c2001-09-03 05:47:38 +0000265def test_dir():
266 if verbose:
267 print "Testing dir() ..."
268 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000269 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000270 del junk
271
272 # Just make sure these don't blow up!
273 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
274 dir(arg)
275
Tim Peters37a309d2001-09-04 01:20:04 +0000276 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000277 class C:
278 Cdata = 1
279 def Cmethod(self): pass
280
281 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000282 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000283 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000284
285 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000286 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000287
288 c.cdata = 2
289 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000290 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000291 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000292
293 class A(C):
294 Adata = 1
295 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000296
Tim Peters37a309d2001-09-04 01:20:04 +0000297 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000298 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000299 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000300 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000301 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000302 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000303 a.adata = 42
304 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000305 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000306
307 # The same, but with new-style classes. Since these have object as a
308 # base class, a lot more gets sucked in.
309 def interesting(strings):
310 return [s for s in strings if not s.startswith('_')]
311
Tim Peters5d2b77c2001-09-03 05:47:38 +0000312 class C(object):
313 Cdata = 1
314 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000315
316 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000317 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000318
319 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000320 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000321 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000322
323 c.cdata = 2
324 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000325 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000326 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000327
Tim Peters5d2b77c2001-09-03 05:47:38 +0000328 class A(C):
329 Adata = 1
330 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000331
332 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000333 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000334 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000335 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000336 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000337 a.adata = 42
338 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000339 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000340 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000341
Tim Peterscaaff8d2001-09-10 23:12:14 +0000342 # Try a module subclass.
343 import sys
344 class M(type(sys)):
345 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000346 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000347 minstance.b = 2
348 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000349 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
350 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000351
352 class M2(M):
353 def getdict(self):
354 return "Not a dict!"
355 __dict__ = property(getdict)
356
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000357 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000358 m2instance.b = 2
359 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000360 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000361 try:
362 dir(m2instance)
363 except TypeError:
364 pass
365
Tim Peters9e6a3992001-10-30 05:45:26 +0000366 # Two essentially featureless objects, just inheriting stuff from
367 # object.
368 vereq(dir(None), dir(Ellipsis))
369
Guido van Rossum44022412002-05-13 18:29:46 +0000370 # Nasty test case for proxied objects
371 class Wrapper(object):
372 def __init__(self, obj):
373 self.__obj = obj
374 def __repr__(self):
375 return "Wrapper(%s)" % repr(self.__obj)
376 def __getitem__(self, key):
377 return Wrapper(self.__obj[key])
378 def __len__(self):
379 return len(self.__obj)
380 def __getattr__(self, name):
381 return Wrapper(getattr(self.__obj, name))
382
383 class C(object):
384 def __getclass(self):
385 return Wrapper(type(self))
386 __class__ = property(__getclass)
387
388 dir(C()) # This used to segfault
389
Tim Peters6d6c1a32001-08-02 04:15:00 +0000390binops = {
391 'add': '+',
392 'sub': '-',
393 'mul': '*',
394 'div': '/',
395 'mod': '%',
396 'divmod': 'divmod',
397 'pow': '**',
398 'lshift': '<<',
399 'rshift': '>>',
400 'and': '&',
401 'xor': '^',
402 'or': '|',
403 'cmp': 'cmp',
404 'lt': '<',
405 'le': '<=',
406 'eq': '==',
407 'ne': '!=',
408 'gt': '>',
409 'ge': '>=',
410 }
411
412for name, expr in binops.items():
413 if expr.islower():
414 expr = expr + "(a, b)"
415 else:
416 expr = 'a %s b' % expr
417 binops[name] = expr
418
419unops = {
420 'pos': '+',
421 'neg': '-',
422 'abs': 'abs',
423 'invert': '~',
424 'int': 'int',
425 'long': 'long',
426 'float': 'float',
427 'oct': 'oct',
428 'hex': 'hex',
429 }
430
431for name, expr in unops.items():
432 if expr.islower():
433 expr = expr + "(a)"
434 else:
435 expr = '%s a' % expr
436 unops[name] = expr
437
438def numops(a, b, skip=[]):
439 dict = {'a': a, 'b': b}
440 for name, expr in binops.items():
441 if name not in skip:
442 name = "__%s__" % name
443 if hasattr(a, name):
444 res = eval(expr, dict)
445 testbinop(a, b, res, expr, name)
446 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000447 if name not in skip:
448 name = "__%s__" % name
449 if hasattr(a, name):
450 res = eval(expr, dict)
451 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000452
453def ints():
454 if verbose: print "Testing int operations..."
455 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000456 # The following crashes in Python 2.2
457 vereq((1).__nonzero__(), 1)
458 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000459 # This returns 'NotImplemented' in Python 2.2
460 class C(int):
461 def __add__(self, other):
462 return NotImplemented
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000463 vereq(C(5L), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000464 try:
465 C() + ""
466 except TypeError:
467 pass
468 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000469 raise TestFailed, "NotImplemented should have caused TypeError"
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000470 import sys
471 try:
472 C(sys.maxint+1)
473 except OverflowError:
474 pass
475 else:
476 raise TestFailed, "should have raised OverflowError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000477
478def longs():
479 if verbose: print "Testing long operations..."
480 numops(100L, 3L)
481
482def floats():
483 if verbose: print "Testing float operations..."
484 numops(100.0, 3.0)
485
486def complexes():
487 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000488 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000489 class Number(complex):
490 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000491 def __new__(cls, *args, **kwds):
492 result = complex.__new__(cls, *args)
493 result.prec = kwds.get('prec', 12)
494 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 def __repr__(self):
496 prec = self.prec
497 if self.imag == 0.0:
498 return "%.*g" % (prec, self.real)
499 if self.real == 0.0:
500 return "%.*gj" % (prec, self.imag)
501 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
502 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000503
Tim Peters6d6c1a32001-08-02 04:15:00 +0000504 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000505 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000506 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000507
Tim Peters3f996e72001-09-13 19:18:27 +0000508 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000509 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000510 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000511
512 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000513 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000514 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000515
Tim Peters6d6c1a32001-08-02 04:15:00 +0000516def spamlists():
517 if verbose: print "Testing spamlist operations..."
518 import copy, xxsubtype as spam
519 def spamlist(l, memo=None):
520 import xxsubtype as spam
521 return spam.spamlist(l)
522 # This is an ugly hack:
523 copy._deepcopy_dispatch[spam.spamlist] = spamlist
524
525 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
526 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
527 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
528 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
529 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
530 "a[b:c]", "__getslice__")
531 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
532 "a+=b", "__iadd__")
533 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
534 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
535 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
536 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
537 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
538 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
539 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
540 # Test subclassing
541 class C(spam.spamlist):
542 def foo(self): return 1
543 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000544 vereq(a, [])
545 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000547 vereq(a, [100])
548 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551
552def spamdicts():
553 if verbose: print "Testing spamdict operations..."
554 import copy, xxsubtype as spam
555 def spamdict(d, memo=None):
556 import xxsubtype as spam
557 sd = spam.spamdict()
558 for k, v in d.items(): sd[k] = v
559 return sd
560 # This is an ugly hack:
561 copy._deepcopy_dispatch[spam.spamdict] = spamdict
562
563 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
564 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
565 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
566 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
567 d = spamdict({1:2,3:4})
568 l1 = []
569 for i in d.keys(): l1.append(i)
570 l = []
571 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000572 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000573 l = []
574 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000575 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000576 l = []
577 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000578 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000579 straightd = {1:2, 3:4}
580 spamd = spamdict(straightd)
581 testunop(spamd, 2, "len(a)", "__len__")
582 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
583 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
584 "a[b]=c", "__setitem__")
585 # Test subclassing
586 class C(spam.spamdict):
587 def foo(self): return 1
588 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a.items(), [])
590 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000591 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000592 vereq(a.items(), [('foo', 'bar')])
593 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000594 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000595 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596
597def pydicts():
598 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000599 verify(issubclass(dict, dict))
600 verify(isinstance({}, dict))
601 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000602 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000603 verify(d.__class__ is dict)
604 verify(isinstance(d, dict))
605 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000606 state = -1
607 def __init__(self, *a, **kw):
608 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000609 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000610 self.state = a[0]
611 if kw:
612 for k, v in kw.items(): self[v] = k
613 def __getitem__(self, key):
614 return self.get(key, 0)
615 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000616 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000617 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000618 def setstate(self, state):
619 self.state = state
620 def getstate(self):
621 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000622 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000624 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000625 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000626 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000628 vereq(a.state, -1)
629 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000631 vereq(a.state, 0)
632 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000633 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000634 vereq(a.state, 10)
635 vereq(a.getstate(), 10)
636 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000638 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000639 if verbose: print "pydict stress test ..."
640 N = 50
641 for i in range(N):
642 a[i] = C()
643 for j in range(N):
644 a[i][j] = i*j
645 for i in range(N):
646 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000647 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000648
649def pylists():
650 if verbose: print "Testing Python subclass of list..."
651 class C(list):
652 def __getitem__(self, i):
653 return list.__getitem__(self, i) + 100
654 def __getslice__(self, i, j):
655 return (i, j)
656 a = C()
657 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000658 vereq(a[0], 100)
659 vereq(a[1], 101)
660 vereq(a[2], 102)
661 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000662
663def metaclass():
664 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000665 class C:
666 __metaclass__ = type
667 def __init__(self):
668 self.__state = 0
669 def getstate(self):
670 return self.__state
671 def setstate(self, state):
672 self.__state = state
673 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000676 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000677 class D:
678 class __metaclass__(type):
679 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000680 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000681 d = D()
682 verify(d.__class__ is D)
683 class M1(type):
684 def __new__(cls, name, bases, dict):
685 dict['__spam__'] = 1
686 return type.__new__(cls, name, bases, dict)
687 class C:
688 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000689 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000690 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000691 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000692
Guido van Rossum309b5662001-08-17 11:43:17 +0000693 class _instance(object):
694 pass
695 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000696 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000697 def __new__(cls, name, bases, dict):
698 self = object.__new__(cls)
699 self.name = name
700 self.bases = bases
701 self.dict = dict
702 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000703 def __call__(self):
704 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000705 # Early binding of methods
706 for key in self.dict:
707 if key.startswith("__"):
708 continue
709 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000710 return it
711 class C:
712 __metaclass__ = M2
713 def spam(self):
714 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000715 vereq(C.name, 'C')
716 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000717 verify('spam' in C.dict)
718 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000719 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000720
Guido van Rossum91ee7982001-08-30 20:52:40 +0000721 # More metaclass examples
722
723 class autosuper(type):
724 # Automatically add __super to the class
725 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000726 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000727 cls = super(autosuper, metaclass).__new__(metaclass,
728 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000729 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000730 while name[:1] == "_":
731 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000732 if name:
733 name = "_%s__super" % name
734 else:
735 name = "__super"
736 setattr(cls, name, super(cls))
737 return cls
738 class A:
739 __metaclass__ = autosuper
740 def meth(self):
741 return "A"
742 class B(A):
743 def meth(self):
744 return "B" + self.__super.meth()
745 class C(A):
746 def meth(self):
747 return "C" + self.__super.meth()
748 class D(C, B):
749 def meth(self):
750 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000751 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000752 class E(B, C):
753 def meth(self):
754 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000755 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000756
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000757 class autoproperty(type):
758 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000759 # named _get_x and/or _set_x are found
760 def __new__(metaclass, name, bases, dict):
761 hits = {}
762 for key, val in dict.iteritems():
763 if key.startswith("_get_"):
764 key = key[5:]
765 get, set = hits.get(key, (None, None))
766 get = val
767 hits[key] = get, set
768 elif key.startswith("_set_"):
769 key = key[5:]
770 get, set = hits.get(key, (None, None))
771 set = val
772 hits[key] = get, set
773 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000774 dict[key] = property(get, set)
775 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000776 name, bases, dict)
777 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000778 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000779 def _get_x(self):
780 return -self.__x
781 def _set_x(self, x):
782 self.__x = -x
783 a = A()
784 verify(not hasattr(a, "x"))
785 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000786 vereq(a.x, 12)
787 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000788
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000789 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000790 # Merge of multiple cooperating metaclasses
791 pass
792 class A:
793 __metaclass__ = multimetaclass
794 def _get_x(self):
795 return "A"
796 class B(A):
797 def _get_x(self):
798 return "B" + self.__super._get_x()
799 class C(A):
800 def _get_x(self):
801 return "C" + self.__super._get_x()
802 class D(C, B):
803 def _get_x(self):
804 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000805 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000806
Guido van Rossumf76de622001-10-18 15:49:21 +0000807 # Make sure type(x) doesn't call x.__class__.__init__
808 class T(type):
809 counter = 0
810 def __init__(self, *args):
811 T.counter += 1
812 class C:
813 __metaclass__ = T
814 vereq(T.counter, 1)
815 a = C()
816 vereq(type(a), C)
817 vereq(T.counter, 1)
818
Guido van Rossum29d26062001-12-11 04:37:34 +0000819 class C(object): pass
820 c = C()
821 try: c()
822 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000823 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000824
Jeremy Hyltonfa955692007-02-27 18:29:45 +0000825 # Testing code to find most derived baseclass
826 class A(type):
827 def __new__(*args, **kwargs):
828 return type.__new__(*args, **kwargs)
829
830 class B(object):
831 pass
832
833 class C(object):
834 __metaclass__ = A
835
836 # The most derived metaclass of D is A rather than type.
837 class D(B, C):
838 pass
839
840
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841def pymods():
842 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000844 import sys
845 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000846 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000847 def __init__(self, name):
848 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000849 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000851 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000852 def __setattr__(self, name, value):
853 log.append(("setattr", name, value))
854 MT.__setattr__(self, name, value)
855 def __delattr__(self, name):
856 log.append(("delattr", name))
857 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000858 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859 a.foo = 12
860 x = a.foo
861 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000862 vereq(log, [("setattr", "foo", 12),
863 ("getattr", "foo"),
864 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000865
Armin Rigo9790a272007-05-02 19:23:31 +0000866 # http://python.org/sf/1174712
867 try:
868 class Module(types.ModuleType, str):
869 pass
870 except TypeError:
871 pass
872 else:
873 raise TestFailed("inheriting from ModuleType and str at the "
874 "same time should fail")
875
Tim Peters6d6c1a32001-08-02 04:15:00 +0000876def multi():
877 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000878 class C(object):
879 def __init__(self):
880 self.__state = 0
881 def getstate(self):
882 return self.__state
883 def setstate(self, state):
884 self.__state = state
885 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000886 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000888 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000889 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000890 def __init__(self):
891 type({}).__init__(self)
892 C.__init__(self)
893 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000894 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000895 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000896 vereq(d.items(), [("hello", "world")])
897 vereq(d["hello"], "world")
898 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000899 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000900 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000901 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000902
Guido van Rossume45763a2001-08-10 21:28:46 +0000903 # SF bug #442833
904 class Node(object):
905 def __int__(self):
906 return int(self.foo())
907 def foo(self):
908 return "23"
909 class Frag(Node, list):
910 def foo(self):
911 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000912 vereq(Node().__int__(), 23)
913 vereq(int(Node()), 23)
914 vereq(Frag().__int__(), 42)
915 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000916
Tim Petersa91e9642001-11-14 23:32:33 +0000917 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000918
919 class A:
920 x = 1
921
922 class B(A):
923 pass
924
925 class C(A):
926 x = 2
927
928 class D(B, C):
929 pass
930 vereq(D.x, 1)
931
932 # Classic MRO is preserved for a classic base class.
933 class E(D, object):
934 pass
935 vereq(E.__mro__, (E, D, B, A, C, object))
936 vereq(E.x, 1)
937
938 # But with a mix of classic bases, their MROs are combined using
939 # new-style MRO.
940 class F(B, C, object):
941 pass
942 vereq(F.__mro__, (F, B, C, A, object))
943 vereq(F.x, 2)
944
945 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000946 class C:
947 def cmethod(self):
948 return "C a"
949 def all_method(self):
950 return "C b"
951
952 class M1(C, object):
953 def m1method(self):
954 return "M1 a"
955 def all_method(self):
956 return "M1 b"
957
958 vereq(M1.__mro__, (M1, C, object))
959 m = M1()
960 vereq(m.cmethod(), "C a")
961 vereq(m.m1method(), "M1 a")
962 vereq(m.all_method(), "M1 b")
963
964 class D(C):
965 def dmethod(self):
966 return "D a"
967 def all_method(self):
968 return "D b"
969
Guido van Rossum9a818922002-11-14 19:50:14 +0000970 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000971 def m2method(self):
972 return "M2 a"
973 def all_method(self):
974 return "M2 b"
975
Guido van Rossum9a818922002-11-14 19:50:14 +0000976 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000977 m = M2()
978 vereq(m.cmethod(), "C a")
979 vereq(m.dmethod(), "D a")
980 vereq(m.m2method(), "M2 a")
981 vereq(m.all_method(), "M2 b")
982
Guido van Rossum9a818922002-11-14 19:50:14 +0000983 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000984 def m3method(self):
985 return "M3 a"
986 def all_method(self):
987 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000988 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000989 m = M3()
990 vereq(m.cmethod(), "C a")
991 vereq(m.dmethod(), "D a")
992 vereq(m.m1method(), "M1 a")
993 vereq(m.m2method(), "M2 a")
994 vereq(m.m3method(), "M3 a")
995 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000996
Guido van Rossume54616c2001-12-14 04:19:56 +0000997 class Classic:
998 pass
999 try:
1000 class New(Classic):
1001 __metaclass__ = type
1002 except TypeError:
1003 pass
1004 else:
1005 raise TestFailed, "new class with only classic bases - shouldn't be"
1006
Tim Peters6d6c1a32001-08-02 04:15:00 +00001007def diamond():
1008 if verbose: print "Testing multiple inheritance special cases..."
1009 class A(object):
1010 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +00001011 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012 class B(A):
1013 def boo(self): return "B"
1014 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +00001015 vereq(B().spam(), "B")
1016 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 class C(A):
1018 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +00001019 vereq(C().spam(), "A")
1020 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001021 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001022 vereq(D().spam(), "B")
1023 vereq(D().boo(), "B")
1024 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001025 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001026 vereq(E().spam(), "B")
1027 vereq(E().boo(), "C")
1028 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +00001029 # MRO order disagreement
1030 try:
1031 class F(D, E): pass
1032 except TypeError:
1033 pass
1034 else:
1035 raise TestFailed, "expected MRO order disagreement (F)"
1036 try:
1037 class G(E, D): pass
1038 except TypeError:
1039 pass
1040 else:
1041 raise TestFailed, "expected MRO order disagreement (G)"
1042
1043
1044# see thread python-dev/2002-October/029035.html
1045def ex5():
1046 if verbose: print "Testing ex5 from C3 switch discussion..."
1047 class A(object): pass
1048 class B(object): pass
1049 class C(object): pass
1050 class X(A): pass
1051 class Y(A): pass
1052 class Z(X,B,Y,C): pass
1053 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1054
1055# see "A Monotonic Superclass Linearization for Dylan",
1056# by Kim Barrett et al. (OOPSLA 1996)
1057def monotonicity():
1058 if verbose: print "Testing MRO monotonicity..."
1059 class Boat(object): pass
1060 class DayBoat(Boat): pass
1061 class WheelBoat(Boat): pass
1062 class EngineLess(DayBoat): pass
1063 class SmallMultihull(DayBoat): pass
1064 class PedalWheelBoat(EngineLess,WheelBoat): pass
1065 class SmallCatamaran(SmallMultihull): pass
1066 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1067
1068 vereq(PedalWheelBoat.__mro__,
1069 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1070 object))
1071 vereq(SmallCatamaran.__mro__,
1072 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1073
1074 vereq(Pedalo.__mro__,
1075 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1076 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1077
1078# see "A Monotonic Superclass Linearization for Dylan",
1079# by Kim Barrett et al. (OOPSLA 1996)
1080def consistency_with_epg():
1081 if verbose: print "Testing consistentcy with EPG..."
1082 class Pane(object): pass
1083 class ScrollingMixin(object): pass
1084 class EditingMixin(object): pass
1085 class ScrollablePane(Pane,ScrollingMixin): pass
1086 class EditablePane(Pane,EditingMixin): pass
1087 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1088
1089 vereq(EditableScrollablePane.__mro__,
1090 (EditableScrollablePane, ScrollablePane, EditablePane,
1091 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001092
Raymond Hettingerf394df42003-04-06 19:13:41 +00001093mro_err_msg = """Cannot create a consistent method resolution
1094order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +00001095
Guido van Rossumd32047f2002-11-25 21:38:52 +00001096def mro_disagreement():
1097 if verbose: print "Testing error messages for MRO disagreement..."
1098 def raises(exc, expected, callable, *args):
1099 try:
1100 callable(*args)
1101 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001102 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001103 raise TestFailed, "Message %r, expected %r" % (str(msg),
1104 expected)
1105 else:
1106 raise TestFailed, "Expected %s" % exc
1107 class A(object): pass
1108 class B(A): pass
1109 class C(object): pass
1110 # Test some very simple errors
1111 raises(TypeError, "duplicate base class A",
1112 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001113 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001114 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001115 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001116 type, "X", (A, C, B), {})
1117 # Test a slightly more complex error
1118 class GridLayout(object): pass
1119 class HorizontalGrid(GridLayout): pass
1120 class VerticalGrid(GridLayout): pass
1121 class HVGrid(HorizontalGrid, VerticalGrid): pass
1122 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +00001123 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001124 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1125
Guido van Rossum37202612001-08-09 19:45:21 +00001126def objects():
1127 if verbose: print "Testing object class..."
1128 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001129 vereq(a.__class__, object)
1130 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001131 b = object()
1132 verify(a is not b)
1133 verify(not hasattr(a, "foo"))
1134 try:
1135 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001136 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001137 pass
1138 else:
1139 verify(0, "object() should not allow setting a foo attribute")
1140 verify(not hasattr(object(), "__dict__"))
1141
1142 class Cdict(object):
1143 pass
1144 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001145 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001146 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001147 vereq(x.foo, 1)
1148 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001149
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150def slots():
1151 if verbose: print "Testing __slots__..."
1152 class C0(object):
1153 __slots__ = []
1154 x = C0()
1155 verify(not hasattr(x, "__dict__"))
1156 verify(not hasattr(x, "foo"))
1157
1158 class C1(object):
1159 __slots__ = ['a']
1160 x = C1()
1161 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001162 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001163 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001164 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001165 x.a = None
1166 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001167 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001168 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001169
1170 class C3(object):
1171 __slots__ = ['a', 'b', 'c']
1172 x = C3()
1173 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001174 verify(not hasattr(x, 'a'))
1175 verify(not hasattr(x, 'b'))
1176 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001177 x.a = 1
1178 x.b = 2
1179 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001180 vereq(x.a, 1)
1181 vereq(x.b, 2)
1182 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001183
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001184 class C4(object):
1185 """Validate name mangling"""
1186 __slots__ = ['__a']
1187 def __init__(self, value):
1188 self.__a = value
1189 def get(self):
1190 return self.__a
1191 x = C4(5)
1192 verify(not hasattr(x, '__dict__'))
1193 verify(not hasattr(x, '__a'))
1194 vereq(x.get(), 5)
1195 try:
1196 x.__a = 6
1197 except AttributeError:
1198 pass
1199 else:
1200 raise TestFailed, "Double underscored names not mangled"
1201
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001202 # Make sure slot names are proper identifiers
1203 try:
1204 class C(object):
1205 __slots__ = [None]
1206 except TypeError:
1207 pass
1208 else:
1209 raise TestFailed, "[None] slots not caught"
1210 try:
1211 class C(object):
1212 __slots__ = ["foo bar"]
1213 except TypeError:
1214 pass
1215 else:
1216 raise TestFailed, "['foo bar'] slots not caught"
1217 try:
1218 class C(object):
1219 __slots__ = ["foo\0bar"]
1220 except TypeError:
1221 pass
1222 else:
1223 raise TestFailed, "['foo\\0bar'] slots not caught"
1224 try:
1225 class C(object):
1226 __slots__ = ["1"]
1227 except TypeError:
1228 pass
1229 else:
1230 raise TestFailed, "['1'] slots not caught"
1231 try:
1232 class C(object):
1233 __slots__ = [""]
1234 except TypeError:
1235 pass
1236 else:
1237 raise TestFailed, "[''] slots not caught"
1238 class C(object):
1239 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001240 # XXX(nnorwitz): was there supposed to be something tested
1241 # from the class above?
1242
1243 # Test a single string is not expanded as a sequence.
1244 class C(object):
1245 __slots__ = "abc"
1246 c = C()
1247 c.abc = 5
1248 vereq(c.abc, 5)
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001249
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001250 # Test unicode slot names
1251 try:
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001252 unicode
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001253 except NameError:
1254 pass
1255 else:
Neal Norwitzcbd9ee62007-04-14 05:25:50 +00001256 # Test a single unicode string is not expanded as a sequence.
1257 class C(object):
1258 __slots__ = unicode("abc")
1259 c = C()
1260 c.abc = 5
1261 vereq(c.abc, 5)
1262
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001263 # _unicode_to_string used to modify slots in certain circumstances
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001264 slots = (unicode("foo"), unicode("bar"))
1265 class C(object):
1266 __slots__ = slots
1267 x = C()
1268 x.foo = 5
1269 vereq(x.foo, 5)
1270 veris(type(slots[0]), unicode)
1271 # this used to leak references
1272 try:
1273 class C(object):
1274 __slots__ = [unichr(128)]
1275 except (TypeError, UnicodeEncodeError):
1276 pass
1277 else:
Neal Norwitz0d4c06e2007-04-25 06:30:05 +00001278 raise TestFailed, "[unichr(128)] slots not caught"
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001279
Guido van Rossum33bab012001-12-05 22:45:48 +00001280 # Test leaks
1281 class Counted(object):
1282 counter = 0 # counts the number of instances alive
1283 def __init__(self):
1284 Counted.counter += 1
1285 def __del__(self):
1286 Counted.counter -= 1
1287 class C(object):
1288 __slots__ = ['a', 'b', 'c']
1289 x = C()
1290 x.a = Counted()
1291 x.b = Counted()
1292 x.c = Counted()
1293 vereq(Counted.counter, 3)
1294 del x
1295 vereq(Counted.counter, 0)
1296 class D(C):
1297 pass
1298 x = D()
1299 x.a = Counted()
1300 x.z = Counted()
1301 vereq(Counted.counter, 2)
1302 del x
1303 vereq(Counted.counter, 0)
1304 class E(D):
1305 __slots__ = ['e']
1306 x = E()
1307 x.a = Counted()
1308 x.z = Counted()
1309 x.e = Counted()
1310 vereq(Counted.counter, 3)
1311 del x
1312 vereq(Counted.counter, 0)
1313
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001314 # Test cyclical leaks [SF bug 519621]
1315 class F(object):
1316 __slots__ = ['a', 'b']
1317 log = []
1318 s = F()
1319 s.a = [Counted(), s]
1320 vereq(Counted.counter, 1)
1321 s = None
1322 import gc
1323 gc.collect()
1324 vereq(Counted.counter, 0)
1325
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001326 # Test lookup leaks [SF bug 572567]
1327 import sys,gc
1328 class G(object):
1329 def __cmp__(self, other):
1330 return 0
1331 g = G()
1332 orig_objects = len(gc.get_objects())
1333 for i in xrange(10):
1334 g==g
1335 new_objects = len(gc.get_objects())
1336 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001337 class H(object):
1338 __slots__ = ['a', 'b']
1339 def __init__(self):
1340 self.a = 1
1341 self.b = 2
1342 def __del__(self):
1343 assert self.a == 1
1344 assert self.b == 2
1345
1346 save_stderr = sys.stderr
1347 sys.stderr = sys.stdout
1348 h = H()
1349 try:
1350 del h
1351 finally:
1352 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001353
Guido van Rossum8b056da2002-08-13 18:26:26 +00001354def slotspecials():
1355 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1356
1357 class D(object):
1358 __slots__ = ["__dict__"]
1359 a = D()
1360 verify(hasattr(a, "__dict__"))
1361 verify(not hasattr(a, "__weakref__"))
1362 a.foo = 42
1363 vereq(a.__dict__, {"foo": 42})
1364
1365 class W(object):
1366 __slots__ = ["__weakref__"]
1367 a = W()
1368 verify(hasattr(a, "__weakref__"))
1369 verify(not hasattr(a, "__dict__"))
1370 try:
1371 a.foo = 42
1372 except AttributeError:
1373 pass
1374 else:
1375 raise TestFailed, "shouldn't be allowed to set a.foo"
1376
1377 class C1(W, D):
1378 __slots__ = []
1379 a = C1()
1380 verify(hasattr(a, "__dict__"))
1381 verify(hasattr(a, "__weakref__"))
1382 a.foo = 42
1383 vereq(a.__dict__, {"foo": 42})
1384
1385 class C2(D, W):
1386 __slots__ = []
1387 a = C2()
1388 verify(hasattr(a, "__dict__"))
1389 verify(hasattr(a, "__weakref__"))
1390 a.foo = 42
1391 vereq(a.__dict__, {"foo": 42})
1392
Guido van Rossum9a818922002-11-14 19:50:14 +00001393# MRO order disagreement
1394#
1395# class C3(C1, C2):
1396# __slots__ = []
1397#
1398# class C4(C2, C1):
1399# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001400
Tim Peters6d6c1a32001-08-02 04:15:00 +00001401def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001402 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001403 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001404 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001405 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001406 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001407 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001408 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001409 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001410 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001411 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001412 vereq(E.foo, 1)
1413 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001414 # Test dynamic instances
1415 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001416 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001417 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001418 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001419 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001420 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001421 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001422 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001423 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001424 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001425 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001426 vereq(int(a), 100)
1427 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001428 verify(not hasattr(a, "spam"))
1429 def mygetattr(self, name):
1430 if name == "spam":
1431 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001432 raise AttributeError
1433 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001435 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001436 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001437 def mysetattr(self, name, value):
1438 if name == "spam":
1439 raise AttributeError
1440 return object.__setattr__(self, name, value)
1441 C.__setattr__ = mysetattr
1442 try:
1443 a.spam = "not spam"
1444 except AttributeError:
1445 pass
1446 else:
1447 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001448 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001449 class D(C):
1450 pass
1451 d = D()
1452 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001453 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001454
Guido van Rossum7e35d572001-09-15 03:14:32 +00001455 # Test handling of int*seq and seq*int
1456 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001457 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001458 vereq("a"*I(2), "aa")
1459 vereq(I(2)*"a", "aa")
1460 vereq(2*I(3), 6)
1461 vereq(I(3)*2, 6)
1462 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001463
1464 # Test handling of long*seq and seq*long
1465 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001466 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001467 vereq("a"*L(2L), "aa")
1468 vereq(L(2L)*"a", "aa")
1469 vereq(2*L(3), 6)
1470 vereq(L(3)*2, 6)
1471 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001472
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001473 # Test comparison of classes with dynamic metaclasses
1474 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001475 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001476 class someclass:
1477 __metaclass__ = dynamicmetaclass
1478 verify(someclass != object)
1479
Tim Peters6d6c1a32001-08-02 04:15:00 +00001480def errors():
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001481 if verbose: print "Testing errors..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001482
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001483 try:
1484 class C(list, dict):
1485 pass
1486 except TypeError:
1487 pass
1488 else:
1489 verify(0, "inheritance from both list and dict should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001490
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001491 try:
1492 class C(object, None):
1493 pass
1494 except TypeError:
1495 pass
1496 else:
1497 verify(0, "inheritance from non-type should be illegal")
1498 class Classic:
1499 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001500
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001501 try:
1502 class C(type(len)):
1503 pass
1504 except TypeError:
1505 pass
1506 else:
1507 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001508
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001509 try:
1510 class C(object):
1511 __slots__ = 1
1512 except TypeError:
1513 pass
1514 else:
1515 verify(0, "__slots__ = 1 should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001516
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001517 try:
1518 class C(object):
1519 __slots__ = [1]
1520 except TypeError:
1521 pass
1522 else:
1523 verify(0, "__slots__ = [1] should be illegal")
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001524
Armin Rigoc0ba52d2007-04-19 14:44:48 +00001525 class M1(type):
1526 pass
1527 class M2(type):
1528 pass
1529 class A1(object):
1530 __metaclass__ = M1
1531 class A2(object):
1532 __metaclass__ = M2
1533 try:
1534 class B(A1, A2):
1535 pass
1536 except TypeError:
1537 pass
1538 else:
1539 verify(0, "finding the most derived metaclass should have failed")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001540
1541def classmethods():
1542 if verbose: print "Testing class methods..."
1543 class C(object):
1544 def foo(*a): return a
1545 goo = classmethod(foo)
1546 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001547 vereq(C.goo(1), (C, 1))
1548 vereq(c.goo(1), (C, 1))
1549 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001550 class D(C):
1551 pass
1552 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001553 vereq(D.goo(1), (D, 1))
1554 vereq(d.goo(1), (D, 1))
1555 vereq(d.foo(1), (d, 1))
1556 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001557 # Test for a specific crash (SF bug 528132)
1558 def f(cls, arg): return (cls, arg)
1559 ff = classmethod(f)
1560 vereq(ff.__get__(0, int)(42), (int, 42))
1561 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001562
Guido van Rossum155db9a2002-04-02 17:53:47 +00001563 # Test super() with classmethods (SF bug 535444)
1564 veris(C.goo.im_self, C)
1565 veris(D.goo.im_self, D)
1566 veris(super(D,D).goo.im_self, D)
1567 veris(super(D,d).goo.im_self, D)
1568 vereq(super(D,D).goo(), (D,))
1569 vereq(super(D,d).goo(), (D,))
1570
Raymond Hettingerbe971532003-06-18 01:13:41 +00001571 # Verify that argument is checked for callability (SF bug 753451)
1572 try:
1573 classmethod(1).__get__(1)
1574 except TypeError:
1575 pass
1576 else:
1577 raise TestFailed, "classmethod should check for callability"
1578
Georg Brandl6a29c322006-02-21 22:17:46 +00001579 # Verify that classmethod() doesn't allow keyword args
1580 try:
1581 classmethod(f, kw=1)
1582 except TypeError:
1583 pass
1584 else:
1585 raise TestFailed, "classmethod shouldn't accept keyword args"
1586
Fred Drakef841aa62002-03-28 15:49:54 +00001587def classmethods_in_c():
1588 if verbose: print "Testing C-based class methods..."
1589 import xxsubtype as spam
1590 a = (1, 2, 3)
1591 d = {'abc': 123}
1592 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001593 veris(x, spam.spamlist)
1594 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001595 vereq(d, d1)
1596 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001597 veris(x, spam.spamlist)
1598 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001599 vereq(d, d1)
1600
Tim Peters6d6c1a32001-08-02 04:15:00 +00001601def staticmethods():
1602 if verbose: print "Testing static methods..."
1603 class C(object):
1604 def foo(*a): return a
1605 goo = staticmethod(foo)
1606 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001607 vereq(C.goo(1), (1,))
1608 vereq(c.goo(1), (1,))
1609 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001610 class D(C):
1611 pass
1612 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001613 vereq(D.goo(1), (1,))
1614 vereq(d.goo(1), (1,))
1615 vereq(d.foo(1), (d, 1))
1616 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001617
Fred Drakef841aa62002-03-28 15:49:54 +00001618def staticmethods_in_c():
1619 if verbose: print "Testing C-based static methods..."
1620 import xxsubtype as spam
1621 a = (1, 2, 3)
1622 d = {"abc": 123}
1623 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1624 veris(x, None)
1625 vereq(a, a1)
1626 vereq(d, d1)
1627 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1628 veris(x, None)
1629 vereq(a, a1)
1630 vereq(d, d1)
1631
Tim Peters6d6c1a32001-08-02 04:15:00 +00001632def classic():
1633 if verbose: print "Testing classic classes..."
1634 class C:
1635 def foo(*a): return a
1636 goo = classmethod(foo)
1637 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001638 vereq(C.goo(1), (C, 1))
1639 vereq(c.goo(1), (C, 1))
1640 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001641 class D(C):
1642 pass
1643 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(D.goo(1), (D, 1))
1645 vereq(d.goo(1), (D, 1))
1646 vereq(d.foo(1), (d, 1))
1647 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001648 class E: # *not* subclassing from C
1649 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001650 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001651 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001652
1653def compattr():
1654 if verbose: print "Testing computed attributes..."
1655 class C(object):
1656 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001657 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001658 self.__get = get
1659 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001660 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001661 def __get__(self, obj, type=None):
1662 return self.__get(obj)
1663 def __set__(self, obj, value):
1664 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001665 def __delete__(self, obj):
1666 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667 def __init__(self):
1668 self.__x = 0
1669 def __get_x(self):
1670 x = self.__x
1671 self.__x = x+1
1672 return x
1673 def __set_x(self, x):
1674 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001675 def __delete_x(self):
1676 del self.__x
1677 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001678 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001679 vereq(a.x, 0)
1680 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001681 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001682 vereq(a.x, 10)
1683 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001684 del a.x
1685 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001686
1687def newslot():
1688 if verbose: print "Testing __new__ slot override..."
1689 class C(list):
1690 def __new__(cls):
1691 self = list.__new__(cls)
1692 self.foo = 1
1693 return self
1694 def __init__(self):
1695 self.foo = self.foo + 2
1696 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001697 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001698 verify(a.__class__ is C)
1699 class D(C):
1700 pass
1701 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001702 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001703 verify(b.__class__ is D)
1704
Tim Peters6d6c1a32001-08-02 04:15:00 +00001705def altmro():
1706 if verbose: print "Testing mro() and overriding it..."
1707 class A(object):
1708 def f(self): return "A"
1709 class B(A):
1710 pass
1711 class C(A):
1712 def f(self): return "C"
1713 class D(B, C):
1714 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001715 vereq(D.mro(), [D, B, C, A, object])
1716 vereq(D.__mro__, (D, B, C, A, object))
1717 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001718
Guido van Rossumd3077402001-08-12 05:24:18 +00001719 class PerverseMetaType(type):
1720 def mro(cls):
1721 L = type.mro(cls)
1722 L.reverse()
1723 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001724 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001725 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001726 vereq(X.__mro__, (object, A, C, B, D, X))
1727 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001728
Armin Rigo037d1e02005-12-29 17:07:39 +00001729 try:
1730 class X(object):
1731 class __metaclass__(type):
1732 def mro(self):
1733 return [self, dict, object]
1734 except TypeError:
1735 pass
1736 else:
1737 raise TestFailed, "devious mro() return not caught"
1738
1739 try:
1740 class X(object):
1741 class __metaclass__(type):
1742 def mro(self):
1743 return [1]
1744 except TypeError:
1745 pass
1746 else:
1747 raise TestFailed, "non-class mro() return not caught"
1748
1749 try:
1750 class X(object):
1751 class __metaclass__(type):
1752 def mro(self):
1753 return 1
1754 except TypeError:
1755 pass
1756 else:
1757 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001758
Armin Rigo037d1e02005-12-29 17:07:39 +00001759
Tim Peters6d6c1a32001-08-02 04:15:00 +00001760def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001761 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001762
1763 class B(object):
1764 "Intermediate class because object doesn't have a __setattr__"
1765
1766 class C(B):
1767
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001768 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001769 if name == "foo":
1770 return ("getattr", name)
1771 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001772 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001773 def __setattr__(self, name, value):
1774 if name == "foo":
1775 self.setattr = (name, value)
1776 else:
1777 return B.__setattr__(self, name, value)
1778 def __delattr__(self, name):
1779 if name == "foo":
1780 self.delattr = name
1781 else:
1782 return B.__delattr__(self, name)
1783
1784 def __getitem__(self, key):
1785 return ("getitem", key)
1786 def __setitem__(self, key, value):
1787 self.setitem = (key, value)
1788 def __delitem__(self, key):
1789 self.delitem = key
1790
1791 def __getslice__(self, i, j):
1792 return ("getslice", i, j)
1793 def __setslice__(self, i, j, value):
1794 self.setslice = (i, j, value)
1795 def __delslice__(self, i, j):
1796 self.delslice = (i, j)
1797
1798 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001799 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001800 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001801 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001802 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001803 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001804
Guido van Rossum45704552001-10-08 16:35:45 +00001805 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001806 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001807 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001808 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001809 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001810
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001812 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001814 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001815 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001816
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001817def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001818 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001819 class C(object):
1820 def __init__(self, x):
1821 self.x = x
1822 def foo(self):
1823 return self.x
1824 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001825 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001826 class D(C):
1827 boo = C.foo
1828 goo = c1.foo
1829 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001830 vereq(d2.foo(), 2)
1831 vereq(d2.boo(), 2)
1832 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001833 class E(object):
1834 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001835 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001836 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001837
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001838def specials():
1839 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001840 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001841 # Test the default behavior for static classes
1842 class C(object):
1843 def __getitem__(self, i):
1844 if 0 <= i < 10: return i
1845 raise IndexError
1846 c1 = C()
1847 c2 = C()
1848 verify(not not c1)
Tim Peters85b362f2006-04-11 01:21:00 +00001849 verify(id(c1) != id(c2))
1850 hash(c1)
1851 hash(c2)
Guido van Rossum45704552001-10-08 16:35:45 +00001852 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1853 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001854 verify(c1 != c2)
1855 verify(not c1 != c1)
1856 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001857 # Note that the module name appears in str/repr, and that varies
1858 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001859 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001860 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001861 verify(-1 not in c1)
1862 for i in range(10):
1863 verify(i in c1)
1864 verify(10 not in c1)
1865 # Test the default behavior for dynamic classes
1866 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001867 def __getitem__(self, i):
1868 if 0 <= i < 10: return i
1869 raise IndexError
1870 d1 = D()
1871 d2 = D()
1872 verify(not not d1)
Tim Peters85b362f2006-04-11 01:21:00 +00001873 verify(id(d1) != id(d2))
1874 hash(d1)
1875 hash(d2)
Guido van Rossum45704552001-10-08 16:35:45 +00001876 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1877 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001878 verify(d1 != d2)
1879 verify(not d1 != d1)
1880 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001881 # Note that the module name appears in str/repr, and that varies
1882 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001883 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001884 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001885 verify(-1 not in d1)
1886 for i in range(10):
1887 verify(i in d1)
1888 verify(10 not in d1)
1889 # Test overridden behavior for static classes
1890 class Proxy(object):
1891 def __init__(self, x):
1892 self.x = x
1893 def __nonzero__(self):
1894 return not not self.x
1895 def __hash__(self):
1896 return hash(self.x)
1897 def __eq__(self, other):
1898 return self.x == other
1899 def __ne__(self, other):
1900 return self.x != other
1901 def __cmp__(self, other):
1902 return cmp(self.x, other.x)
1903 def __str__(self):
1904 return "Proxy:%s" % self.x
1905 def __repr__(self):
1906 return "Proxy(%r)" % self.x
1907 def __contains__(self, value):
1908 return value in self.x
1909 p0 = Proxy(0)
1910 p1 = Proxy(1)
1911 p_1 = Proxy(-1)
1912 verify(not p0)
1913 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001914 vereq(hash(p0), hash(0))
1915 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001916 verify(p0 != p1)
1917 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001918 vereq(not p0, p1)
1919 vereq(cmp(p0, p1), -1)
1920 vereq(cmp(p0, p0), 0)
1921 vereq(cmp(p0, p_1), 1)
1922 vereq(str(p0), "Proxy:0")
1923 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001924 p10 = Proxy(range(10))
1925 verify(-1 not in p10)
1926 for i in range(10):
1927 verify(i in p10)
1928 verify(10 not in p10)
1929 # Test overridden behavior for dynamic classes
1930 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001931 def __init__(self, x):
1932 self.x = x
1933 def __nonzero__(self):
1934 return not not self.x
1935 def __hash__(self):
1936 return hash(self.x)
1937 def __eq__(self, other):
1938 return self.x == other
1939 def __ne__(self, other):
1940 return self.x != other
1941 def __cmp__(self, other):
1942 return cmp(self.x, other.x)
1943 def __str__(self):
1944 return "DProxy:%s" % self.x
1945 def __repr__(self):
1946 return "DProxy(%r)" % self.x
1947 def __contains__(self, value):
1948 return value in self.x
1949 p0 = DProxy(0)
1950 p1 = DProxy(1)
1951 p_1 = DProxy(-1)
1952 verify(not p0)
1953 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001954 vereq(hash(p0), hash(0))
1955 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001956 verify(p0 != p1)
1957 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001958 vereq(not p0, p1)
1959 vereq(cmp(p0, p1), -1)
1960 vereq(cmp(p0, p0), 0)
1961 vereq(cmp(p0, p_1), 1)
1962 vereq(str(p0), "DProxy:0")
1963 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001964 p10 = DProxy(range(10))
1965 verify(-1 not in p10)
1966 for i in range(10):
1967 verify(i in p10)
1968 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001969 # Safety test for __cmp__
1970 def unsafecmp(a, b):
1971 try:
1972 a.__class__.__cmp__(a, b)
1973 except TypeError:
1974 pass
1975 else:
1976 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1977 a.__class__, a, b)
1978 unsafecmp(u"123", "123")
1979 unsafecmp("123", u"123")
1980 unsafecmp(1, 1.0)
1981 unsafecmp(1.0, 1)
1982 unsafecmp(1, 1L)
1983 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001984
Brett Cannon1e534b52007-09-07 04:18:30 +00001985def recursions():
1986 if verbose:
1987 print "Testing recursion checks ..."
1988
Neal Norwitz1a997502003-01-13 20:13:12 +00001989 class Letter(str):
1990 def __new__(cls, letter):
1991 if letter == 'EPS':
1992 return str.__new__(cls)
1993 return str.__new__(cls, letter)
1994 def __str__(self):
1995 if not self:
1996 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001997 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001998 # sys.stdout needs to be the original to trigger the recursion bug
1999 import sys
2000 test_stdout = sys.stdout
2001 sys.stdout = get_original_stdout()
2002 try:
2003 # nothing should actually be printed, this should raise an exception
2004 print Letter('w')
2005 except RuntimeError:
2006 pass
2007 else:
2008 raise TestFailed, "expected a RuntimeError for print recursion"
2009 sys.stdout = test_stdout
2010
Brett Cannon1e534b52007-09-07 04:18:30 +00002011 # Bug #1202533.
2012 class A(object):
2013 pass
2014 A.__mul__ = new.instancemethod(lambda self, x: self * x, None, A)
2015 try:
2016 A()*2
2017 except RuntimeError:
2018 pass
2019 else:
2020 raise TestFailed("expected a RuntimeError")
2021
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002022def weakrefs():
2023 if verbose: print "Testing weak references..."
2024 import weakref
2025 class C(object):
2026 pass
2027 c = C()
2028 r = weakref.ref(c)
2029 verify(r() is c)
2030 del c
2031 verify(r() is None)
2032 del r
2033 class NoWeak(object):
2034 __slots__ = ['foo']
2035 no = NoWeak()
2036 try:
2037 weakref.ref(no)
2038 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00002039 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002040 else:
2041 verify(0, "weakref.ref(no) should be illegal")
2042 class Weak(object):
2043 __slots__ = ['foo', '__weakref__']
2044 yes = Weak()
2045 r = weakref.ref(yes)
2046 verify(r() is yes)
2047 del yes
2048 verify(r() is None)
2049 del r
2050
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002051def properties():
2052 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002053 class C(object):
2054 def getx(self):
2055 return self.__x
2056 def setx(self, value):
2057 self.__x = value
2058 def delx(self):
2059 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00002060 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002061 a = C()
2062 verify(not hasattr(a, "x"))
2063 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00002064 vereq(a._C__x, 42)
2065 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002066 del a.x
2067 verify(not hasattr(a, "x"))
2068 verify(not hasattr(a, "_C__x"))
2069 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00002070 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00002071 C.x.__delete__(a)
2072 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00002073
Tim Peters66c1a522001-09-24 21:17:50 +00002074 raw = C.__dict__['x']
2075 verify(isinstance(raw, property))
2076
2077 attrs = dir(raw)
2078 verify("__doc__" in attrs)
2079 verify("fget" in attrs)
2080 verify("fset" in attrs)
2081 verify("fdel" in attrs)
2082
Guido van Rossum45704552001-10-08 16:35:45 +00002083 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00002084 verify(raw.fget is C.__dict__['getx'])
2085 verify(raw.fset is C.__dict__['setx'])
2086 verify(raw.fdel is C.__dict__['delx'])
2087
2088 for attr in "__doc__", "fget", "fset", "fdel":
2089 try:
2090 setattr(raw, attr, 42)
2091 except TypeError, msg:
2092 if str(msg).find('readonly') < 0:
2093 raise TestFailed("when setting readonly attr %r on a "
2094 "property, got unexpected TypeError "
2095 "msg %r" % (attr, str(msg)))
2096 else:
2097 raise TestFailed("expected TypeError from trying to set "
2098 "readonly %r attr on a property" % attr)
2099
Neal Norwitz673cd822002-10-18 16:33:13 +00002100 class D(object):
2101 __getitem__ = property(lambda s: 1/0)
2102
2103 d = D()
2104 try:
2105 for i in d:
2106 str(i)
2107 except ZeroDivisionError:
2108 pass
2109 else:
2110 raise TestFailed, "expected ZeroDivisionError from bad property"
2111
Georg Brandl533ff6f2006-03-08 18:09:27 +00002112 class E(object):
2113 def getter(self):
2114 "getter method"
2115 return 0
2116 def setter(self, value):
2117 "setter method"
2118 pass
2119 prop = property(getter)
2120 vereq(prop.__doc__, "getter method")
2121 prop2 = property(fset=setter)
2122 vereq(prop2.__doc__, None)
2123
Georg Brandle9462c72006-08-04 18:03:37 +00002124 # this segfaulted in 2.5b2
2125 try:
2126 import _testcapi
2127 except ImportError:
2128 pass
2129 else:
2130 class X(object):
2131 p = property(_testcapi.test_with_docstring)
2132
2133
Guido van Rossumc4a18802001-08-24 16:55:27 +00002134def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00002135 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00002136
2137 class A(object):
2138 def meth(self, a):
2139 return "A(%r)" % a
2140
Guido van Rossum45704552001-10-08 16:35:45 +00002141 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002142
2143 class B(A):
2144 def __init__(self):
2145 self.__super = super(B, self)
2146 def meth(self, a):
2147 return "B(%r)" % a + self.__super.meth(a)
2148
Guido van Rossum45704552001-10-08 16:35:45 +00002149 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002150
2151 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002152 def meth(self, a):
2153 return "C(%r)" % a + self.__super.meth(a)
2154 C._C__super = super(C)
2155
Guido van Rossum45704552001-10-08 16:35:45 +00002156 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002157
2158 class D(C, B):
2159 def meth(self, a):
2160 return "D(%r)" % a + super(D, self).meth(a)
2161
Guido van Rossum5b443c62001-12-03 15:38:28 +00002162 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2163
2164 # Test for subclassing super
2165
2166 class mysuper(super):
2167 def __init__(self, *args):
2168 return super(mysuper, self).__init__(*args)
2169
2170 class E(D):
2171 def meth(self, a):
2172 return "E(%r)" % a + mysuper(E, self).meth(a)
2173
2174 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2175
2176 class F(E):
2177 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002178 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002179 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2180 F._F__super = mysuper(F)
2181
2182 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2183
2184 # Make sure certain errors are raised
2185
2186 try:
2187 super(D, 42)
2188 except TypeError:
2189 pass
2190 else:
2191 raise TestFailed, "shouldn't allow super(D, 42)"
2192
2193 try:
2194 super(D, C())
2195 except TypeError:
2196 pass
2197 else:
2198 raise TestFailed, "shouldn't allow super(D, C())"
2199
2200 try:
2201 super(D).__get__(12)
2202 except TypeError:
2203 pass
2204 else:
2205 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2206
2207 try:
2208 super(D).__get__(C())
2209 except TypeError:
2210 pass
2211 else:
2212 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002213
Guido van Rossuma4541a32003-04-16 20:02:22 +00002214 # Make sure data descriptors can be overridden and accessed via super
2215 # (new feature in Python 2.3)
2216
2217 class DDbase(object):
2218 def getx(self): return 42
2219 x = property(getx)
2220
2221 class DDsub(DDbase):
2222 def getx(self): return "hello"
2223 x = property(getx)
2224
2225 dd = DDsub()
2226 vereq(dd.x, "hello")
2227 vereq(super(DDsub, dd).x, 42)
2228
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002229 # Ensure that super() lookup of descriptor from classmethod
2230 # works (SF ID# 743627)
2231
2232 class Base(object):
2233 aProp = property(lambda self: "foo")
2234
2235 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002236 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002237 def test(klass):
2238 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002239
2240 veris(Sub.test(), Base.aProp)
2241
Georg Brandl5d59c092006-09-30 08:43:30 +00002242 # Verify that super() doesn't allow keyword args
2243 try:
2244 super(Base, kw=1)
2245 except TypeError:
2246 pass
2247 else:
2248 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002249
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002250def inherits():
2251 if verbose: print "Testing inheritance from basic types..."
2252
2253 class hexint(int):
2254 def __repr__(self):
2255 return hex(self)
2256 def __add__(self, other):
2257 return hexint(int.__add__(self, other))
2258 # (Note that overriding __radd__ doesn't work,
2259 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(repr(hexint(7) + 9), "0x10")
2261 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002262 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002263 vereq(a, 12345)
2264 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002265 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002267 verify((+a).__class__ is int)
2268 verify((a >> 0).__class__ is int)
2269 verify((a << 0).__class__ is int)
2270 verify((hexint(0) << 12).__class__ is int)
2271 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002272
2273 class octlong(long):
2274 __slots__ = []
2275 def __str__(self):
2276 s = oct(self)
2277 if s[-1] == 'L':
2278 s = s[:-1]
2279 return s
2280 def __add__(self, other):
2281 return self.__class__(super(octlong, self).__add__(other))
2282 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002284 # (Note that overriding __radd__ here only seems to work
2285 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002287 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(a, 12345L)
2289 vereq(long(a), 12345L)
2290 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002291 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002292 verify((+a).__class__ is long)
2293 verify((-a).__class__ is long)
2294 verify((-octlong(0)).__class__ is long)
2295 verify((a >> 0).__class__ is long)
2296 verify((a << 0).__class__ is long)
2297 verify((a - 0).__class__ is long)
2298 verify((a * 1).__class__ is long)
2299 verify((a ** 1).__class__ is long)
2300 verify((a // 1).__class__ is long)
2301 verify((1 * a).__class__ is long)
2302 verify((a | 0).__class__ is long)
2303 verify((a ^ 0).__class__ is long)
2304 verify((a & -1L).__class__ is long)
2305 verify((octlong(0) << 12).__class__ is long)
2306 verify((octlong(0) >> 12).__class__ is long)
2307 verify(abs(octlong(0)).__class__ is long)
2308
2309 # Because octlong overrides __add__, we can't check the absence of +0
2310 # optimizations using octlong.
2311 class longclone(long):
2312 pass
2313 a = longclone(1)
2314 verify((a + 0).__class__ is long)
2315 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002316
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002317 # Check that negative clones don't segfault
2318 a = longclone(-1)
2319 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002320 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002321
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002322 class precfloat(float):
2323 __slots__ = ['prec']
2324 def __init__(self, value=0.0, prec=12):
2325 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002326 def __repr__(self):
2327 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002328 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002329 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002330 vereq(a, 12345.0)
2331 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002332 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002333 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002334 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002335
Tim Peters2400fa42001-09-12 19:12:49 +00002336 class madcomplex(complex):
2337 def __repr__(self):
2338 return "%.17gj%+.17g" % (self.imag, self.real)
2339 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002340 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002341 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002342 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(a, base)
2344 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002345 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002346 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(repr(a), "4j-3")
2348 vereq(a, base)
2349 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002350 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002351 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002352 veris((+a).__class__, complex)
2353 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002354 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002355 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002356 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002357 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002358 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002359 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002360 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002361
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002362 class madtuple(tuple):
2363 _rev = None
2364 def rev(self):
2365 if self._rev is not None:
2366 return self._rev
2367 L = list(self)
2368 L.reverse()
2369 self._rev = self.__class__(L)
2370 return self._rev
2371 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002372 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2373 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2374 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002375 for i in range(512):
2376 t = madtuple(range(i))
2377 u = t.rev()
2378 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002379 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002380 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002381 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002382 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002383 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002384 verify(a[:].__class__ is tuple)
2385 verify((a * 1).__class__ is tuple)
2386 verify((a * 0).__class__ is tuple)
2387 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002388 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002389 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002390 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002391 verify((a + a).__class__ is tuple)
2392 verify((a * 0).__class__ is tuple)
2393 verify((a * 1).__class__ is tuple)
2394 verify((a * 2).__class__ is tuple)
2395 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002396
2397 class madstring(str):
2398 _rev = None
2399 def rev(self):
2400 if self._rev is not None:
2401 return self._rev
2402 L = list(self)
2403 L.reverse()
2404 self._rev = self.__class__("".join(L))
2405 return self._rev
2406 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002407 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2408 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2409 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002410 for i in range(256):
2411 s = madstring("".join(map(chr, range(i))))
2412 t = s.rev()
2413 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002414 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002415 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002416 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002417 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002418
Tim Peters8fa5dd02001-09-12 02:18:30 +00002419 base = "\x00" * 5
2420 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002421 vereq(s, base)
2422 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002423 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002424 vereq(hash(s), hash(base))
2425 vereq({s: 1}[base], 1)
2426 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002427 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002428 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002429 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002430 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002431 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002432 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002433 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002434 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002435 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002436 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002437 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002439 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002440 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002441 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002442 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002443 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002444 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002445 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002446 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002447 identitytab = ''.join([chr(i) for i in range(256)])
2448 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002449 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002450 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002451 vereq(s.translate(identitytab, "x"), base)
2452 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002453 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002454 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002455 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002456 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002457 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002458 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002459 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002460 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002461 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002462 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002463
Guido van Rossum91ee7982001-08-30 20:52:40 +00002464 class madunicode(unicode):
2465 _rev = None
2466 def rev(self):
2467 if self._rev is not None:
2468 return self._rev
2469 L = list(self)
2470 L.reverse()
2471 self._rev = self.__class__(u"".join(L))
2472 return self._rev
2473 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002474 vereq(u, u"ABCDEF")
2475 vereq(u.rev(), madunicode(u"FEDCBA"))
2476 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002477 base = u"12345"
2478 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002479 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002480 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002481 vereq(hash(u), hash(base))
2482 vereq({u: 1}[base], 1)
2483 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002484 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002485 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002486 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002487 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002488 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002489 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002490 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002491 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002492 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002493 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002494 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002495 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002496 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002497 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002498 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002499 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002500 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002501 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002502 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002503 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002504 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002505 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002506 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002507 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002508 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002509 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002510 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002511 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002512 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002513 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002514 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002515 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002516 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002517 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002518 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002519 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002520 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002521 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002522
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002523 class sublist(list):
2524 pass
2525 a = sublist(range(5))
2526 vereq(a, range(5))
2527 a.append("hello")
2528 vereq(a, range(5) + ["hello"])
2529 a[5] = 5
2530 vereq(a, range(6))
2531 a.extend(range(6, 20))
2532 vereq(a, range(20))
2533 a[-5:] = []
2534 vereq(a, range(15))
2535 del a[10:15]
2536 vereq(len(a), 10)
2537 vereq(a, range(10))
2538 vereq(list(a), range(10))
2539 vereq(a[0], 0)
2540 vereq(a[9], 9)
2541 vereq(a[-10], 0)
2542 vereq(a[-1], 9)
2543 vereq(a[:5], range(5))
2544
Tim Peters59c9a642001-09-13 05:38:56 +00002545 class CountedInput(file):
2546 """Counts lines read by self.readline().
2547
2548 self.lineno is the 0-based ordinal of the last line read, up to
2549 a maximum of one greater than the number of lines in the file.
2550
2551 self.ateof is true if and only if the final "" line has been read,
2552 at which point self.lineno stops incrementing, and further calls
2553 to readline() continue to return "".
2554 """
2555
2556 lineno = 0
2557 ateof = 0
2558 def readline(self):
2559 if self.ateof:
2560 return ""
2561 s = file.readline(self)
2562 # Next line works too.
2563 # s = super(CountedInput, self).readline()
2564 self.lineno += 1
2565 if s == "":
2566 self.ateof = 1
2567 return s
2568
Tim Peters561f8992001-09-13 19:36:36 +00002569 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002570 lines = ['a\n', 'b\n', 'c\n']
2571 try:
2572 f.writelines(lines)
2573 f.close()
2574 f = CountedInput(TESTFN)
2575 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2576 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002577 vereq(expected, got)
2578 vereq(f.lineno, i)
2579 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002580 f.close()
2581 finally:
2582 try:
2583 f.close()
2584 except:
2585 pass
2586 try:
2587 import os
2588 os.unlink(TESTFN)
2589 except:
2590 pass
2591
Tim Peters808b94e2001-09-13 19:33:07 +00002592def keywords():
2593 if verbose:
2594 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002595 vereq(int(x=1), 1)
2596 vereq(float(x=2), 2.0)
2597 vereq(long(x=3), 3L)
2598 vereq(complex(imag=42, real=666), complex(666, 42))
2599 vereq(str(object=500), '500')
2600 vereq(unicode(string='abc', errors='strict'), u'abc')
2601 vereq(tuple(sequence=range(3)), (0, 1, 2))
2602 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002603 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002604
2605 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002606 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002607 try:
2608 constructor(bogus_keyword_arg=1)
2609 except TypeError:
2610 pass
2611 else:
2612 raise TestFailed("expected TypeError from bogus keyword "
2613 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002614
Tim Peters8fa45672001-09-13 21:01:29 +00002615def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002616 # XXX This test is disabled because rexec is not deemed safe
2617 return
Tim Peters8fa45672001-09-13 21:01:29 +00002618 import rexec
2619 if verbose:
2620 print "Testing interaction with restricted execution ..."
2621
2622 sandbox = rexec.RExec()
2623
2624 code1 = """f = open(%r, 'w')""" % TESTFN
2625 code2 = """f = file(%r, 'w')""" % TESTFN
2626 code3 = """\
2627f = open(%r)
2628t = type(f) # a sneaky way to get the file() constructor
2629f.close()
2630f = t(%r, 'w') # rexec can't catch this by itself
2631""" % (TESTFN, TESTFN)
2632
2633 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2634 f.close()
2635
2636 try:
2637 for code in code1, code2, code3:
2638 try:
2639 sandbox.r_exec(code)
2640 except IOError, msg:
2641 if str(msg).find("restricted") >= 0:
2642 outcome = "OK"
2643 else:
2644 outcome = "got an exception, but not an expected one"
2645 else:
2646 outcome = "expected a restricted-execution exception"
2647
2648 if outcome != "OK":
2649 raise TestFailed("%s, in %r" % (outcome, code))
2650
2651 finally:
2652 try:
2653 import os
2654 os.unlink(TESTFN)
2655 except:
2656 pass
2657
Tim Peters0ab085c2001-09-14 00:25:33 +00002658def str_subclass_as_dict_key():
2659 if verbose:
2660 print "Testing a str subclass used as dict key .."
2661
2662 class cistr(str):
2663 """Sublcass of str that computes __eq__ case-insensitively.
2664
2665 Also computes a hash code of the string in canonical form.
2666 """
2667
2668 def __init__(self, value):
2669 self.canonical = value.lower()
2670 self.hashcode = hash(self.canonical)
2671
2672 def __eq__(self, other):
2673 if not isinstance(other, cistr):
2674 other = cistr(other)
2675 return self.canonical == other.canonical
2676
2677 def __hash__(self):
2678 return self.hashcode
2679
Guido van Rossum45704552001-10-08 16:35:45 +00002680 vereq(cistr('ABC'), 'abc')
2681 vereq('aBc', cistr('ABC'))
2682 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002683
2684 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002685 vereq(d[cistr('one')], 1)
2686 vereq(d[cistr('tWo')], 2)
2687 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002688 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002689 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002690
Guido van Rossumab3b0342001-09-18 20:38:53 +00002691def classic_comparisons():
2692 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002693 class classic:
2694 pass
2695 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002696 if verbose: print " (base = %s)" % base
2697 class C(base):
2698 def __init__(self, value):
2699 self.value = int(value)
2700 def __cmp__(self, other):
2701 if isinstance(other, C):
2702 return cmp(self.value, other.value)
2703 if isinstance(other, int) or isinstance(other, long):
2704 return cmp(self.value, other)
2705 return NotImplemented
2706 c1 = C(1)
2707 c2 = C(2)
2708 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002709 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002710 c = {1: c1, 2: c2, 3: c3}
2711 for x in 1, 2, 3:
2712 for y in 1, 2, 3:
2713 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2714 for op in "<", "<=", "==", "!=", ">", ">=":
2715 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2716 "x=%d, y=%d" % (x, y))
2717 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2718 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2719
Guido van Rossum0639f592001-09-18 21:06:04 +00002720def rich_comparisons():
2721 if verbose:
2722 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002723 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002724 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002725 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002726 vereq(z, 1+0j)
2727 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002728 class ZZ(complex):
2729 def __eq__(self, other):
2730 try:
2731 return abs(self - other) <= 1e-6
2732 except:
2733 return NotImplemented
2734 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002735 vereq(zz, 1+0j)
2736 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002737
Guido van Rossum0639f592001-09-18 21:06:04 +00002738 class classic:
2739 pass
2740 for base in (classic, int, object, list):
2741 if verbose: print " (base = %s)" % base
2742 class C(base):
2743 def __init__(self, value):
2744 self.value = int(value)
2745 def __cmp__(self, other):
2746 raise TestFailed, "shouldn't call __cmp__"
2747 def __eq__(self, other):
2748 if isinstance(other, C):
2749 return self.value == other.value
2750 if isinstance(other, int) or isinstance(other, long):
2751 return self.value == other
2752 return NotImplemented
2753 def __ne__(self, other):
2754 if isinstance(other, C):
2755 return self.value != other.value
2756 if isinstance(other, int) or isinstance(other, long):
2757 return self.value != other
2758 return NotImplemented
2759 def __lt__(self, other):
2760 if isinstance(other, C):
2761 return self.value < other.value
2762 if isinstance(other, int) or isinstance(other, long):
2763 return self.value < other
2764 return NotImplemented
2765 def __le__(self, other):
2766 if isinstance(other, C):
2767 return self.value <= other.value
2768 if isinstance(other, int) or isinstance(other, long):
2769 return self.value <= other
2770 return NotImplemented
2771 def __gt__(self, other):
2772 if isinstance(other, C):
2773 return self.value > other.value
2774 if isinstance(other, int) or isinstance(other, long):
2775 return self.value > other
2776 return NotImplemented
2777 def __ge__(self, other):
2778 if isinstance(other, C):
2779 return self.value >= other.value
2780 if isinstance(other, int) or isinstance(other, long):
2781 return self.value >= other
2782 return NotImplemented
2783 c1 = C(1)
2784 c2 = C(2)
2785 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002786 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002787 c = {1: c1, 2: c2, 3: c3}
2788 for x in 1, 2, 3:
2789 for y in 1, 2, 3:
2790 for op in "<", "<=", "==", "!=", ">", ">=":
2791 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2792 "x=%d, y=%d" % (x, y))
2793 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2794 "x=%d, y=%d" % (x, y))
2795 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2796 "x=%d, y=%d" % (x, y))
2797
Guido van Rossum1952e382001-09-19 01:25:16 +00002798def coercions():
2799 if verbose: print "Testing coercions..."
2800 class I(int): pass
2801 coerce(I(0), 0)
2802 coerce(0, I(0))
2803 class L(long): pass
2804 coerce(L(0), 0)
2805 coerce(L(0), 0L)
2806 coerce(0, L(0))
2807 coerce(0L, L(0))
2808 class F(float): pass
2809 coerce(F(0), 0)
2810 coerce(F(0), 0L)
2811 coerce(F(0), 0.)
2812 coerce(0, F(0))
2813 coerce(0L, F(0))
2814 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002815 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002816 coerce(C(0), 0)
2817 coerce(C(0), 0L)
2818 coerce(C(0), 0.)
2819 coerce(C(0), 0j)
2820 coerce(0, C(0))
2821 coerce(0L, C(0))
2822 coerce(0., C(0))
2823 coerce(0j, C(0))
2824
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002825def descrdoc():
2826 if verbose: print "Testing descriptor doc strings..."
2827 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002828 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002829 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002830 check(file.name, "file name") # member descriptor
2831
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002832def setclass():
2833 if verbose: print "Testing __class__ assignment..."
2834 class C(object): pass
2835 class D(object): pass
2836 class E(object): pass
2837 class F(D, E): pass
2838 for cls in C, D, E, F:
2839 for cls2 in C, D, E, F:
2840 x = cls()
2841 x.__class__ = cls2
2842 verify(x.__class__ is cls2)
2843 x.__class__ = cls
2844 verify(x.__class__ is cls)
2845 def cant(x, C):
2846 try:
2847 x.__class__ = C
2848 except TypeError:
2849 pass
2850 else:
2851 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002852 try:
2853 delattr(x, "__class__")
2854 except TypeError:
2855 pass
2856 else:
2857 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002858 cant(C(), list)
2859 cant(list(), C)
2860 cant(C(), 1)
2861 cant(C(), object)
2862 cant(object(), list)
2863 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002864 class Int(int): __slots__ = []
2865 cant(2, Int)
2866 cant(Int(), int)
2867 cant(True, int)
2868 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002869 o = object()
2870 cant(o, type(1))
2871 cant(o, type(None))
2872 del o
Žiga Seilnacht6f2d09c2007-03-16 11:59:38 +00002873 class G(object):
2874 __slots__ = ["a", "b"]
2875 class H(object):
2876 __slots__ = ["b", "a"]
2877 try:
2878 unicode
2879 except NameError:
2880 class I(object):
2881 __slots__ = ["a", "b"]
2882 else:
2883 class I(object):
2884 __slots__ = [unicode("a"), unicode("b")]
2885 class J(object):
2886 __slots__ = ["c", "b"]
2887 class K(object):
2888 __slots__ = ["a", "b", "d"]
2889 class L(H):
2890 __slots__ = ["e"]
2891 class M(I):
2892 __slots__ = ["e"]
2893 class N(J):
2894 __slots__ = ["__weakref__"]
2895 class P(J):
2896 __slots__ = ["__dict__"]
2897 class Q(J):
2898 pass
2899 class R(J):
2900 __slots__ = ["__dict__", "__weakref__"]
2901
2902 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2903 x = cls()
2904 x.a = 1
2905 x.__class__ = cls2
2906 verify(x.__class__ is cls2,
2907 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2908 vereq(x.a, 1)
2909 x.__class__ = cls
2910 verify(x.__class__ is cls,
2911 "assigning %r as __class__ for %r silently failed" % (cls, x))
2912 vereq(x.a, 1)
2913 for cls in G, J, K, L, M, N, P, R, list, Int:
2914 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2915 if cls is cls2:
2916 continue
2917 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002918
Guido van Rossum6661be32001-10-26 04:26:12 +00002919def setdict():
2920 if verbose: print "Testing __dict__ assignment..."
2921 class C(object): pass
2922 a = C()
2923 a.__dict__ = {'b': 1}
2924 vereq(a.b, 1)
2925 def cant(x, dict):
2926 try:
2927 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002928 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002929 pass
2930 else:
2931 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2932 cant(a, None)
2933 cant(a, [])
2934 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002935 del a.__dict__ # Deleting __dict__ is allowed
Armin Rigo9790a272007-05-02 19:23:31 +00002936
2937 class Base(object):
2938 pass
2939 def verify_dict_readonly(x):
2940 """
2941 x has to be an instance of a class inheriting from Base.
2942 """
2943 cant(x, {})
2944 try:
2945 del x.__dict__
2946 except (AttributeError, TypeError):
2947 pass
2948 else:
2949 raise TestFailed, "shouldn't allow del %r.__dict__" % x
2950 dict_descr = Base.__dict__["__dict__"]
2951 try:
2952 dict_descr.__set__(x, {})
2953 except (AttributeError, TypeError):
2954 pass
2955 else:
2956 raise TestFailed, "dict_descr allowed access to %r's dict" % x
2957
2958 # Classes don't allow __dict__ assignment and have readonly dicts
2959 class Meta1(type, Base):
2960 pass
2961 class Meta2(Base, type):
2962 pass
2963 class D(object):
2964 __metaclass__ = Meta1
2965 class E(object):
2966 __metaclass__ = Meta2
2967 for cls in C, D, E:
2968 verify_dict_readonly(cls)
2969 class_dict = cls.__dict__
2970 try:
2971 class_dict["spam"] = "eggs"
2972 except TypeError:
2973 pass
2974 else:
2975 raise TestFailed, "%r's __dict__ can be modified" % cls
2976
2977 # Modules also disallow __dict__ assignment
2978 class Module1(types.ModuleType, Base):
2979 pass
2980 class Module2(Base, types.ModuleType):
2981 pass
2982 for ModuleType in Module1, Module2:
2983 mod = ModuleType("spam")
2984 verify_dict_readonly(mod)
2985 mod.__dict__["spam"] = "eggs"
2986
2987 # Exception's __dict__ can be replaced, but not deleted
2988 class Exception1(Exception, Base):
2989 pass
2990 class Exception2(Base, Exception):
2991 pass
2992 for ExceptionType in Exception, Exception1, Exception2:
2993 e = ExceptionType()
2994 e.__dict__ = {"a": 1}
2995 vereq(e.a, 1)
2996 try:
2997 del e.__dict__
2998 except (TypeError, AttributeError):
2999 pass
3000 else:
3001 raise TestFaied, "%r's __dict__ can be deleted" % e
3002
Guido van Rossum6661be32001-10-26 04:26:12 +00003003
Guido van Rossum3926a632001-09-25 16:25:58 +00003004def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003005 if verbose:
3006 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00003007 import pickle, cPickle
3008
3009 def sorteditems(d):
3010 L = d.items()
3011 L.sort()
3012 return L
3013
3014 global C
3015 class C(object):
3016 def __init__(self, a, b):
3017 super(C, self).__init__()
3018 self.a = a
3019 self.b = b
3020 def __repr__(self):
3021 return "C(%r, %r)" % (self.a, self.b)
3022
3023 global C1
3024 class C1(list):
3025 def __new__(cls, a, b):
3026 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00003027 def __getnewargs__(self):
3028 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00003029 def __init__(self, a, b):
3030 self.a = a
3031 self.b = b
3032 def __repr__(self):
3033 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3034
3035 global C2
3036 class C2(int):
3037 def __new__(cls, a, b, val=0):
3038 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00003039 def __getnewargs__(self):
3040 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00003041 def __init__(self, a, b, val=0):
3042 self.a = a
3043 self.b = b
3044 def __repr__(self):
3045 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3046
Guido van Rossum90c45142001-11-24 21:07:01 +00003047 global C3
3048 class C3(object):
3049 def __init__(self, foo):
3050 self.foo = foo
3051 def __getstate__(self):
3052 return self.foo
3053 def __setstate__(self, foo):
3054 self.foo = foo
3055
3056 global C4classic, C4
3057 class C4classic: # classic
3058 pass
3059 class C4(C4classic, object): # mixed inheritance
3060 pass
3061
Guido van Rossum3926a632001-09-25 16:25:58 +00003062 for p in pickle, cPickle:
3063 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003064 if verbose:
3065 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00003066
3067 for cls in C, C1, C2:
3068 s = p.dumps(cls, bin)
3069 cls2 = p.loads(s)
3070 verify(cls2 is cls)
3071
3072 a = C1(1, 2); a.append(42); a.append(24)
3073 b = C2("hello", "world", 42)
3074 s = p.dumps((a, b), bin)
3075 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00003076 vereq(x.__class__, a.__class__)
3077 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3078 vereq(y.__class__, b.__class__)
3079 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003080 vereq(repr(x), repr(a))
3081 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00003082 if verbose:
3083 print "a = x =", a
3084 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00003085 # Test for __getstate__ and __setstate__ on new style class
3086 u = C3(42)
3087 s = p.dumps(u, bin)
3088 v = p.loads(s)
3089 veris(u.__class__, v.__class__)
3090 vereq(u.foo, v.foo)
3091 # Test for picklability of hybrid class
3092 u = C4()
3093 u.foo = 42
3094 s = p.dumps(u, bin)
3095 v = p.loads(s)
3096 veris(u.__class__, v.__class__)
3097 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003098
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003099 # Testing copy.deepcopy()
3100 if verbose:
3101 print "deepcopy"
3102 import copy
3103 for cls in C, C1, C2:
3104 cls2 = copy.deepcopy(cls)
3105 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003106
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003107 a = C1(1, 2); a.append(42); a.append(24)
3108 b = C2("hello", "world", 42)
3109 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003110 vereq(x.__class__, a.__class__)
3111 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3112 vereq(y.__class__, b.__class__)
3113 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003114 vereq(repr(x), repr(a))
3115 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003116 if verbose:
3117 print "a = x =", a
3118 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003119
Guido van Rossum8c842552002-03-14 23:05:54 +00003120def pickleslots():
3121 if verbose: print "Testing pickling of classes with __slots__ ..."
3122 import pickle, cPickle
3123 # Pickling of classes with __slots__ but without __getstate__ should fail
3124 global B, C, D, E
3125 class B(object):
3126 pass
3127 for base in [object, B]:
3128 class C(base):
3129 __slots__ = ['a']
3130 class D(C):
3131 pass
3132 try:
3133 pickle.dumps(C())
3134 except TypeError:
3135 pass
3136 else:
3137 raise TestFailed, "should fail: pickle C instance - %s" % base
3138 try:
3139 cPickle.dumps(C())
3140 except TypeError:
3141 pass
3142 else:
3143 raise TestFailed, "should fail: cPickle C instance - %s" % base
3144 try:
3145 pickle.dumps(C())
3146 except TypeError:
3147 pass
3148 else:
3149 raise TestFailed, "should fail: pickle D instance - %s" % base
3150 try:
3151 cPickle.dumps(D())
3152 except TypeError:
3153 pass
3154 else:
3155 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003156 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003157 class C(base):
3158 __slots__ = ['a']
3159 def __getstate__(self):
3160 try:
3161 d = self.__dict__.copy()
3162 except AttributeError:
3163 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003164 for cls in self.__class__.__mro__:
3165 for sn in cls.__dict__.get('__slots__', ()):
3166 try:
3167 d[sn] = getattr(self, sn)
3168 except AttributeError:
3169 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003170 return d
3171 def __setstate__(self, d):
3172 for k, v in d.items():
3173 setattr(self, k, v)
3174 class D(C):
3175 pass
3176 # Now it should work
3177 x = C()
3178 y = pickle.loads(pickle.dumps(x))
3179 vereq(hasattr(y, 'a'), 0)
3180 y = cPickle.loads(cPickle.dumps(x))
3181 vereq(hasattr(y, 'a'), 0)
3182 x.a = 42
3183 y = pickle.loads(pickle.dumps(x))
3184 vereq(y.a, 42)
3185 y = cPickle.loads(cPickle.dumps(x))
3186 vereq(y.a, 42)
3187 x = D()
3188 x.a = 42
3189 x.b = 100
3190 y = pickle.loads(pickle.dumps(x))
3191 vereq(y.a + y.b, 142)
3192 y = cPickle.loads(cPickle.dumps(x))
3193 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003194 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003195 class E(C):
3196 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003197 x = E()
3198 x.a = 42
3199 x.b = "foo"
3200 y = pickle.loads(pickle.dumps(x))
3201 vereq(y.a, x.a)
3202 vereq(y.b, x.b)
3203 y = cPickle.loads(cPickle.dumps(x))
3204 vereq(y.a, x.a)
3205 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003206
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003207def copies():
3208 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
3209 import copy
3210 class C(object):
3211 pass
3212
3213 a = C()
3214 a.foo = 12
3215 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003216 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003217
3218 a.bar = [1,2,3]
3219 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003220 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003221 verify(c.bar is a.bar)
3222
3223 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003224 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003225 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003226 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003227
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003228def binopoverride():
3229 if verbose: print "Testing overrides of binary operations..."
3230 class I(int):
3231 def __repr__(self):
3232 return "I(%r)" % int(self)
3233 def __add__(self, other):
3234 return I(int(self) + int(other))
3235 __radd__ = __add__
3236 def __pow__(self, other, mod=None):
3237 if mod is None:
3238 return I(pow(int(self), int(other)))
3239 else:
3240 return I(pow(int(self), int(other), int(mod)))
3241 def __rpow__(self, other, mod=None):
3242 if mod is None:
3243 return I(pow(int(other), int(self), mod))
3244 else:
3245 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003246
Walter Dörwald70a6b492004-02-12 17:35:32 +00003247 vereq(repr(I(1) + I(2)), "I(3)")
3248 vereq(repr(I(1) + 2), "I(3)")
3249 vereq(repr(1 + I(2)), "I(3)")
3250 vereq(repr(I(2) ** I(3)), "I(8)")
3251 vereq(repr(2 ** I(3)), "I(8)")
3252 vereq(repr(I(2) ** 3), "I(8)")
3253 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003254 class S(str):
3255 def __eq__(self, other):
3256 return self.lower() == other.lower()
3257
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003258def subclasspropagation():
3259 if verbose: print "Testing propagation of slot functions to subclasses..."
3260 class A(object):
3261 pass
3262 class B(A):
3263 pass
3264 class C(A):
3265 pass
3266 class D(B, C):
3267 pass
3268 d = D()
Tim Peters171b8682006-04-11 01:59:34 +00003269 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003270 A.__hash__ = lambda self: 42
3271 vereq(hash(d), 42)
3272 C.__hash__ = lambda self: 314
3273 vereq(hash(d), 314)
3274 B.__hash__ = lambda self: 144
3275 vereq(hash(d), 144)
3276 D.__hash__ = lambda self: 100
3277 vereq(hash(d), 100)
3278 del D.__hash__
3279 vereq(hash(d), 144)
3280 del B.__hash__
3281 vereq(hash(d), 314)
3282 del C.__hash__
3283 vereq(hash(d), 42)
3284 del A.__hash__
Tim Peters171b8682006-04-11 01:59:34 +00003285 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003286 d.foo = 42
3287 d.bar = 42
3288 vereq(d.foo, 42)
3289 vereq(d.bar, 42)
3290 def __getattribute__(self, name):
3291 if name == "foo":
3292 return 24
3293 return object.__getattribute__(self, name)
3294 A.__getattribute__ = __getattribute__
3295 vereq(d.foo, 24)
3296 vereq(d.bar, 42)
3297 def __getattr__(self, name):
3298 if name in ("spam", "foo", "bar"):
3299 return "hello"
3300 raise AttributeError, name
3301 B.__getattr__ = __getattr__
3302 vereq(d.spam, "hello")
3303 vereq(d.foo, 24)
3304 vereq(d.bar, 42)
3305 del A.__getattribute__
3306 vereq(d.foo, 42)
3307 del d.foo
3308 vereq(d.foo, "hello")
3309 vereq(d.bar, 42)
3310 del B.__getattr__
3311 try:
3312 d.foo
3313 except AttributeError:
3314 pass
3315 else:
3316 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003317
Guido van Rossume7f3e242002-06-14 02:35:45 +00003318 # Test a nasty bug in recurse_down_subclasses()
3319 import gc
3320 class A(object):
3321 pass
3322 class B(A):
3323 pass
3324 del B
3325 gc.collect()
3326 A.__setitem__ = lambda *a: None # crash
3327
Tim Petersfc57ccb2001-10-12 02:38:24 +00003328def buffer_inherit():
3329 import binascii
3330 # SF bug [#470040] ParseTuple t# vs subclasses.
3331 if verbose:
3332 print "Testing that buffer interface is inherited ..."
3333
3334 class MyStr(str):
3335 pass
3336 base = 'abc'
3337 m = MyStr(base)
3338 # b2a_hex uses the buffer interface to get its argument's value, via
3339 # PyArg_ParseTuple 't#' code.
3340 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3341
3342 # It's not clear that unicode will continue to support the character
3343 # buffer interface, and this test will fail if that's taken away.
3344 class MyUni(unicode):
3345 pass
3346 base = u'abc'
3347 m = MyUni(base)
3348 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3349
3350 class MyInt(int):
3351 pass
3352 m = MyInt(42)
3353 try:
3354 binascii.b2a_hex(m)
3355 raise TestFailed('subclass of int should not have a buffer interface')
3356 except TypeError:
3357 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003358
Tim Petersc9933152001-10-16 20:18:24 +00003359def str_of_str_subclass():
3360 import binascii
3361 import cStringIO
3362
3363 if verbose:
3364 print "Testing __str__ defined in subclass of str ..."
3365
3366 class octetstring(str):
3367 def __str__(self):
3368 return binascii.b2a_hex(self)
3369 def __repr__(self):
3370 return self + " repr"
3371
3372 o = octetstring('A')
3373 vereq(type(o), octetstring)
3374 vereq(type(str(o)), str)
3375 vereq(type(repr(o)), str)
3376 vereq(ord(o), 0x41)
3377 vereq(str(o), '41')
3378 vereq(repr(o), 'A repr')
3379 vereq(o.__str__(), '41')
3380 vereq(o.__repr__(), 'A repr')
3381
3382 capture = cStringIO.StringIO()
3383 # Calling str() or not exercises different internal paths.
3384 print >> capture, o
3385 print >> capture, str(o)
3386 vereq(capture.getvalue(), '41\n41\n')
3387 capture.close()
3388
Guido van Rossumc8e56452001-10-22 00:43:43 +00003389def kwdargs():
3390 if verbose: print "Testing keyword arguments to __init__, __call__..."
3391 def f(a): return a
3392 vereq(f.__call__(a=42), 42)
3393 a = []
3394 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003395 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003396
Brett Cannon22565aa2006-06-09 22:31:23 +00003397def recursive__call__():
3398 if verbose: print ("Testing recursive __call__() by setting to instance of "
3399 "class ...")
3400 class A(object):
3401 pass
3402
3403 A.__call__ = A()
3404 try:
3405 A()()
3406 except RuntimeError:
3407 pass
3408 else:
3409 raise TestFailed("Recursion limit should have been reached for "
3410 "__call__()")
3411
Guido van Rossumed87ad82001-10-30 02:33:02 +00003412def delhook():
3413 if verbose: print "Testing __del__ hook..."
3414 log = []
3415 class C(object):
3416 def __del__(self):
3417 log.append(1)
3418 c = C()
3419 vereq(log, [])
3420 del c
3421 vereq(log, [1])
3422
Guido van Rossum29d26062001-12-11 04:37:34 +00003423 class D(object): pass
3424 d = D()
3425 try: del d[0]
3426 except TypeError: pass
3427 else: raise TestFailed, "invalid del() didn't raise TypeError"
3428
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003429def hashinherit():
3430 if verbose: print "Testing hash of mutable subclasses..."
3431
3432 class mydict(dict):
3433 pass
3434 d = mydict()
3435 try:
3436 hash(d)
3437 except TypeError:
3438 pass
3439 else:
3440 raise TestFailed, "hash() of dict subclass should fail"
3441
3442 class mylist(list):
3443 pass
3444 d = mylist()
3445 try:
3446 hash(d)
3447 except TypeError:
3448 pass
3449 else:
3450 raise TestFailed, "hash() of list subclass should fail"
3451
Guido van Rossum29d26062001-12-11 04:37:34 +00003452def strops():
3453 try: 'a' + 5
3454 except TypeError: pass
3455 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3456
3457 try: ''.split('')
3458 except ValueError: pass
3459 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3460
3461 try: ''.join([0])
3462 except TypeError: pass
3463 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3464
3465 try: ''.rindex('5')
3466 except ValueError: pass
3467 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3468
Guido van Rossum29d26062001-12-11 04:37:34 +00003469 try: '%(n)s' % None
3470 except TypeError: pass
3471 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3472
3473 try: '%(n' % {}
3474 except ValueError: pass
3475 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3476
3477 try: '%*s' % ('abc')
3478 except TypeError: pass
3479 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3480
3481 try: '%*.*s' % ('abc', 5)
3482 except TypeError: pass
3483 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3484
3485 try: '%s' % (1, 2)
3486 except TypeError: pass
3487 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3488
3489 try: '%' % None
3490 except ValueError: pass
3491 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3492
3493 vereq('534253'.isdigit(), 1)
3494 vereq('534253x'.isdigit(), 0)
3495 vereq('%c' % 5, '\x05')
3496 vereq('%c' % '5', '5')
3497
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003498def deepcopyrecursive():
3499 if verbose: print "Testing deepcopy of recursive objects..."
3500 class Node:
3501 pass
3502 a = Node()
3503 b = Node()
3504 a.b = b
3505 b.a = a
3506 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003507
Guido van Rossumd7035672002-03-12 20:43:31 +00003508def modules():
3509 if verbose: print "Testing uninitialized module objects..."
3510 from types import ModuleType as M
3511 m = M.__new__(M)
3512 str(m)
3513 vereq(hasattr(m, "__name__"), 0)
3514 vereq(hasattr(m, "__file__"), 0)
3515 vereq(hasattr(m, "foo"), 0)
3516 vereq(m.__dict__, None)
3517 m.foo = 1
3518 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003519
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003520def dictproxyiterkeys():
3521 class C(object):
3522 def meth(self):
3523 pass
3524 if verbose: print "Testing dict-proxy iterkeys..."
3525 keys = [ key for key in C.__dict__.iterkeys() ]
3526 keys.sort()
3527 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3528
3529def dictproxyitervalues():
3530 class C(object):
3531 def meth(self):
3532 pass
3533 if verbose: print "Testing dict-proxy itervalues..."
3534 values = [ values for values in C.__dict__.itervalues() ]
3535 vereq(len(values), 5)
3536
3537def dictproxyiteritems():
3538 class C(object):
3539 def meth(self):
3540 pass
3541 if verbose: print "Testing dict-proxy iteritems..."
3542 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3543 keys.sort()
3544 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3545
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003546def funnynew():
3547 if verbose: print "Testing __new__ returning something unexpected..."
3548 class C(object):
3549 def __new__(cls, arg):
3550 if isinstance(arg, str): return [1, 2, 3]
3551 elif isinstance(arg, int): return object.__new__(D)
3552 else: return object.__new__(cls)
3553 class D(C):
3554 def __init__(self, arg):
3555 self.foo = arg
3556 vereq(C("1"), [1, 2, 3])
3557 vereq(D("1"), [1, 2, 3])
3558 d = D(None)
3559 veris(d.foo, None)
3560 d = C(1)
3561 vereq(isinstance(d, D), True)
3562 vereq(d.foo, 1)
3563 d = D(1)
3564 vereq(isinstance(d, D), True)
3565 vereq(d.foo, 1)
3566
Guido van Rossume8fc6402002-04-16 16:44:51 +00003567def imulbug():
3568 # SF bug 544647
3569 if verbose: print "Testing for __imul__ problems..."
3570 class C(object):
3571 def __imul__(self, other):
3572 return (self, other)
3573 x = C()
3574 y = x
3575 y *= 1.0
3576 vereq(y, (x, 1.0))
3577 y = x
3578 y *= 2
3579 vereq(y, (x, 2))
3580 y = x
3581 y *= 3L
3582 vereq(y, (x, 3L))
3583 y = x
3584 y *= 1L<<100
3585 vereq(y, (x, 1L<<100))
3586 y = x
3587 y *= None
3588 vereq(y, (x, None))
3589 y = x
3590 y *= "foo"
3591 vereq(y, (x, "foo"))
3592
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003593def docdescriptor():
3594 # SF bug 542984
3595 if verbose: print "Testing __doc__ descriptor..."
3596 class DocDescr(object):
3597 def __get__(self, object, otype):
3598 if object:
3599 object = object.__class__.__name__ + ' instance'
3600 if otype:
3601 otype = otype.__name__
3602 return 'object=%s; type=%s' % (object, otype)
3603 class OldClass:
3604 __doc__ = DocDescr()
3605 class NewClass(object):
3606 __doc__ = DocDescr()
3607 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3608 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3609 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3610 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3611
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003612def copy_setstate():
3613 if verbose:
3614 print "Testing that copy.*copy() correctly uses __setstate__..."
3615 import copy
3616 class C(object):
3617 def __init__(self, foo=None):
3618 self.foo = foo
3619 self.__foo = foo
3620 def setfoo(self, foo=None):
3621 self.foo = foo
3622 def getfoo(self):
3623 return self.__foo
3624 def __getstate__(self):
3625 return [self.foo]
3626 def __setstate__(self, lst):
3627 assert len(lst) == 1
3628 self.__foo = self.foo = lst[0]
3629 a = C(42)
3630 a.setfoo(24)
3631 vereq(a.foo, 24)
3632 vereq(a.getfoo(), 42)
3633 b = copy.copy(a)
3634 vereq(b.foo, 24)
3635 vereq(b.getfoo(), 24)
3636 b = copy.deepcopy(a)
3637 vereq(b.foo, 24)
3638 vereq(b.getfoo(), 24)
3639
Guido van Rossum09638c12002-06-13 19:17:46 +00003640def slices():
3641 if verbose:
3642 print "Testing cases with slices and overridden __getitem__ ..."
3643 # Strings
3644 vereq("hello"[:4], "hell")
3645 vereq("hello"[slice(4)], "hell")
3646 vereq(str.__getitem__("hello", slice(4)), "hell")
3647 class S(str):
3648 def __getitem__(self, x):
3649 return str.__getitem__(self, x)
3650 vereq(S("hello")[:4], "hell")
3651 vereq(S("hello")[slice(4)], "hell")
3652 vereq(S("hello").__getitem__(slice(4)), "hell")
3653 # Tuples
3654 vereq((1,2,3)[:2], (1,2))
3655 vereq((1,2,3)[slice(2)], (1,2))
3656 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3657 class T(tuple):
3658 def __getitem__(self, x):
3659 return tuple.__getitem__(self, x)
3660 vereq(T((1,2,3))[:2], (1,2))
3661 vereq(T((1,2,3))[slice(2)], (1,2))
3662 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3663 # Lists
3664 vereq([1,2,3][:2], [1,2])
3665 vereq([1,2,3][slice(2)], [1,2])
3666 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3667 class L(list):
3668 def __getitem__(self, x):
3669 return list.__getitem__(self, x)
3670 vereq(L([1,2,3])[:2], [1,2])
3671 vereq(L([1,2,3])[slice(2)], [1,2])
3672 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3673 # Now do lists and __setitem__
3674 a = L([1,2,3])
3675 a[slice(1, 3)] = [3,2]
3676 vereq(a, [1,3,2])
3677 a[slice(0, 2, 1)] = [3,1]
3678 vereq(a, [3,1,2])
3679 a.__setitem__(slice(1, 3), [2,1])
3680 vereq(a, [3,2,1])
3681 a.__setitem__(slice(0, 2, 1), [2,3])
3682 vereq(a, [2,3,1])
3683
Tim Peters2484aae2002-07-11 06:56:07 +00003684def subtype_resurrection():
3685 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003686 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003687
3688 class C(object):
3689 container = []
3690
3691 def __del__(self):
3692 # resurrect the instance
3693 C.container.append(self)
3694
3695 c = C()
3696 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003697 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003698 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003699 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003700
3701 # If that didn't blow up, it's also interesting to see whether clearing
3702 # the last container slot works: that will attempt to delete c again,
3703 # which will cause c to get appended back to the container again "during"
3704 # the del.
3705 del C.container[-1]
3706 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003707 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003708
Tim Peters14cb1e12002-07-11 18:26:21 +00003709 # Make c mortal again, so that the test framework with -l doesn't report
3710 # it as a leak.
3711 del C.__del__
3712
Guido van Rossum2d702462002-08-06 21:28:28 +00003713def slottrash():
3714 # Deallocating deeply nested slotted trash caused stack overflows
3715 if verbose:
3716 print "Testing slot trash..."
3717 class trash(object):
3718 __slots__ = ['x']
3719 def __init__(self, x):
3720 self.x = x
3721 o = None
3722 for i in xrange(50000):
3723 o = trash(o)
3724 del o
3725
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003726def slotmultipleinheritance():
3727 # SF bug 575229, multiple inheritance w/ slots dumps core
3728 class A(object):
3729 __slots__=()
3730 class B(object):
3731 pass
3732 class C(A,B) :
3733 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003734 vereq(C.__basicsize__, B.__basicsize__)
3735 verify(hasattr(C, '__dict__'))
3736 verify(hasattr(C, '__weakref__'))
3737 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003738
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003739def testrmul():
3740 # SF patch 592646
3741 if verbose:
3742 print "Testing correct invocation of __rmul__..."
3743 class C(object):
3744 def __mul__(self, other):
3745 return "mul"
3746 def __rmul__(self, other):
3747 return "rmul"
3748 a = C()
3749 vereq(a*2, "mul")
3750 vereq(a*2.2, "mul")
3751 vereq(2*a, "rmul")
3752 vereq(2.2*a, "rmul")
3753
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003754def testipow():
3755 # [SF bug 620179]
3756 if verbose:
3757 print "Testing correct invocation of __ipow__..."
3758 class C(object):
3759 def __ipow__(self, other):
3760 pass
3761 a = C()
3762 a **= 2
3763
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003764def do_this_first():
3765 if verbose:
3766 print "Testing SF bug 551412 ..."
3767 # This dumps core when SF bug 551412 isn't fixed --
3768 # but only when test_descr.py is run separately.
3769 # (That can't be helped -- as soon as PyType_Ready()
3770 # is called for PyLong_Type, the bug is gone.)
3771 class UserLong(object):
3772 def __pow__(self, *args):
3773 pass
3774 try:
3775 pow(0L, UserLong(), 0L)
3776 except:
3777 pass
3778
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003779 if verbose:
3780 print "Testing SF bug 570483..."
3781 # Another segfault only when run early
3782 # (before PyType_Ready(tuple) is called)
3783 type.mro(tuple)
3784
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003785def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003786 if verbose:
3787 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003788 # stuff that should work:
3789 class C(object):
3790 pass
3791 class C2(object):
3792 def __getattribute__(self, attr):
3793 if attr == 'a':
3794 return 2
3795 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003796 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003797 def meth(self):
3798 return 1
3799 class D(C):
3800 pass
3801 class E(D):
3802 pass
3803 d = D()
3804 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003805 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003806 D.__bases__ = (C2,)
3807 vereq(d.meth(), 1)
3808 vereq(e.meth(), 1)
3809 vereq(d.a, 2)
3810 vereq(e.a, 2)
3811 vereq(C2.__subclasses__(), [D])
3812
3813 # stuff that shouldn't:
3814 class L(list):
3815 pass
3816
3817 try:
3818 L.__bases__ = (dict,)
3819 except TypeError:
3820 pass
3821 else:
3822 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3823
3824 try:
3825 list.__bases__ = (dict,)
3826 except TypeError:
3827 pass
3828 else:
3829 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3830
3831 try:
Michael W. Hudsonf3904422006-11-23 13:54:04 +00003832 D.__bases__ = (C2, list)
3833 except TypeError:
3834 pass
3835 else:
3836 assert 0, "best_base calculation found wanting"
3837
3838 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003839 del D.__bases__
3840 except TypeError:
3841 pass
3842 else:
3843 raise TestFailed, "shouldn't be able to delete .__bases__"
3844
3845 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003846 D.__bases__ = ()
3847 except TypeError, msg:
3848 if str(msg) == "a new-style class can't have only classic bases":
3849 raise TestFailed, "wrong error message for .__bases__ = ()"
3850 else:
3851 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3852
3853 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003854 D.__bases__ = (D,)
3855 except TypeError:
3856 pass
3857 else:
3858 # actually, we'll have crashed by here...
3859 raise TestFailed, "shouldn't be able to create inheritance cycles"
3860
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003861 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003862 D.__bases__ = (C, C)
3863 except TypeError:
3864 pass
3865 else:
3866 raise TestFailed, "didn't detect repeated base classes"
3867
3868 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003869 D.__bases__ = (E,)
3870 except TypeError:
3871 pass
3872 else:
3873 raise TestFailed, "shouldn't be able to create inheritance cycles"
3874
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003875 # let's throw a classic class into the mix:
3876 class Classic:
3877 def meth2(self):
3878 return 3
3879
3880 D.__bases__ = (C, Classic)
3881
3882 vereq(d.meth2(), 3)
3883 vereq(e.meth2(), 3)
3884 try:
3885 d.a
3886 except AttributeError:
3887 pass
3888 else:
3889 raise TestFailed, "attribute should have vanished"
3890
3891 try:
3892 D.__bases__ = (Classic,)
3893 except TypeError:
3894 pass
3895 else:
3896 raise TestFailed, "new-style class must have a new-style base"
3897
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003898def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003899 if verbose:
3900 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003901 class WorkOnce(type):
3902 def __new__(self, name, bases, ns):
3903 self.flag = 0
3904 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3905 def mro(self):
3906 if self.flag > 0:
3907 raise RuntimeError, "bozo"
3908 else:
3909 self.flag += 1
3910 return type.mro(self)
3911
3912 class WorkAlways(type):
3913 def mro(self):
3914 # this is here to make sure that .mro()s aren't called
3915 # with an exception set (which was possible at one point).
3916 # An error message will be printed in a debug build.
3917 # What's a good way to test for this?
3918 return type.mro(self)
3919
3920 class C(object):
3921 pass
3922
3923 class C2(object):
3924 pass
3925
3926 class D(C):
3927 pass
3928
3929 class E(D):
3930 pass
3931
3932 class F(D):
3933 __metaclass__ = WorkOnce
3934
3935 class G(D):
3936 __metaclass__ = WorkAlways
3937
3938 # Immediate subclasses have their mro's adjusted in alphabetical
3939 # order, so E's will get adjusted before adjusting F's fails. We
3940 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003941
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003942 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003943 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003944
3945 try:
3946 D.__bases__ = (C2,)
3947 except RuntimeError:
3948 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003949 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003950 else:
3951 raise TestFailed, "exception not propagated"
3952
3953def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003954 if verbose:
3955 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003956 class A(object):
3957 pass
3958
3959 class B(object):
3960 pass
3961
3962 class C(A, B):
3963 pass
3964
3965 class D(A, B):
3966 pass
3967
3968 class E(C, D):
3969 pass
3970
3971 try:
3972 C.__bases__ = (B, A)
3973 except TypeError:
3974 pass
3975 else:
3976 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003977
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003978def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003979 if verbose:
3980 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003981 class C(object):
3982 pass
3983
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003984 # C.__module__ could be 'test_descr' or '__main__'
3985 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003986
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003987 C.__name__ = 'D'
3988 vereq((C.__module__, C.__name__), (mod, 'D'))
3989
3990 C.__name__ = 'D.E'
3991 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003992
Guido van Rossum613f24f2003-01-06 23:00:59 +00003993def subclass_right_op():
3994 if verbose:
3995 print "Testing correct dispatch of subclass overloading __r<op>__..."
3996
3997 # This code tests various cases where right-dispatch of a subclass
3998 # should be preferred over left-dispatch of a base class.
3999
4000 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4001
4002 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00004003 def __floordiv__(self, other):
4004 return "B.__floordiv__"
4005 def __rfloordiv__(self, other):
4006 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004007
Guido van Rossumf389c772003-02-27 20:04:19 +00004008 vereq(B(1) // 1, "B.__floordiv__")
4009 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004010
4011 # Case 2: subclass of object; this is just the baseline for case 3
4012
4013 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00004014 def __floordiv__(self, other):
4015 return "C.__floordiv__"
4016 def __rfloordiv__(self, other):
4017 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004018
Guido van Rossumf389c772003-02-27 20:04:19 +00004019 vereq(C() // 1, "C.__floordiv__")
4020 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004021
4022 # Case 3: subclass of new-style class; here it gets interesting
4023
4024 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00004025 def __floordiv__(self, other):
4026 return "D.__floordiv__"
4027 def __rfloordiv__(self, other):
4028 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004029
Guido van Rossumf389c772003-02-27 20:04:19 +00004030 vereq(D() // C(), "D.__floordiv__")
4031 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004032
4033 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4034
4035 class E(C):
4036 pass
4037
Guido van Rossumf389c772003-02-27 20:04:19 +00004038 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00004039
Guido van Rossumf389c772003-02-27 20:04:19 +00004040 vereq(E() // 1, "C.__floordiv__")
4041 vereq(1 // E(), "C.__rfloordiv__")
4042 vereq(E() // C(), "C.__floordiv__")
4043 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00004044
Guido van Rossum373c7412003-01-07 13:41:37 +00004045def dict_type_with_metaclass():
4046 if verbose:
4047 print "Testing type of __dict__ when __metaclass__ set..."
4048
4049 class B(object):
4050 pass
4051 class M(type):
4052 pass
4053 class C:
4054 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4055 __metaclass__ = M
4056 veris(type(C.__dict__), type(B.__dict__))
4057
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004058def meth_class_get():
4059 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004060 if verbose:
4061 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004062 # Baseline
4063 arg = [1, 2, 3]
4064 res = {1: None, 2: None, 3: None}
4065 vereq(dict.fromkeys(arg), res)
4066 vereq({}.fromkeys(arg), res)
4067 # Now get the descriptor
4068 descr = dict.__dict__["fromkeys"]
4069 # More baseline using the descriptor directly
4070 vereq(descr.__get__(None, dict)(arg), res)
4071 vereq(descr.__get__({})(arg), res)
4072 # Now check various error cases
4073 try:
4074 descr.__get__(None, None)
4075 except TypeError:
4076 pass
4077 else:
4078 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
4079 try:
4080 descr.__get__(42)
4081 except TypeError:
4082 pass
4083 else:
4084 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
4085 try:
4086 descr.__get__(None, 42)
4087 except TypeError:
4088 pass
4089 else:
4090 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
4091 try:
4092 descr.__get__(None, int)
4093 except TypeError:
4094 pass
4095 else:
4096 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
4097
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004098def isinst_isclass():
4099 if verbose:
4100 print "Testing proxy isinstance() and isclass()..."
4101 class Proxy(object):
4102 def __init__(self, obj):
4103 self.__obj = obj
4104 def __getattribute__(self, name):
4105 if name.startswith("_Proxy__"):
4106 return object.__getattribute__(self, name)
4107 else:
4108 return getattr(self.__obj, name)
4109 # Test with a classic class
4110 class C:
4111 pass
4112 a = C()
4113 pa = Proxy(a)
4114 verify(isinstance(a, C)) # Baseline
4115 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004116 # Test with a classic subclass
4117 class D(C):
4118 pass
4119 a = D()
4120 pa = Proxy(a)
4121 verify(isinstance(a, C)) # Baseline
4122 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004123 # Test with a new-style class
4124 class C(object):
4125 pass
4126 a = C()
4127 pa = Proxy(a)
4128 verify(isinstance(a, C)) # Baseline
4129 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004130 # Test with a new-style subclass
4131 class D(C):
4132 pass
4133 a = D()
4134 pa = Proxy(a)
4135 verify(isinstance(a, C)) # Baseline
4136 verify(isinstance(pa, C)) # Test
4137
4138def proxysuper():
4139 if verbose:
4140 print "Testing super() for a proxy object..."
4141 class Proxy(object):
4142 def __init__(self, obj):
4143 self.__obj = obj
4144 def __getattribute__(self, name):
4145 if name.startswith("_Proxy__"):
4146 return object.__getattribute__(self, name)
4147 else:
4148 return getattr(self.__obj, name)
4149
4150 class B(object):
4151 def f(self):
4152 return "B.f"
4153
4154 class C(B):
4155 def f(self):
4156 return super(C, self).f() + "->C.f"
4157
4158 obj = C()
4159 p = Proxy(obj)
4160 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004161
Guido van Rossum52b27052003-04-15 20:05:10 +00004162def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004163 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00004164 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004165 try:
4166 object.__setattr__(str, "foo", 42)
4167 except TypeError:
4168 pass
4169 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004170 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004171 try:
4172 object.__delattr__(str, "lower")
4173 except TypeError:
4174 pass
4175 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004176 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004177
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004178def weakref_segfault():
4179 # SF 742911
4180 if verbose:
4181 print "Testing weakref segfault..."
4182
4183 import weakref
4184
4185 class Provoker:
4186 def __init__(self, referrent):
4187 self.ref = weakref.ref(referrent)
4188
4189 def __del__(self):
4190 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004191
4192 class Oops(object):
4193 pass
4194
4195 o = Oops()
4196 o.whatever = Provoker(o)
4197 del o
4198
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004199def wrapper_segfault():
4200 # SF 927248: deeply nested wrappers could cause stack overflow
4201 f = lambda:None
4202 for i in xrange(1000000):
4203 f = f.__call__
4204 f = None
4205
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004206# Fix SF #762455, segfault when sys.stdout is changed in getattr
4207def filefault():
4208 if verbose:
4209 print "Testing sys.stdout is changed in getattr..."
4210 import sys
4211 class StdoutGuard:
4212 def __getattr__(self, attr):
4213 sys.stdout = sys.__stdout__
4214 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4215 sys.stdout = StdoutGuard()
4216 try:
4217 print "Oops!"
4218 except RuntimeError:
4219 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004220
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004221def vicious_descriptor_nonsense():
4222 # A potential segfault spotted by Thomas Wouters in mail to
4223 # python-dev 2003-04-17, turned into an example & fixed by Michael
4224 # Hudson just less than four months later...
4225 if verbose:
4226 print "Testing vicious_descriptor_nonsense..."
4227
4228 class Evil(object):
4229 def __hash__(self):
4230 return hash('attr')
4231 def __eq__(self, other):
4232 del C.attr
4233 return 0
4234
4235 class Descr(object):
4236 def __get__(self, ob, type=None):
4237 return 1
4238
4239 class C(object):
4240 attr = Descr()
4241
4242 c = C()
4243 c.__dict__[Evil()] = 0
4244
4245 vereq(c.attr, 1)
4246 # this makes a crash more likely:
4247 import gc; gc.collect()
4248 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004249
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004250def test_init():
4251 # SF 1155938
4252 class Foo(object):
4253 def __init__(self):
4254 return 10
4255 try:
4256 Foo()
4257 except TypeError:
4258 pass
4259 else:
4260 raise TestFailed, "did not test __init__() for None return"
4261
Armin Rigoc6686b72005-11-07 08:38:00 +00004262def methodwrapper():
4263 # <type 'method-wrapper'> did not support any reflection before 2.5
4264 if verbose:
4265 print "Testing method-wrapper objects..."
4266
4267 l = []
4268 vereq(l.__add__, l.__add__)
Armin Rigofd01d792006-06-08 10:56:24 +00004269 vereq(l.__add__, [].__add__)
4270 verify(l.__add__ != [5].__add__)
4271 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004272 verify(l.__add__.__name__ == '__add__')
4273 verify(l.__add__.__self__ is l)
4274 verify(l.__add__.__objclass__ is list)
4275 vereq(l.__add__.__doc__, list.__add__.__doc__)
Armin Rigofd01d792006-06-08 10:56:24 +00004276 try:
4277 hash(l.__add__)
4278 except TypeError:
4279 pass
4280 else:
4281 raise TestFailed("no TypeError from hash([].__add__)")
4282
4283 t = ()
4284 t += (7,)
4285 vereq(t.__add__, (7,).__add__)
4286 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004287
Armin Rigofd163f92005-12-29 15:59:19 +00004288def notimplemented():
4289 # all binary methods should be able to return a NotImplemented
4290 if verbose:
4291 print "Testing NotImplemented..."
4292
4293 import sys
4294 import types
4295 import operator
4296
4297 def specialmethod(self, other):
4298 return NotImplemented
4299
4300 def check(expr, x, y):
4301 try:
4302 exec expr in {'x': x, 'y': y, 'operator': operator}
4303 except TypeError:
4304 pass
4305 else:
4306 raise TestFailed("no TypeError from %r" % (expr,))
4307
4308 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
4309 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4310 # ValueErrors instead of TypeErrors
4311 for metaclass in [type, types.ClassType]:
4312 for name, expr, iexpr in [
4313 ('__add__', 'x + y', 'x += y'),
4314 ('__sub__', 'x - y', 'x -= y'),
4315 ('__mul__', 'x * y', 'x *= y'),
4316 ('__truediv__', 'operator.truediv(x, y)', None),
4317 ('__floordiv__', 'operator.floordiv(x, y)', None),
4318 ('__div__', 'x / y', 'x /= y'),
4319 ('__mod__', 'x % y', 'x %= y'),
4320 ('__divmod__', 'divmod(x, y)', None),
4321 ('__pow__', 'x ** y', 'x **= y'),
4322 ('__lshift__', 'x << y', 'x <<= y'),
4323 ('__rshift__', 'x >> y', 'x >>= y'),
4324 ('__and__', 'x & y', 'x &= y'),
4325 ('__or__', 'x | y', 'x |= y'),
4326 ('__xor__', 'x ^ y', 'x ^= y'),
4327 ('__coerce__', 'coerce(x, y)', None)]:
4328 if name == '__coerce__':
4329 rname = name
4330 else:
4331 rname = '__r' + name[2:]
4332 A = metaclass('A', (), {name: specialmethod})
4333 B = metaclass('B', (), {rname: specialmethod})
4334 a = A()
4335 b = B()
4336 check(expr, a, a)
4337 check(expr, a, b)
4338 check(expr, b, a)
4339 check(expr, b, b)
4340 check(expr, a, N1)
4341 check(expr, a, N2)
4342 check(expr, N1, b)
4343 check(expr, N2, b)
4344 if iexpr:
4345 check(iexpr, a, a)
4346 check(iexpr, a, b)
4347 check(iexpr, b, a)
4348 check(iexpr, b, b)
4349 check(iexpr, a, N1)
4350 check(iexpr, a, N2)
4351 iname = '__i' + name[2:]
4352 C = metaclass('C', (), {iname: specialmethod})
4353 c = C()
4354 check(iexpr, c, a)
4355 check(iexpr, c, b)
4356 check(iexpr, c, N1)
4357 check(iexpr, c, N2)
4358
Georg Brandl0fca97a2007-03-05 22:28:08 +00004359def test_assign_slice():
4360 # ceval.c's assign_slice used to check for
4361 # tp->tp_as_sequence->sq_slice instead of
4362 # tp->tp_as_sequence->sq_ass_slice
4363
4364 class C(object):
4365 def __setslice__(self, start, stop, value):
4366 self.value = value
4367
4368 c = C()
4369 c[1:2] = 3
4370 vereq(c.value, 3)
4371
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004372def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004373 weakref_segfault() # Must be first, somehow
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004374 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004375 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004376 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004377 lists()
4378 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004379 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004380 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004381 ints()
4382 longs()
4383 floats()
4384 complexes()
4385 spamlists()
4386 spamdicts()
4387 pydicts()
4388 pylists()
4389 metaclass()
4390 pymods()
4391 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004392 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004393 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004394 ex5()
4395 monotonicity()
4396 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004397 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004398 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004399 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004400 dynamics()
Armin Rigoc0ba52d2007-04-19 14:44:48 +00004401 errors()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004402 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004403 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004404 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004405 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004406 classic()
4407 compattr()
4408 newslot()
4409 altmro()
4410 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004411 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004412 specials()
Brett Cannon1e534b52007-09-07 04:18:30 +00004413 recursions()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004414 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004415 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004416 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004417 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004418 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004419 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004420 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004421 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004422 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004423 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004424 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004425 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004426 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004427 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004428 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004429 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004430 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004431 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004432 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004433 kwdargs()
Brett Cannon22565aa2006-06-09 22:31:23 +00004434 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004435 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004436 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004437 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004438 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004439 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004440 dictproxyiterkeys()
4441 dictproxyitervalues()
4442 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004443 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004444 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004445 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004446 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004447 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004448 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004449 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004450 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004451 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004452 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004453 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004454 test_mutable_bases()
4455 test_mutable_bases_with_failing_mro()
4456 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004457 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004458 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004459 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004460 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004461 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004462 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004463 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004464 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004465 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004466 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004467 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004468 notimplemented()
Georg Brandl0fca97a2007-03-05 22:28:08 +00004469 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004470
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004471 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004472
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004473if __name__ == "__main__":
4474 test_main()