blob: bccc912aad9a5e463d90a21136bd45d673c812e2 [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
Barry Warsaw04f357c2002-07-23 19:04:11 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
16 if verbose: print "checking", expr
17 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
29 if verbose: print "checking", expr
30 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
32 # XXX Hack so this passes before 2.3 when -Qnew is specified.
33 if meth == "__div__" and 1/2 == 0.5:
34 meth = "__truediv__"
35
Guido van Rossum45704552001-10-08 16:35:45 +000036 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 t = type(a)
38 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000039 while meth not in t.__dict__:
40 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000041 vereq(m, t.__dict__[meth])
42 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045
46def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
47 if verbose: print "checking", expr
48 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000049 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 t = type(a)
51 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000052 while meth not in t.__dict__:
53 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000054 vereq(m, t.__dict__[meth])
55 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000056 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058
59def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
60 if verbose: print "checking", stmt
61 dict = {'a': deepcopy(a), 'b': b}
62 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 t = type(a)
65 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000066 while meth not in t.__dict__:
67 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000068 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000069 dict['a'] = deepcopy(a)
70 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict['a'] = deepcopy(a)
73 bm = getattr(dict['a'], meth)
74 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076
77def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
78 if verbose: print "checking", stmt
79 dict = {'a': deepcopy(a), 'b': b, 'c': c}
80 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000081 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 t = type(a)
83 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000084 while meth not in t.__dict__:
85 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 dict['a'] = deepcopy(a)
88 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict['a'] = deepcopy(a)
91 bm = getattr(dict['a'], meth)
92 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094
95def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
96 if verbose: print "checking", stmt
97 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
98 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000099 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000101 while meth not in t.__dict__:
102 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105 dict['a'] = deepcopy(a)
106 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108 dict['a'] = deepcopy(a)
109 bm = getattr(dict['a'], meth)
110 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000111 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000112
Tim Peters2f93e282001-10-04 05:27:00 +0000113def class_docstrings():
114 class Classic:
115 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000116 vereq(Classic.__doc__, "A classic docstring.")
117 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000118
119 class Classic2:
120 pass
121 verify(Classic2.__doc__ is None)
122
Tim Peters4fb1fe82001-10-04 05:48:13 +0000123 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000124 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000125 vereq(NewStatic.__doc__, "Another docstring.")
126 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 pass
130 verify(NewStatic2.__doc__ is None)
131
Tim Peters4fb1fe82001-10-04 05:48:13 +0000132 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000133 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000134 vereq(NewDynamic.__doc__, "Another docstring.")
135 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000136
Tim Peters4fb1fe82001-10-04 05:48:13 +0000137 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000138 pass
139 verify(NewDynamic2.__doc__ is None)
140
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141def lists():
142 if verbose: print "Testing list operations..."
143 testbinop([1], [2], [1,2], "a+b", "__add__")
144 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
145 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
146 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
147 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
148 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
149 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
150 testunop([1,2,3], 3, "len(a)", "__len__")
151 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
152 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
153 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
154 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
155
156def dicts():
157 if verbose: print "Testing dict operations..."
158 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
159 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
160 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
161 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
162 d = {1:2,3:4}
163 l1 = []
164 for i in d.keys(): l1.append(i)
165 l = []
166 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 l = []
169 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000171 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000172 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000173 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 d = {1:2, 3:4}
175 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(eval(repr(d), {}), d)
177 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
179
Tim Peters25786c02001-09-02 08:22:48 +0000180def dict_constructor():
181 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 print "Testing dict constructor ..."
183 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000186 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000187 d = dict(items={})
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()))
192 vereq(d, dict(items=d.iteritems()))
Tim Peters25786c02001-09-02 08:22:48 +0000193 for badarg in 0, 0L, 0j, "0", [0], (0,):
194 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000195 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000196 except TypeError:
197 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000198 except ValueError:
199 if badarg == "0":
200 # It's a sequence, and its elements are also sequences (gotta
201 # love strings <wink>), but they aren't of length 2, so this
202 # one seemed better as a ValueError than a TypeError.
203 pass
204 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000205 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000206 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000207 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000208 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000209 dict(senseless={})
Tim Peters25786c02001-09-02 08:22:48 +0000210 except TypeError:
211 pass
212 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000213 raise TestFailed("no TypeError from dict(senseless={})")
Tim Peters25786c02001-09-02 08:22:48 +0000214
215 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000216 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000217 except TypeError:
218 pass
219 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000220 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000221
222 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000223 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000224 dict = {1:2, 3:4, 'a':1j}
225
Tim Peters25786c02001-09-02 08:22:48 +0000226 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000227 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000228 except TypeError:
229 pass
230 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000231 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000232
233 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000234 Mapping.__getitem__ = lambda self, i: self.dict[i]
Tim Petersa427a2b2001-10-29 22:25:45 +0000235 d = dict(items=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000236 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000237
Tim Peters1fc240e2001-10-26 05:06:50 +0000238 # Init from sequence of iterable objects, each producing a 2-sequence.
239 class AddressBookEntry:
240 def __init__(self, first, last):
241 self.first = first
242 self.last = last
243 def __iter__(self):
244 return iter([self.first, self.last])
245
Tim Petersa427a2b2001-10-29 22:25:45 +0000246 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000247 AddressBookEntry('Barry', 'Peters'),
248 AddressBookEntry('Tim', 'Peters'),
249 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000250 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
251
Tim Petersa427a2b2001-10-29 22:25:45 +0000252 d = dict(zip(range(4), range(1, 5)))
253 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000254
255 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000256 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000257 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000258 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000259 except ValueError:
260 pass
261 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000262 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000263
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264def test_dir():
265 if verbose:
266 print "Testing dir() ..."
267 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000268 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000269 del junk
270
271 # Just make sure these don't blow up!
272 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
273 dir(arg)
274
Tim Peters37a309d2001-09-04 01:20:04 +0000275 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000276 class C:
277 Cdata = 1
278 def Cmethod(self): pass
279
280 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000281 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000282 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000283
284 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000285 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000286
287 c.cdata = 2
288 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000289 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000290 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291
292 class A(C):
293 Adata = 1
294 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000295
Tim Peters37a309d2001-09-04 01:20:04 +0000296 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000297 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000298 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000299 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000300 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000301 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000302 a.adata = 42
303 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000304 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000305
306 # The same, but with new-style classes. Since these have object as a
307 # base class, a lot more gets sucked in.
308 def interesting(strings):
309 return [s for s in strings if not s.startswith('_')]
310
Tim Peters5d2b77c2001-09-03 05:47:38 +0000311 class C(object):
312 Cdata = 1
313 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000314
315 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000316 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000317
318 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000319 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000320 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000321
322 c.cdata = 2
323 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000324 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000325 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000326
Tim Peters5d2b77c2001-09-03 05:47:38 +0000327 class A(C):
328 Adata = 1
329 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000330
331 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000332 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000333 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000334 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000335 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000336 a.adata = 42
337 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000338 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000339 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000340
Tim Peterscaaff8d2001-09-10 23:12:14 +0000341 # Try a module subclass.
342 import sys
343 class M(type(sys)):
344 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000345 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000346 minstance.b = 2
347 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000348 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
349 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000350
351 class M2(M):
352 def getdict(self):
353 return "Not a dict!"
354 __dict__ = property(getdict)
355
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000356 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000357 m2instance.b = 2
358 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000359 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000360 try:
361 dir(m2instance)
362 except TypeError:
363 pass
364
Tim Peters9e6a3992001-10-30 05:45:26 +0000365 # Two essentially featureless objects, just inheriting stuff from
366 # object.
367 vereq(dir(None), dir(Ellipsis))
368
Guido van Rossum44022412002-05-13 18:29:46 +0000369 # Nasty test case for proxied objects
370 class Wrapper(object):
371 def __init__(self, obj):
372 self.__obj = obj
373 def __repr__(self):
374 return "Wrapper(%s)" % repr(self.__obj)
375 def __getitem__(self, key):
376 return Wrapper(self.__obj[key])
377 def __len__(self):
378 return len(self.__obj)
379 def __getattr__(self, name):
380 return Wrapper(getattr(self.__obj, name))
381
382 class C(object):
383 def __getclass(self):
384 return Wrapper(type(self))
385 __class__ = property(__getclass)
386
387 dir(C()) # This used to segfault
388
Tim Peters6d6c1a32001-08-02 04:15:00 +0000389binops = {
390 'add': '+',
391 'sub': '-',
392 'mul': '*',
393 'div': '/',
394 'mod': '%',
395 'divmod': 'divmod',
396 'pow': '**',
397 'lshift': '<<',
398 'rshift': '>>',
399 'and': '&',
400 'xor': '^',
401 'or': '|',
402 'cmp': 'cmp',
403 'lt': '<',
404 'le': '<=',
405 'eq': '==',
406 'ne': '!=',
407 'gt': '>',
408 'ge': '>=',
409 }
410
411for name, expr in binops.items():
412 if expr.islower():
413 expr = expr + "(a, b)"
414 else:
415 expr = 'a %s b' % expr
416 binops[name] = expr
417
418unops = {
419 'pos': '+',
420 'neg': '-',
421 'abs': 'abs',
422 'invert': '~',
423 'int': 'int',
424 'long': 'long',
425 'float': 'float',
426 'oct': 'oct',
427 'hex': 'hex',
428 }
429
430for name, expr in unops.items():
431 if expr.islower():
432 expr = expr + "(a)"
433 else:
434 expr = '%s a' % expr
435 unops[name] = expr
436
437def numops(a, b, skip=[]):
438 dict = {'a': a, 'b': b}
439 for name, expr in binops.items():
440 if name not in skip:
441 name = "__%s__" % name
442 if hasattr(a, name):
443 res = eval(expr, dict)
444 testbinop(a, b, res, expr, name)
445 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000446 if name not in skip:
447 name = "__%s__" % name
448 if hasattr(a, name):
449 res = eval(expr, dict)
450 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451
452def ints():
453 if verbose: print "Testing int operations..."
454 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000455 # The following crashes in Python 2.2
456 vereq((1).__nonzero__(), 1)
457 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000458 # This returns 'NotImplemented' in Python 2.2
459 class C(int):
460 def __add__(self, other):
461 return NotImplemented
462 try:
463 C() + ""
464 except TypeError:
465 pass
466 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000467 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000468
469def longs():
470 if verbose: print "Testing long operations..."
471 numops(100L, 3L)
472
473def floats():
474 if verbose: print "Testing float operations..."
475 numops(100.0, 3.0)
476
477def complexes():
478 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000479 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000480 class Number(complex):
481 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000482 def __new__(cls, *args, **kwds):
483 result = complex.__new__(cls, *args)
484 result.prec = kwds.get('prec', 12)
485 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000486 def __repr__(self):
487 prec = self.prec
488 if self.imag == 0.0:
489 return "%.*g" % (prec, self.real)
490 if self.real == 0.0:
491 return "%.*gj" % (prec, self.imag)
492 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
493 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000494
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000496 vereq(`a`, "3.14")
497 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000498
Tim Peters3f996e72001-09-13 19:18:27 +0000499 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000500 vereq(`a`, "3.1")
501 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000502
503 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000504 vereq(`a`, "234.5")
505 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000506
Tim Peters6d6c1a32001-08-02 04:15:00 +0000507def spamlists():
508 if verbose: print "Testing spamlist operations..."
509 import copy, xxsubtype as spam
510 def spamlist(l, memo=None):
511 import xxsubtype as spam
512 return spam.spamlist(l)
513 # This is an ugly hack:
514 copy._deepcopy_dispatch[spam.spamlist] = spamlist
515
516 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
517 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
518 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
519 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
520 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
521 "a[b:c]", "__getslice__")
522 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
523 "a+=b", "__iadd__")
524 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
525 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
526 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
527 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
528 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
529 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
530 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
531 # Test subclassing
532 class C(spam.spamlist):
533 def foo(self): return 1
534 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000535 vereq(a, [])
536 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000537 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000538 vereq(a, [100])
539 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000540 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000541 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000542
543def spamdicts():
544 if verbose: print "Testing spamdict operations..."
545 import copy, xxsubtype as spam
546 def spamdict(d, memo=None):
547 import xxsubtype as spam
548 sd = spam.spamdict()
549 for k, v in d.items(): sd[k] = v
550 return sd
551 # This is an ugly hack:
552 copy._deepcopy_dispatch[spam.spamdict] = spamdict
553
554 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
555 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
556 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
557 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
558 d = spamdict({1:2,3:4})
559 l1 = []
560 for i in d.keys(): l1.append(i)
561 l = []
562 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000563 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000564 l = []
565 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000566 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000567 l = []
568 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000569 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000570 straightd = {1:2, 3:4}
571 spamd = spamdict(straightd)
572 testunop(spamd, 2, "len(a)", "__len__")
573 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
574 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
575 "a[b]=c", "__setitem__")
576 # Test subclassing
577 class C(spam.spamdict):
578 def foo(self): return 1
579 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a.items(), [])
581 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.items(), [('foo', 'bar')])
584 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000587
588def pydicts():
589 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000590 verify(issubclass(dict, dict))
591 verify(isinstance({}, dict))
592 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000594 verify(d.__class__ is dict)
595 verify(isinstance(d, dict))
596 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597 state = -1
598 def __init__(self, *a, **kw):
599 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000600 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000601 self.state = a[0]
602 if kw:
603 for k, v in kw.items(): self[v] = k
604 def __getitem__(self, key):
605 return self.get(key, 0)
606 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000607 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000608 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000609 def setstate(self, state):
610 self.state = state
611 def getstate(self):
612 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000613 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000615 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000616 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000617 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000618 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000619 vereq(a.state, -1)
620 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000622 vereq(a.state, 0)
623 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000625 vereq(a.state, 10)
626 vereq(a.getstate(), 10)
627 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 if verbose: print "pydict stress test ..."
631 N = 50
632 for i in range(N):
633 a[i] = C()
634 for j in range(N):
635 a[i][j] = i*j
636 for i in range(N):
637 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000638 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000639
640def pylists():
641 if verbose: print "Testing Python subclass of list..."
642 class C(list):
643 def __getitem__(self, i):
644 return list.__getitem__(self, i) + 100
645 def __getslice__(self, i, j):
646 return (i, j)
647 a = C()
648 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000649 vereq(a[0], 100)
650 vereq(a[1], 101)
651 vereq(a[2], 102)
652 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000653
654def metaclass():
655 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000656 class C:
657 __metaclass__ = type
658 def __init__(self):
659 self.__state = 0
660 def getstate(self):
661 return self.__state
662 def setstate(self, state):
663 self.__state = state
664 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000665 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000666 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000667 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000668 class D:
669 class __metaclass__(type):
670 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000671 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000672 d = D()
673 verify(d.__class__ is D)
674 class M1(type):
675 def __new__(cls, name, bases, dict):
676 dict['__spam__'] = 1
677 return type.__new__(cls, name, bases, dict)
678 class C:
679 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000680 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000681 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000682 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000683
Guido van Rossum309b5662001-08-17 11:43:17 +0000684 class _instance(object):
685 pass
686 class M2(object):
687 def __new__(cls, name, bases, dict):
688 self = object.__new__(cls)
689 self.name = name
690 self.bases = bases
691 self.dict = dict
692 return self
693 __new__ = staticmethod(__new__)
694 def __call__(self):
695 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000696 # Early binding of methods
697 for key in self.dict:
698 if key.startswith("__"):
699 continue
700 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000701 return it
702 class C:
703 __metaclass__ = M2
704 def spam(self):
705 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000706 vereq(C.name, 'C')
707 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000708 verify('spam' in C.dict)
709 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000710 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000711
Guido van Rossum91ee7982001-08-30 20:52:40 +0000712 # More metaclass examples
713
714 class autosuper(type):
715 # Automatically add __super to the class
716 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000718 cls = super(autosuper, metaclass).__new__(metaclass,
719 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000720 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000721 while name[:1] == "_":
722 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000723 if name:
724 name = "_%s__super" % name
725 else:
726 name = "__super"
727 setattr(cls, name, super(cls))
728 return cls
729 class A:
730 __metaclass__ = autosuper
731 def meth(self):
732 return "A"
733 class B(A):
734 def meth(self):
735 return "B" + self.__super.meth()
736 class C(A):
737 def meth(self):
738 return "C" + self.__super.meth()
739 class D(C, B):
740 def meth(self):
741 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000742 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000743 class E(B, C):
744 def meth(self):
745 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000746 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000747
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000748 class autoproperty(type):
749 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000750 # named _get_x and/or _set_x are found
751 def __new__(metaclass, name, bases, dict):
752 hits = {}
753 for key, val in dict.iteritems():
754 if key.startswith("_get_"):
755 key = key[5:]
756 get, set = hits.get(key, (None, None))
757 get = val
758 hits[key] = get, set
759 elif key.startswith("_set_"):
760 key = key[5:]
761 get, set = hits.get(key, (None, None))
762 set = val
763 hits[key] = get, set
764 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000765 dict[key] = property(get, set)
766 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000767 name, bases, dict)
768 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000769 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000770 def _get_x(self):
771 return -self.__x
772 def _set_x(self, x):
773 self.__x = -x
774 a = A()
775 verify(not hasattr(a, "x"))
776 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000777 vereq(a.x, 12)
778 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000779
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000780 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000781 # Merge of multiple cooperating metaclasses
782 pass
783 class A:
784 __metaclass__ = multimetaclass
785 def _get_x(self):
786 return "A"
787 class B(A):
788 def _get_x(self):
789 return "B" + self.__super._get_x()
790 class C(A):
791 def _get_x(self):
792 return "C" + self.__super._get_x()
793 class D(C, B):
794 def _get_x(self):
795 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000796 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000797
Guido van Rossumf76de622001-10-18 15:49:21 +0000798 # Make sure type(x) doesn't call x.__class__.__init__
799 class T(type):
800 counter = 0
801 def __init__(self, *args):
802 T.counter += 1
803 class C:
804 __metaclass__ = T
805 vereq(T.counter, 1)
806 a = C()
807 vereq(type(a), C)
808 vereq(T.counter, 1)
809
Guido van Rossum29d26062001-12-11 04:37:34 +0000810 class C(object): pass
811 c = C()
812 try: c()
813 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000814 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000815
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816def pymods():
817 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000818 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000819 import sys
820 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000821 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000822 def __init__(self, name):
823 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000824 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000826 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827 def __setattr__(self, name, value):
828 log.append(("setattr", name, value))
829 MT.__setattr__(self, name, value)
830 def __delattr__(self, name):
831 log.append(("delattr", name))
832 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000833 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 a.foo = 12
835 x = a.foo
836 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000837 vereq(log, [("setattr", "foo", 12),
838 ("getattr", "foo"),
839 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840
841def multi():
842 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 class C(object):
844 def __init__(self):
845 self.__state = 0
846 def getstate(self):
847 return self.__state
848 def setstate(self, state):
849 self.__state = state
850 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000851 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000852 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000853 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000854 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855 def __init__(self):
856 type({}).__init__(self)
857 C.__init__(self)
858 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000859 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000861 vereq(d.items(), [("hello", "world")])
862 vereq(d["hello"], "world")
863 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000865 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000866 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867
Guido van Rossume45763a2001-08-10 21:28:46 +0000868 # SF bug #442833
869 class Node(object):
870 def __int__(self):
871 return int(self.foo())
872 def foo(self):
873 return "23"
874 class Frag(Node, list):
875 def foo(self):
876 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(Node().__int__(), 23)
878 vereq(int(Node()), 23)
879 vereq(Frag().__int__(), 42)
880 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000881
Tim Petersa91e9642001-11-14 23:32:33 +0000882 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000883
884 class A:
885 x = 1
886
887 class B(A):
888 pass
889
890 class C(A):
891 x = 2
892
893 class D(B, C):
894 pass
895 vereq(D.x, 1)
896
897 # Classic MRO is preserved for a classic base class.
898 class E(D, object):
899 pass
900 vereq(E.__mro__, (E, D, B, A, C, object))
901 vereq(E.x, 1)
902
903 # But with a mix of classic bases, their MROs are combined using
904 # new-style MRO.
905 class F(B, C, object):
906 pass
907 vereq(F.__mro__, (F, B, C, A, object))
908 vereq(F.x, 2)
909
910 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000911 class C:
912 def cmethod(self):
913 return "C a"
914 def all_method(self):
915 return "C b"
916
917 class M1(C, object):
918 def m1method(self):
919 return "M1 a"
920 def all_method(self):
921 return "M1 b"
922
923 vereq(M1.__mro__, (M1, C, object))
924 m = M1()
925 vereq(m.cmethod(), "C a")
926 vereq(m.m1method(), "M1 a")
927 vereq(m.all_method(), "M1 b")
928
929 class D(C):
930 def dmethod(self):
931 return "D a"
932 def all_method(self):
933 return "D b"
934
935 class M2(object, D):
936 def m2method(self):
937 return "M2 a"
938 def all_method(self):
939 return "M2 b"
940
941 vereq(M2.__mro__, (M2, object, D, C))
942 m = M2()
943 vereq(m.cmethod(), "C a")
944 vereq(m.dmethod(), "D a")
945 vereq(m.m2method(), "M2 a")
946 vereq(m.all_method(), "M2 b")
947
948 class M3(M1, object, M2):
949 def m3method(self):
950 return "M3 a"
951 def all_method(self):
952 return "M3 b"
953 # XXX Expected this (the commented-out result):
954 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
955 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000956 m = M3()
957 vereq(m.cmethod(), "C a")
958 vereq(m.dmethod(), "D a")
959 vereq(m.m1method(), "M1 a")
960 vereq(m.m2method(), "M2 a")
961 vereq(m.m3method(), "M3 a")
962 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000963
Guido van Rossume54616c2001-12-14 04:19:56 +0000964 class Classic:
965 pass
966 try:
967 class New(Classic):
968 __metaclass__ = type
969 except TypeError:
970 pass
971 else:
972 raise TestFailed, "new class with only classic bases - shouldn't be"
973
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974def diamond():
975 if verbose: print "Testing multiple inheritance special cases..."
976 class A(object):
977 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000978 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000979 class B(A):
980 def boo(self): return "B"
981 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000982 vereq(B().spam(), "B")
983 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 class C(A):
985 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000986 vereq(C().spam(), "A")
987 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000988 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000989 vereq(D().spam(), "B")
990 vereq(D().boo(), "B")
991 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000992 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000993 vereq(E().spam(), "B")
994 vereq(E().boo(), "C")
995 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000996 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000997 vereq(F().spam(), "B")
998 vereq(F().boo(), "B")
999 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001000 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +00001001 vereq(G().spam(), "B")
1002 vereq(G().boo(), "C")
1003 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001004
Guido van Rossum37202612001-08-09 19:45:21 +00001005def objects():
1006 if verbose: print "Testing object class..."
1007 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001008 vereq(a.__class__, object)
1009 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001010 b = object()
1011 verify(a is not b)
1012 verify(not hasattr(a, "foo"))
1013 try:
1014 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001015 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001016 pass
1017 else:
1018 verify(0, "object() should not allow setting a foo attribute")
1019 verify(not hasattr(object(), "__dict__"))
1020
1021 class Cdict(object):
1022 pass
1023 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001024 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001025 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001026 vereq(x.foo, 1)
1027 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001028
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029def slots():
1030 if verbose: print "Testing __slots__..."
1031 class C0(object):
1032 __slots__ = []
1033 x = C0()
1034 verify(not hasattr(x, "__dict__"))
1035 verify(not hasattr(x, "foo"))
1036
1037 class C1(object):
1038 __slots__ = ['a']
1039 x = C1()
1040 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001041 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001042 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001043 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001044 x.a = None
1045 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001046 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001047 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001048
1049 class C3(object):
1050 __slots__ = ['a', 'b', 'c']
1051 x = C3()
1052 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001053 verify(not hasattr(x, 'a'))
1054 verify(not hasattr(x, 'b'))
1055 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056 x.a = 1
1057 x.b = 2
1058 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001059 vereq(x.a, 1)
1060 vereq(x.b, 2)
1061 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001062
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001063 class C4(object):
1064 """Validate name mangling"""
1065 __slots__ = ['__a']
1066 def __init__(self, value):
1067 self.__a = value
1068 def get(self):
1069 return self.__a
1070 x = C4(5)
1071 verify(not hasattr(x, '__dict__'))
1072 verify(not hasattr(x, '__a'))
1073 vereq(x.get(), 5)
1074 try:
1075 x.__a = 6
1076 except AttributeError:
1077 pass
1078 else:
1079 raise TestFailed, "Double underscored names not mangled"
1080
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001081 # Make sure slot names are proper identifiers
1082 try:
1083 class C(object):
1084 __slots__ = [None]
1085 except TypeError:
1086 pass
1087 else:
1088 raise TestFailed, "[None] slots not caught"
1089 try:
1090 class C(object):
1091 __slots__ = ["foo bar"]
1092 except TypeError:
1093 pass
1094 else:
1095 raise TestFailed, "['foo bar'] slots not caught"
1096 try:
1097 class C(object):
1098 __slots__ = ["foo\0bar"]
1099 except TypeError:
1100 pass
1101 else:
1102 raise TestFailed, "['foo\\0bar'] slots not caught"
1103 try:
1104 class C(object):
1105 __slots__ = ["1"]
1106 except TypeError:
1107 pass
1108 else:
1109 raise TestFailed, "['1'] slots not caught"
1110 try:
1111 class C(object):
1112 __slots__ = [""]
1113 except TypeError:
1114 pass
1115 else:
1116 raise TestFailed, "[''] slots not caught"
1117 class C(object):
1118 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1119
Guido van Rossum33bab012001-12-05 22:45:48 +00001120 # Test leaks
1121 class Counted(object):
1122 counter = 0 # counts the number of instances alive
1123 def __init__(self):
1124 Counted.counter += 1
1125 def __del__(self):
1126 Counted.counter -= 1
1127 class C(object):
1128 __slots__ = ['a', 'b', 'c']
1129 x = C()
1130 x.a = Counted()
1131 x.b = Counted()
1132 x.c = Counted()
1133 vereq(Counted.counter, 3)
1134 del x
1135 vereq(Counted.counter, 0)
1136 class D(C):
1137 pass
1138 x = D()
1139 x.a = Counted()
1140 x.z = Counted()
1141 vereq(Counted.counter, 2)
1142 del x
1143 vereq(Counted.counter, 0)
1144 class E(D):
1145 __slots__ = ['e']
1146 x = E()
1147 x.a = Counted()
1148 x.z = Counted()
1149 x.e = Counted()
1150 vereq(Counted.counter, 3)
1151 del x
1152 vereq(Counted.counter, 0)
1153
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001154 # Test cyclical leaks [SF bug 519621]
1155 class F(object):
1156 __slots__ = ['a', 'b']
1157 log = []
1158 s = F()
1159 s.a = [Counted(), s]
1160 vereq(Counted.counter, 1)
1161 s = None
1162 import gc
1163 gc.collect()
1164 vereq(Counted.counter, 0)
1165
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001166 # Test lookup leaks [SF bug 572567]
1167 import sys,gc
1168 class G(object):
1169 def __cmp__(self, other):
1170 return 0
1171 g = G()
1172 orig_objects = len(gc.get_objects())
1173 for i in xrange(10):
1174 g==g
1175 new_objects = len(gc.get_objects())
1176 vereq(orig_objects, new_objects)
1177
Tim Peters6d6c1a32001-08-02 04:15:00 +00001178def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001179 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001180 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001181 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001182 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001183 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001184 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001185 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001186 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001187 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001188 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001189 vereq(E.foo, 1)
1190 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001191 # Test dynamic instances
1192 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001193 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001194 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001195 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001196 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001197 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001198 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001199 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001200 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001201 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001202 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001203 vereq(int(a), 100)
1204 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001205 verify(not hasattr(a, "spam"))
1206 def mygetattr(self, name):
1207 if name == "spam":
1208 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001209 raise AttributeError
1210 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001211 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001212 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001213 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001214 def mysetattr(self, name, value):
1215 if name == "spam":
1216 raise AttributeError
1217 return object.__setattr__(self, name, value)
1218 C.__setattr__ = mysetattr
1219 try:
1220 a.spam = "not spam"
1221 except AttributeError:
1222 pass
1223 else:
1224 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001225 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001226 class D(C):
1227 pass
1228 d = D()
1229 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001230 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001231
Guido van Rossum7e35d572001-09-15 03:14:32 +00001232 # Test handling of int*seq and seq*int
1233 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001234 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001235 vereq("a"*I(2), "aa")
1236 vereq(I(2)*"a", "aa")
1237 vereq(2*I(3), 6)
1238 vereq(I(3)*2, 6)
1239 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001240
1241 # Test handling of long*seq and seq*long
1242 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001243 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001244 vereq("a"*L(2L), "aa")
1245 vereq(L(2L)*"a", "aa")
1246 vereq(2*L(3), 6)
1247 vereq(L(3)*2, 6)
1248 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001249
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001250 # Test comparison of classes with dynamic metaclasses
1251 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001252 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001253 class someclass:
1254 __metaclass__ = dynamicmetaclass
1255 verify(someclass != object)
1256
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257def errors():
1258 if verbose: print "Testing errors..."
1259
1260 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001261 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001262 pass
1263 except TypeError:
1264 pass
1265 else:
1266 verify(0, "inheritance from both list and dict should be illegal")
1267
1268 try:
1269 class C(object, None):
1270 pass
1271 except TypeError:
1272 pass
1273 else:
1274 verify(0, "inheritance from non-type should be illegal")
1275 class Classic:
1276 pass
1277
1278 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001279 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280 pass
1281 except TypeError:
1282 pass
1283 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001284 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001285
1286 try:
1287 class C(object):
1288 __slots__ = 1
1289 except TypeError:
1290 pass
1291 else:
1292 verify(0, "__slots__ = 1 should be illegal")
1293
1294 try:
1295 class C(object):
1296 __slots__ = [1]
1297 except TypeError:
1298 pass
1299 else:
1300 verify(0, "__slots__ = [1] should be illegal")
1301
1302def classmethods():
1303 if verbose: print "Testing class methods..."
1304 class C(object):
1305 def foo(*a): return a
1306 goo = classmethod(foo)
1307 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001308 vereq(C.goo(1), (C, 1))
1309 vereq(c.goo(1), (C, 1))
1310 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001311 class D(C):
1312 pass
1313 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001314 vereq(D.goo(1), (D, 1))
1315 vereq(d.goo(1), (D, 1))
1316 vereq(d.foo(1), (d, 1))
1317 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001318 # Test for a specific crash (SF bug 528132)
1319 def f(cls, arg): return (cls, arg)
1320 ff = classmethod(f)
1321 vereq(ff.__get__(0, int)(42), (int, 42))
1322 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001323
Guido van Rossum155db9a2002-04-02 17:53:47 +00001324 # Test super() with classmethods (SF bug 535444)
1325 veris(C.goo.im_self, C)
1326 veris(D.goo.im_self, D)
1327 veris(super(D,D).goo.im_self, D)
1328 veris(super(D,d).goo.im_self, D)
1329 vereq(super(D,D).goo(), (D,))
1330 vereq(super(D,d).goo(), (D,))
1331
Fred Drakef841aa62002-03-28 15:49:54 +00001332def classmethods_in_c():
1333 if verbose: print "Testing C-based class methods..."
1334 import xxsubtype as spam
1335 a = (1, 2, 3)
1336 d = {'abc': 123}
1337 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1338 veris(x, None)
1339 vereq((spam.spamlist,) + a, a1)
1340 vereq(d, d1)
1341 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1342 veris(x, None)
1343 vereq((spam.spamlist,) + a, a1)
1344 vereq(d, d1)
1345
Tim Peters6d6c1a32001-08-02 04:15:00 +00001346def staticmethods():
1347 if verbose: print "Testing static methods..."
1348 class C(object):
1349 def foo(*a): return a
1350 goo = staticmethod(foo)
1351 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001352 vereq(C.goo(1), (1,))
1353 vereq(c.goo(1), (1,))
1354 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001355 class D(C):
1356 pass
1357 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001358 vereq(D.goo(1), (1,))
1359 vereq(d.goo(1), (1,))
1360 vereq(d.foo(1), (d, 1))
1361 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001362
Fred Drakef841aa62002-03-28 15:49:54 +00001363def staticmethods_in_c():
1364 if verbose: print "Testing C-based static methods..."
1365 import xxsubtype as spam
1366 a = (1, 2, 3)
1367 d = {"abc": 123}
1368 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1369 veris(x, None)
1370 vereq(a, a1)
1371 vereq(d, d1)
1372 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1373 veris(x, None)
1374 vereq(a, a1)
1375 vereq(d, d1)
1376
Tim Peters6d6c1a32001-08-02 04:15:00 +00001377def classic():
1378 if verbose: print "Testing classic classes..."
1379 class C:
1380 def foo(*a): return a
1381 goo = classmethod(foo)
1382 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001383 vereq(C.goo(1), (C, 1))
1384 vereq(c.goo(1), (C, 1))
1385 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001386 class D(C):
1387 pass
1388 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001389 vereq(D.goo(1), (D, 1))
1390 vereq(d.goo(1), (D, 1))
1391 vereq(d.foo(1), (d, 1))
1392 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001393 class E: # *not* subclassing from C
1394 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001395 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001396 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001397
1398def compattr():
1399 if verbose: print "Testing computed attributes..."
1400 class C(object):
1401 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001402 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001403 self.__get = get
1404 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001405 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001406 def __get__(self, obj, type=None):
1407 return self.__get(obj)
1408 def __set__(self, obj, value):
1409 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001410 def __delete__(self, obj):
1411 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001412 def __init__(self):
1413 self.__x = 0
1414 def __get_x(self):
1415 x = self.__x
1416 self.__x = x+1
1417 return x
1418 def __set_x(self, x):
1419 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001420 def __delete_x(self):
1421 del self.__x
1422 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001423 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001424 vereq(a.x, 0)
1425 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001426 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001427 vereq(a.x, 10)
1428 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001429 del a.x
1430 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001431
1432def newslot():
1433 if verbose: print "Testing __new__ slot override..."
1434 class C(list):
1435 def __new__(cls):
1436 self = list.__new__(cls)
1437 self.foo = 1
1438 return self
1439 def __init__(self):
1440 self.foo = self.foo + 2
1441 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001442 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001443 verify(a.__class__ is C)
1444 class D(C):
1445 pass
1446 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001447 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001448 verify(b.__class__ is D)
1449
Tim Peters6d6c1a32001-08-02 04:15:00 +00001450def altmro():
1451 if verbose: print "Testing mro() and overriding it..."
1452 class A(object):
1453 def f(self): return "A"
1454 class B(A):
1455 pass
1456 class C(A):
1457 def f(self): return "C"
1458 class D(B, C):
1459 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001460 vereq(D.mro(), [D, B, C, A, object])
1461 vereq(D.__mro__, (D, B, C, A, object))
1462 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001463 class PerverseMetaType(type):
1464 def mro(cls):
1465 L = type.mro(cls)
1466 L.reverse()
1467 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001468 class X(A,B,C,D):
1469 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001470 vereq(X.__mro__, (object, A, C, B, D, X))
1471 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001472
1473def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001474 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001475
1476 class B(object):
1477 "Intermediate class because object doesn't have a __setattr__"
1478
1479 class C(B):
1480
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001481 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001482 if name == "foo":
1483 return ("getattr", name)
1484 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001485 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001486 def __setattr__(self, name, value):
1487 if name == "foo":
1488 self.setattr = (name, value)
1489 else:
1490 return B.__setattr__(self, name, value)
1491 def __delattr__(self, name):
1492 if name == "foo":
1493 self.delattr = name
1494 else:
1495 return B.__delattr__(self, name)
1496
1497 def __getitem__(self, key):
1498 return ("getitem", key)
1499 def __setitem__(self, key, value):
1500 self.setitem = (key, value)
1501 def __delitem__(self, key):
1502 self.delitem = key
1503
1504 def __getslice__(self, i, j):
1505 return ("getslice", i, j)
1506 def __setslice__(self, i, j, value):
1507 self.setslice = (i, j, value)
1508 def __delslice__(self, i, j):
1509 self.delslice = (i, j)
1510
1511 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001512 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001514 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001515 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001516 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001517
Guido van Rossum45704552001-10-08 16:35:45 +00001518 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001519 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001520 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001521 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001522 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001523
Guido van Rossum45704552001-10-08 16:35:45 +00001524 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001525 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001526 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001527 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001528 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001529
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001530def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001531 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001532 class C(object):
1533 def __init__(self, x):
1534 self.x = x
1535 def foo(self):
1536 return self.x
1537 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001538 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001539 class D(C):
1540 boo = C.foo
1541 goo = c1.foo
1542 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001543 vereq(d2.foo(), 2)
1544 vereq(d2.boo(), 2)
1545 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001546 class E(object):
1547 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001548 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001549 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001550
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001551def specials():
1552 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001553 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001554 # Test the default behavior for static classes
1555 class C(object):
1556 def __getitem__(self, i):
1557 if 0 <= i < 10: return i
1558 raise IndexError
1559 c1 = C()
1560 c2 = C()
1561 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001562 vereq(hash(c1), id(c1))
1563 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1564 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001565 verify(c1 != c2)
1566 verify(not c1 != c1)
1567 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001568 # Note that the module name appears in str/repr, and that varies
1569 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001570 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001571 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001572 verify(-1 not in c1)
1573 for i in range(10):
1574 verify(i in c1)
1575 verify(10 not in c1)
1576 # Test the default behavior for dynamic classes
1577 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001578 def __getitem__(self, i):
1579 if 0 <= i < 10: return i
1580 raise IndexError
1581 d1 = D()
1582 d2 = D()
1583 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001584 vereq(hash(d1), id(d1))
1585 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1586 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001587 verify(d1 != d2)
1588 verify(not d1 != d1)
1589 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001590 # Note that the module name appears in str/repr, and that varies
1591 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001592 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001593 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001594 verify(-1 not in d1)
1595 for i in range(10):
1596 verify(i in d1)
1597 verify(10 not in d1)
1598 # Test overridden behavior for static classes
1599 class Proxy(object):
1600 def __init__(self, x):
1601 self.x = x
1602 def __nonzero__(self):
1603 return not not self.x
1604 def __hash__(self):
1605 return hash(self.x)
1606 def __eq__(self, other):
1607 return self.x == other
1608 def __ne__(self, other):
1609 return self.x != other
1610 def __cmp__(self, other):
1611 return cmp(self.x, other.x)
1612 def __str__(self):
1613 return "Proxy:%s" % self.x
1614 def __repr__(self):
1615 return "Proxy(%r)" % self.x
1616 def __contains__(self, value):
1617 return value in self.x
1618 p0 = Proxy(0)
1619 p1 = Proxy(1)
1620 p_1 = Proxy(-1)
1621 verify(not p0)
1622 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001623 vereq(hash(p0), hash(0))
1624 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001625 verify(p0 != p1)
1626 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001627 vereq(not p0, p1)
1628 vereq(cmp(p0, p1), -1)
1629 vereq(cmp(p0, p0), 0)
1630 vereq(cmp(p0, p_1), 1)
1631 vereq(str(p0), "Proxy:0")
1632 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001633 p10 = Proxy(range(10))
1634 verify(-1 not in p10)
1635 for i in range(10):
1636 verify(i in p10)
1637 verify(10 not in p10)
1638 # Test overridden behavior for dynamic classes
1639 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001640 def __init__(self, x):
1641 self.x = x
1642 def __nonzero__(self):
1643 return not not self.x
1644 def __hash__(self):
1645 return hash(self.x)
1646 def __eq__(self, other):
1647 return self.x == other
1648 def __ne__(self, other):
1649 return self.x != other
1650 def __cmp__(self, other):
1651 return cmp(self.x, other.x)
1652 def __str__(self):
1653 return "DProxy:%s" % self.x
1654 def __repr__(self):
1655 return "DProxy(%r)" % self.x
1656 def __contains__(self, value):
1657 return value in self.x
1658 p0 = DProxy(0)
1659 p1 = DProxy(1)
1660 p_1 = DProxy(-1)
1661 verify(not p0)
1662 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001663 vereq(hash(p0), hash(0))
1664 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001665 verify(p0 != p1)
1666 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(not p0, p1)
1668 vereq(cmp(p0, p1), -1)
1669 vereq(cmp(p0, p0), 0)
1670 vereq(cmp(p0, p_1), 1)
1671 vereq(str(p0), "DProxy:0")
1672 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001673 p10 = DProxy(range(10))
1674 verify(-1 not in p10)
1675 for i in range(10):
1676 verify(i in p10)
1677 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001678 # Safety test for __cmp__
1679 def unsafecmp(a, b):
1680 try:
1681 a.__class__.__cmp__(a, b)
1682 except TypeError:
1683 pass
1684 else:
1685 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1686 a.__class__, a, b)
1687 unsafecmp(u"123", "123")
1688 unsafecmp("123", u"123")
1689 unsafecmp(1, 1.0)
1690 unsafecmp(1.0, 1)
1691 unsafecmp(1, 1L)
1692 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001693
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001694def weakrefs():
1695 if verbose: print "Testing weak references..."
1696 import weakref
1697 class C(object):
1698 pass
1699 c = C()
1700 r = weakref.ref(c)
1701 verify(r() is c)
1702 del c
1703 verify(r() is None)
1704 del r
1705 class NoWeak(object):
1706 __slots__ = ['foo']
1707 no = NoWeak()
1708 try:
1709 weakref.ref(no)
1710 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001711 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001712 else:
1713 verify(0, "weakref.ref(no) should be illegal")
1714 class Weak(object):
1715 __slots__ = ['foo', '__weakref__']
1716 yes = Weak()
1717 r = weakref.ref(yes)
1718 verify(r() is yes)
1719 del yes
1720 verify(r() is None)
1721 del r
1722
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001723def properties():
1724 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001725 class C(object):
1726 def getx(self):
1727 return self.__x
1728 def setx(self, value):
1729 self.__x = value
1730 def delx(self):
1731 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001732 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001733 a = C()
1734 verify(not hasattr(a, "x"))
1735 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001736 vereq(a._C__x, 42)
1737 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001738 del a.x
1739 verify(not hasattr(a, "x"))
1740 verify(not hasattr(a, "_C__x"))
1741 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001742 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001743 C.x.__delete__(a)
1744 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001745
Tim Peters66c1a522001-09-24 21:17:50 +00001746 raw = C.__dict__['x']
1747 verify(isinstance(raw, property))
1748
1749 attrs = dir(raw)
1750 verify("__doc__" in attrs)
1751 verify("fget" in attrs)
1752 verify("fset" in attrs)
1753 verify("fdel" in attrs)
1754
Guido van Rossum45704552001-10-08 16:35:45 +00001755 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001756 verify(raw.fget is C.__dict__['getx'])
1757 verify(raw.fset is C.__dict__['setx'])
1758 verify(raw.fdel is C.__dict__['delx'])
1759
1760 for attr in "__doc__", "fget", "fset", "fdel":
1761 try:
1762 setattr(raw, attr, 42)
1763 except TypeError, msg:
1764 if str(msg).find('readonly') < 0:
1765 raise TestFailed("when setting readonly attr %r on a "
1766 "property, got unexpected TypeError "
1767 "msg %r" % (attr, str(msg)))
1768 else:
1769 raise TestFailed("expected TypeError from trying to set "
1770 "readonly %r attr on a property" % attr)
1771
Guido van Rossumc4a18802001-08-24 16:55:27 +00001772def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001773 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001774
1775 class A(object):
1776 def meth(self, a):
1777 return "A(%r)" % a
1778
Guido van Rossum45704552001-10-08 16:35:45 +00001779 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001780
1781 class B(A):
1782 def __init__(self):
1783 self.__super = super(B, self)
1784 def meth(self, a):
1785 return "B(%r)" % a + self.__super.meth(a)
1786
Guido van Rossum45704552001-10-08 16:35:45 +00001787 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001788
1789 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001790 def meth(self, a):
1791 return "C(%r)" % a + self.__super.meth(a)
1792 C._C__super = super(C)
1793
Guido van Rossum45704552001-10-08 16:35:45 +00001794 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001795
1796 class D(C, B):
1797 def meth(self, a):
1798 return "D(%r)" % a + super(D, self).meth(a)
1799
Guido van Rossum5b443c62001-12-03 15:38:28 +00001800 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1801
1802 # Test for subclassing super
1803
1804 class mysuper(super):
1805 def __init__(self, *args):
1806 return super(mysuper, self).__init__(*args)
1807
1808 class E(D):
1809 def meth(self, a):
1810 return "E(%r)" % a + mysuper(E, self).meth(a)
1811
1812 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1813
1814 class F(E):
1815 def meth(self, a):
1816 s = self.__super
1817 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1818 F._F__super = mysuper(F)
1819
1820 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1821
1822 # Make sure certain errors are raised
1823
1824 try:
1825 super(D, 42)
1826 except TypeError:
1827 pass
1828 else:
1829 raise TestFailed, "shouldn't allow super(D, 42)"
1830
1831 try:
1832 super(D, C())
1833 except TypeError:
1834 pass
1835 else:
1836 raise TestFailed, "shouldn't allow super(D, C())"
1837
1838 try:
1839 super(D).__get__(12)
1840 except TypeError:
1841 pass
1842 else:
1843 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1844
1845 try:
1846 super(D).__get__(C())
1847 except TypeError:
1848 pass
1849 else:
1850 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001851
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001852def inherits():
1853 if verbose: print "Testing inheritance from basic types..."
1854
1855 class hexint(int):
1856 def __repr__(self):
1857 return hex(self)
1858 def __add__(self, other):
1859 return hexint(int.__add__(self, other))
1860 # (Note that overriding __radd__ doesn't work,
1861 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001862 vereq(repr(hexint(7) + 9), "0x10")
1863 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001864 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001865 vereq(a, 12345)
1866 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001867 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001868 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001869 verify((+a).__class__ is int)
1870 verify((a >> 0).__class__ is int)
1871 verify((a << 0).__class__ is int)
1872 verify((hexint(0) << 12).__class__ is int)
1873 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001874
1875 class octlong(long):
1876 __slots__ = []
1877 def __str__(self):
1878 s = oct(self)
1879 if s[-1] == 'L':
1880 s = s[:-1]
1881 return s
1882 def __add__(self, other):
1883 return self.__class__(super(octlong, self).__add__(other))
1884 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001885 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001886 # (Note that overriding __radd__ here only seems to work
1887 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001888 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001889 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001890 vereq(a, 12345L)
1891 vereq(long(a), 12345L)
1892 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001893 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001894 verify((+a).__class__ is long)
1895 verify((-a).__class__ is long)
1896 verify((-octlong(0)).__class__ is long)
1897 verify((a >> 0).__class__ is long)
1898 verify((a << 0).__class__ is long)
1899 verify((a - 0).__class__ is long)
1900 verify((a * 1).__class__ is long)
1901 verify((a ** 1).__class__ is long)
1902 verify((a // 1).__class__ is long)
1903 verify((1 * a).__class__ is long)
1904 verify((a | 0).__class__ is long)
1905 verify((a ^ 0).__class__ is long)
1906 verify((a & -1L).__class__ is long)
1907 verify((octlong(0) << 12).__class__ is long)
1908 verify((octlong(0) >> 12).__class__ is long)
1909 verify(abs(octlong(0)).__class__ is long)
1910
1911 # Because octlong overrides __add__, we can't check the absence of +0
1912 # optimizations using octlong.
1913 class longclone(long):
1914 pass
1915 a = longclone(1)
1916 verify((a + 0).__class__ is long)
1917 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001918
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001919 # Check that negative clones don't segfault
1920 a = longclone(-1)
1921 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001922 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001923
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001924 class precfloat(float):
1925 __slots__ = ['prec']
1926 def __init__(self, value=0.0, prec=12):
1927 self.prec = int(prec)
1928 float.__init__(value)
1929 def __repr__(self):
1930 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001931 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001932 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001933 vereq(a, 12345.0)
1934 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001935 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001936 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001937 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001938
Tim Peters2400fa42001-09-12 19:12:49 +00001939 class madcomplex(complex):
1940 def __repr__(self):
1941 return "%.17gj%+.17g" % (self.imag, self.real)
1942 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001944 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001945 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001946 vereq(a, base)
1947 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001948 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001949 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001950 vereq(repr(a), "4j-3")
1951 vereq(a, base)
1952 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001953 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001954 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001955 veris((+a).__class__, complex)
1956 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001957 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001958 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001959 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001960 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001961 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001962 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001963 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001964
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001965 class madtuple(tuple):
1966 _rev = None
1967 def rev(self):
1968 if self._rev is not None:
1969 return self._rev
1970 L = list(self)
1971 L.reverse()
1972 self._rev = self.__class__(L)
1973 return self._rev
1974 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001975 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1976 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1977 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001978 for i in range(512):
1979 t = madtuple(range(i))
1980 u = t.rev()
1981 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001982 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001983 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001984 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001985 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001986 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001987 verify(a[:].__class__ is tuple)
1988 verify((a * 1).__class__ is tuple)
1989 verify((a * 0).__class__ is tuple)
1990 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001991 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001992 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001993 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001994 verify((a + a).__class__ is tuple)
1995 verify((a * 0).__class__ is tuple)
1996 verify((a * 1).__class__ is tuple)
1997 verify((a * 2).__class__ is tuple)
1998 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001999
2000 class madstring(str):
2001 _rev = None
2002 def rev(self):
2003 if self._rev is not None:
2004 return self._rev
2005 L = list(self)
2006 L.reverse()
2007 self._rev = self.__class__("".join(L))
2008 return self._rev
2009 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002010 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2011 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2012 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002013 for i in range(256):
2014 s = madstring("".join(map(chr, range(i))))
2015 t = s.rev()
2016 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002017 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002018 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002019 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002020 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002021
Tim Peters8fa5dd02001-09-12 02:18:30 +00002022 base = "\x00" * 5
2023 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002024 vereq(s, base)
2025 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002026 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002027 vereq(hash(s), hash(base))
2028 vereq({s: 1}[base], 1)
2029 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002030 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002031 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002032 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002033 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002034 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002035 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002036 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002037 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002038 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002039 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002040 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002041 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002042 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002043 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002044 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002045 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002046 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002047 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002048 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002049 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002050 identitytab = ''.join([chr(i) for i in range(256)])
2051 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002052 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002053 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002054 vereq(s.translate(identitytab, "x"), base)
2055 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002056 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002057 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002058 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002059 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002060 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002061 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002062 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002063 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002064 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002065 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002066
Tim Peters111f6092001-09-12 07:54:51 +00002067 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002068 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002069 verify(intern(s).__class__ is str)
2070 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002071 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002072
2073 i = intern("y x")
2074 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002075 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002076 verify(intern(s).__class__ is str)
2077 verify(intern(s) is i)
2078
2079 s = madstring(i)
2080 verify(intern(s).__class__ is str)
2081 verify(intern(s) is i)
2082
Guido van Rossum91ee7982001-08-30 20:52:40 +00002083 class madunicode(unicode):
2084 _rev = None
2085 def rev(self):
2086 if self._rev is not None:
2087 return self._rev
2088 L = list(self)
2089 L.reverse()
2090 self._rev = self.__class__(u"".join(L))
2091 return self._rev
2092 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002093 vereq(u, u"ABCDEF")
2094 vereq(u.rev(), madunicode(u"FEDCBA"))
2095 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002096 base = u"12345"
2097 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002098 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002099 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002100 vereq(hash(u), hash(base))
2101 vereq({u: 1}[base], 1)
2102 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002103 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002104 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002105 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002106 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002107 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002108 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002109 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002110 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002111 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002112 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002113 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002114 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002115 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002116 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002117 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002118 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002119 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002120 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002121 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002122 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002123 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002124 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002125 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002126 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002127 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002128 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002129 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002130 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002131 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002132 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002133 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002134 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002135 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002136 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002137 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002138 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002139 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002140 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002141
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002142 class sublist(list):
2143 pass
2144 a = sublist(range(5))
2145 vereq(a, range(5))
2146 a.append("hello")
2147 vereq(a, range(5) + ["hello"])
2148 a[5] = 5
2149 vereq(a, range(6))
2150 a.extend(range(6, 20))
2151 vereq(a, range(20))
2152 a[-5:] = []
2153 vereq(a, range(15))
2154 del a[10:15]
2155 vereq(len(a), 10)
2156 vereq(a, range(10))
2157 vereq(list(a), range(10))
2158 vereq(a[0], 0)
2159 vereq(a[9], 9)
2160 vereq(a[-10], 0)
2161 vereq(a[-1], 9)
2162 vereq(a[:5], range(5))
2163
Tim Peters59c9a642001-09-13 05:38:56 +00002164 class CountedInput(file):
2165 """Counts lines read by self.readline().
2166
2167 self.lineno is the 0-based ordinal of the last line read, up to
2168 a maximum of one greater than the number of lines in the file.
2169
2170 self.ateof is true if and only if the final "" line has been read,
2171 at which point self.lineno stops incrementing, and further calls
2172 to readline() continue to return "".
2173 """
2174
2175 lineno = 0
2176 ateof = 0
2177 def readline(self):
2178 if self.ateof:
2179 return ""
2180 s = file.readline(self)
2181 # Next line works too.
2182 # s = super(CountedInput, self).readline()
2183 self.lineno += 1
2184 if s == "":
2185 self.ateof = 1
2186 return s
2187
Tim Peters561f8992001-09-13 19:36:36 +00002188 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002189 lines = ['a\n', 'b\n', 'c\n']
2190 try:
2191 f.writelines(lines)
2192 f.close()
2193 f = CountedInput(TESTFN)
2194 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2195 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002196 vereq(expected, got)
2197 vereq(f.lineno, i)
2198 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002199 f.close()
2200 finally:
2201 try:
2202 f.close()
2203 except:
2204 pass
2205 try:
2206 import os
2207 os.unlink(TESTFN)
2208 except:
2209 pass
2210
Tim Peters808b94e2001-09-13 19:33:07 +00002211def keywords():
2212 if verbose:
2213 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(int(x=1), 1)
2215 vereq(float(x=2), 2.0)
2216 vereq(long(x=3), 3L)
2217 vereq(complex(imag=42, real=666), complex(666, 42))
2218 vereq(str(object=500), '500')
2219 vereq(unicode(string='abc', errors='strict'), u'abc')
2220 vereq(tuple(sequence=range(3)), (0, 1, 2))
2221 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002222 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002223
2224 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002225 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002226 try:
2227 constructor(bogus_keyword_arg=1)
2228 except TypeError:
2229 pass
2230 else:
2231 raise TestFailed("expected TypeError from bogus keyword "
2232 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002233
Tim Peters8fa45672001-09-13 21:01:29 +00002234def restricted():
2235 import rexec
2236 if verbose:
2237 print "Testing interaction with restricted execution ..."
2238
2239 sandbox = rexec.RExec()
2240
2241 code1 = """f = open(%r, 'w')""" % TESTFN
2242 code2 = """f = file(%r, 'w')""" % TESTFN
2243 code3 = """\
2244f = open(%r)
2245t = type(f) # a sneaky way to get the file() constructor
2246f.close()
2247f = t(%r, 'w') # rexec can't catch this by itself
2248""" % (TESTFN, TESTFN)
2249
2250 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2251 f.close()
2252
2253 try:
2254 for code in code1, code2, code3:
2255 try:
2256 sandbox.r_exec(code)
2257 except IOError, msg:
2258 if str(msg).find("restricted") >= 0:
2259 outcome = "OK"
2260 else:
2261 outcome = "got an exception, but not an expected one"
2262 else:
2263 outcome = "expected a restricted-execution exception"
2264
2265 if outcome != "OK":
2266 raise TestFailed("%s, in %r" % (outcome, code))
2267
2268 finally:
2269 try:
2270 import os
2271 os.unlink(TESTFN)
2272 except:
2273 pass
2274
Tim Peters0ab085c2001-09-14 00:25:33 +00002275def str_subclass_as_dict_key():
2276 if verbose:
2277 print "Testing a str subclass used as dict key .."
2278
2279 class cistr(str):
2280 """Sublcass of str that computes __eq__ case-insensitively.
2281
2282 Also computes a hash code of the string in canonical form.
2283 """
2284
2285 def __init__(self, value):
2286 self.canonical = value.lower()
2287 self.hashcode = hash(self.canonical)
2288
2289 def __eq__(self, other):
2290 if not isinstance(other, cistr):
2291 other = cistr(other)
2292 return self.canonical == other.canonical
2293
2294 def __hash__(self):
2295 return self.hashcode
2296
Guido van Rossum45704552001-10-08 16:35:45 +00002297 vereq(cistr('ABC'), 'abc')
2298 vereq('aBc', cistr('ABC'))
2299 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002300
2301 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002302 vereq(d[cistr('one')], 1)
2303 vereq(d[cistr('tWo')], 2)
2304 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002305 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002306 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002307
Guido van Rossumab3b0342001-09-18 20:38:53 +00002308def classic_comparisons():
2309 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002310 class classic:
2311 pass
2312 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002313 if verbose: print " (base = %s)" % base
2314 class C(base):
2315 def __init__(self, value):
2316 self.value = int(value)
2317 def __cmp__(self, other):
2318 if isinstance(other, C):
2319 return cmp(self.value, other.value)
2320 if isinstance(other, int) or isinstance(other, long):
2321 return cmp(self.value, other)
2322 return NotImplemented
2323 c1 = C(1)
2324 c2 = C(2)
2325 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002326 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002327 c = {1: c1, 2: c2, 3: c3}
2328 for x in 1, 2, 3:
2329 for y in 1, 2, 3:
2330 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2331 for op in "<", "<=", "==", "!=", ">", ">=":
2332 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2333 "x=%d, y=%d" % (x, y))
2334 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2335 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2336
Guido van Rossum0639f592001-09-18 21:06:04 +00002337def rich_comparisons():
2338 if verbose:
2339 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002340 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002341 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002342 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(z, 1+0j)
2344 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002345 class ZZ(complex):
2346 def __eq__(self, other):
2347 try:
2348 return abs(self - other) <= 1e-6
2349 except:
2350 return NotImplemented
2351 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002352 vereq(zz, 1+0j)
2353 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002354
Guido van Rossum0639f592001-09-18 21:06:04 +00002355 class classic:
2356 pass
2357 for base in (classic, int, object, list):
2358 if verbose: print " (base = %s)" % base
2359 class C(base):
2360 def __init__(self, value):
2361 self.value = int(value)
2362 def __cmp__(self, other):
2363 raise TestFailed, "shouldn't call __cmp__"
2364 def __eq__(self, other):
2365 if isinstance(other, C):
2366 return self.value == other.value
2367 if isinstance(other, int) or isinstance(other, long):
2368 return self.value == other
2369 return NotImplemented
2370 def __ne__(self, other):
2371 if isinstance(other, C):
2372 return self.value != other.value
2373 if isinstance(other, int) or isinstance(other, long):
2374 return self.value != other
2375 return NotImplemented
2376 def __lt__(self, other):
2377 if isinstance(other, C):
2378 return self.value < other.value
2379 if isinstance(other, int) or isinstance(other, long):
2380 return self.value < other
2381 return NotImplemented
2382 def __le__(self, other):
2383 if isinstance(other, C):
2384 return self.value <= other.value
2385 if isinstance(other, int) or isinstance(other, long):
2386 return self.value <= other
2387 return NotImplemented
2388 def __gt__(self, other):
2389 if isinstance(other, C):
2390 return self.value > other.value
2391 if isinstance(other, int) or isinstance(other, long):
2392 return self.value > other
2393 return NotImplemented
2394 def __ge__(self, other):
2395 if isinstance(other, C):
2396 return self.value >= other.value
2397 if isinstance(other, int) or isinstance(other, long):
2398 return self.value >= other
2399 return NotImplemented
2400 c1 = C(1)
2401 c2 = C(2)
2402 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002403 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002404 c = {1: c1, 2: c2, 3: c3}
2405 for x in 1, 2, 3:
2406 for y in 1, 2, 3:
2407 for op in "<", "<=", "==", "!=", ">", ">=":
2408 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2409 "x=%d, y=%d" % (x, y))
2410 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2411 "x=%d, y=%d" % (x, y))
2412 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2413 "x=%d, y=%d" % (x, y))
2414
Guido van Rossum1952e382001-09-19 01:25:16 +00002415def coercions():
2416 if verbose: print "Testing coercions..."
2417 class I(int): pass
2418 coerce(I(0), 0)
2419 coerce(0, I(0))
2420 class L(long): pass
2421 coerce(L(0), 0)
2422 coerce(L(0), 0L)
2423 coerce(0, L(0))
2424 coerce(0L, L(0))
2425 class F(float): pass
2426 coerce(F(0), 0)
2427 coerce(F(0), 0L)
2428 coerce(F(0), 0.)
2429 coerce(0, F(0))
2430 coerce(0L, F(0))
2431 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002432 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002433 coerce(C(0), 0)
2434 coerce(C(0), 0L)
2435 coerce(C(0), 0.)
2436 coerce(C(0), 0j)
2437 coerce(0, C(0))
2438 coerce(0L, C(0))
2439 coerce(0., C(0))
2440 coerce(0j, C(0))
2441
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002442def descrdoc():
2443 if verbose: print "Testing descriptor doc strings..."
2444 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002445 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002446 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002447 check(file.name, "file name") # member descriptor
2448
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002449def setclass():
2450 if verbose: print "Testing __class__ assignment..."
2451 class C(object): pass
2452 class D(object): pass
2453 class E(object): pass
2454 class F(D, E): pass
2455 for cls in C, D, E, F:
2456 for cls2 in C, D, E, F:
2457 x = cls()
2458 x.__class__ = cls2
2459 verify(x.__class__ is cls2)
2460 x.__class__ = cls
2461 verify(x.__class__ is cls)
2462 def cant(x, C):
2463 try:
2464 x.__class__ = C
2465 except TypeError:
2466 pass
2467 else:
2468 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002469 try:
2470 delattr(x, "__class__")
2471 except TypeError:
2472 pass
2473 else:
2474 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002475 cant(C(), list)
2476 cant(list(), C)
2477 cant(C(), 1)
2478 cant(C(), object)
2479 cant(object(), list)
2480 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002481 class Int(int): __slots__ = []
2482 cant(2, Int)
2483 cant(Int(), int)
2484 cant(True, int)
2485 cant(2, bool)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002486
Guido van Rossum6661be32001-10-26 04:26:12 +00002487def setdict():
2488 if verbose: print "Testing __dict__ assignment..."
2489 class C(object): pass
2490 a = C()
2491 a.__dict__ = {'b': 1}
2492 vereq(a.b, 1)
2493 def cant(x, dict):
2494 try:
2495 x.__dict__ = dict
2496 except TypeError:
2497 pass
2498 else:
2499 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2500 cant(a, None)
2501 cant(a, [])
2502 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002503 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002504 # Classes don't allow __dict__ assignment
2505 cant(C, {})
2506
Guido van Rossum3926a632001-09-25 16:25:58 +00002507def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002508 if verbose:
2509 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002510 import pickle, cPickle
2511
2512 def sorteditems(d):
2513 L = d.items()
2514 L.sort()
2515 return L
2516
2517 global C
2518 class C(object):
2519 def __init__(self, a, b):
2520 super(C, self).__init__()
2521 self.a = a
2522 self.b = b
2523 def __repr__(self):
2524 return "C(%r, %r)" % (self.a, self.b)
2525
2526 global C1
2527 class C1(list):
2528 def __new__(cls, a, b):
2529 return super(C1, cls).__new__(cls)
2530 def __init__(self, a, b):
2531 self.a = a
2532 self.b = b
2533 def __repr__(self):
2534 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2535
2536 global C2
2537 class C2(int):
2538 def __new__(cls, a, b, val=0):
2539 return super(C2, cls).__new__(cls, val)
2540 def __init__(self, a, b, val=0):
2541 self.a = a
2542 self.b = b
2543 def __repr__(self):
2544 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2545
Guido van Rossum90c45142001-11-24 21:07:01 +00002546 global C3
2547 class C3(object):
2548 def __init__(self, foo):
2549 self.foo = foo
2550 def __getstate__(self):
2551 return self.foo
2552 def __setstate__(self, foo):
2553 self.foo = foo
2554
2555 global C4classic, C4
2556 class C4classic: # classic
2557 pass
2558 class C4(C4classic, object): # mixed inheritance
2559 pass
2560
Guido van Rossum3926a632001-09-25 16:25:58 +00002561 for p in pickle, cPickle:
2562 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002563 if verbose:
2564 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002565
2566 for cls in C, C1, C2:
2567 s = p.dumps(cls, bin)
2568 cls2 = p.loads(s)
2569 verify(cls2 is cls)
2570
2571 a = C1(1, 2); a.append(42); a.append(24)
2572 b = C2("hello", "world", 42)
2573 s = p.dumps((a, b), bin)
2574 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002575 vereq(x.__class__, a.__class__)
2576 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2577 vereq(y.__class__, b.__class__)
2578 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2579 vereq(`x`, `a`)
2580 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002581 if verbose:
2582 print "a = x =", a
2583 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002584 # Test for __getstate__ and __setstate__ on new style class
2585 u = C3(42)
2586 s = p.dumps(u, bin)
2587 v = p.loads(s)
2588 veris(u.__class__, v.__class__)
2589 vereq(u.foo, v.foo)
2590 # Test for picklability of hybrid class
2591 u = C4()
2592 u.foo = 42
2593 s = p.dumps(u, bin)
2594 v = p.loads(s)
2595 veris(u.__class__, v.__class__)
2596 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002597
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002598 # Testing copy.deepcopy()
2599 if verbose:
2600 print "deepcopy"
2601 import copy
2602 for cls in C, C1, C2:
2603 cls2 = copy.deepcopy(cls)
2604 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002605
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002606 a = C1(1, 2); a.append(42); a.append(24)
2607 b = C2("hello", "world", 42)
2608 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002609 vereq(x.__class__, a.__class__)
2610 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2611 vereq(y.__class__, b.__class__)
2612 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2613 vereq(`x`, `a`)
2614 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002615 if verbose:
2616 print "a = x =", a
2617 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002618
Guido van Rossum8c842552002-03-14 23:05:54 +00002619def pickleslots():
2620 if verbose: print "Testing pickling of classes with __slots__ ..."
2621 import pickle, cPickle
2622 # Pickling of classes with __slots__ but without __getstate__ should fail
2623 global B, C, D, E
2624 class B(object):
2625 pass
2626 for base in [object, B]:
2627 class C(base):
2628 __slots__ = ['a']
2629 class D(C):
2630 pass
2631 try:
2632 pickle.dumps(C())
2633 except TypeError:
2634 pass
2635 else:
2636 raise TestFailed, "should fail: pickle C instance - %s" % base
2637 try:
2638 cPickle.dumps(C())
2639 except TypeError:
2640 pass
2641 else:
2642 raise TestFailed, "should fail: cPickle C instance - %s" % base
2643 try:
2644 pickle.dumps(C())
2645 except TypeError:
2646 pass
2647 else:
2648 raise TestFailed, "should fail: pickle D instance - %s" % base
2649 try:
2650 cPickle.dumps(D())
2651 except TypeError:
2652 pass
2653 else:
2654 raise TestFailed, "should fail: cPickle D instance - %s" % base
2655 # Give C a __getstate__ and __setstate__
2656 class C(base):
2657 __slots__ = ['a']
2658 def __getstate__(self):
2659 try:
2660 d = self.__dict__.copy()
2661 except AttributeError:
2662 d = {}
2663 try:
2664 d['a'] = self.a
2665 except AttributeError:
2666 pass
2667 return d
2668 def __setstate__(self, d):
2669 for k, v in d.items():
2670 setattr(self, k, v)
2671 class D(C):
2672 pass
2673 # Now it should work
2674 x = C()
2675 y = pickle.loads(pickle.dumps(x))
2676 vereq(hasattr(y, 'a'), 0)
2677 y = cPickle.loads(cPickle.dumps(x))
2678 vereq(hasattr(y, 'a'), 0)
2679 x.a = 42
2680 y = pickle.loads(pickle.dumps(x))
2681 vereq(y.a, 42)
2682 y = cPickle.loads(cPickle.dumps(x))
2683 vereq(y.a, 42)
2684 x = D()
2685 x.a = 42
2686 x.b = 100
2687 y = pickle.loads(pickle.dumps(x))
2688 vereq(y.a + y.b, 142)
2689 y = cPickle.loads(cPickle.dumps(x))
2690 vereq(y.a + y.b, 142)
2691 # But a subclass that adds a slot should not work
2692 class E(C):
2693 __slots__ = ['b']
2694 try:
2695 pickle.dumps(E())
2696 except TypeError:
2697 pass
2698 else:
2699 raise TestFailed, "should fail: pickle E instance - %s" % base
2700 try:
2701 cPickle.dumps(E())
2702 except TypeError:
2703 pass
2704 else:
2705 raise TestFailed, "should fail: cPickle E instance - %s" % base
2706
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002707def copies():
2708 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2709 import copy
2710 class C(object):
2711 pass
2712
2713 a = C()
2714 a.foo = 12
2715 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002716 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002717
2718 a.bar = [1,2,3]
2719 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002720 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002721 verify(c.bar is a.bar)
2722
2723 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002724 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002725 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002726 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002727
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002728def binopoverride():
2729 if verbose: print "Testing overrides of binary operations..."
2730 class I(int):
2731 def __repr__(self):
2732 return "I(%r)" % int(self)
2733 def __add__(self, other):
2734 return I(int(self) + int(other))
2735 __radd__ = __add__
2736 def __pow__(self, other, mod=None):
2737 if mod is None:
2738 return I(pow(int(self), int(other)))
2739 else:
2740 return I(pow(int(self), int(other), int(mod)))
2741 def __rpow__(self, other, mod=None):
2742 if mod is None:
2743 return I(pow(int(other), int(self), mod))
2744 else:
2745 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002746
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002747 vereq(`I(1) + I(2)`, "I(3)")
2748 vereq(`I(1) + 2`, "I(3)")
2749 vereq(`1 + I(2)`, "I(3)")
2750 vereq(`I(2) ** I(3)`, "I(8)")
2751 vereq(`2 ** I(3)`, "I(8)")
2752 vereq(`I(2) ** 3`, "I(8)")
2753 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2754 class S(str):
2755 def __eq__(self, other):
2756 return self.lower() == other.lower()
2757
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002758def subclasspropagation():
2759 if verbose: print "Testing propagation of slot functions to subclasses..."
2760 class A(object):
2761 pass
2762 class B(A):
2763 pass
2764 class C(A):
2765 pass
2766 class D(B, C):
2767 pass
2768 d = D()
2769 vereq(hash(d), id(d))
2770 A.__hash__ = lambda self: 42
2771 vereq(hash(d), 42)
2772 C.__hash__ = lambda self: 314
2773 vereq(hash(d), 314)
2774 B.__hash__ = lambda self: 144
2775 vereq(hash(d), 144)
2776 D.__hash__ = lambda self: 100
2777 vereq(hash(d), 100)
2778 del D.__hash__
2779 vereq(hash(d), 144)
2780 del B.__hash__
2781 vereq(hash(d), 314)
2782 del C.__hash__
2783 vereq(hash(d), 42)
2784 del A.__hash__
2785 vereq(hash(d), id(d))
2786 d.foo = 42
2787 d.bar = 42
2788 vereq(d.foo, 42)
2789 vereq(d.bar, 42)
2790 def __getattribute__(self, name):
2791 if name == "foo":
2792 return 24
2793 return object.__getattribute__(self, name)
2794 A.__getattribute__ = __getattribute__
2795 vereq(d.foo, 24)
2796 vereq(d.bar, 42)
2797 def __getattr__(self, name):
2798 if name in ("spam", "foo", "bar"):
2799 return "hello"
2800 raise AttributeError, name
2801 B.__getattr__ = __getattr__
2802 vereq(d.spam, "hello")
2803 vereq(d.foo, 24)
2804 vereq(d.bar, 42)
2805 del A.__getattribute__
2806 vereq(d.foo, 42)
2807 del d.foo
2808 vereq(d.foo, "hello")
2809 vereq(d.bar, 42)
2810 del B.__getattr__
2811 try:
2812 d.foo
2813 except AttributeError:
2814 pass
2815 else:
2816 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002817
Guido van Rossume7f3e242002-06-14 02:35:45 +00002818 # Test a nasty bug in recurse_down_subclasses()
2819 import gc
2820 class A(object):
2821 pass
2822 class B(A):
2823 pass
2824 del B
2825 gc.collect()
2826 A.__setitem__ = lambda *a: None # crash
2827
Tim Petersfc57ccb2001-10-12 02:38:24 +00002828def buffer_inherit():
2829 import binascii
2830 # SF bug [#470040] ParseTuple t# vs subclasses.
2831 if verbose:
2832 print "Testing that buffer interface is inherited ..."
2833
2834 class MyStr(str):
2835 pass
2836 base = 'abc'
2837 m = MyStr(base)
2838 # b2a_hex uses the buffer interface to get its argument's value, via
2839 # PyArg_ParseTuple 't#' code.
2840 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2841
2842 # It's not clear that unicode will continue to support the character
2843 # buffer interface, and this test will fail if that's taken away.
2844 class MyUni(unicode):
2845 pass
2846 base = u'abc'
2847 m = MyUni(base)
2848 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2849
2850 class MyInt(int):
2851 pass
2852 m = MyInt(42)
2853 try:
2854 binascii.b2a_hex(m)
2855 raise TestFailed('subclass of int should not have a buffer interface')
2856 except TypeError:
2857 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002858
Tim Petersc9933152001-10-16 20:18:24 +00002859def str_of_str_subclass():
2860 import binascii
2861 import cStringIO
2862
2863 if verbose:
2864 print "Testing __str__ defined in subclass of str ..."
2865
2866 class octetstring(str):
2867 def __str__(self):
2868 return binascii.b2a_hex(self)
2869 def __repr__(self):
2870 return self + " repr"
2871
2872 o = octetstring('A')
2873 vereq(type(o), octetstring)
2874 vereq(type(str(o)), str)
2875 vereq(type(repr(o)), str)
2876 vereq(ord(o), 0x41)
2877 vereq(str(o), '41')
2878 vereq(repr(o), 'A repr')
2879 vereq(o.__str__(), '41')
2880 vereq(o.__repr__(), 'A repr')
2881
2882 capture = cStringIO.StringIO()
2883 # Calling str() or not exercises different internal paths.
2884 print >> capture, o
2885 print >> capture, str(o)
2886 vereq(capture.getvalue(), '41\n41\n')
2887 capture.close()
2888
Guido van Rossumc8e56452001-10-22 00:43:43 +00002889def kwdargs():
2890 if verbose: print "Testing keyword arguments to __init__, __call__..."
2891 def f(a): return a
2892 vereq(f.__call__(a=42), 42)
2893 a = []
2894 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002895 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002896
Guido van Rossumed87ad82001-10-30 02:33:02 +00002897def delhook():
2898 if verbose: print "Testing __del__ hook..."
2899 log = []
2900 class C(object):
2901 def __del__(self):
2902 log.append(1)
2903 c = C()
2904 vereq(log, [])
2905 del c
2906 vereq(log, [1])
2907
Guido van Rossum29d26062001-12-11 04:37:34 +00002908 class D(object): pass
2909 d = D()
2910 try: del d[0]
2911 except TypeError: pass
2912 else: raise TestFailed, "invalid del() didn't raise TypeError"
2913
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002914def hashinherit():
2915 if verbose: print "Testing hash of mutable subclasses..."
2916
2917 class mydict(dict):
2918 pass
2919 d = mydict()
2920 try:
2921 hash(d)
2922 except TypeError:
2923 pass
2924 else:
2925 raise TestFailed, "hash() of dict subclass should fail"
2926
2927 class mylist(list):
2928 pass
2929 d = mylist()
2930 try:
2931 hash(d)
2932 except TypeError:
2933 pass
2934 else:
2935 raise TestFailed, "hash() of list subclass should fail"
2936
Guido van Rossum29d26062001-12-11 04:37:34 +00002937def strops():
2938 try: 'a' + 5
2939 except TypeError: pass
2940 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2941
2942 try: ''.split('')
2943 except ValueError: pass
2944 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2945
2946 try: ''.join([0])
2947 except TypeError: pass
2948 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2949
2950 try: ''.rindex('5')
2951 except ValueError: pass
2952 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2953
2954 try: ''.replace('', '')
2955 except ValueError: pass
2956 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2957
2958 try: '%(n)s' % None
2959 except TypeError: pass
2960 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2961
2962 try: '%(n' % {}
2963 except ValueError: pass
2964 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2965
2966 try: '%*s' % ('abc')
2967 except TypeError: pass
2968 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2969
2970 try: '%*.*s' % ('abc', 5)
2971 except TypeError: pass
2972 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2973
2974 try: '%s' % (1, 2)
2975 except TypeError: pass
2976 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2977
2978 try: '%' % None
2979 except ValueError: pass
2980 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2981
2982 vereq('534253'.isdigit(), 1)
2983 vereq('534253x'.isdigit(), 0)
2984 vereq('%c' % 5, '\x05')
2985 vereq('%c' % '5', '5')
2986
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002987def deepcopyrecursive():
2988 if verbose: print "Testing deepcopy of recursive objects..."
2989 class Node:
2990 pass
2991 a = Node()
2992 b = Node()
2993 a.b = b
2994 b.a = a
2995 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002996
Guido van Rossumd7035672002-03-12 20:43:31 +00002997def modules():
2998 if verbose: print "Testing uninitialized module objects..."
2999 from types import ModuleType as M
3000 m = M.__new__(M)
3001 str(m)
3002 vereq(hasattr(m, "__name__"), 0)
3003 vereq(hasattr(m, "__file__"), 0)
3004 vereq(hasattr(m, "foo"), 0)
3005 vereq(m.__dict__, None)
3006 m.foo = 1
3007 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003008
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003009def dictproxyiterkeys():
3010 class C(object):
3011 def meth(self):
3012 pass
3013 if verbose: print "Testing dict-proxy iterkeys..."
3014 keys = [ key for key in C.__dict__.iterkeys() ]
3015 keys.sort()
3016 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3017
3018def dictproxyitervalues():
3019 class C(object):
3020 def meth(self):
3021 pass
3022 if verbose: print "Testing dict-proxy itervalues..."
3023 values = [ values for values in C.__dict__.itervalues() ]
3024 vereq(len(values), 5)
3025
3026def dictproxyiteritems():
3027 class C(object):
3028 def meth(self):
3029 pass
3030 if verbose: print "Testing dict-proxy iteritems..."
3031 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3032 keys.sort()
3033 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3034
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003035def funnynew():
3036 if verbose: print "Testing __new__ returning something unexpected..."
3037 class C(object):
3038 def __new__(cls, arg):
3039 if isinstance(arg, str): return [1, 2, 3]
3040 elif isinstance(arg, int): return object.__new__(D)
3041 else: return object.__new__(cls)
3042 class D(C):
3043 def __init__(self, arg):
3044 self.foo = arg
3045 vereq(C("1"), [1, 2, 3])
3046 vereq(D("1"), [1, 2, 3])
3047 d = D(None)
3048 veris(d.foo, None)
3049 d = C(1)
3050 vereq(isinstance(d, D), True)
3051 vereq(d.foo, 1)
3052 d = D(1)
3053 vereq(isinstance(d, D), True)
3054 vereq(d.foo, 1)
3055
Guido van Rossume8fc6402002-04-16 16:44:51 +00003056def imulbug():
3057 # SF bug 544647
3058 if verbose: print "Testing for __imul__ problems..."
3059 class C(object):
3060 def __imul__(self, other):
3061 return (self, other)
3062 x = C()
3063 y = x
3064 y *= 1.0
3065 vereq(y, (x, 1.0))
3066 y = x
3067 y *= 2
3068 vereq(y, (x, 2))
3069 y = x
3070 y *= 3L
3071 vereq(y, (x, 3L))
3072 y = x
3073 y *= 1L<<100
3074 vereq(y, (x, 1L<<100))
3075 y = x
3076 y *= None
3077 vereq(y, (x, None))
3078 y = x
3079 y *= "foo"
3080 vereq(y, (x, "foo"))
3081
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003082def docdescriptor():
3083 # SF bug 542984
3084 if verbose: print "Testing __doc__ descriptor..."
3085 class DocDescr(object):
3086 def __get__(self, object, otype):
3087 if object:
3088 object = object.__class__.__name__ + ' instance'
3089 if otype:
3090 otype = otype.__name__
3091 return 'object=%s; type=%s' % (object, otype)
3092 class OldClass:
3093 __doc__ = DocDescr()
3094 class NewClass(object):
3095 __doc__ = DocDescr()
3096 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3097 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3098 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3099 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3100
Tim Petersafb2c802002-04-18 18:06:20 +00003101def string_exceptions():
3102 if verbose:
3103 print "Testing string exceptions ..."
3104
3105 # Ensure builtin strings work OK as exceptions.
3106 astring = "An exception string."
3107 try:
3108 raise astring
3109 except astring:
3110 pass
3111 else:
3112 raise TestFailed, "builtin string not usable as exception"
3113
3114 # Ensure string subclass instances do not.
3115 class MyStr(str):
3116 pass
3117
3118 newstring = MyStr("oops -- shouldn't work")
3119 try:
3120 raise newstring
3121 except TypeError:
3122 pass
3123 except:
3124 raise TestFailed, "string subclass allowed as exception"
3125
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003126def copy_setstate():
3127 if verbose:
3128 print "Testing that copy.*copy() correctly uses __setstate__..."
3129 import copy
3130 class C(object):
3131 def __init__(self, foo=None):
3132 self.foo = foo
3133 self.__foo = foo
3134 def setfoo(self, foo=None):
3135 self.foo = foo
3136 def getfoo(self):
3137 return self.__foo
3138 def __getstate__(self):
3139 return [self.foo]
3140 def __setstate__(self, lst):
3141 assert len(lst) == 1
3142 self.__foo = self.foo = lst[0]
3143 a = C(42)
3144 a.setfoo(24)
3145 vereq(a.foo, 24)
3146 vereq(a.getfoo(), 42)
3147 b = copy.copy(a)
3148 vereq(b.foo, 24)
3149 vereq(b.getfoo(), 24)
3150 b = copy.deepcopy(a)
3151 vereq(b.foo, 24)
3152 vereq(b.getfoo(), 24)
3153
Guido van Rossum09638c12002-06-13 19:17:46 +00003154def slices():
3155 if verbose:
3156 print "Testing cases with slices and overridden __getitem__ ..."
3157 # Strings
3158 vereq("hello"[:4], "hell")
3159 vereq("hello"[slice(4)], "hell")
3160 vereq(str.__getitem__("hello", slice(4)), "hell")
3161 class S(str):
3162 def __getitem__(self, x):
3163 return str.__getitem__(self, x)
3164 vereq(S("hello")[:4], "hell")
3165 vereq(S("hello")[slice(4)], "hell")
3166 vereq(S("hello").__getitem__(slice(4)), "hell")
3167 # Tuples
3168 vereq((1,2,3)[:2], (1,2))
3169 vereq((1,2,3)[slice(2)], (1,2))
3170 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3171 class T(tuple):
3172 def __getitem__(self, x):
3173 return tuple.__getitem__(self, x)
3174 vereq(T((1,2,3))[:2], (1,2))
3175 vereq(T((1,2,3))[slice(2)], (1,2))
3176 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3177 # Lists
3178 vereq([1,2,3][:2], [1,2])
3179 vereq([1,2,3][slice(2)], [1,2])
3180 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3181 class L(list):
3182 def __getitem__(self, x):
3183 return list.__getitem__(self, x)
3184 vereq(L([1,2,3])[:2], [1,2])
3185 vereq(L([1,2,3])[slice(2)], [1,2])
3186 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3187 # Now do lists and __setitem__
3188 a = L([1,2,3])
3189 a[slice(1, 3)] = [3,2]
3190 vereq(a, [1,3,2])
3191 a[slice(0, 2, 1)] = [3,1]
3192 vereq(a, [3,1,2])
3193 a.__setitem__(slice(1, 3), [2,1])
3194 vereq(a, [3,2,1])
3195 a.__setitem__(slice(0, 2, 1), [2,3])
3196 vereq(a, [2,3,1])
3197
Tim Peters2484aae2002-07-11 06:56:07 +00003198def subtype_resurrection():
3199 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003200 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003201
3202 class C(object):
3203 container = []
3204
3205 def __del__(self):
3206 # resurrect the instance
3207 C.container.append(self)
3208
3209 c = C()
3210 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003211 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003212 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003213 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003214
3215 # If that didn't blow up, it's also interesting to see whether clearing
3216 # the last container slot works: that will attempt to delete c again,
3217 # which will cause c to get appended back to the container again "during"
3218 # the del.
3219 del C.container[-1]
3220 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003221 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003222
Tim Peters14cb1e12002-07-11 18:26:21 +00003223 # Make c mortal again, so that the test framework with -l doesn't report
3224 # it as a leak.
3225 del C.__del__
3226
Guido van Rossum2d702462002-08-06 21:28:28 +00003227def slottrash():
3228 # Deallocating deeply nested slotted trash caused stack overflows
3229 if verbose:
3230 print "Testing slot trash..."
3231 class trash(object):
3232 __slots__ = ['x']
3233 def __init__(self, x):
3234 self.x = x
3235 o = None
3236 for i in xrange(50000):
3237 o = trash(o)
3238 del o
3239
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003240def slotmultipleinheritance():
3241 # SF bug 575229, multiple inheritance w/ slots dumps core
3242 class A(object):
3243 __slots__=()
3244 class B(object):
3245 pass
3246 class C(A,B) :
3247 __slots__=()
3248 C().x=2
3249
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003250def testrmul():
3251 # SF patch 592646
3252 if verbose:
3253 print "Testing correct invocation of __rmul__..."
3254 class C(object):
3255 def __mul__(self, other):
3256 return "mul"
3257 def __rmul__(self, other):
3258 return "rmul"
3259 a = C()
3260 vereq(a*2, "mul")
3261 vereq(a*2.2, "mul")
3262 vereq(2*a, "rmul")
3263 vereq(2.2*a, "rmul")
3264
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003265def do_this_first():
3266 if verbose:
3267 print "Testing SF bug 551412 ..."
3268 # This dumps core when SF bug 551412 isn't fixed --
3269 # but only when test_descr.py is run separately.
3270 # (That can't be helped -- as soon as PyType_Ready()
3271 # is called for PyLong_Type, the bug is gone.)
3272 class UserLong(object):
3273 def __pow__(self, *args):
3274 pass
3275 try:
3276 pow(0L, UserLong(), 0L)
3277 except:
3278 pass
3279
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003280 if verbose:
3281 print "Testing SF bug 570483..."
3282 # Another segfault only when run early
3283 # (before PyType_Ready(tuple) is called)
3284 type.mro(tuple)
3285
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003286def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003287 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003288 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003289 lists()
3290 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003291 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003292 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003293 ints()
3294 longs()
3295 floats()
3296 complexes()
3297 spamlists()
3298 spamdicts()
3299 pydicts()
3300 pylists()
3301 metaclass()
3302 pymods()
3303 multi()
3304 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00003305 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003306 slots()
3307 dynamics()
3308 errors()
3309 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003310 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003311 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003312 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003313 classic()
3314 compattr()
3315 newslot()
3316 altmro()
3317 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003318 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003319 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003320 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003321 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003322 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003323 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003324 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003325 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003326 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003327 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003328 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003329 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003330 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003331 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003332 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003333 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003334 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003335 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003336 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003337 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003338 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003339 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003340 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003341 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003342 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003343 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003344 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003345 dictproxyiterkeys()
3346 dictproxyitervalues()
3347 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003348 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003349 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003350 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003351 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003352 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003353 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003354 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003355 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003356 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003357 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003358 testrmul()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003359 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003360
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003361if __name__ == "__main__":
3362 test_main()