blob: 0c06d9a99cdc782ff3c9bb435c4bed7dee6423db [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 Rossumd1ef7892007-11-10 22:12:24 +00002134def properties_plus():
2135 class C:
2136 foo = property(doc="hello")
2137 @foo.getter
2138 def foo(self):
2139 return self._foo
2140 @foo.setter
2141 def foo(self, value):
2142 self._foo = abs(value)
2143 @foo.deleter
2144 def foo(self):
2145 del self._foo
2146 c = C()
2147 assert C.foo.__doc__ == "hello"
2148 assert not hasattr(c, "foo")
2149 c.foo = -42
2150 assert c.foo == 42
2151 del c.foo
2152 assert not hasattr(c, "foo")
2153
2154 class D(C):
2155 @C.foo.deleter
2156 def foo(self):
2157 try:
2158 del self._foo
2159 except AttributeError:
2160 pass
2161 d = D()
2162 d.foo = 24
2163 assert d.foo == 24
2164 del d.foo
2165 del d.foo
2166
2167 class E:
2168 @property
2169 def foo(self):
2170 return self._foo
2171 @foo.setter
2172 def foo (self, value):
2173 raise RuntimeError
2174 @foo.setter
2175 @foo.deleter
2176 def foo(self, value=None):
2177 if value is None:
2178 del self._foo
2179 else:
2180 self._foo = abs(value)
2181 e = E()
2182 e.foo = -42
2183 assert e.foo == 42
2184 del e.foo
2185
2186 class F(E):
2187 @E.foo.deleter
2188 def foo(self):
2189 del self._foo
2190 @foo.setter
2191 def foo(self, value):
2192 self._foo = max(0, value)
2193 f = F()
2194 f.foo = -10
2195 assert f.foo == 0
2196 del f.foo
2197
2198
Guido van Rossumc4a18802001-08-24 16:55:27 +00002199def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00002200 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00002201
2202 class A(object):
2203 def meth(self, a):
2204 return "A(%r)" % a
2205
Guido van Rossum45704552001-10-08 16:35:45 +00002206 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002207
2208 class B(A):
2209 def __init__(self):
2210 self.__super = super(B, self)
2211 def meth(self, a):
2212 return "B(%r)" % a + self.__super.meth(a)
2213
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002215
2216 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002217 def meth(self, a):
2218 return "C(%r)" % a + self.__super.meth(a)
2219 C._C__super = super(C)
2220
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002222
2223 class D(C, B):
2224 def meth(self, a):
2225 return "D(%r)" % a + super(D, self).meth(a)
2226
Guido van Rossum5b443c62001-12-03 15:38:28 +00002227 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2228
2229 # Test for subclassing super
2230
2231 class mysuper(super):
2232 def __init__(self, *args):
2233 return super(mysuper, self).__init__(*args)
2234
2235 class E(D):
2236 def meth(self, a):
2237 return "E(%r)" % a + mysuper(E, self).meth(a)
2238
2239 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2240
2241 class F(E):
2242 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002243 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002244 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2245 F._F__super = mysuper(F)
2246
2247 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2248
2249 # Make sure certain errors are raised
2250
2251 try:
2252 super(D, 42)
2253 except TypeError:
2254 pass
2255 else:
2256 raise TestFailed, "shouldn't allow super(D, 42)"
2257
2258 try:
2259 super(D, C())
2260 except TypeError:
2261 pass
2262 else:
2263 raise TestFailed, "shouldn't allow super(D, C())"
2264
2265 try:
2266 super(D).__get__(12)
2267 except TypeError:
2268 pass
2269 else:
2270 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2271
2272 try:
2273 super(D).__get__(C())
2274 except TypeError:
2275 pass
2276 else:
2277 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002278
Guido van Rossuma4541a32003-04-16 20:02:22 +00002279 # Make sure data descriptors can be overridden and accessed via super
2280 # (new feature in Python 2.3)
2281
2282 class DDbase(object):
2283 def getx(self): return 42
2284 x = property(getx)
2285
2286 class DDsub(DDbase):
2287 def getx(self): return "hello"
2288 x = property(getx)
2289
2290 dd = DDsub()
2291 vereq(dd.x, "hello")
2292 vereq(super(DDsub, dd).x, 42)
2293
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002294 # Ensure that super() lookup of descriptor from classmethod
2295 # works (SF ID# 743627)
2296
2297 class Base(object):
2298 aProp = property(lambda self: "foo")
2299
2300 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002301 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002302 def test(klass):
2303 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002304
2305 veris(Sub.test(), Base.aProp)
2306
Georg Brandl5d59c092006-09-30 08:43:30 +00002307 # Verify that super() doesn't allow keyword args
2308 try:
2309 super(Base, kw=1)
2310 except TypeError:
2311 pass
2312 else:
2313 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002314
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002315def inherits():
2316 if verbose: print "Testing inheritance from basic types..."
2317
2318 class hexint(int):
2319 def __repr__(self):
2320 return hex(self)
2321 def __add__(self, other):
2322 return hexint(int.__add__(self, other))
2323 # (Note that overriding __radd__ doesn't work,
2324 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(repr(hexint(7) + 9), "0x10")
2326 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002327 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002328 vereq(a, 12345)
2329 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002330 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002331 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002332 verify((+a).__class__ is int)
2333 verify((a >> 0).__class__ is int)
2334 verify((a << 0).__class__ is int)
2335 verify((hexint(0) << 12).__class__ is int)
2336 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002337
2338 class octlong(long):
2339 __slots__ = []
2340 def __str__(self):
2341 s = oct(self)
2342 if s[-1] == 'L':
2343 s = s[:-1]
2344 return s
2345 def __add__(self, other):
2346 return self.__class__(super(octlong, self).__add__(other))
2347 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002349 # (Note that overriding __radd__ here only seems to work
2350 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002351 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002352 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002353 vereq(a, 12345L)
2354 vereq(long(a), 12345L)
2355 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002356 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002357 verify((+a).__class__ is long)
2358 verify((-a).__class__ is long)
2359 verify((-octlong(0)).__class__ is long)
2360 verify((a >> 0).__class__ is long)
2361 verify((a << 0).__class__ is long)
2362 verify((a - 0).__class__ is long)
2363 verify((a * 1).__class__ is long)
2364 verify((a ** 1).__class__ is long)
2365 verify((a // 1).__class__ is long)
2366 verify((1 * a).__class__ is long)
2367 verify((a | 0).__class__ is long)
2368 verify((a ^ 0).__class__ is long)
2369 verify((a & -1L).__class__ is long)
2370 verify((octlong(0) << 12).__class__ is long)
2371 verify((octlong(0) >> 12).__class__ is long)
2372 verify(abs(octlong(0)).__class__ is long)
2373
2374 # Because octlong overrides __add__, we can't check the absence of +0
2375 # optimizations using octlong.
2376 class longclone(long):
2377 pass
2378 a = longclone(1)
2379 verify((a + 0).__class__ is long)
2380 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002381
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002382 # Check that negative clones don't segfault
2383 a = longclone(-1)
2384 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002385 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002386
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002387 class precfloat(float):
2388 __slots__ = ['prec']
2389 def __init__(self, value=0.0, prec=12):
2390 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002391 def __repr__(self):
2392 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002393 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002394 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002395 vereq(a, 12345.0)
2396 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002397 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002398 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002399 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002400
Tim Peters2400fa42001-09-12 19:12:49 +00002401 class madcomplex(complex):
2402 def __repr__(self):
2403 return "%.17gj%+.17g" % (self.imag, self.real)
2404 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002405 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002406 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002407 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002408 vereq(a, base)
2409 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002410 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002411 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002412 vereq(repr(a), "4j-3")
2413 vereq(a, base)
2414 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002415 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002416 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002417 veris((+a).__class__, complex)
2418 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002419 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002420 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002421 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002422 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002423 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002424 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002425 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002426
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002427 class madtuple(tuple):
2428 _rev = None
2429 def rev(self):
2430 if self._rev is not None:
2431 return self._rev
2432 L = list(self)
2433 L.reverse()
2434 self._rev = self.__class__(L)
2435 return self._rev
2436 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002437 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2438 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2439 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002440 for i in range(512):
2441 t = madtuple(range(i))
2442 u = t.rev()
2443 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002444 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002445 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002446 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002447 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002448 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002449 verify(a[:].__class__ is tuple)
2450 verify((a * 1).__class__ is tuple)
2451 verify((a * 0).__class__ is tuple)
2452 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002453 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002454 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002455 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002456 verify((a + a).__class__ is tuple)
2457 verify((a * 0).__class__ is tuple)
2458 verify((a * 1).__class__ is tuple)
2459 verify((a * 2).__class__ is tuple)
2460 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002461
2462 class madstring(str):
2463 _rev = None
2464 def rev(self):
2465 if self._rev is not None:
2466 return self._rev
2467 L = list(self)
2468 L.reverse()
2469 self._rev = self.__class__("".join(L))
2470 return self._rev
2471 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002472 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2473 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2474 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002475 for i in range(256):
2476 s = madstring("".join(map(chr, range(i))))
2477 t = s.rev()
2478 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002479 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002480 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002481 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002482 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002483
Tim Peters8fa5dd02001-09-12 02:18:30 +00002484 base = "\x00" * 5
2485 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002486 vereq(s, base)
2487 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002488 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002489 vereq(hash(s), hash(base))
2490 vereq({s: 1}[base], 1)
2491 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002492 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002493 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002494 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002495 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002496 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002497 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002498 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002499 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002500 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002501 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002502 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002503 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002504 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002505 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002506 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002507 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002508 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002509 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002510 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002511 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002512 identitytab = ''.join([chr(i) for i in range(256)])
2513 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002514 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002515 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002516 vereq(s.translate(identitytab, "x"), base)
2517 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002518 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002519 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002520 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002521 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002522 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002523 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002524 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002525 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002526 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002527 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002528
Guido van Rossum91ee7982001-08-30 20:52:40 +00002529 class madunicode(unicode):
2530 _rev = None
2531 def rev(self):
2532 if self._rev is not None:
2533 return self._rev
2534 L = list(self)
2535 L.reverse()
2536 self._rev = self.__class__(u"".join(L))
2537 return self._rev
2538 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002539 vereq(u, u"ABCDEF")
2540 vereq(u.rev(), madunicode(u"FEDCBA"))
2541 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002542 base = u"12345"
2543 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002544 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002545 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002546 vereq(hash(u), hash(base))
2547 vereq({u: 1}[base], 1)
2548 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002549 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002550 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002551 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002552 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002553 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002554 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002555 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002556 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002557 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002558 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002559 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002560 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002561 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002562 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002563 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002564 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002565 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002566 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002567 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002568 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002569 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002570 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002571 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002572 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002573 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002574 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002575 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002576 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002577 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002578 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002579 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002580 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002581 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002582 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002583 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002584 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002585 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002586 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002587
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002588 class sublist(list):
2589 pass
2590 a = sublist(range(5))
2591 vereq(a, range(5))
2592 a.append("hello")
2593 vereq(a, range(5) + ["hello"])
2594 a[5] = 5
2595 vereq(a, range(6))
2596 a.extend(range(6, 20))
2597 vereq(a, range(20))
2598 a[-5:] = []
2599 vereq(a, range(15))
2600 del a[10:15]
2601 vereq(len(a), 10)
2602 vereq(a, range(10))
2603 vereq(list(a), range(10))
2604 vereq(a[0], 0)
2605 vereq(a[9], 9)
2606 vereq(a[-10], 0)
2607 vereq(a[-1], 9)
2608 vereq(a[:5], range(5))
2609
Tim Peters59c9a642001-09-13 05:38:56 +00002610 class CountedInput(file):
2611 """Counts lines read by self.readline().
2612
2613 self.lineno is the 0-based ordinal of the last line read, up to
2614 a maximum of one greater than the number of lines in the file.
2615
2616 self.ateof is true if and only if the final "" line has been read,
2617 at which point self.lineno stops incrementing, and further calls
2618 to readline() continue to return "".
2619 """
2620
2621 lineno = 0
2622 ateof = 0
2623 def readline(self):
2624 if self.ateof:
2625 return ""
2626 s = file.readline(self)
2627 # Next line works too.
2628 # s = super(CountedInput, self).readline()
2629 self.lineno += 1
2630 if s == "":
2631 self.ateof = 1
2632 return s
2633
Tim Peters561f8992001-09-13 19:36:36 +00002634 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002635 lines = ['a\n', 'b\n', 'c\n']
2636 try:
2637 f.writelines(lines)
2638 f.close()
2639 f = CountedInput(TESTFN)
2640 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2641 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002642 vereq(expected, got)
2643 vereq(f.lineno, i)
2644 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002645 f.close()
2646 finally:
2647 try:
2648 f.close()
2649 except:
2650 pass
2651 try:
2652 import os
2653 os.unlink(TESTFN)
2654 except:
2655 pass
2656
Tim Peters808b94e2001-09-13 19:33:07 +00002657def keywords():
2658 if verbose:
2659 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002660 vereq(int(x=1), 1)
2661 vereq(float(x=2), 2.0)
2662 vereq(long(x=3), 3L)
2663 vereq(complex(imag=42, real=666), complex(666, 42))
2664 vereq(str(object=500), '500')
2665 vereq(unicode(string='abc', errors='strict'), u'abc')
2666 vereq(tuple(sequence=range(3)), (0, 1, 2))
2667 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002668 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002669
2670 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002671 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002672 try:
2673 constructor(bogus_keyword_arg=1)
2674 except TypeError:
2675 pass
2676 else:
2677 raise TestFailed("expected TypeError from bogus keyword "
2678 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002679
Tim Peters8fa45672001-09-13 21:01:29 +00002680def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002681 # XXX This test is disabled because rexec is not deemed safe
2682 return
Tim Peters8fa45672001-09-13 21:01:29 +00002683 import rexec
2684 if verbose:
2685 print "Testing interaction with restricted execution ..."
2686
2687 sandbox = rexec.RExec()
2688
2689 code1 = """f = open(%r, 'w')""" % TESTFN
2690 code2 = """f = file(%r, 'w')""" % TESTFN
2691 code3 = """\
2692f = open(%r)
2693t = type(f) # a sneaky way to get the file() constructor
2694f.close()
2695f = t(%r, 'w') # rexec can't catch this by itself
2696""" % (TESTFN, TESTFN)
2697
2698 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2699 f.close()
2700
2701 try:
2702 for code in code1, code2, code3:
2703 try:
2704 sandbox.r_exec(code)
2705 except IOError, msg:
2706 if str(msg).find("restricted") >= 0:
2707 outcome = "OK"
2708 else:
2709 outcome = "got an exception, but not an expected one"
2710 else:
2711 outcome = "expected a restricted-execution exception"
2712
2713 if outcome != "OK":
2714 raise TestFailed("%s, in %r" % (outcome, code))
2715
2716 finally:
2717 try:
2718 import os
2719 os.unlink(TESTFN)
2720 except:
2721 pass
2722
Tim Peters0ab085c2001-09-14 00:25:33 +00002723def str_subclass_as_dict_key():
2724 if verbose:
2725 print "Testing a str subclass used as dict key .."
2726
2727 class cistr(str):
2728 """Sublcass of str that computes __eq__ case-insensitively.
2729
2730 Also computes a hash code of the string in canonical form.
2731 """
2732
2733 def __init__(self, value):
2734 self.canonical = value.lower()
2735 self.hashcode = hash(self.canonical)
2736
2737 def __eq__(self, other):
2738 if not isinstance(other, cistr):
2739 other = cistr(other)
2740 return self.canonical == other.canonical
2741
2742 def __hash__(self):
2743 return self.hashcode
2744
Guido van Rossum45704552001-10-08 16:35:45 +00002745 vereq(cistr('ABC'), 'abc')
2746 vereq('aBc', cistr('ABC'))
2747 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002748
2749 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002750 vereq(d[cistr('one')], 1)
2751 vereq(d[cistr('tWo')], 2)
2752 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002753 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002754 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002755
Guido van Rossumab3b0342001-09-18 20:38:53 +00002756def classic_comparisons():
2757 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002758 class classic:
2759 pass
2760 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002761 if verbose: print " (base = %s)" % base
2762 class C(base):
2763 def __init__(self, value):
2764 self.value = int(value)
2765 def __cmp__(self, other):
2766 if isinstance(other, C):
2767 return cmp(self.value, other.value)
2768 if isinstance(other, int) or isinstance(other, long):
2769 return cmp(self.value, other)
2770 return NotImplemented
2771 c1 = C(1)
2772 c2 = C(2)
2773 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002774 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002775 c = {1: c1, 2: c2, 3: c3}
2776 for x in 1, 2, 3:
2777 for y in 1, 2, 3:
2778 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2779 for op in "<", "<=", "==", "!=", ">", ">=":
2780 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2781 "x=%d, y=%d" % (x, y))
2782 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2783 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2784
Guido van Rossum0639f592001-09-18 21:06:04 +00002785def rich_comparisons():
2786 if verbose:
2787 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002788 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002789 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002790 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002791 vereq(z, 1+0j)
2792 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002793 class ZZ(complex):
2794 def __eq__(self, other):
2795 try:
2796 return abs(self - other) <= 1e-6
2797 except:
2798 return NotImplemented
2799 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002800 vereq(zz, 1+0j)
2801 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002802
Guido van Rossum0639f592001-09-18 21:06:04 +00002803 class classic:
2804 pass
2805 for base in (classic, int, object, list):
2806 if verbose: print " (base = %s)" % base
2807 class C(base):
2808 def __init__(self, value):
2809 self.value = int(value)
2810 def __cmp__(self, other):
2811 raise TestFailed, "shouldn't call __cmp__"
2812 def __eq__(self, other):
2813 if isinstance(other, C):
2814 return self.value == other.value
2815 if isinstance(other, int) or isinstance(other, long):
2816 return self.value == other
2817 return NotImplemented
2818 def __ne__(self, other):
2819 if isinstance(other, C):
2820 return self.value != other.value
2821 if isinstance(other, int) or isinstance(other, long):
2822 return self.value != other
2823 return NotImplemented
2824 def __lt__(self, other):
2825 if isinstance(other, C):
2826 return self.value < other.value
2827 if isinstance(other, int) or isinstance(other, long):
2828 return self.value < other
2829 return NotImplemented
2830 def __le__(self, other):
2831 if isinstance(other, C):
2832 return self.value <= other.value
2833 if isinstance(other, int) or isinstance(other, long):
2834 return self.value <= other
2835 return NotImplemented
2836 def __gt__(self, other):
2837 if isinstance(other, C):
2838 return self.value > other.value
2839 if isinstance(other, int) or isinstance(other, long):
2840 return self.value > other
2841 return NotImplemented
2842 def __ge__(self, other):
2843 if isinstance(other, C):
2844 return self.value >= other.value
2845 if isinstance(other, int) or isinstance(other, long):
2846 return self.value >= other
2847 return NotImplemented
2848 c1 = C(1)
2849 c2 = C(2)
2850 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002851 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002852 c = {1: c1, 2: c2, 3: c3}
2853 for x in 1, 2, 3:
2854 for y in 1, 2, 3:
2855 for op in "<", "<=", "==", "!=", ">", ">=":
2856 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2857 "x=%d, y=%d" % (x, y))
2858 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2859 "x=%d, y=%d" % (x, y))
2860 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2861 "x=%d, y=%d" % (x, y))
2862
Guido van Rossum1952e382001-09-19 01:25:16 +00002863def coercions():
2864 if verbose: print "Testing coercions..."
2865 class I(int): pass
2866 coerce(I(0), 0)
2867 coerce(0, I(0))
2868 class L(long): pass
2869 coerce(L(0), 0)
2870 coerce(L(0), 0L)
2871 coerce(0, L(0))
2872 coerce(0L, L(0))
2873 class F(float): pass
2874 coerce(F(0), 0)
2875 coerce(F(0), 0L)
2876 coerce(F(0), 0.)
2877 coerce(0, F(0))
2878 coerce(0L, F(0))
2879 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002880 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002881 coerce(C(0), 0)
2882 coerce(C(0), 0L)
2883 coerce(C(0), 0.)
2884 coerce(C(0), 0j)
2885 coerce(0, C(0))
2886 coerce(0L, C(0))
2887 coerce(0., C(0))
2888 coerce(0j, C(0))
2889
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002890def descrdoc():
2891 if verbose: print "Testing descriptor doc strings..."
2892 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002893 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002894 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002895 check(file.name, "file name") # member descriptor
2896
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002897def setclass():
2898 if verbose: print "Testing __class__ assignment..."
2899 class C(object): pass
2900 class D(object): pass
2901 class E(object): pass
2902 class F(D, E): pass
2903 for cls in C, D, E, F:
2904 for cls2 in C, D, E, F:
2905 x = cls()
2906 x.__class__ = cls2
2907 verify(x.__class__ is cls2)
2908 x.__class__ = cls
2909 verify(x.__class__ is cls)
2910 def cant(x, C):
2911 try:
2912 x.__class__ = C
2913 except TypeError:
2914 pass
2915 else:
2916 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002917 try:
2918 delattr(x, "__class__")
2919 except TypeError:
2920 pass
2921 else:
2922 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002923 cant(C(), list)
2924 cant(list(), C)
2925 cant(C(), 1)
2926 cant(C(), object)
2927 cant(object(), list)
2928 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002929 class Int(int): __slots__ = []
2930 cant(2, Int)
2931 cant(Int(), int)
2932 cant(True, int)
2933 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002934 o = object()
2935 cant(o, type(1))
2936 cant(o, type(None))
2937 del o
Žiga Seilnacht6f2d09c2007-03-16 11:59:38 +00002938 class G(object):
2939 __slots__ = ["a", "b"]
2940 class H(object):
2941 __slots__ = ["b", "a"]
2942 try:
2943 unicode
2944 except NameError:
2945 class I(object):
2946 __slots__ = ["a", "b"]
2947 else:
2948 class I(object):
2949 __slots__ = [unicode("a"), unicode("b")]
2950 class J(object):
2951 __slots__ = ["c", "b"]
2952 class K(object):
2953 __slots__ = ["a", "b", "d"]
2954 class L(H):
2955 __slots__ = ["e"]
2956 class M(I):
2957 __slots__ = ["e"]
2958 class N(J):
2959 __slots__ = ["__weakref__"]
2960 class P(J):
2961 __slots__ = ["__dict__"]
2962 class Q(J):
2963 pass
2964 class R(J):
2965 __slots__ = ["__dict__", "__weakref__"]
2966
2967 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2968 x = cls()
2969 x.a = 1
2970 x.__class__ = cls2
2971 verify(x.__class__ is cls2,
2972 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2973 vereq(x.a, 1)
2974 x.__class__ = cls
2975 verify(x.__class__ is cls,
2976 "assigning %r as __class__ for %r silently failed" % (cls, x))
2977 vereq(x.a, 1)
2978 for cls in G, J, K, L, M, N, P, R, list, Int:
2979 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2980 if cls is cls2:
2981 continue
2982 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002983
Guido van Rossum6661be32001-10-26 04:26:12 +00002984def setdict():
2985 if verbose: print "Testing __dict__ assignment..."
2986 class C(object): pass
2987 a = C()
2988 a.__dict__ = {'b': 1}
2989 vereq(a.b, 1)
2990 def cant(x, dict):
2991 try:
2992 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002993 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002994 pass
2995 else:
2996 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2997 cant(a, None)
2998 cant(a, [])
2999 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00003000 del a.__dict__ # Deleting __dict__ is allowed
Armin Rigo9790a272007-05-02 19:23:31 +00003001
3002 class Base(object):
3003 pass
3004 def verify_dict_readonly(x):
3005 """
3006 x has to be an instance of a class inheriting from Base.
3007 """
3008 cant(x, {})
3009 try:
3010 del x.__dict__
3011 except (AttributeError, TypeError):
3012 pass
3013 else:
3014 raise TestFailed, "shouldn't allow del %r.__dict__" % x
3015 dict_descr = Base.__dict__["__dict__"]
3016 try:
3017 dict_descr.__set__(x, {})
3018 except (AttributeError, TypeError):
3019 pass
3020 else:
3021 raise TestFailed, "dict_descr allowed access to %r's dict" % x
3022
3023 # Classes don't allow __dict__ assignment and have readonly dicts
3024 class Meta1(type, Base):
3025 pass
3026 class Meta2(Base, type):
3027 pass
3028 class D(object):
3029 __metaclass__ = Meta1
3030 class E(object):
3031 __metaclass__ = Meta2
3032 for cls in C, D, E:
3033 verify_dict_readonly(cls)
3034 class_dict = cls.__dict__
3035 try:
3036 class_dict["spam"] = "eggs"
3037 except TypeError:
3038 pass
3039 else:
3040 raise TestFailed, "%r's __dict__ can be modified" % cls
3041
3042 # Modules also disallow __dict__ assignment
3043 class Module1(types.ModuleType, Base):
3044 pass
3045 class Module2(Base, types.ModuleType):
3046 pass
3047 for ModuleType in Module1, Module2:
3048 mod = ModuleType("spam")
3049 verify_dict_readonly(mod)
3050 mod.__dict__["spam"] = "eggs"
3051
3052 # Exception's __dict__ can be replaced, but not deleted
3053 class Exception1(Exception, Base):
3054 pass
3055 class Exception2(Base, Exception):
3056 pass
3057 for ExceptionType in Exception, Exception1, Exception2:
3058 e = ExceptionType()
3059 e.__dict__ = {"a": 1}
3060 vereq(e.a, 1)
3061 try:
3062 del e.__dict__
3063 except (TypeError, AttributeError):
3064 pass
3065 else:
3066 raise TestFaied, "%r's __dict__ can be deleted" % e
3067
Guido van Rossum6661be32001-10-26 04:26:12 +00003068
Guido van Rossum3926a632001-09-25 16:25:58 +00003069def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003070 if verbose:
3071 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00003072 import pickle, cPickle
3073
3074 def sorteditems(d):
3075 L = d.items()
3076 L.sort()
3077 return L
3078
3079 global C
3080 class C(object):
3081 def __init__(self, a, b):
3082 super(C, self).__init__()
3083 self.a = a
3084 self.b = b
3085 def __repr__(self):
3086 return "C(%r, %r)" % (self.a, self.b)
3087
3088 global C1
3089 class C1(list):
3090 def __new__(cls, a, b):
3091 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00003092 def __getnewargs__(self):
3093 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00003094 def __init__(self, a, b):
3095 self.a = a
3096 self.b = b
3097 def __repr__(self):
3098 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
3099
3100 global C2
3101 class C2(int):
3102 def __new__(cls, a, b, val=0):
3103 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00003104 def __getnewargs__(self):
3105 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00003106 def __init__(self, a, b, val=0):
3107 self.a = a
3108 self.b = b
3109 def __repr__(self):
3110 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
3111
Guido van Rossum90c45142001-11-24 21:07:01 +00003112 global C3
3113 class C3(object):
3114 def __init__(self, foo):
3115 self.foo = foo
3116 def __getstate__(self):
3117 return self.foo
3118 def __setstate__(self, foo):
3119 self.foo = foo
3120
3121 global C4classic, C4
3122 class C4classic: # classic
3123 pass
3124 class C4(C4classic, object): # mixed inheritance
3125 pass
3126
Guido van Rossum3926a632001-09-25 16:25:58 +00003127 for p in pickle, cPickle:
3128 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003129 if verbose:
3130 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00003131
3132 for cls in C, C1, C2:
3133 s = p.dumps(cls, bin)
3134 cls2 = p.loads(s)
3135 verify(cls2 is cls)
3136
3137 a = C1(1, 2); a.append(42); a.append(24)
3138 b = C2("hello", "world", 42)
3139 s = p.dumps((a, b), bin)
3140 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00003141 vereq(x.__class__, a.__class__)
3142 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3143 vereq(y.__class__, b.__class__)
3144 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003145 vereq(repr(x), repr(a))
3146 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00003147 if verbose:
3148 print "a = x =", a
3149 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00003150 # Test for __getstate__ and __setstate__ on new style class
3151 u = C3(42)
3152 s = p.dumps(u, bin)
3153 v = p.loads(s)
3154 veris(u.__class__, v.__class__)
3155 vereq(u.foo, v.foo)
3156 # Test for picklability of hybrid class
3157 u = C4()
3158 u.foo = 42
3159 s = p.dumps(u, bin)
3160 v = p.loads(s)
3161 veris(u.__class__, v.__class__)
3162 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00003163
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003164 # Testing copy.deepcopy()
3165 if verbose:
3166 print "deepcopy"
3167 import copy
3168 for cls in C, C1, C2:
3169 cls2 = copy.deepcopy(cls)
3170 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003171
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003172 a = C1(1, 2); a.append(42); a.append(24)
3173 b = C2("hello", "world", 42)
3174 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00003175 vereq(x.__class__, a.__class__)
3176 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
3177 vereq(y.__class__, b.__class__)
3178 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00003179 vereq(repr(x), repr(a))
3180 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00003181 if verbose:
3182 print "a = x =", a
3183 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003184
Guido van Rossum8c842552002-03-14 23:05:54 +00003185def pickleslots():
3186 if verbose: print "Testing pickling of classes with __slots__ ..."
3187 import pickle, cPickle
3188 # Pickling of classes with __slots__ but without __getstate__ should fail
3189 global B, C, D, E
3190 class B(object):
3191 pass
3192 for base in [object, B]:
3193 class C(base):
3194 __slots__ = ['a']
3195 class D(C):
3196 pass
3197 try:
3198 pickle.dumps(C())
3199 except TypeError:
3200 pass
3201 else:
3202 raise TestFailed, "should fail: pickle C instance - %s" % base
3203 try:
3204 cPickle.dumps(C())
3205 except TypeError:
3206 pass
3207 else:
3208 raise TestFailed, "should fail: cPickle C instance - %s" % base
3209 try:
3210 pickle.dumps(C())
3211 except TypeError:
3212 pass
3213 else:
3214 raise TestFailed, "should fail: pickle D instance - %s" % base
3215 try:
3216 cPickle.dumps(D())
3217 except TypeError:
3218 pass
3219 else:
3220 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003221 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003222 class C(base):
3223 __slots__ = ['a']
3224 def __getstate__(self):
3225 try:
3226 d = self.__dict__.copy()
3227 except AttributeError:
3228 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003229 for cls in self.__class__.__mro__:
3230 for sn in cls.__dict__.get('__slots__', ()):
3231 try:
3232 d[sn] = getattr(self, sn)
3233 except AttributeError:
3234 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003235 return d
3236 def __setstate__(self, d):
3237 for k, v in d.items():
3238 setattr(self, k, v)
3239 class D(C):
3240 pass
3241 # Now it should work
3242 x = C()
3243 y = pickle.loads(pickle.dumps(x))
3244 vereq(hasattr(y, 'a'), 0)
3245 y = cPickle.loads(cPickle.dumps(x))
3246 vereq(hasattr(y, 'a'), 0)
3247 x.a = 42
3248 y = pickle.loads(pickle.dumps(x))
3249 vereq(y.a, 42)
3250 y = cPickle.loads(cPickle.dumps(x))
3251 vereq(y.a, 42)
3252 x = D()
3253 x.a = 42
3254 x.b = 100
3255 y = pickle.loads(pickle.dumps(x))
3256 vereq(y.a + y.b, 142)
3257 y = cPickle.loads(cPickle.dumps(x))
3258 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003259 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003260 class E(C):
3261 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003262 x = E()
3263 x.a = 42
3264 x.b = "foo"
3265 y = pickle.loads(pickle.dumps(x))
3266 vereq(y.a, x.a)
3267 vereq(y.b, x.b)
3268 y = cPickle.loads(cPickle.dumps(x))
3269 vereq(y.a, x.a)
3270 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003271
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003272def copies():
3273 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
3274 import copy
3275 class C(object):
3276 pass
3277
3278 a = C()
3279 a.foo = 12
3280 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003281 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003282
3283 a.bar = [1,2,3]
3284 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003285 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003286 verify(c.bar is a.bar)
3287
3288 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003289 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003290 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003291 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003292
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003293def binopoverride():
3294 if verbose: print "Testing overrides of binary operations..."
3295 class I(int):
3296 def __repr__(self):
3297 return "I(%r)" % int(self)
3298 def __add__(self, other):
3299 return I(int(self) + int(other))
3300 __radd__ = __add__
3301 def __pow__(self, other, mod=None):
3302 if mod is None:
3303 return I(pow(int(self), int(other)))
3304 else:
3305 return I(pow(int(self), int(other), int(mod)))
3306 def __rpow__(self, other, mod=None):
3307 if mod is None:
3308 return I(pow(int(other), int(self), mod))
3309 else:
3310 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003311
Walter Dörwald70a6b492004-02-12 17:35:32 +00003312 vereq(repr(I(1) + I(2)), "I(3)")
3313 vereq(repr(I(1) + 2), "I(3)")
3314 vereq(repr(1 + I(2)), "I(3)")
3315 vereq(repr(I(2) ** I(3)), "I(8)")
3316 vereq(repr(2 ** I(3)), "I(8)")
3317 vereq(repr(I(2) ** 3), "I(8)")
3318 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003319 class S(str):
3320 def __eq__(self, other):
3321 return self.lower() == other.lower()
3322
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003323def subclasspropagation():
3324 if verbose: print "Testing propagation of slot functions to subclasses..."
3325 class A(object):
3326 pass
3327 class B(A):
3328 pass
3329 class C(A):
3330 pass
3331 class D(B, C):
3332 pass
3333 d = D()
Tim Peters171b8682006-04-11 01:59:34 +00003334 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003335 A.__hash__ = lambda self: 42
3336 vereq(hash(d), 42)
3337 C.__hash__ = lambda self: 314
3338 vereq(hash(d), 314)
3339 B.__hash__ = lambda self: 144
3340 vereq(hash(d), 144)
3341 D.__hash__ = lambda self: 100
3342 vereq(hash(d), 100)
3343 del D.__hash__
3344 vereq(hash(d), 144)
3345 del B.__hash__
3346 vereq(hash(d), 314)
3347 del C.__hash__
3348 vereq(hash(d), 42)
3349 del A.__hash__
Tim Peters171b8682006-04-11 01:59:34 +00003350 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003351 d.foo = 42
3352 d.bar = 42
3353 vereq(d.foo, 42)
3354 vereq(d.bar, 42)
3355 def __getattribute__(self, name):
3356 if name == "foo":
3357 return 24
3358 return object.__getattribute__(self, name)
3359 A.__getattribute__ = __getattribute__
3360 vereq(d.foo, 24)
3361 vereq(d.bar, 42)
3362 def __getattr__(self, name):
3363 if name in ("spam", "foo", "bar"):
3364 return "hello"
3365 raise AttributeError, name
3366 B.__getattr__ = __getattr__
3367 vereq(d.spam, "hello")
3368 vereq(d.foo, 24)
3369 vereq(d.bar, 42)
3370 del A.__getattribute__
3371 vereq(d.foo, 42)
3372 del d.foo
3373 vereq(d.foo, "hello")
3374 vereq(d.bar, 42)
3375 del B.__getattr__
3376 try:
3377 d.foo
3378 except AttributeError:
3379 pass
3380 else:
3381 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003382
Guido van Rossume7f3e242002-06-14 02:35:45 +00003383 # Test a nasty bug in recurse_down_subclasses()
3384 import gc
3385 class A(object):
3386 pass
3387 class B(A):
3388 pass
3389 del B
3390 gc.collect()
3391 A.__setitem__ = lambda *a: None # crash
3392
Tim Petersfc57ccb2001-10-12 02:38:24 +00003393def buffer_inherit():
3394 import binascii
3395 # SF bug [#470040] ParseTuple t# vs subclasses.
3396 if verbose:
3397 print "Testing that buffer interface is inherited ..."
3398
3399 class MyStr(str):
3400 pass
3401 base = 'abc'
3402 m = MyStr(base)
3403 # b2a_hex uses the buffer interface to get its argument's value, via
3404 # PyArg_ParseTuple 't#' code.
3405 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3406
3407 # It's not clear that unicode will continue to support the character
3408 # buffer interface, and this test will fail if that's taken away.
3409 class MyUni(unicode):
3410 pass
3411 base = u'abc'
3412 m = MyUni(base)
3413 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3414
3415 class MyInt(int):
3416 pass
3417 m = MyInt(42)
3418 try:
3419 binascii.b2a_hex(m)
3420 raise TestFailed('subclass of int should not have a buffer interface')
3421 except TypeError:
3422 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003423
Tim Petersc9933152001-10-16 20:18:24 +00003424def str_of_str_subclass():
3425 import binascii
3426 import cStringIO
3427
3428 if verbose:
3429 print "Testing __str__ defined in subclass of str ..."
3430
3431 class octetstring(str):
3432 def __str__(self):
3433 return binascii.b2a_hex(self)
3434 def __repr__(self):
3435 return self + " repr"
3436
3437 o = octetstring('A')
3438 vereq(type(o), octetstring)
3439 vereq(type(str(o)), str)
3440 vereq(type(repr(o)), str)
3441 vereq(ord(o), 0x41)
3442 vereq(str(o), '41')
3443 vereq(repr(o), 'A repr')
3444 vereq(o.__str__(), '41')
3445 vereq(o.__repr__(), 'A repr')
3446
3447 capture = cStringIO.StringIO()
3448 # Calling str() or not exercises different internal paths.
3449 print >> capture, o
3450 print >> capture, str(o)
3451 vereq(capture.getvalue(), '41\n41\n')
3452 capture.close()
3453
Guido van Rossumc8e56452001-10-22 00:43:43 +00003454def kwdargs():
3455 if verbose: print "Testing keyword arguments to __init__, __call__..."
3456 def f(a): return a
3457 vereq(f.__call__(a=42), 42)
3458 a = []
3459 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003460 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003461
Brett Cannon22565aa2006-06-09 22:31:23 +00003462def recursive__call__():
3463 if verbose: print ("Testing recursive __call__() by setting to instance of "
3464 "class ...")
3465 class A(object):
3466 pass
3467
3468 A.__call__ = A()
3469 try:
3470 A()()
3471 except RuntimeError:
3472 pass
3473 else:
3474 raise TestFailed("Recursion limit should have been reached for "
3475 "__call__()")
3476
Guido van Rossumed87ad82001-10-30 02:33:02 +00003477def delhook():
3478 if verbose: print "Testing __del__ hook..."
3479 log = []
3480 class C(object):
3481 def __del__(self):
3482 log.append(1)
3483 c = C()
3484 vereq(log, [])
3485 del c
3486 vereq(log, [1])
3487
Guido van Rossum29d26062001-12-11 04:37:34 +00003488 class D(object): pass
3489 d = D()
3490 try: del d[0]
3491 except TypeError: pass
3492 else: raise TestFailed, "invalid del() didn't raise TypeError"
3493
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003494def hashinherit():
3495 if verbose: print "Testing hash of mutable subclasses..."
3496
3497 class mydict(dict):
3498 pass
3499 d = mydict()
3500 try:
3501 hash(d)
3502 except TypeError:
3503 pass
3504 else:
3505 raise TestFailed, "hash() of dict subclass should fail"
3506
3507 class mylist(list):
3508 pass
3509 d = mylist()
3510 try:
3511 hash(d)
3512 except TypeError:
3513 pass
3514 else:
3515 raise TestFailed, "hash() of list subclass should fail"
3516
Guido van Rossum29d26062001-12-11 04:37:34 +00003517def strops():
3518 try: 'a' + 5
3519 except TypeError: pass
3520 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3521
3522 try: ''.split('')
3523 except ValueError: pass
3524 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3525
3526 try: ''.join([0])
3527 except TypeError: pass
3528 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3529
3530 try: ''.rindex('5')
3531 except ValueError: pass
3532 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3533
Guido van Rossum29d26062001-12-11 04:37:34 +00003534 try: '%(n)s' % None
3535 except TypeError: pass
3536 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3537
3538 try: '%(n' % {}
3539 except ValueError: pass
3540 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3541
3542 try: '%*s' % ('abc')
3543 except TypeError: pass
3544 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3545
3546 try: '%*.*s' % ('abc', 5)
3547 except TypeError: pass
3548 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3549
3550 try: '%s' % (1, 2)
3551 except TypeError: pass
3552 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3553
3554 try: '%' % None
3555 except ValueError: pass
3556 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3557
3558 vereq('534253'.isdigit(), 1)
3559 vereq('534253x'.isdigit(), 0)
3560 vereq('%c' % 5, '\x05')
3561 vereq('%c' % '5', '5')
3562
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003563def deepcopyrecursive():
3564 if verbose: print "Testing deepcopy of recursive objects..."
3565 class Node:
3566 pass
3567 a = Node()
3568 b = Node()
3569 a.b = b
3570 b.a = a
3571 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003572
Guido van Rossumd7035672002-03-12 20:43:31 +00003573def modules():
3574 if verbose: print "Testing uninitialized module objects..."
3575 from types import ModuleType as M
3576 m = M.__new__(M)
3577 str(m)
3578 vereq(hasattr(m, "__name__"), 0)
3579 vereq(hasattr(m, "__file__"), 0)
3580 vereq(hasattr(m, "foo"), 0)
3581 vereq(m.__dict__, None)
3582 m.foo = 1
3583 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003584
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003585def dictproxyiterkeys():
3586 class C(object):
3587 def meth(self):
3588 pass
3589 if verbose: print "Testing dict-proxy iterkeys..."
3590 keys = [ key for key in C.__dict__.iterkeys() ]
3591 keys.sort()
3592 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3593
3594def dictproxyitervalues():
3595 class C(object):
3596 def meth(self):
3597 pass
3598 if verbose: print "Testing dict-proxy itervalues..."
3599 values = [ values for values in C.__dict__.itervalues() ]
3600 vereq(len(values), 5)
3601
3602def dictproxyiteritems():
3603 class C(object):
3604 def meth(self):
3605 pass
3606 if verbose: print "Testing dict-proxy iteritems..."
3607 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3608 keys.sort()
3609 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3610
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003611def funnynew():
3612 if verbose: print "Testing __new__ returning something unexpected..."
3613 class C(object):
3614 def __new__(cls, arg):
3615 if isinstance(arg, str): return [1, 2, 3]
3616 elif isinstance(arg, int): return object.__new__(D)
3617 else: return object.__new__(cls)
3618 class D(C):
3619 def __init__(self, arg):
3620 self.foo = arg
3621 vereq(C("1"), [1, 2, 3])
3622 vereq(D("1"), [1, 2, 3])
3623 d = D(None)
3624 veris(d.foo, None)
3625 d = C(1)
3626 vereq(isinstance(d, D), True)
3627 vereq(d.foo, 1)
3628 d = D(1)
3629 vereq(isinstance(d, D), True)
3630 vereq(d.foo, 1)
3631
Guido van Rossume8fc6402002-04-16 16:44:51 +00003632def imulbug():
3633 # SF bug 544647
3634 if verbose: print "Testing for __imul__ problems..."
3635 class C(object):
3636 def __imul__(self, other):
3637 return (self, other)
3638 x = C()
3639 y = x
3640 y *= 1.0
3641 vereq(y, (x, 1.0))
3642 y = x
3643 y *= 2
3644 vereq(y, (x, 2))
3645 y = x
3646 y *= 3L
3647 vereq(y, (x, 3L))
3648 y = x
3649 y *= 1L<<100
3650 vereq(y, (x, 1L<<100))
3651 y = x
3652 y *= None
3653 vereq(y, (x, None))
3654 y = x
3655 y *= "foo"
3656 vereq(y, (x, "foo"))
3657
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003658def docdescriptor():
3659 # SF bug 542984
3660 if verbose: print "Testing __doc__ descriptor..."
3661 class DocDescr(object):
3662 def __get__(self, object, otype):
3663 if object:
3664 object = object.__class__.__name__ + ' instance'
3665 if otype:
3666 otype = otype.__name__
3667 return 'object=%s; type=%s' % (object, otype)
3668 class OldClass:
3669 __doc__ = DocDescr()
3670 class NewClass(object):
3671 __doc__ = DocDescr()
3672 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3673 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3674 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3675 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3676
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003677def copy_setstate():
3678 if verbose:
3679 print "Testing that copy.*copy() correctly uses __setstate__..."
3680 import copy
3681 class C(object):
3682 def __init__(self, foo=None):
3683 self.foo = foo
3684 self.__foo = foo
3685 def setfoo(self, foo=None):
3686 self.foo = foo
3687 def getfoo(self):
3688 return self.__foo
3689 def __getstate__(self):
3690 return [self.foo]
3691 def __setstate__(self, lst):
3692 assert len(lst) == 1
3693 self.__foo = self.foo = lst[0]
3694 a = C(42)
3695 a.setfoo(24)
3696 vereq(a.foo, 24)
3697 vereq(a.getfoo(), 42)
3698 b = copy.copy(a)
3699 vereq(b.foo, 24)
3700 vereq(b.getfoo(), 24)
3701 b = copy.deepcopy(a)
3702 vereq(b.foo, 24)
3703 vereq(b.getfoo(), 24)
3704
Guido van Rossum09638c12002-06-13 19:17:46 +00003705def slices():
3706 if verbose:
3707 print "Testing cases with slices and overridden __getitem__ ..."
3708 # Strings
3709 vereq("hello"[:4], "hell")
3710 vereq("hello"[slice(4)], "hell")
3711 vereq(str.__getitem__("hello", slice(4)), "hell")
3712 class S(str):
3713 def __getitem__(self, x):
3714 return str.__getitem__(self, x)
3715 vereq(S("hello")[:4], "hell")
3716 vereq(S("hello")[slice(4)], "hell")
3717 vereq(S("hello").__getitem__(slice(4)), "hell")
3718 # Tuples
3719 vereq((1,2,3)[:2], (1,2))
3720 vereq((1,2,3)[slice(2)], (1,2))
3721 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3722 class T(tuple):
3723 def __getitem__(self, x):
3724 return tuple.__getitem__(self, x)
3725 vereq(T((1,2,3))[:2], (1,2))
3726 vereq(T((1,2,3))[slice(2)], (1,2))
3727 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3728 # Lists
3729 vereq([1,2,3][:2], [1,2])
3730 vereq([1,2,3][slice(2)], [1,2])
3731 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3732 class L(list):
3733 def __getitem__(self, x):
3734 return list.__getitem__(self, x)
3735 vereq(L([1,2,3])[:2], [1,2])
3736 vereq(L([1,2,3])[slice(2)], [1,2])
3737 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3738 # Now do lists and __setitem__
3739 a = L([1,2,3])
3740 a[slice(1, 3)] = [3,2]
3741 vereq(a, [1,3,2])
3742 a[slice(0, 2, 1)] = [3,1]
3743 vereq(a, [3,1,2])
3744 a.__setitem__(slice(1, 3), [2,1])
3745 vereq(a, [3,2,1])
3746 a.__setitem__(slice(0, 2, 1), [2,3])
3747 vereq(a, [2,3,1])
3748
Tim Peters2484aae2002-07-11 06:56:07 +00003749def subtype_resurrection():
3750 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003751 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003752
3753 class C(object):
3754 container = []
3755
3756 def __del__(self):
3757 # resurrect the instance
3758 C.container.append(self)
3759
3760 c = C()
3761 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003762 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003763 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003764 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003765
3766 # If that didn't blow up, it's also interesting to see whether clearing
3767 # the last container slot works: that will attempt to delete c again,
3768 # which will cause c to get appended back to the container again "during"
3769 # the del.
3770 del C.container[-1]
3771 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003772 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003773
Tim Peters14cb1e12002-07-11 18:26:21 +00003774 # Make c mortal again, so that the test framework with -l doesn't report
3775 # it as a leak.
3776 del C.__del__
3777
Guido van Rossum2d702462002-08-06 21:28:28 +00003778def slottrash():
3779 # Deallocating deeply nested slotted trash caused stack overflows
3780 if verbose:
3781 print "Testing slot trash..."
3782 class trash(object):
3783 __slots__ = ['x']
3784 def __init__(self, x):
3785 self.x = x
3786 o = None
3787 for i in xrange(50000):
3788 o = trash(o)
3789 del o
3790
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003791def slotmultipleinheritance():
3792 # SF bug 575229, multiple inheritance w/ slots dumps core
3793 class A(object):
3794 __slots__=()
3795 class B(object):
3796 pass
3797 class C(A,B) :
3798 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003799 vereq(C.__basicsize__, B.__basicsize__)
3800 verify(hasattr(C, '__dict__'))
3801 verify(hasattr(C, '__weakref__'))
3802 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003803
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003804def testrmul():
3805 # SF patch 592646
3806 if verbose:
3807 print "Testing correct invocation of __rmul__..."
3808 class C(object):
3809 def __mul__(self, other):
3810 return "mul"
3811 def __rmul__(self, other):
3812 return "rmul"
3813 a = C()
3814 vereq(a*2, "mul")
3815 vereq(a*2.2, "mul")
3816 vereq(2*a, "rmul")
3817 vereq(2.2*a, "rmul")
3818
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003819def testipow():
3820 # [SF bug 620179]
3821 if verbose:
3822 print "Testing correct invocation of __ipow__..."
3823 class C(object):
3824 def __ipow__(self, other):
3825 pass
3826 a = C()
3827 a **= 2
3828
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003829def do_this_first():
3830 if verbose:
3831 print "Testing SF bug 551412 ..."
3832 # This dumps core when SF bug 551412 isn't fixed --
3833 # but only when test_descr.py is run separately.
3834 # (That can't be helped -- as soon as PyType_Ready()
3835 # is called for PyLong_Type, the bug is gone.)
3836 class UserLong(object):
3837 def __pow__(self, *args):
3838 pass
3839 try:
3840 pow(0L, UserLong(), 0L)
3841 except:
3842 pass
3843
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003844 if verbose:
3845 print "Testing SF bug 570483..."
3846 # Another segfault only when run early
3847 # (before PyType_Ready(tuple) is called)
3848 type.mro(tuple)
3849
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003850def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003851 if verbose:
3852 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003853 # stuff that should work:
3854 class C(object):
3855 pass
3856 class C2(object):
3857 def __getattribute__(self, attr):
3858 if attr == 'a':
3859 return 2
3860 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003861 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003862 def meth(self):
3863 return 1
3864 class D(C):
3865 pass
3866 class E(D):
3867 pass
3868 d = D()
3869 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003870 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003871 D.__bases__ = (C2,)
3872 vereq(d.meth(), 1)
3873 vereq(e.meth(), 1)
3874 vereq(d.a, 2)
3875 vereq(e.a, 2)
3876 vereq(C2.__subclasses__(), [D])
3877
3878 # stuff that shouldn't:
3879 class L(list):
3880 pass
3881
3882 try:
3883 L.__bases__ = (dict,)
3884 except TypeError:
3885 pass
3886 else:
3887 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3888
3889 try:
3890 list.__bases__ = (dict,)
3891 except TypeError:
3892 pass
3893 else:
3894 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3895
3896 try:
Michael W. Hudsonf3904422006-11-23 13:54:04 +00003897 D.__bases__ = (C2, list)
3898 except TypeError:
3899 pass
3900 else:
3901 assert 0, "best_base calculation found wanting"
3902
3903 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003904 del D.__bases__
3905 except TypeError:
3906 pass
3907 else:
3908 raise TestFailed, "shouldn't be able to delete .__bases__"
3909
3910 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003911 D.__bases__ = ()
3912 except TypeError, msg:
3913 if str(msg) == "a new-style class can't have only classic bases":
3914 raise TestFailed, "wrong error message for .__bases__ = ()"
3915 else:
3916 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3917
3918 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003919 D.__bases__ = (D,)
3920 except TypeError:
3921 pass
3922 else:
3923 # actually, we'll have crashed by here...
3924 raise TestFailed, "shouldn't be able to create inheritance cycles"
3925
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003926 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003927 D.__bases__ = (C, C)
3928 except TypeError:
3929 pass
3930 else:
3931 raise TestFailed, "didn't detect repeated base classes"
3932
3933 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003934 D.__bases__ = (E,)
3935 except TypeError:
3936 pass
3937 else:
3938 raise TestFailed, "shouldn't be able to create inheritance cycles"
3939
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003940 # let's throw a classic class into the mix:
3941 class Classic:
3942 def meth2(self):
3943 return 3
3944
3945 D.__bases__ = (C, Classic)
3946
3947 vereq(d.meth2(), 3)
3948 vereq(e.meth2(), 3)
3949 try:
3950 d.a
3951 except AttributeError:
3952 pass
3953 else:
3954 raise TestFailed, "attribute should have vanished"
3955
3956 try:
3957 D.__bases__ = (Classic,)
3958 except TypeError:
3959 pass
3960 else:
3961 raise TestFailed, "new-style class must have a new-style base"
3962
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003963def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003964 if verbose:
3965 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003966 class WorkOnce(type):
3967 def __new__(self, name, bases, ns):
3968 self.flag = 0
3969 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3970 def mro(self):
3971 if self.flag > 0:
3972 raise RuntimeError, "bozo"
3973 else:
3974 self.flag += 1
3975 return type.mro(self)
3976
3977 class WorkAlways(type):
3978 def mro(self):
3979 # this is here to make sure that .mro()s aren't called
3980 # with an exception set (which was possible at one point).
3981 # An error message will be printed in a debug build.
3982 # What's a good way to test for this?
3983 return type.mro(self)
3984
3985 class C(object):
3986 pass
3987
3988 class C2(object):
3989 pass
3990
3991 class D(C):
3992 pass
3993
3994 class E(D):
3995 pass
3996
3997 class F(D):
3998 __metaclass__ = WorkOnce
3999
4000 class G(D):
4001 __metaclass__ = WorkAlways
4002
4003 # Immediate subclasses have their mro's adjusted in alphabetical
4004 # order, so E's will get adjusted before adjusting F's fails. We
4005 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00004006
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004007 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00004008 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004009
4010 try:
4011 D.__bases__ = (C2,)
4012 except RuntimeError:
4013 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00004014 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004015 else:
4016 raise TestFailed, "exception not propagated"
4017
4018def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00004019 if verbose:
4020 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004021 class A(object):
4022 pass
4023
4024 class B(object):
4025 pass
4026
4027 class C(A, B):
4028 pass
4029
4030 class D(A, B):
4031 pass
4032
4033 class E(C, D):
4034 pass
4035
4036 try:
4037 C.__bases__ = (B, A)
4038 except TypeError:
4039 pass
4040 else:
4041 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00004042
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004043def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00004044 if verbose:
4045 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004046 class C(object):
4047 pass
4048
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00004049 # C.__module__ could be 'test_descr' or '__main__'
4050 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00004051
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00004052 C.__name__ = 'D'
4053 vereq((C.__module__, C.__name__), (mod, 'D'))
4054
4055 C.__name__ = 'D.E'
4056 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00004057
Guido van Rossum613f24f2003-01-06 23:00:59 +00004058def subclass_right_op():
4059 if verbose:
4060 print "Testing correct dispatch of subclass overloading __r<op>__..."
4061
4062 # This code tests various cases where right-dispatch of a subclass
4063 # should be preferred over left-dispatch of a base class.
4064
4065 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
4066
4067 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00004068 def __floordiv__(self, other):
4069 return "B.__floordiv__"
4070 def __rfloordiv__(self, other):
4071 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004072
Guido van Rossumf389c772003-02-27 20:04:19 +00004073 vereq(B(1) // 1, "B.__floordiv__")
4074 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004075
4076 # Case 2: subclass of object; this is just the baseline for case 3
4077
4078 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00004079 def __floordiv__(self, other):
4080 return "C.__floordiv__"
4081 def __rfloordiv__(self, other):
4082 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004083
Guido van Rossumf389c772003-02-27 20:04:19 +00004084 vereq(C() // 1, "C.__floordiv__")
4085 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004086
4087 # Case 3: subclass of new-style class; here it gets interesting
4088
4089 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00004090 def __floordiv__(self, other):
4091 return "D.__floordiv__"
4092 def __rfloordiv__(self, other):
4093 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00004094
Guido van Rossumf389c772003-02-27 20:04:19 +00004095 vereq(D() // C(), "D.__floordiv__")
4096 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00004097
4098 # Case 4: this didn't work right in 2.2.2 and 2.3a1
4099
4100 class E(C):
4101 pass
4102
Guido van Rossumf389c772003-02-27 20:04:19 +00004103 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00004104
Guido van Rossumf389c772003-02-27 20:04:19 +00004105 vereq(E() // 1, "C.__floordiv__")
4106 vereq(1 // E(), "C.__rfloordiv__")
4107 vereq(E() // C(), "C.__floordiv__")
4108 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00004109
Guido van Rossum373c7412003-01-07 13:41:37 +00004110def dict_type_with_metaclass():
4111 if verbose:
4112 print "Testing type of __dict__ when __metaclass__ set..."
4113
4114 class B(object):
4115 pass
4116 class M(type):
4117 pass
4118 class C:
4119 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
4120 __metaclass__ = M
4121 veris(type(C.__dict__), type(B.__dict__))
4122
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004123def meth_class_get():
4124 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004125 if verbose:
4126 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004127 # Baseline
4128 arg = [1, 2, 3]
4129 res = {1: None, 2: None, 3: None}
4130 vereq(dict.fromkeys(arg), res)
4131 vereq({}.fromkeys(arg), res)
4132 # Now get the descriptor
4133 descr = dict.__dict__["fromkeys"]
4134 # More baseline using the descriptor directly
4135 vereq(descr.__get__(None, dict)(arg), res)
4136 vereq(descr.__get__({})(arg), res)
4137 # Now check various error cases
4138 try:
4139 descr.__get__(None, None)
4140 except TypeError:
4141 pass
4142 else:
4143 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
4144 try:
4145 descr.__get__(42)
4146 except TypeError:
4147 pass
4148 else:
4149 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
4150 try:
4151 descr.__get__(None, 42)
4152 except TypeError:
4153 pass
4154 else:
4155 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
4156 try:
4157 descr.__get__(None, int)
4158 except TypeError:
4159 pass
4160 else:
4161 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
4162
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004163def isinst_isclass():
4164 if verbose:
4165 print "Testing proxy isinstance() and isclass()..."
4166 class Proxy(object):
4167 def __init__(self, obj):
4168 self.__obj = obj
4169 def __getattribute__(self, name):
4170 if name.startswith("_Proxy__"):
4171 return object.__getattribute__(self, name)
4172 else:
4173 return getattr(self.__obj, name)
4174 # Test with a classic class
4175 class C:
4176 pass
4177 a = C()
4178 pa = Proxy(a)
4179 verify(isinstance(a, C)) # Baseline
4180 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004181 # Test with a classic subclass
4182 class D(C):
4183 pass
4184 a = D()
4185 pa = Proxy(a)
4186 verify(isinstance(a, C)) # Baseline
4187 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004188 # Test with a new-style class
4189 class C(object):
4190 pass
4191 a = C()
4192 pa = Proxy(a)
4193 verify(isinstance(a, C)) # Baseline
4194 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004195 # Test with a new-style subclass
4196 class D(C):
4197 pass
4198 a = D()
4199 pa = Proxy(a)
4200 verify(isinstance(a, C)) # Baseline
4201 verify(isinstance(pa, C)) # Test
4202
4203def proxysuper():
4204 if verbose:
4205 print "Testing super() for a proxy object..."
4206 class Proxy(object):
4207 def __init__(self, obj):
4208 self.__obj = obj
4209 def __getattribute__(self, name):
4210 if name.startswith("_Proxy__"):
4211 return object.__getattribute__(self, name)
4212 else:
4213 return getattr(self.__obj, name)
4214
4215 class B(object):
4216 def f(self):
4217 return "B.f"
4218
4219 class C(B):
4220 def f(self):
4221 return super(C, self).f() + "->C.f"
4222
4223 obj = C()
4224 p = Proxy(obj)
4225 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004226
Guido van Rossum52b27052003-04-15 20:05:10 +00004227def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004228 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00004229 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004230 try:
4231 object.__setattr__(str, "foo", 42)
4232 except TypeError:
4233 pass
4234 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004235 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004236 try:
4237 object.__delattr__(str, "lower")
4238 except TypeError:
4239 pass
4240 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00004241 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004242
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004243def weakref_segfault():
4244 # SF 742911
4245 if verbose:
4246 print "Testing weakref segfault..."
4247
4248 import weakref
4249
4250 class Provoker:
4251 def __init__(self, referrent):
4252 self.ref = weakref.ref(referrent)
4253
4254 def __del__(self):
4255 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004256
4257 class Oops(object):
4258 pass
4259
4260 o = Oops()
4261 o.whatever = Provoker(o)
4262 del o
4263
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004264def wrapper_segfault():
4265 # SF 927248: deeply nested wrappers could cause stack overflow
4266 f = lambda:None
4267 for i in xrange(1000000):
4268 f = f.__call__
4269 f = None
4270
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004271# Fix SF #762455, segfault when sys.stdout is changed in getattr
4272def filefault():
4273 if verbose:
4274 print "Testing sys.stdout is changed in getattr..."
4275 import sys
4276 class StdoutGuard:
4277 def __getattr__(self, attr):
4278 sys.stdout = sys.__stdout__
4279 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4280 sys.stdout = StdoutGuard()
4281 try:
4282 print "Oops!"
4283 except RuntimeError:
4284 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004285
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004286def vicious_descriptor_nonsense():
4287 # A potential segfault spotted by Thomas Wouters in mail to
4288 # python-dev 2003-04-17, turned into an example & fixed by Michael
4289 # Hudson just less than four months later...
4290 if verbose:
4291 print "Testing vicious_descriptor_nonsense..."
4292
4293 class Evil(object):
4294 def __hash__(self):
4295 return hash('attr')
4296 def __eq__(self, other):
4297 del C.attr
4298 return 0
4299
4300 class Descr(object):
4301 def __get__(self, ob, type=None):
4302 return 1
4303
4304 class C(object):
4305 attr = Descr()
4306
4307 c = C()
4308 c.__dict__[Evil()] = 0
4309
4310 vereq(c.attr, 1)
4311 # this makes a crash more likely:
4312 import gc; gc.collect()
4313 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004314
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004315def test_init():
4316 # SF 1155938
4317 class Foo(object):
4318 def __init__(self):
4319 return 10
4320 try:
4321 Foo()
4322 except TypeError:
4323 pass
4324 else:
4325 raise TestFailed, "did not test __init__() for None return"
4326
Armin Rigoc6686b72005-11-07 08:38:00 +00004327def methodwrapper():
4328 # <type 'method-wrapper'> did not support any reflection before 2.5
4329 if verbose:
4330 print "Testing method-wrapper objects..."
4331
4332 l = []
4333 vereq(l.__add__, l.__add__)
Armin Rigofd01d792006-06-08 10:56:24 +00004334 vereq(l.__add__, [].__add__)
4335 verify(l.__add__ != [5].__add__)
4336 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004337 verify(l.__add__.__name__ == '__add__')
4338 verify(l.__add__.__self__ is l)
4339 verify(l.__add__.__objclass__ is list)
4340 vereq(l.__add__.__doc__, list.__add__.__doc__)
Armin Rigofd01d792006-06-08 10:56:24 +00004341 try:
4342 hash(l.__add__)
4343 except TypeError:
4344 pass
4345 else:
4346 raise TestFailed("no TypeError from hash([].__add__)")
4347
4348 t = ()
4349 t += (7,)
4350 vereq(t.__add__, (7,).__add__)
4351 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004352
Armin Rigofd163f92005-12-29 15:59:19 +00004353def notimplemented():
4354 # all binary methods should be able to return a NotImplemented
4355 if verbose:
4356 print "Testing NotImplemented..."
4357
4358 import sys
4359 import types
4360 import operator
4361
4362 def specialmethod(self, other):
4363 return NotImplemented
4364
4365 def check(expr, x, y):
4366 try:
4367 exec expr in {'x': x, 'y': y, 'operator': operator}
4368 except TypeError:
4369 pass
4370 else:
4371 raise TestFailed("no TypeError from %r" % (expr,))
4372
4373 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
4374 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4375 # ValueErrors instead of TypeErrors
4376 for metaclass in [type, types.ClassType]:
4377 for name, expr, iexpr in [
4378 ('__add__', 'x + y', 'x += y'),
4379 ('__sub__', 'x - y', 'x -= y'),
4380 ('__mul__', 'x * y', 'x *= y'),
4381 ('__truediv__', 'operator.truediv(x, y)', None),
4382 ('__floordiv__', 'operator.floordiv(x, y)', None),
4383 ('__div__', 'x / y', 'x /= y'),
4384 ('__mod__', 'x % y', 'x %= y'),
4385 ('__divmod__', 'divmod(x, y)', None),
4386 ('__pow__', 'x ** y', 'x **= y'),
4387 ('__lshift__', 'x << y', 'x <<= y'),
4388 ('__rshift__', 'x >> y', 'x >>= y'),
4389 ('__and__', 'x & y', 'x &= y'),
4390 ('__or__', 'x | y', 'x |= y'),
4391 ('__xor__', 'x ^ y', 'x ^= y'),
4392 ('__coerce__', 'coerce(x, y)', None)]:
4393 if name == '__coerce__':
4394 rname = name
4395 else:
4396 rname = '__r' + name[2:]
4397 A = metaclass('A', (), {name: specialmethod})
4398 B = metaclass('B', (), {rname: specialmethod})
4399 a = A()
4400 b = B()
4401 check(expr, a, a)
4402 check(expr, a, b)
4403 check(expr, b, a)
4404 check(expr, b, b)
4405 check(expr, a, N1)
4406 check(expr, a, N2)
4407 check(expr, N1, b)
4408 check(expr, N2, b)
4409 if iexpr:
4410 check(iexpr, a, a)
4411 check(iexpr, a, b)
4412 check(iexpr, b, a)
4413 check(iexpr, b, b)
4414 check(iexpr, a, N1)
4415 check(iexpr, a, N2)
4416 iname = '__i' + name[2:]
4417 C = metaclass('C', (), {iname: specialmethod})
4418 c = C()
4419 check(iexpr, c, a)
4420 check(iexpr, c, b)
4421 check(iexpr, c, N1)
4422 check(iexpr, c, N2)
4423
Georg Brandl0fca97a2007-03-05 22:28:08 +00004424def test_assign_slice():
4425 # ceval.c's assign_slice used to check for
4426 # tp->tp_as_sequence->sq_slice instead of
4427 # tp->tp_as_sequence->sq_ass_slice
4428
4429 class C(object):
4430 def __setslice__(self, start, stop, value):
4431 self.value = value
4432
4433 c = C()
4434 c[1:2] = 3
4435 vereq(c.value, 3)
4436
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004437def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004438 weakref_segfault() # Must be first, somehow
Martin v. Löwisd5cfa542006-07-03 13:47:40 +00004439 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004440 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004441 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004442 lists()
4443 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004444 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004445 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004446 ints()
4447 longs()
4448 floats()
4449 complexes()
4450 spamlists()
4451 spamdicts()
4452 pydicts()
4453 pylists()
4454 metaclass()
4455 pymods()
4456 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004457 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004458 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004459 ex5()
4460 monotonicity()
4461 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004462 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004463 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004464 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004465 dynamics()
Armin Rigoc0ba52d2007-04-19 14:44:48 +00004466 errors()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004467 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004468 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004469 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004470 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004471 classic()
4472 compattr()
4473 newslot()
4474 altmro()
4475 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004476 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004477 specials()
Brett Cannon1e534b52007-09-07 04:18:30 +00004478 recursions()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004479 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004480 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004481 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004482 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004483 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004484 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004485 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004486 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004487 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004488 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004489 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004490 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004491 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004492 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004493 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004494 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004495 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004496 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004497 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004498 kwdargs()
Brett Cannon22565aa2006-06-09 22:31:23 +00004499 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004500 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004501 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004502 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004503 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004504 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004505 dictproxyiterkeys()
4506 dictproxyitervalues()
4507 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004508 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004509 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004510 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004511 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004512 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004513 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004514 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004515 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004516 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004517 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004518 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004519 test_mutable_bases()
4520 test_mutable_bases_with_failing_mro()
4521 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004522 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004523 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004524 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004525 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004526 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004527 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004528 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004529 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004530 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004531 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004532 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004533 notimplemented()
Georg Brandl0fca97a2007-03-05 22:28:08 +00004534 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004535
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004536 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004537
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004538if __name__ == "__main__":
4539 test_main()