blob: 0c7def14fe21feef9a7d13abe0051299f938d54b [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
Guido van Rossum8b056da2002-08-13 18:26:26 +00001178def slotspecials():
1179 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1180
1181 class D(object):
1182 __slots__ = ["__dict__"]
1183 a = D()
1184 verify(hasattr(a, "__dict__"))
1185 verify(not hasattr(a, "__weakref__"))
1186 a.foo = 42
1187 vereq(a.__dict__, {"foo": 42})
1188
1189 class W(object):
1190 __slots__ = ["__weakref__"]
1191 a = W()
1192 verify(hasattr(a, "__weakref__"))
1193 verify(not hasattr(a, "__dict__"))
1194 try:
1195 a.foo = 42
1196 except AttributeError:
1197 pass
1198 else:
1199 raise TestFailed, "shouldn't be allowed to set a.foo"
1200
1201 class C1(W, D):
1202 __slots__ = []
1203 a = C1()
1204 verify(hasattr(a, "__dict__"))
1205 verify(hasattr(a, "__weakref__"))
1206 a.foo = 42
1207 vereq(a.__dict__, {"foo": 42})
1208
1209 class C2(D, W):
1210 __slots__ = []
1211 a = C2()
1212 verify(hasattr(a, "__dict__"))
1213 verify(hasattr(a, "__weakref__"))
1214 a.foo = 42
1215 vereq(a.__dict__, {"foo": 42})
1216
1217 class C3(C1, C2):
1218 __slots__ = []
1219
1220 class C4(C2, C1):
1221 __slots__ = []
1222
Tim Peters6d6c1a32001-08-02 04:15:00 +00001223def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001224 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001225 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001226 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001227 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001228 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001229 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001230 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001231 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001232 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001233 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001234 vereq(E.foo, 1)
1235 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001236 # Test dynamic instances
1237 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001238 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001239 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001240 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001241 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001242 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001243 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001244 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001245 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001246 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001247 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001248 vereq(int(a), 100)
1249 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001250 verify(not hasattr(a, "spam"))
1251 def mygetattr(self, name):
1252 if name == "spam":
1253 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001254 raise AttributeError
1255 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001256 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001257 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001258 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001259 def mysetattr(self, name, value):
1260 if name == "spam":
1261 raise AttributeError
1262 return object.__setattr__(self, name, value)
1263 C.__setattr__ = mysetattr
1264 try:
1265 a.spam = "not spam"
1266 except AttributeError:
1267 pass
1268 else:
1269 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001270 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001271 class D(C):
1272 pass
1273 d = D()
1274 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001275 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001276
Guido van Rossum7e35d572001-09-15 03:14:32 +00001277 # Test handling of int*seq and seq*int
1278 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001279 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001280 vereq("a"*I(2), "aa")
1281 vereq(I(2)*"a", "aa")
1282 vereq(2*I(3), 6)
1283 vereq(I(3)*2, 6)
1284 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001285
1286 # Test handling of long*seq and seq*long
1287 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001288 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001289 vereq("a"*L(2L), "aa")
1290 vereq(L(2L)*"a", "aa")
1291 vereq(2*L(3), 6)
1292 vereq(L(3)*2, 6)
1293 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001294
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001295 # Test comparison of classes with dynamic metaclasses
1296 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001297 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001298 class someclass:
1299 __metaclass__ = dynamicmetaclass
1300 verify(someclass != object)
1301
Tim Peters6d6c1a32001-08-02 04:15:00 +00001302def errors():
1303 if verbose: print "Testing errors..."
1304
1305 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001306 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001307 pass
1308 except TypeError:
1309 pass
1310 else:
1311 verify(0, "inheritance from both list and dict should be illegal")
1312
1313 try:
1314 class C(object, None):
1315 pass
1316 except TypeError:
1317 pass
1318 else:
1319 verify(0, "inheritance from non-type should be illegal")
1320 class Classic:
1321 pass
1322
1323 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001324 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001325 pass
1326 except TypeError:
1327 pass
1328 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001329 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001330
1331 try:
1332 class C(object):
1333 __slots__ = 1
1334 except TypeError:
1335 pass
1336 else:
1337 verify(0, "__slots__ = 1 should be illegal")
1338
1339 try:
1340 class C(object):
1341 __slots__ = [1]
1342 except TypeError:
1343 pass
1344 else:
1345 verify(0, "__slots__ = [1] should be illegal")
1346
1347def classmethods():
1348 if verbose: print "Testing class methods..."
1349 class C(object):
1350 def foo(*a): return a
1351 goo = classmethod(foo)
1352 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001353 vereq(C.goo(1), (C, 1))
1354 vereq(c.goo(1), (C, 1))
1355 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001356 class D(C):
1357 pass
1358 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(D.goo(1), (D, 1))
1360 vereq(d.goo(1), (D, 1))
1361 vereq(d.foo(1), (d, 1))
1362 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001363 # Test for a specific crash (SF bug 528132)
1364 def f(cls, arg): return (cls, arg)
1365 ff = classmethod(f)
1366 vereq(ff.__get__(0, int)(42), (int, 42))
1367 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001368
Guido van Rossum155db9a2002-04-02 17:53:47 +00001369 # Test super() with classmethods (SF bug 535444)
1370 veris(C.goo.im_self, C)
1371 veris(D.goo.im_self, D)
1372 veris(super(D,D).goo.im_self, D)
1373 veris(super(D,d).goo.im_self, D)
1374 vereq(super(D,D).goo(), (D,))
1375 vereq(super(D,d).goo(), (D,))
1376
Fred Drakef841aa62002-03-28 15:49:54 +00001377def classmethods_in_c():
1378 if verbose: print "Testing C-based class methods..."
1379 import xxsubtype as spam
1380 a = (1, 2, 3)
1381 d = {'abc': 123}
1382 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1383 veris(x, None)
1384 vereq((spam.spamlist,) + a, a1)
1385 vereq(d, d1)
1386 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1387 veris(x, None)
1388 vereq((spam.spamlist,) + a, a1)
1389 vereq(d, d1)
1390
Tim Peters6d6c1a32001-08-02 04:15:00 +00001391def staticmethods():
1392 if verbose: print "Testing static methods..."
1393 class C(object):
1394 def foo(*a): return a
1395 goo = staticmethod(foo)
1396 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001397 vereq(C.goo(1), (1,))
1398 vereq(c.goo(1), (1,))
1399 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001400 class D(C):
1401 pass
1402 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001403 vereq(D.goo(1), (1,))
1404 vereq(d.goo(1), (1,))
1405 vereq(d.foo(1), (d, 1))
1406 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001407
Fred Drakef841aa62002-03-28 15:49:54 +00001408def staticmethods_in_c():
1409 if verbose: print "Testing C-based static methods..."
1410 import xxsubtype as spam
1411 a = (1, 2, 3)
1412 d = {"abc": 123}
1413 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1414 veris(x, None)
1415 vereq(a, a1)
1416 vereq(d, d1)
1417 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1418 veris(x, None)
1419 vereq(a, a1)
1420 vereq(d, d1)
1421
Tim Peters6d6c1a32001-08-02 04:15:00 +00001422def classic():
1423 if verbose: print "Testing classic classes..."
1424 class C:
1425 def foo(*a): return a
1426 goo = classmethod(foo)
1427 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001428 vereq(C.goo(1), (C, 1))
1429 vereq(c.goo(1), (C, 1))
1430 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001431 class D(C):
1432 pass
1433 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq(D.goo(1), (D, 1))
1435 vereq(d.goo(1), (D, 1))
1436 vereq(d.foo(1), (d, 1))
1437 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001438 class E: # *not* subclassing from C
1439 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001440 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001441 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001442
1443def compattr():
1444 if verbose: print "Testing computed attributes..."
1445 class C(object):
1446 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001447 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001448 self.__get = get
1449 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001450 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001451 def __get__(self, obj, type=None):
1452 return self.__get(obj)
1453 def __set__(self, obj, value):
1454 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001455 def __delete__(self, obj):
1456 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001457 def __init__(self):
1458 self.__x = 0
1459 def __get_x(self):
1460 x = self.__x
1461 self.__x = x+1
1462 return x
1463 def __set_x(self, x):
1464 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001465 def __delete_x(self):
1466 del self.__x
1467 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001468 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001469 vereq(a.x, 0)
1470 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001471 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001472 vereq(a.x, 10)
1473 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001474 del a.x
1475 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001476
1477def newslot():
1478 if verbose: print "Testing __new__ slot override..."
1479 class C(list):
1480 def __new__(cls):
1481 self = list.__new__(cls)
1482 self.foo = 1
1483 return self
1484 def __init__(self):
1485 self.foo = self.foo + 2
1486 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001487 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001488 verify(a.__class__ is C)
1489 class D(C):
1490 pass
1491 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001492 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001493 verify(b.__class__ is D)
1494
Tim Peters6d6c1a32001-08-02 04:15:00 +00001495def altmro():
1496 if verbose: print "Testing mro() and overriding it..."
1497 class A(object):
1498 def f(self): return "A"
1499 class B(A):
1500 pass
1501 class C(A):
1502 def f(self): return "C"
1503 class D(B, C):
1504 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001505 vereq(D.mro(), [D, B, C, A, object])
1506 vereq(D.__mro__, (D, B, C, A, object))
1507 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001508 class PerverseMetaType(type):
1509 def mro(cls):
1510 L = type.mro(cls)
1511 L.reverse()
1512 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513 class X(A,B,C,D):
1514 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001515 vereq(X.__mro__, (object, A, C, B, D, X))
1516 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001517
1518def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001519 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001520
1521 class B(object):
1522 "Intermediate class because object doesn't have a __setattr__"
1523
1524 class C(B):
1525
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001526 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001527 if name == "foo":
1528 return ("getattr", name)
1529 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001530 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001531 def __setattr__(self, name, value):
1532 if name == "foo":
1533 self.setattr = (name, value)
1534 else:
1535 return B.__setattr__(self, name, value)
1536 def __delattr__(self, name):
1537 if name == "foo":
1538 self.delattr = name
1539 else:
1540 return B.__delattr__(self, name)
1541
1542 def __getitem__(self, key):
1543 return ("getitem", key)
1544 def __setitem__(self, key, value):
1545 self.setitem = (key, value)
1546 def __delitem__(self, key):
1547 self.delitem = key
1548
1549 def __getslice__(self, i, j):
1550 return ("getslice", i, j)
1551 def __setslice__(self, i, j, value):
1552 self.setslice = (i, j, value)
1553 def __delslice__(self, i, j):
1554 self.delslice = (i, j)
1555
1556 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001557 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001558 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001559 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001560 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001561 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001562
Guido van Rossum45704552001-10-08 16:35:45 +00001563 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001564 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001565 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001566 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001567 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001568
Guido van Rossum45704552001-10-08 16:35:45 +00001569 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001570 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001571 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001572 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001573 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001574
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001575def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001576 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001577 class C(object):
1578 def __init__(self, x):
1579 self.x = x
1580 def foo(self):
1581 return self.x
1582 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001584 class D(C):
1585 boo = C.foo
1586 goo = c1.foo
1587 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001588 vereq(d2.foo(), 2)
1589 vereq(d2.boo(), 2)
1590 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001591 class E(object):
1592 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001593 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001594 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001595
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001596def specials():
1597 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001598 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001599 # Test the default behavior for static classes
1600 class C(object):
1601 def __getitem__(self, i):
1602 if 0 <= i < 10: return i
1603 raise IndexError
1604 c1 = C()
1605 c2 = C()
1606 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001607 vereq(hash(c1), id(c1))
1608 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1609 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001610 verify(c1 != c2)
1611 verify(not c1 != c1)
1612 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001613 # Note that the module name appears in str/repr, and that varies
1614 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001615 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001616 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001617 verify(-1 not in c1)
1618 for i in range(10):
1619 verify(i in c1)
1620 verify(10 not in c1)
1621 # Test the default behavior for dynamic classes
1622 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001623 def __getitem__(self, i):
1624 if 0 <= i < 10: return i
1625 raise IndexError
1626 d1 = D()
1627 d2 = D()
1628 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001629 vereq(hash(d1), id(d1))
1630 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1631 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001632 verify(d1 != d2)
1633 verify(not d1 != d1)
1634 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001635 # Note that the module name appears in str/repr, and that varies
1636 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001637 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001638 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001639 verify(-1 not in d1)
1640 for i in range(10):
1641 verify(i in d1)
1642 verify(10 not in d1)
1643 # Test overridden behavior for static classes
1644 class Proxy(object):
1645 def __init__(self, x):
1646 self.x = x
1647 def __nonzero__(self):
1648 return not not self.x
1649 def __hash__(self):
1650 return hash(self.x)
1651 def __eq__(self, other):
1652 return self.x == other
1653 def __ne__(self, other):
1654 return self.x != other
1655 def __cmp__(self, other):
1656 return cmp(self.x, other.x)
1657 def __str__(self):
1658 return "Proxy:%s" % self.x
1659 def __repr__(self):
1660 return "Proxy(%r)" % self.x
1661 def __contains__(self, value):
1662 return value in self.x
1663 p0 = Proxy(0)
1664 p1 = Proxy(1)
1665 p_1 = Proxy(-1)
1666 verify(not p0)
1667 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001668 vereq(hash(p0), hash(0))
1669 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001670 verify(p0 != p1)
1671 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001672 vereq(not p0, p1)
1673 vereq(cmp(p0, p1), -1)
1674 vereq(cmp(p0, p0), 0)
1675 vereq(cmp(p0, p_1), 1)
1676 vereq(str(p0), "Proxy:0")
1677 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001678 p10 = Proxy(range(10))
1679 verify(-1 not in p10)
1680 for i in range(10):
1681 verify(i in p10)
1682 verify(10 not in p10)
1683 # Test overridden behavior for dynamic classes
1684 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001685 def __init__(self, x):
1686 self.x = x
1687 def __nonzero__(self):
1688 return not not self.x
1689 def __hash__(self):
1690 return hash(self.x)
1691 def __eq__(self, other):
1692 return self.x == other
1693 def __ne__(self, other):
1694 return self.x != other
1695 def __cmp__(self, other):
1696 return cmp(self.x, other.x)
1697 def __str__(self):
1698 return "DProxy:%s" % self.x
1699 def __repr__(self):
1700 return "DProxy(%r)" % self.x
1701 def __contains__(self, value):
1702 return value in self.x
1703 p0 = DProxy(0)
1704 p1 = DProxy(1)
1705 p_1 = DProxy(-1)
1706 verify(not p0)
1707 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001708 vereq(hash(p0), hash(0))
1709 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001710 verify(p0 != p1)
1711 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001712 vereq(not p0, p1)
1713 vereq(cmp(p0, p1), -1)
1714 vereq(cmp(p0, p0), 0)
1715 vereq(cmp(p0, p_1), 1)
1716 vereq(str(p0), "DProxy:0")
1717 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001718 p10 = DProxy(range(10))
1719 verify(-1 not in p10)
1720 for i in range(10):
1721 verify(i in p10)
1722 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001723 # Safety test for __cmp__
1724 def unsafecmp(a, b):
1725 try:
1726 a.__class__.__cmp__(a, b)
1727 except TypeError:
1728 pass
1729 else:
1730 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1731 a.__class__, a, b)
1732 unsafecmp(u"123", "123")
1733 unsafecmp("123", u"123")
1734 unsafecmp(1, 1.0)
1735 unsafecmp(1.0, 1)
1736 unsafecmp(1, 1L)
1737 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001738
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001739def weakrefs():
1740 if verbose: print "Testing weak references..."
1741 import weakref
1742 class C(object):
1743 pass
1744 c = C()
1745 r = weakref.ref(c)
1746 verify(r() is c)
1747 del c
1748 verify(r() is None)
1749 del r
1750 class NoWeak(object):
1751 __slots__ = ['foo']
1752 no = NoWeak()
1753 try:
1754 weakref.ref(no)
1755 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001756 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001757 else:
1758 verify(0, "weakref.ref(no) should be illegal")
1759 class Weak(object):
1760 __slots__ = ['foo', '__weakref__']
1761 yes = Weak()
1762 r = weakref.ref(yes)
1763 verify(r() is yes)
1764 del yes
1765 verify(r() is None)
1766 del r
1767
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001768def properties():
1769 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001770 class C(object):
1771 def getx(self):
1772 return self.__x
1773 def setx(self, value):
1774 self.__x = value
1775 def delx(self):
1776 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001777 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001778 a = C()
1779 verify(not hasattr(a, "x"))
1780 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(a._C__x, 42)
1782 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001783 del a.x
1784 verify(not hasattr(a, "x"))
1785 verify(not hasattr(a, "_C__x"))
1786 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001787 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001788 C.x.__delete__(a)
1789 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001790
Tim Peters66c1a522001-09-24 21:17:50 +00001791 raw = C.__dict__['x']
1792 verify(isinstance(raw, property))
1793
1794 attrs = dir(raw)
1795 verify("__doc__" in attrs)
1796 verify("fget" in attrs)
1797 verify("fset" in attrs)
1798 verify("fdel" in attrs)
1799
Guido van Rossum45704552001-10-08 16:35:45 +00001800 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001801 verify(raw.fget is C.__dict__['getx'])
1802 verify(raw.fset is C.__dict__['setx'])
1803 verify(raw.fdel is C.__dict__['delx'])
1804
1805 for attr in "__doc__", "fget", "fset", "fdel":
1806 try:
1807 setattr(raw, attr, 42)
1808 except TypeError, msg:
1809 if str(msg).find('readonly') < 0:
1810 raise TestFailed("when setting readonly attr %r on a "
1811 "property, got unexpected TypeError "
1812 "msg %r" % (attr, str(msg)))
1813 else:
1814 raise TestFailed("expected TypeError from trying to set "
1815 "readonly %r attr on a property" % attr)
1816
Guido van Rossumc4a18802001-08-24 16:55:27 +00001817def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001818 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001819
1820 class A(object):
1821 def meth(self, a):
1822 return "A(%r)" % a
1823
Guido van Rossum45704552001-10-08 16:35:45 +00001824 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001825
1826 class B(A):
1827 def __init__(self):
1828 self.__super = super(B, self)
1829 def meth(self, a):
1830 return "B(%r)" % a + self.__super.meth(a)
1831
Guido van Rossum45704552001-10-08 16:35:45 +00001832 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001833
1834 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001835 def meth(self, a):
1836 return "C(%r)" % a + self.__super.meth(a)
1837 C._C__super = super(C)
1838
Guido van Rossum45704552001-10-08 16:35:45 +00001839 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001840
1841 class D(C, B):
1842 def meth(self, a):
1843 return "D(%r)" % a + super(D, self).meth(a)
1844
Guido van Rossum5b443c62001-12-03 15:38:28 +00001845 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1846
1847 # Test for subclassing super
1848
1849 class mysuper(super):
1850 def __init__(self, *args):
1851 return super(mysuper, self).__init__(*args)
1852
1853 class E(D):
1854 def meth(self, a):
1855 return "E(%r)" % a + mysuper(E, self).meth(a)
1856
1857 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1858
1859 class F(E):
1860 def meth(self, a):
1861 s = self.__super
1862 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1863 F._F__super = mysuper(F)
1864
1865 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1866
1867 # Make sure certain errors are raised
1868
1869 try:
1870 super(D, 42)
1871 except TypeError:
1872 pass
1873 else:
1874 raise TestFailed, "shouldn't allow super(D, 42)"
1875
1876 try:
1877 super(D, C())
1878 except TypeError:
1879 pass
1880 else:
1881 raise TestFailed, "shouldn't allow super(D, C())"
1882
1883 try:
1884 super(D).__get__(12)
1885 except TypeError:
1886 pass
1887 else:
1888 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1889
1890 try:
1891 super(D).__get__(C())
1892 except TypeError:
1893 pass
1894 else:
1895 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001896
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001897def inherits():
1898 if verbose: print "Testing inheritance from basic types..."
1899
1900 class hexint(int):
1901 def __repr__(self):
1902 return hex(self)
1903 def __add__(self, other):
1904 return hexint(int.__add__(self, other))
1905 # (Note that overriding __radd__ doesn't work,
1906 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001907 vereq(repr(hexint(7) + 9), "0x10")
1908 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001909 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(a, 12345)
1911 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001912 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001913 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001914 verify((+a).__class__ is int)
1915 verify((a >> 0).__class__ is int)
1916 verify((a << 0).__class__ is int)
1917 verify((hexint(0) << 12).__class__ is int)
1918 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001919
1920 class octlong(long):
1921 __slots__ = []
1922 def __str__(self):
1923 s = oct(self)
1924 if s[-1] == 'L':
1925 s = s[:-1]
1926 return s
1927 def __add__(self, other):
1928 return self.__class__(super(octlong, self).__add__(other))
1929 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001930 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001931 # (Note that overriding __radd__ here only seems to work
1932 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001933 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001934 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(a, 12345L)
1936 vereq(long(a), 12345L)
1937 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001938 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001939 verify((+a).__class__ is long)
1940 verify((-a).__class__ is long)
1941 verify((-octlong(0)).__class__ is long)
1942 verify((a >> 0).__class__ is long)
1943 verify((a << 0).__class__ is long)
1944 verify((a - 0).__class__ is long)
1945 verify((a * 1).__class__ is long)
1946 verify((a ** 1).__class__ is long)
1947 verify((a // 1).__class__ is long)
1948 verify((1 * a).__class__ is long)
1949 verify((a | 0).__class__ is long)
1950 verify((a ^ 0).__class__ is long)
1951 verify((a & -1L).__class__ is long)
1952 verify((octlong(0) << 12).__class__ is long)
1953 verify((octlong(0) >> 12).__class__ is long)
1954 verify(abs(octlong(0)).__class__ is long)
1955
1956 # Because octlong overrides __add__, we can't check the absence of +0
1957 # optimizations using octlong.
1958 class longclone(long):
1959 pass
1960 a = longclone(1)
1961 verify((a + 0).__class__ is long)
1962 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001963
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001964 # Check that negative clones don't segfault
1965 a = longclone(-1)
1966 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001967 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001968
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001969 class precfloat(float):
1970 __slots__ = ['prec']
1971 def __init__(self, value=0.0, prec=12):
1972 self.prec = int(prec)
1973 float.__init__(value)
1974 def __repr__(self):
1975 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001976 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001977 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001978 vereq(a, 12345.0)
1979 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001980 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001981 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001982 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001983
Tim Peters2400fa42001-09-12 19:12:49 +00001984 class madcomplex(complex):
1985 def __repr__(self):
1986 return "%.17gj%+.17g" % (self.imag, self.real)
1987 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001988 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001989 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001990 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001991 vereq(a, base)
1992 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001993 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001994 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001995 vereq(repr(a), "4j-3")
1996 vereq(a, base)
1997 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001998 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001999 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002000 veris((+a).__class__, complex)
2001 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002002 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002003 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002004 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002005 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002006 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002007 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002008 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002009
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002010 class madtuple(tuple):
2011 _rev = None
2012 def rev(self):
2013 if self._rev is not None:
2014 return self._rev
2015 L = list(self)
2016 L.reverse()
2017 self._rev = self.__class__(L)
2018 return self._rev
2019 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002020 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2021 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2022 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002023 for i in range(512):
2024 t = madtuple(range(i))
2025 u = t.rev()
2026 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002027 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002028 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002029 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002030 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002031 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002032 verify(a[:].__class__ is tuple)
2033 verify((a * 1).__class__ is tuple)
2034 verify((a * 0).__class__ is tuple)
2035 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002036 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002037 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002038 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002039 verify((a + a).__class__ is tuple)
2040 verify((a * 0).__class__ is tuple)
2041 verify((a * 1).__class__ is tuple)
2042 verify((a * 2).__class__ is tuple)
2043 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002044
2045 class madstring(str):
2046 _rev = None
2047 def rev(self):
2048 if self._rev is not None:
2049 return self._rev
2050 L = list(self)
2051 L.reverse()
2052 self._rev = self.__class__("".join(L))
2053 return self._rev
2054 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002055 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2056 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2057 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002058 for i in range(256):
2059 s = madstring("".join(map(chr, range(i))))
2060 t = s.rev()
2061 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002062 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002063 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002064 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002065 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002066
Tim Peters8fa5dd02001-09-12 02:18:30 +00002067 base = "\x00" * 5
2068 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002069 vereq(s, base)
2070 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002071 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002072 vereq(hash(s), hash(base))
2073 vereq({s: 1}[base], 1)
2074 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002075 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002076 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002077 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002078 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002079 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002080 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002081 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002082 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002083 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002084 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002085 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002086 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002087 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002088 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002089 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002090 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002091 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002092 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002093 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002094 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002095 identitytab = ''.join([chr(i) for i in range(256)])
2096 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002097 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002098 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002099 vereq(s.translate(identitytab, "x"), base)
2100 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002101 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002102 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002103 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002104 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002105 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002106 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002107 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002108 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002109 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002110 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002111
Tim Peters111f6092001-09-12 07:54:51 +00002112 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002113 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002114 verify(intern(s).__class__ is str)
2115 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002116 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002117
2118 i = intern("y x")
2119 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002120 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002121 verify(intern(s).__class__ is str)
2122 verify(intern(s) is i)
2123
2124 s = madstring(i)
2125 verify(intern(s).__class__ is str)
2126 verify(intern(s) is i)
2127
Guido van Rossum91ee7982001-08-30 20:52:40 +00002128 class madunicode(unicode):
2129 _rev = None
2130 def rev(self):
2131 if self._rev is not None:
2132 return self._rev
2133 L = list(self)
2134 L.reverse()
2135 self._rev = self.__class__(u"".join(L))
2136 return self._rev
2137 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002138 vereq(u, u"ABCDEF")
2139 vereq(u.rev(), madunicode(u"FEDCBA"))
2140 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002141 base = u"12345"
2142 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002143 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002144 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002145 vereq(hash(u), hash(base))
2146 vereq({u: 1}[base], 1)
2147 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002148 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002149 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002150 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002151 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002152 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002153 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002154 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002155 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002156 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002157 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002158 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002159 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002160 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002161 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002162 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002163 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002164 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002165 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002166 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002167 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002168 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002169 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002170 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002171 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002172 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002173 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002174 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002176 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002177 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002178 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002179 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002180 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002181 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002182 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002184 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002185 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002186
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002187 class sublist(list):
2188 pass
2189 a = sublist(range(5))
2190 vereq(a, range(5))
2191 a.append("hello")
2192 vereq(a, range(5) + ["hello"])
2193 a[5] = 5
2194 vereq(a, range(6))
2195 a.extend(range(6, 20))
2196 vereq(a, range(20))
2197 a[-5:] = []
2198 vereq(a, range(15))
2199 del a[10:15]
2200 vereq(len(a), 10)
2201 vereq(a, range(10))
2202 vereq(list(a), range(10))
2203 vereq(a[0], 0)
2204 vereq(a[9], 9)
2205 vereq(a[-10], 0)
2206 vereq(a[-1], 9)
2207 vereq(a[:5], range(5))
2208
Tim Peters59c9a642001-09-13 05:38:56 +00002209 class CountedInput(file):
2210 """Counts lines read by self.readline().
2211
2212 self.lineno is the 0-based ordinal of the last line read, up to
2213 a maximum of one greater than the number of lines in the file.
2214
2215 self.ateof is true if and only if the final "" line has been read,
2216 at which point self.lineno stops incrementing, and further calls
2217 to readline() continue to return "".
2218 """
2219
2220 lineno = 0
2221 ateof = 0
2222 def readline(self):
2223 if self.ateof:
2224 return ""
2225 s = file.readline(self)
2226 # Next line works too.
2227 # s = super(CountedInput, self).readline()
2228 self.lineno += 1
2229 if s == "":
2230 self.ateof = 1
2231 return s
2232
Tim Peters561f8992001-09-13 19:36:36 +00002233 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002234 lines = ['a\n', 'b\n', 'c\n']
2235 try:
2236 f.writelines(lines)
2237 f.close()
2238 f = CountedInput(TESTFN)
2239 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2240 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002241 vereq(expected, got)
2242 vereq(f.lineno, i)
2243 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002244 f.close()
2245 finally:
2246 try:
2247 f.close()
2248 except:
2249 pass
2250 try:
2251 import os
2252 os.unlink(TESTFN)
2253 except:
2254 pass
2255
Tim Peters808b94e2001-09-13 19:33:07 +00002256def keywords():
2257 if verbose:
2258 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002259 vereq(int(x=1), 1)
2260 vereq(float(x=2), 2.0)
2261 vereq(long(x=3), 3L)
2262 vereq(complex(imag=42, real=666), complex(666, 42))
2263 vereq(str(object=500), '500')
2264 vereq(unicode(string='abc', errors='strict'), u'abc')
2265 vereq(tuple(sequence=range(3)), (0, 1, 2))
2266 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002267 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002268
2269 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002270 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002271 try:
2272 constructor(bogus_keyword_arg=1)
2273 except TypeError:
2274 pass
2275 else:
2276 raise TestFailed("expected TypeError from bogus keyword "
2277 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002278
Tim Peters8fa45672001-09-13 21:01:29 +00002279def restricted():
2280 import rexec
2281 if verbose:
2282 print "Testing interaction with restricted execution ..."
2283
2284 sandbox = rexec.RExec()
2285
2286 code1 = """f = open(%r, 'w')""" % TESTFN
2287 code2 = """f = file(%r, 'w')""" % TESTFN
2288 code3 = """\
2289f = open(%r)
2290t = type(f) # a sneaky way to get the file() constructor
2291f.close()
2292f = t(%r, 'w') # rexec can't catch this by itself
2293""" % (TESTFN, TESTFN)
2294
2295 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2296 f.close()
2297
2298 try:
2299 for code in code1, code2, code3:
2300 try:
2301 sandbox.r_exec(code)
2302 except IOError, msg:
2303 if str(msg).find("restricted") >= 0:
2304 outcome = "OK"
2305 else:
2306 outcome = "got an exception, but not an expected one"
2307 else:
2308 outcome = "expected a restricted-execution exception"
2309
2310 if outcome != "OK":
2311 raise TestFailed("%s, in %r" % (outcome, code))
2312
2313 finally:
2314 try:
2315 import os
2316 os.unlink(TESTFN)
2317 except:
2318 pass
2319
Tim Peters0ab085c2001-09-14 00:25:33 +00002320def str_subclass_as_dict_key():
2321 if verbose:
2322 print "Testing a str subclass used as dict key .."
2323
2324 class cistr(str):
2325 """Sublcass of str that computes __eq__ case-insensitively.
2326
2327 Also computes a hash code of the string in canonical form.
2328 """
2329
2330 def __init__(self, value):
2331 self.canonical = value.lower()
2332 self.hashcode = hash(self.canonical)
2333
2334 def __eq__(self, other):
2335 if not isinstance(other, cistr):
2336 other = cistr(other)
2337 return self.canonical == other.canonical
2338
2339 def __hash__(self):
2340 return self.hashcode
2341
Guido van Rossum45704552001-10-08 16:35:45 +00002342 vereq(cistr('ABC'), 'abc')
2343 vereq('aBc', cistr('ABC'))
2344 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002345
2346 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(d[cistr('one')], 1)
2348 vereq(d[cistr('tWo')], 2)
2349 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002350 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002351 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002352
Guido van Rossumab3b0342001-09-18 20:38:53 +00002353def classic_comparisons():
2354 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002355 class classic:
2356 pass
2357 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002358 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 if isinstance(other, C):
2364 return cmp(self.value, other.value)
2365 if isinstance(other, int) or isinstance(other, long):
2366 return cmp(self.value, other)
2367 return NotImplemented
2368 c1 = C(1)
2369 c2 = C(2)
2370 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002371 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002372 c = {1: c1, 2: c2, 3: c3}
2373 for x in 1, 2, 3:
2374 for y in 1, 2, 3:
2375 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2376 for op in "<", "<=", "==", "!=", ">", ">=":
2377 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2378 "x=%d, y=%d" % (x, y))
2379 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2380 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2381
Guido van Rossum0639f592001-09-18 21:06:04 +00002382def rich_comparisons():
2383 if verbose:
2384 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002385 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002386 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002387 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002388 vereq(z, 1+0j)
2389 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002390 class ZZ(complex):
2391 def __eq__(self, other):
2392 try:
2393 return abs(self - other) <= 1e-6
2394 except:
2395 return NotImplemented
2396 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002397 vereq(zz, 1+0j)
2398 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002399
Guido van Rossum0639f592001-09-18 21:06:04 +00002400 class classic:
2401 pass
2402 for base in (classic, int, object, list):
2403 if verbose: print " (base = %s)" % base
2404 class C(base):
2405 def __init__(self, value):
2406 self.value = int(value)
2407 def __cmp__(self, other):
2408 raise TestFailed, "shouldn't call __cmp__"
2409 def __eq__(self, other):
2410 if isinstance(other, C):
2411 return self.value == other.value
2412 if isinstance(other, int) or isinstance(other, long):
2413 return self.value == other
2414 return NotImplemented
2415 def __ne__(self, other):
2416 if isinstance(other, C):
2417 return self.value != other.value
2418 if isinstance(other, int) or isinstance(other, long):
2419 return self.value != other
2420 return NotImplemented
2421 def __lt__(self, other):
2422 if isinstance(other, C):
2423 return self.value < other.value
2424 if isinstance(other, int) or isinstance(other, long):
2425 return self.value < other
2426 return NotImplemented
2427 def __le__(self, other):
2428 if isinstance(other, C):
2429 return self.value <= other.value
2430 if isinstance(other, int) or isinstance(other, long):
2431 return self.value <= other
2432 return NotImplemented
2433 def __gt__(self, other):
2434 if isinstance(other, C):
2435 return self.value > other.value
2436 if isinstance(other, int) or isinstance(other, long):
2437 return self.value > other
2438 return NotImplemented
2439 def __ge__(self, other):
2440 if isinstance(other, C):
2441 return self.value >= other.value
2442 if isinstance(other, int) or isinstance(other, long):
2443 return self.value >= other
2444 return NotImplemented
2445 c1 = C(1)
2446 c2 = C(2)
2447 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002448 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002449 c = {1: c1, 2: c2, 3: c3}
2450 for x in 1, 2, 3:
2451 for y in 1, 2, 3:
2452 for op in "<", "<=", "==", "!=", ">", ">=":
2453 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2454 "x=%d, y=%d" % (x, y))
2455 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2456 "x=%d, y=%d" % (x, y))
2457 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2458 "x=%d, y=%d" % (x, y))
2459
Guido van Rossum1952e382001-09-19 01:25:16 +00002460def coercions():
2461 if verbose: print "Testing coercions..."
2462 class I(int): pass
2463 coerce(I(0), 0)
2464 coerce(0, I(0))
2465 class L(long): pass
2466 coerce(L(0), 0)
2467 coerce(L(0), 0L)
2468 coerce(0, L(0))
2469 coerce(0L, L(0))
2470 class F(float): pass
2471 coerce(F(0), 0)
2472 coerce(F(0), 0L)
2473 coerce(F(0), 0.)
2474 coerce(0, F(0))
2475 coerce(0L, F(0))
2476 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002477 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002478 coerce(C(0), 0)
2479 coerce(C(0), 0L)
2480 coerce(C(0), 0.)
2481 coerce(C(0), 0j)
2482 coerce(0, C(0))
2483 coerce(0L, C(0))
2484 coerce(0., C(0))
2485 coerce(0j, C(0))
2486
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002487def descrdoc():
2488 if verbose: print "Testing descriptor doc strings..."
2489 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002490 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002491 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002492 check(file.name, "file name") # member descriptor
2493
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002494def setclass():
2495 if verbose: print "Testing __class__ assignment..."
2496 class C(object): pass
2497 class D(object): pass
2498 class E(object): pass
2499 class F(D, E): pass
2500 for cls in C, D, E, F:
2501 for cls2 in C, D, E, F:
2502 x = cls()
2503 x.__class__ = cls2
2504 verify(x.__class__ is cls2)
2505 x.__class__ = cls
2506 verify(x.__class__ is cls)
2507 def cant(x, C):
2508 try:
2509 x.__class__ = C
2510 except TypeError:
2511 pass
2512 else:
2513 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002514 try:
2515 delattr(x, "__class__")
2516 except TypeError:
2517 pass
2518 else:
2519 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002520 cant(C(), list)
2521 cant(list(), C)
2522 cant(C(), 1)
2523 cant(C(), object)
2524 cant(object(), list)
2525 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002526 class Int(int): __slots__ = []
2527 cant(2, Int)
2528 cant(Int(), int)
2529 cant(True, int)
2530 cant(2, bool)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002531
Guido van Rossum6661be32001-10-26 04:26:12 +00002532def setdict():
2533 if verbose: print "Testing __dict__ assignment..."
2534 class C(object): pass
2535 a = C()
2536 a.__dict__ = {'b': 1}
2537 vereq(a.b, 1)
2538 def cant(x, dict):
2539 try:
2540 x.__dict__ = dict
2541 except TypeError:
2542 pass
2543 else:
2544 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2545 cant(a, None)
2546 cant(a, [])
2547 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002548 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002549 # Classes don't allow __dict__ assignment
2550 cant(C, {})
2551
Guido van Rossum3926a632001-09-25 16:25:58 +00002552def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002553 if verbose:
2554 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002555 import pickle, cPickle
2556
2557 def sorteditems(d):
2558 L = d.items()
2559 L.sort()
2560 return L
2561
2562 global C
2563 class C(object):
2564 def __init__(self, a, b):
2565 super(C, self).__init__()
2566 self.a = a
2567 self.b = b
2568 def __repr__(self):
2569 return "C(%r, %r)" % (self.a, self.b)
2570
2571 global C1
2572 class C1(list):
2573 def __new__(cls, a, b):
2574 return super(C1, cls).__new__(cls)
2575 def __init__(self, a, b):
2576 self.a = a
2577 self.b = b
2578 def __repr__(self):
2579 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2580
2581 global C2
2582 class C2(int):
2583 def __new__(cls, a, b, val=0):
2584 return super(C2, cls).__new__(cls, val)
2585 def __init__(self, a, b, val=0):
2586 self.a = a
2587 self.b = b
2588 def __repr__(self):
2589 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2590
Guido van Rossum90c45142001-11-24 21:07:01 +00002591 global C3
2592 class C3(object):
2593 def __init__(self, foo):
2594 self.foo = foo
2595 def __getstate__(self):
2596 return self.foo
2597 def __setstate__(self, foo):
2598 self.foo = foo
2599
2600 global C4classic, C4
2601 class C4classic: # classic
2602 pass
2603 class C4(C4classic, object): # mixed inheritance
2604 pass
2605
Guido van Rossum3926a632001-09-25 16:25:58 +00002606 for p in pickle, cPickle:
2607 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002608 if verbose:
2609 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002610
2611 for cls in C, C1, C2:
2612 s = p.dumps(cls, bin)
2613 cls2 = p.loads(s)
2614 verify(cls2 is cls)
2615
2616 a = C1(1, 2); a.append(42); a.append(24)
2617 b = C2("hello", "world", 42)
2618 s = p.dumps((a, b), bin)
2619 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002620 vereq(x.__class__, a.__class__)
2621 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2622 vereq(y.__class__, b.__class__)
2623 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2624 vereq(`x`, `a`)
2625 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002626 if verbose:
2627 print "a = x =", a
2628 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002629 # Test for __getstate__ and __setstate__ on new style class
2630 u = C3(42)
2631 s = p.dumps(u, bin)
2632 v = p.loads(s)
2633 veris(u.__class__, v.__class__)
2634 vereq(u.foo, v.foo)
2635 # Test for picklability of hybrid class
2636 u = C4()
2637 u.foo = 42
2638 s = p.dumps(u, bin)
2639 v = p.loads(s)
2640 veris(u.__class__, v.__class__)
2641 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002642
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002643 # Testing copy.deepcopy()
2644 if verbose:
2645 print "deepcopy"
2646 import copy
2647 for cls in C, C1, C2:
2648 cls2 = copy.deepcopy(cls)
2649 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002650
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002651 a = C1(1, 2); a.append(42); a.append(24)
2652 b = C2("hello", "world", 42)
2653 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002654 vereq(x.__class__, a.__class__)
2655 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2656 vereq(y.__class__, b.__class__)
2657 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2658 vereq(`x`, `a`)
2659 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002660 if verbose:
2661 print "a = x =", a
2662 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002663
Guido van Rossum8c842552002-03-14 23:05:54 +00002664def pickleslots():
2665 if verbose: print "Testing pickling of classes with __slots__ ..."
2666 import pickle, cPickle
2667 # Pickling of classes with __slots__ but without __getstate__ should fail
2668 global B, C, D, E
2669 class B(object):
2670 pass
2671 for base in [object, B]:
2672 class C(base):
2673 __slots__ = ['a']
2674 class D(C):
2675 pass
2676 try:
2677 pickle.dumps(C())
2678 except TypeError:
2679 pass
2680 else:
2681 raise TestFailed, "should fail: pickle C instance - %s" % base
2682 try:
2683 cPickle.dumps(C())
2684 except TypeError:
2685 pass
2686 else:
2687 raise TestFailed, "should fail: cPickle C instance - %s" % base
2688 try:
2689 pickle.dumps(C())
2690 except TypeError:
2691 pass
2692 else:
2693 raise TestFailed, "should fail: pickle D instance - %s" % base
2694 try:
2695 cPickle.dumps(D())
2696 except TypeError:
2697 pass
2698 else:
2699 raise TestFailed, "should fail: cPickle D instance - %s" % base
2700 # Give C a __getstate__ and __setstate__
2701 class C(base):
2702 __slots__ = ['a']
2703 def __getstate__(self):
2704 try:
2705 d = self.__dict__.copy()
2706 except AttributeError:
2707 d = {}
2708 try:
2709 d['a'] = self.a
2710 except AttributeError:
2711 pass
2712 return d
2713 def __setstate__(self, d):
2714 for k, v in d.items():
2715 setattr(self, k, v)
2716 class D(C):
2717 pass
2718 # Now it should work
2719 x = C()
2720 y = pickle.loads(pickle.dumps(x))
2721 vereq(hasattr(y, 'a'), 0)
2722 y = cPickle.loads(cPickle.dumps(x))
2723 vereq(hasattr(y, 'a'), 0)
2724 x.a = 42
2725 y = pickle.loads(pickle.dumps(x))
2726 vereq(y.a, 42)
2727 y = cPickle.loads(cPickle.dumps(x))
2728 vereq(y.a, 42)
2729 x = D()
2730 x.a = 42
2731 x.b = 100
2732 y = pickle.loads(pickle.dumps(x))
2733 vereq(y.a + y.b, 142)
2734 y = cPickle.loads(cPickle.dumps(x))
2735 vereq(y.a + y.b, 142)
2736 # But a subclass that adds a slot should not work
2737 class E(C):
2738 __slots__ = ['b']
2739 try:
2740 pickle.dumps(E())
2741 except TypeError:
2742 pass
2743 else:
2744 raise TestFailed, "should fail: pickle E instance - %s" % base
2745 try:
2746 cPickle.dumps(E())
2747 except TypeError:
2748 pass
2749 else:
2750 raise TestFailed, "should fail: cPickle E instance - %s" % base
2751
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002752def copies():
2753 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2754 import copy
2755 class C(object):
2756 pass
2757
2758 a = C()
2759 a.foo = 12
2760 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002761 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002762
2763 a.bar = [1,2,3]
2764 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002765 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002766 verify(c.bar is a.bar)
2767
2768 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002769 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002770 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002771 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002772
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002773def binopoverride():
2774 if verbose: print "Testing overrides of binary operations..."
2775 class I(int):
2776 def __repr__(self):
2777 return "I(%r)" % int(self)
2778 def __add__(self, other):
2779 return I(int(self) + int(other))
2780 __radd__ = __add__
2781 def __pow__(self, other, mod=None):
2782 if mod is None:
2783 return I(pow(int(self), int(other)))
2784 else:
2785 return I(pow(int(self), int(other), int(mod)))
2786 def __rpow__(self, other, mod=None):
2787 if mod is None:
2788 return I(pow(int(other), int(self), mod))
2789 else:
2790 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002791
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002792 vereq(`I(1) + I(2)`, "I(3)")
2793 vereq(`I(1) + 2`, "I(3)")
2794 vereq(`1 + I(2)`, "I(3)")
2795 vereq(`I(2) ** I(3)`, "I(8)")
2796 vereq(`2 ** I(3)`, "I(8)")
2797 vereq(`I(2) ** 3`, "I(8)")
2798 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2799 class S(str):
2800 def __eq__(self, other):
2801 return self.lower() == other.lower()
2802
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002803def subclasspropagation():
2804 if verbose: print "Testing propagation of slot functions to subclasses..."
2805 class A(object):
2806 pass
2807 class B(A):
2808 pass
2809 class C(A):
2810 pass
2811 class D(B, C):
2812 pass
2813 d = D()
2814 vereq(hash(d), id(d))
2815 A.__hash__ = lambda self: 42
2816 vereq(hash(d), 42)
2817 C.__hash__ = lambda self: 314
2818 vereq(hash(d), 314)
2819 B.__hash__ = lambda self: 144
2820 vereq(hash(d), 144)
2821 D.__hash__ = lambda self: 100
2822 vereq(hash(d), 100)
2823 del D.__hash__
2824 vereq(hash(d), 144)
2825 del B.__hash__
2826 vereq(hash(d), 314)
2827 del C.__hash__
2828 vereq(hash(d), 42)
2829 del A.__hash__
2830 vereq(hash(d), id(d))
2831 d.foo = 42
2832 d.bar = 42
2833 vereq(d.foo, 42)
2834 vereq(d.bar, 42)
2835 def __getattribute__(self, name):
2836 if name == "foo":
2837 return 24
2838 return object.__getattribute__(self, name)
2839 A.__getattribute__ = __getattribute__
2840 vereq(d.foo, 24)
2841 vereq(d.bar, 42)
2842 def __getattr__(self, name):
2843 if name in ("spam", "foo", "bar"):
2844 return "hello"
2845 raise AttributeError, name
2846 B.__getattr__ = __getattr__
2847 vereq(d.spam, "hello")
2848 vereq(d.foo, 24)
2849 vereq(d.bar, 42)
2850 del A.__getattribute__
2851 vereq(d.foo, 42)
2852 del d.foo
2853 vereq(d.foo, "hello")
2854 vereq(d.bar, 42)
2855 del B.__getattr__
2856 try:
2857 d.foo
2858 except AttributeError:
2859 pass
2860 else:
2861 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002862
Guido van Rossume7f3e242002-06-14 02:35:45 +00002863 # Test a nasty bug in recurse_down_subclasses()
2864 import gc
2865 class A(object):
2866 pass
2867 class B(A):
2868 pass
2869 del B
2870 gc.collect()
2871 A.__setitem__ = lambda *a: None # crash
2872
Tim Petersfc57ccb2001-10-12 02:38:24 +00002873def buffer_inherit():
2874 import binascii
2875 # SF bug [#470040] ParseTuple t# vs subclasses.
2876 if verbose:
2877 print "Testing that buffer interface is inherited ..."
2878
2879 class MyStr(str):
2880 pass
2881 base = 'abc'
2882 m = MyStr(base)
2883 # b2a_hex uses the buffer interface to get its argument's value, via
2884 # PyArg_ParseTuple 't#' code.
2885 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2886
2887 # It's not clear that unicode will continue to support the character
2888 # buffer interface, and this test will fail if that's taken away.
2889 class MyUni(unicode):
2890 pass
2891 base = u'abc'
2892 m = MyUni(base)
2893 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2894
2895 class MyInt(int):
2896 pass
2897 m = MyInt(42)
2898 try:
2899 binascii.b2a_hex(m)
2900 raise TestFailed('subclass of int should not have a buffer interface')
2901 except TypeError:
2902 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002903
Tim Petersc9933152001-10-16 20:18:24 +00002904def str_of_str_subclass():
2905 import binascii
2906 import cStringIO
2907
2908 if verbose:
2909 print "Testing __str__ defined in subclass of str ..."
2910
2911 class octetstring(str):
2912 def __str__(self):
2913 return binascii.b2a_hex(self)
2914 def __repr__(self):
2915 return self + " repr"
2916
2917 o = octetstring('A')
2918 vereq(type(o), octetstring)
2919 vereq(type(str(o)), str)
2920 vereq(type(repr(o)), str)
2921 vereq(ord(o), 0x41)
2922 vereq(str(o), '41')
2923 vereq(repr(o), 'A repr')
2924 vereq(o.__str__(), '41')
2925 vereq(o.__repr__(), 'A repr')
2926
2927 capture = cStringIO.StringIO()
2928 # Calling str() or not exercises different internal paths.
2929 print >> capture, o
2930 print >> capture, str(o)
2931 vereq(capture.getvalue(), '41\n41\n')
2932 capture.close()
2933
Guido van Rossumc8e56452001-10-22 00:43:43 +00002934def kwdargs():
2935 if verbose: print "Testing keyword arguments to __init__, __call__..."
2936 def f(a): return a
2937 vereq(f.__call__(a=42), 42)
2938 a = []
2939 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002940 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002941
Guido van Rossumed87ad82001-10-30 02:33:02 +00002942def delhook():
2943 if verbose: print "Testing __del__ hook..."
2944 log = []
2945 class C(object):
2946 def __del__(self):
2947 log.append(1)
2948 c = C()
2949 vereq(log, [])
2950 del c
2951 vereq(log, [1])
2952
Guido van Rossum29d26062001-12-11 04:37:34 +00002953 class D(object): pass
2954 d = D()
2955 try: del d[0]
2956 except TypeError: pass
2957 else: raise TestFailed, "invalid del() didn't raise TypeError"
2958
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002959def hashinherit():
2960 if verbose: print "Testing hash of mutable subclasses..."
2961
2962 class mydict(dict):
2963 pass
2964 d = mydict()
2965 try:
2966 hash(d)
2967 except TypeError:
2968 pass
2969 else:
2970 raise TestFailed, "hash() of dict subclass should fail"
2971
2972 class mylist(list):
2973 pass
2974 d = mylist()
2975 try:
2976 hash(d)
2977 except TypeError:
2978 pass
2979 else:
2980 raise TestFailed, "hash() of list subclass should fail"
2981
Guido van Rossum29d26062001-12-11 04:37:34 +00002982def strops():
2983 try: 'a' + 5
2984 except TypeError: pass
2985 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2986
2987 try: ''.split('')
2988 except ValueError: pass
2989 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2990
2991 try: ''.join([0])
2992 except TypeError: pass
2993 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2994
2995 try: ''.rindex('5')
2996 except ValueError: pass
2997 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2998
Guido van Rossum29d26062001-12-11 04:37:34 +00002999 try: '%(n)s' % None
3000 except TypeError: pass
3001 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3002
3003 try: '%(n' % {}
3004 except ValueError: pass
3005 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3006
3007 try: '%*s' % ('abc')
3008 except TypeError: pass
3009 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3010
3011 try: '%*.*s' % ('abc', 5)
3012 except TypeError: pass
3013 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3014
3015 try: '%s' % (1, 2)
3016 except TypeError: pass
3017 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3018
3019 try: '%' % None
3020 except ValueError: pass
3021 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3022
3023 vereq('534253'.isdigit(), 1)
3024 vereq('534253x'.isdigit(), 0)
3025 vereq('%c' % 5, '\x05')
3026 vereq('%c' % '5', '5')
3027
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003028def deepcopyrecursive():
3029 if verbose: print "Testing deepcopy of recursive objects..."
3030 class Node:
3031 pass
3032 a = Node()
3033 b = Node()
3034 a.b = b
3035 b.a = a
3036 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003037
Guido van Rossumd7035672002-03-12 20:43:31 +00003038def modules():
3039 if verbose: print "Testing uninitialized module objects..."
3040 from types import ModuleType as M
3041 m = M.__new__(M)
3042 str(m)
3043 vereq(hasattr(m, "__name__"), 0)
3044 vereq(hasattr(m, "__file__"), 0)
3045 vereq(hasattr(m, "foo"), 0)
3046 vereq(m.__dict__, None)
3047 m.foo = 1
3048 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003049
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003050def dictproxyiterkeys():
3051 class C(object):
3052 def meth(self):
3053 pass
3054 if verbose: print "Testing dict-proxy iterkeys..."
3055 keys = [ key for key in C.__dict__.iterkeys() ]
3056 keys.sort()
3057 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3058
3059def dictproxyitervalues():
3060 class C(object):
3061 def meth(self):
3062 pass
3063 if verbose: print "Testing dict-proxy itervalues..."
3064 values = [ values for values in C.__dict__.itervalues() ]
3065 vereq(len(values), 5)
3066
3067def dictproxyiteritems():
3068 class C(object):
3069 def meth(self):
3070 pass
3071 if verbose: print "Testing dict-proxy iteritems..."
3072 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3073 keys.sort()
3074 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3075
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003076def funnynew():
3077 if verbose: print "Testing __new__ returning something unexpected..."
3078 class C(object):
3079 def __new__(cls, arg):
3080 if isinstance(arg, str): return [1, 2, 3]
3081 elif isinstance(arg, int): return object.__new__(D)
3082 else: return object.__new__(cls)
3083 class D(C):
3084 def __init__(self, arg):
3085 self.foo = arg
3086 vereq(C("1"), [1, 2, 3])
3087 vereq(D("1"), [1, 2, 3])
3088 d = D(None)
3089 veris(d.foo, None)
3090 d = C(1)
3091 vereq(isinstance(d, D), True)
3092 vereq(d.foo, 1)
3093 d = D(1)
3094 vereq(isinstance(d, D), True)
3095 vereq(d.foo, 1)
3096
Guido van Rossume8fc6402002-04-16 16:44:51 +00003097def imulbug():
3098 # SF bug 544647
3099 if verbose: print "Testing for __imul__ problems..."
3100 class C(object):
3101 def __imul__(self, other):
3102 return (self, other)
3103 x = C()
3104 y = x
3105 y *= 1.0
3106 vereq(y, (x, 1.0))
3107 y = x
3108 y *= 2
3109 vereq(y, (x, 2))
3110 y = x
3111 y *= 3L
3112 vereq(y, (x, 3L))
3113 y = x
3114 y *= 1L<<100
3115 vereq(y, (x, 1L<<100))
3116 y = x
3117 y *= None
3118 vereq(y, (x, None))
3119 y = x
3120 y *= "foo"
3121 vereq(y, (x, "foo"))
3122
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003123def docdescriptor():
3124 # SF bug 542984
3125 if verbose: print "Testing __doc__ descriptor..."
3126 class DocDescr(object):
3127 def __get__(self, object, otype):
3128 if object:
3129 object = object.__class__.__name__ + ' instance'
3130 if otype:
3131 otype = otype.__name__
3132 return 'object=%s; type=%s' % (object, otype)
3133 class OldClass:
3134 __doc__ = DocDescr()
3135 class NewClass(object):
3136 __doc__ = DocDescr()
3137 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3138 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3139 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3140 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3141
Tim Petersafb2c802002-04-18 18:06:20 +00003142def string_exceptions():
3143 if verbose:
3144 print "Testing string exceptions ..."
3145
3146 # Ensure builtin strings work OK as exceptions.
3147 astring = "An exception string."
3148 try:
3149 raise astring
3150 except astring:
3151 pass
3152 else:
3153 raise TestFailed, "builtin string not usable as exception"
3154
3155 # Ensure string subclass instances do not.
3156 class MyStr(str):
3157 pass
3158
3159 newstring = MyStr("oops -- shouldn't work")
3160 try:
3161 raise newstring
3162 except TypeError:
3163 pass
3164 except:
3165 raise TestFailed, "string subclass allowed as exception"
3166
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003167def copy_setstate():
3168 if verbose:
3169 print "Testing that copy.*copy() correctly uses __setstate__..."
3170 import copy
3171 class C(object):
3172 def __init__(self, foo=None):
3173 self.foo = foo
3174 self.__foo = foo
3175 def setfoo(self, foo=None):
3176 self.foo = foo
3177 def getfoo(self):
3178 return self.__foo
3179 def __getstate__(self):
3180 return [self.foo]
3181 def __setstate__(self, lst):
3182 assert len(lst) == 1
3183 self.__foo = self.foo = lst[0]
3184 a = C(42)
3185 a.setfoo(24)
3186 vereq(a.foo, 24)
3187 vereq(a.getfoo(), 42)
3188 b = copy.copy(a)
3189 vereq(b.foo, 24)
3190 vereq(b.getfoo(), 24)
3191 b = copy.deepcopy(a)
3192 vereq(b.foo, 24)
3193 vereq(b.getfoo(), 24)
3194
Guido van Rossum09638c12002-06-13 19:17:46 +00003195def slices():
3196 if verbose:
3197 print "Testing cases with slices and overridden __getitem__ ..."
3198 # Strings
3199 vereq("hello"[:4], "hell")
3200 vereq("hello"[slice(4)], "hell")
3201 vereq(str.__getitem__("hello", slice(4)), "hell")
3202 class S(str):
3203 def __getitem__(self, x):
3204 return str.__getitem__(self, x)
3205 vereq(S("hello")[:4], "hell")
3206 vereq(S("hello")[slice(4)], "hell")
3207 vereq(S("hello").__getitem__(slice(4)), "hell")
3208 # Tuples
3209 vereq((1,2,3)[:2], (1,2))
3210 vereq((1,2,3)[slice(2)], (1,2))
3211 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3212 class T(tuple):
3213 def __getitem__(self, x):
3214 return tuple.__getitem__(self, x)
3215 vereq(T((1,2,3))[:2], (1,2))
3216 vereq(T((1,2,3))[slice(2)], (1,2))
3217 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3218 # Lists
3219 vereq([1,2,3][:2], [1,2])
3220 vereq([1,2,3][slice(2)], [1,2])
3221 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3222 class L(list):
3223 def __getitem__(self, x):
3224 return list.__getitem__(self, x)
3225 vereq(L([1,2,3])[:2], [1,2])
3226 vereq(L([1,2,3])[slice(2)], [1,2])
3227 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3228 # Now do lists and __setitem__
3229 a = L([1,2,3])
3230 a[slice(1, 3)] = [3,2]
3231 vereq(a, [1,3,2])
3232 a[slice(0, 2, 1)] = [3,1]
3233 vereq(a, [3,1,2])
3234 a.__setitem__(slice(1, 3), [2,1])
3235 vereq(a, [3,2,1])
3236 a.__setitem__(slice(0, 2, 1), [2,3])
3237 vereq(a, [2,3,1])
3238
Tim Peters2484aae2002-07-11 06:56:07 +00003239def subtype_resurrection():
3240 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003241 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003242
3243 class C(object):
3244 container = []
3245
3246 def __del__(self):
3247 # resurrect the instance
3248 C.container.append(self)
3249
3250 c = C()
3251 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003252 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003253 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003254 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003255
3256 # If that didn't blow up, it's also interesting to see whether clearing
3257 # the last container slot works: that will attempt to delete c again,
3258 # which will cause c to get appended back to the container again "during"
3259 # the del.
3260 del C.container[-1]
3261 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003262 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003263
Tim Peters14cb1e12002-07-11 18:26:21 +00003264 # Make c mortal again, so that the test framework with -l doesn't report
3265 # it as a leak.
3266 del C.__del__
3267
Guido van Rossum2d702462002-08-06 21:28:28 +00003268def slottrash():
3269 # Deallocating deeply nested slotted trash caused stack overflows
3270 if verbose:
3271 print "Testing slot trash..."
3272 class trash(object):
3273 __slots__ = ['x']
3274 def __init__(self, x):
3275 self.x = x
3276 o = None
3277 for i in xrange(50000):
3278 o = trash(o)
3279 del o
3280
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003281def slotmultipleinheritance():
3282 # SF bug 575229, multiple inheritance w/ slots dumps core
3283 class A(object):
3284 __slots__=()
3285 class B(object):
3286 pass
3287 class C(A,B) :
3288 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003289 vereq(C.__basicsize__, B.__basicsize__)
3290 verify(hasattr(C, '__dict__'))
3291 verify(hasattr(C, '__weakref__'))
3292 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003293
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003294def testrmul():
3295 # SF patch 592646
3296 if verbose:
3297 print "Testing correct invocation of __rmul__..."
3298 class C(object):
3299 def __mul__(self, other):
3300 return "mul"
3301 def __rmul__(self, other):
3302 return "rmul"
3303 a = C()
3304 vereq(a*2, "mul")
3305 vereq(a*2.2, "mul")
3306 vereq(2*a, "rmul")
3307 vereq(2.2*a, "rmul")
3308
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003309def do_this_first():
3310 if verbose:
3311 print "Testing SF bug 551412 ..."
3312 # This dumps core when SF bug 551412 isn't fixed --
3313 # but only when test_descr.py is run separately.
3314 # (That can't be helped -- as soon as PyType_Ready()
3315 # is called for PyLong_Type, the bug is gone.)
3316 class UserLong(object):
3317 def __pow__(self, *args):
3318 pass
3319 try:
3320 pow(0L, UserLong(), 0L)
3321 except:
3322 pass
3323
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003324 if verbose:
3325 print "Testing SF bug 570483..."
3326 # Another segfault only when run early
3327 # (before PyType_Ready(tuple) is called)
3328 type.mro(tuple)
3329
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003330def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003331 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003332 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003333 lists()
3334 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003335 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003336 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003337 ints()
3338 longs()
3339 floats()
3340 complexes()
3341 spamlists()
3342 spamdicts()
3343 pydicts()
3344 pylists()
3345 metaclass()
3346 pymods()
3347 multi()
3348 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00003349 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003350 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003351 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003352 dynamics()
3353 errors()
3354 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003355 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003356 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003357 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003358 classic()
3359 compattr()
3360 newslot()
3361 altmro()
3362 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003363 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003364 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003365 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003366 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003367 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003368 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003369 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003370 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003371 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003372 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003373 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003374 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003375 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003376 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003377 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003378 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003379 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003380 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003381 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003382 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003383 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003384 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003385 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003386 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003387 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003388 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003389 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003390 dictproxyiterkeys()
3391 dictproxyitervalues()
3392 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003393 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003394 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003395 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003396 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003397 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003398 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003399 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003400 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003401 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003402 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003403 testrmul()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003404 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003405
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003406if __name__ == "__main__":
3407 test_main()