blob: dca8ea1760e7a3bdf4682bea2ddaa2ee5f1cff78 [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
Tim Petersc2fe6182001-10-30 23:20:46 +00003from 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
Tim Peters6d6c1a32001-08-02 04:15:00 +00001166def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001167 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001168 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001169 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001170 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001171 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001172 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001173 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001174 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001175 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001176 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001177 vereq(E.foo, 1)
1178 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001179 # Test dynamic instances
1180 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001181 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001182 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001183 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001184 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001185 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001186 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001187 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001188 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001189 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001190 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001191 vereq(int(a), 100)
1192 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001193 verify(not hasattr(a, "spam"))
1194 def mygetattr(self, name):
1195 if name == "spam":
1196 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001197 raise AttributeError
1198 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001199 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001200 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001201 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001202 def mysetattr(self, name, value):
1203 if name == "spam":
1204 raise AttributeError
1205 return object.__setattr__(self, name, value)
1206 C.__setattr__ = mysetattr
1207 try:
1208 a.spam = "not spam"
1209 except AttributeError:
1210 pass
1211 else:
1212 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001213 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001214 class D(C):
1215 pass
1216 d = D()
1217 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001218 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001219
Guido van Rossum7e35d572001-09-15 03:14:32 +00001220 # Test handling of int*seq and seq*int
1221 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001222 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001223 vereq("a"*I(2), "aa")
1224 vereq(I(2)*"a", "aa")
1225 vereq(2*I(3), 6)
1226 vereq(I(3)*2, 6)
1227 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001228
1229 # Test handling of long*seq and seq*long
1230 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001231 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001232 vereq("a"*L(2L), "aa")
1233 vereq(L(2L)*"a", "aa")
1234 vereq(2*L(3), 6)
1235 vereq(L(3)*2, 6)
1236 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001237
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001238 # Test comparison of classes with dynamic metaclasses
1239 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001240 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001241 class someclass:
1242 __metaclass__ = dynamicmetaclass
1243 verify(someclass != object)
1244
Tim Peters6d6c1a32001-08-02 04:15:00 +00001245def errors():
1246 if verbose: print "Testing errors..."
1247
1248 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001249 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001250 pass
1251 except TypeError:
1252 pass
1253 else:
1254 verify(0, "inheritance from both list and dict should be illegal")
1255
1256 try:
1257 class C(object, None):
1258 pass
1259 except TypeError:
1260 pass
1261 else:
1262 verify(0, "inheritance from non-type should be illegal")
1263 class Classic:
1264 pass
1265
1266 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001267 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 pass
1269 except TypeError:
1270 pass
1271 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001272 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001273
1274 try:
1275 class C(object):
1276 __slots__ = 1
1277 except TypeError:
1278 pass
1279 else:
1280 verify(0, "__slots__ = 1 should be illegal")
1281
1282 try:
1283 class C(object):
1284 __slots__ = [1]
1285 except TypeError:
1286 pass
1287 else:
1288 verify(0, "__slots__ = [1] should be illegal")
1289
1290def classmethods():
1291 if verbose: print "Testing class methods..."
1292 class C(object):
1293 def foo(*a): return a
1294 goo = classmethod(foo)
1295 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001296 vereq(C.goo(1), (C, 1))
1297 vereq(c.goo(1), (C, 1))
1298 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001299 class D(C):
1300 pass
1301 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001302 vereq(D.goo(1), (D, 1))
1303 vereq(d.goo(1), (D, 1))
1304 vereq(d.foo(1), (d, 1))
1305 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001306 # Test for a specific crash (SF bug 528132)
1307 def f(cls, arg): return (cls, arg)
1308 ff = classmethod(f)
1309 vereq(ff.__get__(0, int)(42), (int, 42))
1310 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001311
Guido van Rossum155db9a2002-04-02 17:53:47 +00001312 # Test super() with classmethods (SF bug 535444)
1313 veris(C.goo.im_self, C)
1314 veris(D.goo.im_self, D)
1315 veris(super(D,D).goo.im_self, D)
1316 veris(super(D,d).goo.im_self, D)
1317 vereq(super(D,D).goo(), (D,))
1318 vereq(super(D,d).goo(), (D,))
1319
Fred Drakef841aa62002-03-28 15:49:54 +00001320def classmethods_in_c():
1321 if verbose: print "Testing C-based class methods..."
1322 import xxsubtype as spam
1323 a = (1, 2, 3)
1324 d = {'abc': 123}
1325 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1326 veris(x, None)
1327 vereq((spam.spamlist,) + a, a1)
1328 vereq(d, d1)
1329 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1330 veris(x, None)
1331 vereq((spam.spamlist,) + a, a1)
1332 vereq(d, d1)
1333
Tim Peters6d6c1a32001-08-02 04:15:00 +00001334def staticmethods():
1335 if verbose: print "Testing static methods..."
1336 class C(object):
1337 def foo(*a): return a
1338 goo = staticmethod(foo)
1339 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001340 vereq(C.goo(1), (1,))
1341 vereq(c.goo(1), (1,))
1342 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001343 class D(C):
1344 pass
1345 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001346 vereq(D.goo(1), (1,))
1347 vereq(d.goo(1), (1,))
1348 vereq(d.foo(1), (d, 1))
1349 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001350
Fred Drakef841aa62002-03-28 15:49:54 +00001351def staticmethods_in_c():
1352 if verbose: print "Testing C-based static methods..."
1353 import xxsubtype as spam
1354 a = (1, 2, 3)
1355 d = {"abc": 123}
1356 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1357 veris(x, None)
1358 vereq(a, a1)
1359 vereq(d, d1)
1360 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1361 veris(x, None)
1362 vereq(a, a1)
1363 vereq(d, d1)
1364
Tim Peters6d6c1a32001-08-02 04:15:00 +00001365def classic():
1366 if verbose: print "Testing classic classes..."
1367 class C:
1368 def foo(*a): return a
1369 goo = classmethod(foo)
1370 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001371 vereq(C.goo(1), (C, 1))
1372 vereq(c.goo(1), (C, 1))
1373 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001374 class D(C):
1375 pass
1376 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001377 vereq(D.goo(1), (D, 1))
1378 vereq(d.goo(1), (D, 1))
1379 vereq(d.foo(1), (d, 1))
1380 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001381 class E: # *not* subclassing from C
1382 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001383 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001384 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001385
1386def compattr():
1387 if verbose: print "Testing computed attributes..."
1388 class C(object):
1389 class computed_attribute(object):
1390 def __init__(self, get, set=None):
1391 self.__get = get
1392 self.__set = set
1393 def __get__(self, obj, type=None):
1394 return self.__get(obj)
1395 def __set__(self, obj, value):
1396 return self.__set(obj, value)
1397 def __init__(self):
1398 self.__x = 0
1399 def __get_x(self):
1400 x = self.__x
1401 self.__x = x+1
1402 return x
1403 def __set_x(self, x):
1404 self.__x = x
1405 x = computed_attribute(__get_x, __set_x)
1406 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001407 vereq(a.x, 0)
1408 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001409 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001410 vereq(a.x, 10)
1411 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001412
1413def newslot():
1414 if verbose: print "Testing __new__ slot override..."
1415 class C(list):
1416 def __new__(cls):
1417 self = list.__new__(cls)
1418 self.foo = 1
1419 return self
1420 def __init__(self):
1421 self.foo = self.foo + 2
1422 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001423 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001424 verify(a.__class__ is C)
1425 class D(C):
1426 pass
1427 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001428 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001429 verify(b.__class__ is D)
1430
Tim Peters6d6c1a32001-08-02 04:15:00 +00001431def altmro():
1432 if verbose: print "Testing mro() and overriding it..."
1433 class A(object):
1434 def f(self): return "A"
1435 class B(A):
1436 pass
1437 class C(A):
1438 def f(self): return "C"
1439 class D(B, C):
1440 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001441 vereq(D.mro(), [D, B, C, A, object])
1442 vereq(D.__mro__, (D, B, C, A, object))
1443 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001444 class PerverseMetaType(type):
1445 def mro(cls):
1446 L = type.mro(cls)
1447 L.reverse()
1448 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001449 class X(A,B,C,D):
1450 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001451 vereq(X.__mro__, (object, A, C, B, D, X))
1452 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001453
1454def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001455 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001456
1457 class B(object):
1458 "Intermediate class because object doesn't have a __setattr__"
1459
1460 class C(B):
1461
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001462 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001463 if name == "foo":
1464 return ("getattr", name)
1465 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001466 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001467 def __setattr__(self, name, value):
1468 if name == "foo":
1469 self.setattr = (name, value)
1470 else:
1471 return B.__setattr__(self, name, value)
1472 def __delattr__(self, name):
1473 if name == "foo":
1474 self.delattr = name
1475 else:
1476 return B.__delattr__(self, name)
1477
1478 def __getitem__(self, key):
1479 return ("getitem", key)
1480 def __setitem__(self, key, value):
1481 self.setitem = (key, value)
1482 def __delitem__(self, key):
1483 self.delitem = key
1484
1485 def __getslice__(self, i, j):
1486 return ("getslice", i, j)
1487 def __setslice__(self, i, j, value):
1488 self.setslice = (i, j, value)
1489 def __delslice__(self, i, j):
1490 self.delslice = (i, j)
1491
1492 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001493 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001494 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001496 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001497 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001498
Guido van Rossum45704552001-10-08 16:35:45 +00001499 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001500 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001501 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001502 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001503 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001504
Guido van Rossum45704552001-10-08 16:35:45 +00001505 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001506 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001507 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001508 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001509 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001510
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001511def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001512 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001513 class C(object):
1514 def __init__(self, x):
1515 self.x = x
1516 def foo(self):
1517 return self.x
1518 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001519 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001520 class D(C):
1521 boo = C.foo
1522 goo = c1.foo
1523 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001524 vereq(d2.foo(), 2)
1525 vereq(d2.boo(), 2)
1526 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001527 class E(object):
1528 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001529 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001530 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001531
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001532def specials():
1533 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001534 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001535 # Test the default behavior for static classes
1536 class C(object):
1537 def __getitem__(self, i):
1538 if 0 <= i < 10: return i
1539 raise IndexError
1540 c1 = C()
1541 c2 = C()
1542 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001543 vereq(hash(c1), id(c1))
1544 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1545 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001546 verify(c1 != c2)
1547 verify(not c1 != c1)
1548 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001549 # Note that the module name appears in str/repr, and that varies
1550 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001551 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001552 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001553 verify(-1 not in c1)
1554 for i in range(10):
1555 verify(i in c1)
1556 verify(10 not in c1)
1557 # Test the default behavior for dynamic classes
1558 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001559 def __getitem__(self, i):
1560 if 0 <= i < 10: return i
1561 raise IndexError
1562 d1 = D()
1563 d2 = D()
1564 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001565 vereq(hash(d1), id(d1))
1566 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1567 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001568 verify(d1 != d2)
1569 verify(not d1 != d1)
1570 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001571 # Note that the module name appears in str/repr, and that varies
1572 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001573 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001574 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001575 verify(-1 not in d1)
1576 for i in range(10):
1577 verify(i in d1)
1578 verify(10 not in d1)
1579 # Test overridden behavior for static classes
1580 class Proxy(object):
1581 def __init__(self, x):
1582 self.x = x
1583 def __nonzero__(self):
1584 return not not self.x
1585 def __hash__(self):
1586 return hash(self.x)
1587 def __eq__(self, other):
1588 return self.x == other
1589 def __ne__(self, other):
1590 return self.x != other
1591 def __cmp__(self, other):
1592 return cmp(self.x, other.x)
1593 def __str__(self):
1594 return "Proxy:%s" % self.x
1595 def __repr__(self):
1596 return "Proxy(%r)" % self.x
1597 def __contains__(self, value):
1598 return value in self.x
1599 p0 = Proxy(0)
1600 p1 = Proxy(1)
1601 p_1 = Proxy(-1)
1602 verify(not p0)
1603 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001604 vereq(hash(p0), hash(0))
1605 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001606 verify(p0 != p1)
1607 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001608 vereq(not p0, p1)
1609 vereq(cmp(p0, p1), -1)
1610 vereq(cmp(p0, p0), 0)
1611 vereq(cmp(p0, p_1), 1)
1612 vereq(str(p0), "Proxy:0")
1613 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001614 p10 = Proxy(range(10))
1615 verify(-1 not in p10)
1616 for i in range(10):
1617 verify(i in p10)
1618 verify(10 not in p10)
1619 # Test overridden behavior for dynamic classes
1620 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001621 def __init__(self, x):
1622 self.x = x
1623 def __nonzero__(self):
1624 return not not self.x
1625 def __hash__(self):
1626 return hash(self.x)
1627 def __eq__(self, other):
1628 return self.x == other
1629 def __ne__(self, other):
1630 return self.x != other
1631 def __cmp__(self, other):
1632 return cmp(self.x, other.x)
1633 def __str__(self):
1634 return "DProxy:%s" % self.x
1635 def __repr__(self):
1636 return "DProxy(%r)" % self.x
1637 def __contains__(self, value):
1638 return value in self.x
1639 p0 = DProxy(0)
1640 p1 = DProxy(1)
1641 p_1 = DProxy(-1)
1642 verify(not p0)
1643 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(hash(p0), hash(0))
1645 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001646 verify(p0 != p1)
1647 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001648 vereq(not p0, p1)
1649 vereq(cmp(p0, p1), -1)
1650 vereq(cmp(p0, p0), 0)
1651 vereq(cmp(p0, p_1), 1)
1652 vereq(str(p0), "DProxy:0")
1653 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001654 p10 = DProxy(range(10))
1655 verify(-1 not in p10)
1656 for i in range(10):
1657 verify(i in p10)
1658 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001659 # Safety test for __cmp__
1660 def unsafecmp(a, b):
1661 try:
1662 a.__class__.__cmp__(a, b)
1663 except TypeError:
1664 pass
1665 else:
1666 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1667 a.__class__, a, b)
1668 unsafecmp(u"123", "123")
1669 unsafecmp("123", u"123")
1670 unsafecmp(1, 1.0)
1671 unsafecmp(1.0, 1)
1672 unsafecmp(1, 1L)
1673 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001674
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001675def weakrefs():
1676 if verbose: print "Testing weak references..."
1677 import weakref
1678 class C(object):
1679 pass
1680 c = C()
1681 r = weakref.ref(c)
1682 verify(r() is c)
1683 del c
1684 verify(r() is None)
1685 del r
1686 class NoWeak(object):
1687 __slots__ = ['foo']
1688 no = NoWeak()
1689 try:
1690 weakref.ref(no)
1691 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001692 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001693 else:
1694 verify(0, "weakref.ref(no) should be illegal")
1695 class Weak(object):
1696 __slots__ = ['foo', '__weakref__']
1697 yes = Weak()
1698 r = weakref.ref(yes)
1699 verify(r() is yes)
1700 del yes
1701 verify(r() is None)
1702 del r
1703
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001704def properties():
1705 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001706 class C(object):
1707 def getx(self):
1708 return self.__x
1709 def setx(self, value):
1710 self.__x = value
1711 def delx(self):
1712 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001713 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001714 a = C()
1715 verify(not hasattr(a, "x"))
1716 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001717 vereq(a._C__x, 42)
1718 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001719 del a.x
1720 verify(not hasattr(a, "x"))
1721 verify(not hasattr(a, "_C__x"))
1722 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001723 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001724## C.x.__set__(a)
1725## verify(not hasattr(a, "x"))
1726
Tim Peters66c1a522001-09-24 21:17:50 +00001727 raw = C.__dict__['x']
1728 verify(isinstance(raw, property))
1729
1730 attrs = dir(raw)
1731 verify("__doc__" in attrs)
1732 verify("fget" in attrs)
1733 verify("fset" in attrs)
1734 verify("fdel" in attrs)
1735
Guido van Rossum45704552001-10-08 16:35:45 +00001736 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001737 verify(raw.fget is C.__dict__['getx'])
1738 verify(raw.fset is C.__dict__['setx'])
1739 verify(raw.fdel is C.__dict__['delx'])
1740
1741 for attr in "__doc__", "fget", "fset", "fdel":
1742 try:
1743 setattr(raw, attr, 42)
1744 except TypeError, msg:
1745 if str(msg).find('readonly') < 0:
1746 raise TestFailed("when setting readonly attr %r on a "
1747 "property, got unexpected TypeError "
1748 "msg %r" % (attr, str(msg)))
1749 else:
1750 raise TestFailed("expected TypeError from trying to set "
1751 "readonly %r attr on a property" % attr)
1752
Guido van Rossumc4a18802001-08-24 16:55:27 +00001753def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001754 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001755
1756 class A(object):
1757 def meth(self, a):
1758 return "A(%r)" % a
1759
Guido van Rossum45704552001-10-08 16:35:45 +00001760 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001761
1762 class B(A):
1763 def __init__(self):
1764 self.__super = super(B, self)
1765 def meth(self, a):
1766 return "B(%r)" % a + self.__super.meth(a)
1767
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001769
1770 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001771 def meth(self, a):
1772 return "C(%r)" % a + self.__super.meth(a)
1773 C._C__super = super(C)
1774
Guido van Rossum45704552001-10-08 16:35:45 +00001775 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001776
1777 class D(C, B):
1778 def meth(self, a):
1779 return "D(%r)" % a + super(D, self).meth(a)
1780
Guido van Rossum5b443c62001-12-03 15:38:28 +00001781 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1782
1783 # Test for subclassing super
1784
1785 class mysuper(super):
1786 def __init__(self, *args):
1787 return super(mysuper, self).__init__(*args)
1788
1789 class E(D):
1790 def meth(self, a):
1791 return "E(%r)" % a + mysuper(E, self).meth(a)
1792
1793 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1794
1795 class F(E):
1796 def meth(self, a):
1797 s = self.__super
1798 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1799 F._F__super = mysuper(F)
1800
1801 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1802
1803 # Make sure certain errors are raised
1804
1805 try:
1806 super(D, 42)
1807 except TypeError:
1808 pass
1809 else:
1810 raise TestFailed, "shouldn't allow super(D, 42)"
1811
1812 try:
1813 super(D, C())
1814 except TypeError:
1815 pass
1816 else:
1817 raise TestFailed, "shouldn't allow super(D, C())"
1818
1819 try:
1820 super(D).__get__(12)
1821 except TypeError:
1822 pass
1823 else:
1824 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1825
1826 try:
1827 super(D).__get__(C())
1828 except TypeError:
1829 pass
1830 else:
1831 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001832
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001833def inherits():
1834 if verbose: print "Testing inheritance from basic types..."
1835
1836 class hexint(int):
1837 def __repr__(self):
1838 return hex(self)
1839 def __add__(self, other):
1840 return hexint(int.__add__(self, other))
1841 # (Note that overriding __radd__ doesn't work,
1842 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001843 vereq(repr(hexint(7) + 9), "0x10")
1844 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001845 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001846 vereq(a, 12345)
1847 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001848 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001849 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001850 verify((+a).__class__ is int)
1851 verify((a >> 0).__class__ is int)
1852 verify((a << 0).__class__ is int)
1853 verify((hexint(0) << 12).__class__ is int)
1854 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001855
1856 class octlong(long):
1857 __slots__ = []
1858 def __str__(self):
1859 s = oct(self)
1860 if s[-1] == 'L':
1861 s = s[:-1]
1862 return s
1863 def __add__(self, other):
1864 return self.__class__(super(octlong, self).__add__(other))
1865 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001866 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001867 # (Note that overriding __radd__ here only seems to work
1868 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001869 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001870 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001871 vereq(a, 12345L)
1872 vereq(long(a), 12345L)
1873 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001874 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001875 verify((+a).__class__ is long)
1876 verify((-a).__class__ is long)
1877 verify((-octlong(0)).__class__ is long)
1878 verify((a >> 0).__class__ is long)
1879 verify((a << 0).__class__ is long)
1880 verify((a - 0).__class__ is long)
1881 verify((a * 1).__class__ is long)
1882 verify((a ** 1).__class__ is long)
1883 verify((a // 1).__class__ is long)
1884 verify((1 * a).__class__ is long)
1885 verify((a | 0).__class__ is long)
1886 verify((a ^ 0).__class__ is long)
1887 verify((a & -1L).__class__ is long)
1888 verify((octlong(0) << 12).__class__ is long)
1889 verify((octlong(0) >> 12).__class__ is long)
1890 verify(abs(octlong(0)).__class__ is long)
1891
1892 # Because octlong overrides __add__, we can't check the absence of +0
1893 # optimizations using octlong.
1894 class longclone(long):
1895 pass
1896 a = longclone(1)
1897 verify((a + 0).__class__ is long)
1898 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001899
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001900 # Check that negative clones don't segfault
1901 a = longclone(-1)
1902 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001903 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001904
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001905 class precfloat(float):
1906 __slots__ = ['prec']
1907 def __init__(self, value=0.0, prec=12):
1908 self.prec = int(prec)
1909 float.__init__(value)
1910 def __repr__(self):
1911 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001912 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001913 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001914 vereq(a, 12345.0)
1915 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001916 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001917 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001918 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001919
Tim Peters2400fa42001-09-12 19:12:49 +00001920 class madcomplex(complex):
1921 def __repr__(self):
1922 return "%.17gj%+.17g" % (self.imag, self.real)
1923 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001924 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001925 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001926 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001927 vereq(a, base)
1928 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001929 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001930 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001931 vereq(repr(a), "4j-3")
1932 vereq(a, base)
1933 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001934 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001936 veris((+a).__class__, complex)
1937 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001938 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001939 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001940 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001941 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001942 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001943 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001944 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001945
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001946 class madtuple(tuple):
1947 _rev = None
1948 def rev(self):
1949 if self._rev is not None:
1950 return self._rev
1951 L = list(self)
1952 L.reverse()
1953 self._rev = self.__class__(L)
1954 return self._rev
1955 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001956 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1957 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1958 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001959 for i in range(512):
1960 t = madtuple(range(i))
1961 u = t.rev()
1962 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001963 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001964 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001965 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001966 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001967 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001968 verify(a[:].__class__ is tuple)
1969 verify((a * 1).__class__ is tuple)
1970 verify((a * 0).__class__ is tuple)
1971 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001972 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001973 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001974 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001975 verify((a + a).__class__ is tuple)
1976 verify((a * 0).__class__ is tuple)
1977 verify((a * 1).__class__ is tuple)
1978 verify((a * 2).__class__ is tuple)
1979 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001980
1981 class madstring(str):
1982 _rev = None
1983 def rev(self):
1984 if self._rev is not None:
1985 return self._rev
1986 L = list(self)
1987 L.reverse()
1988 self._rev = self.__class__("".join(L))
1989 return self._rev
1990 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001991 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1992 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1993 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001994 for i in range(256):
1995 s = madstring("".join(map(chr, range(i))))
1996 t = s.rev()
1997 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001998 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001999 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002000 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002001 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002002
Tim Peters8fa5dd02001-09-12 02:18:30 +00002003 base = "\x00" * 5
2004 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002005 vereq(s, base)
2006 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002007 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002008 vereq(hash(s), hash(base))
2009 vereq({s: 1}[base], 1)
2010 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002011 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002012 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002013 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002014 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002015 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002016 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002017 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002018 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002019 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002020 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002021 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002022 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002023 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002024 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002025 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002026 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002027 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002028 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002029 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002030 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002031 identitytab = ''.join([chr(i) for i in range(256)])
2032 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002033 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002034 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002035 vereq(s.translate(identitytab, "x"), base)
2036 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002037 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002038 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002039 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002040 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002041 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002042 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002043 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002044 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002045 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002046 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002047
Tim Peters111f6092001-09-12 07:54:51 +00002048 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002049 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002050 verify(intern(s).__class__ is str)
2051 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002052 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002053
2054 i = intern("y x")
2055 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002056 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002057 verify(intern(s).__class__ is str)
2058 verify(intern(s) is i)
2059
2060 s = madstring(i)
2061 verify(intern(s).__class__ is str)
2062 verify(intern(s) is i)
2063
Guido van Rossum91ee7982001-08-30 20:52:40 +00002064 class madunicode(unicode):
2065 _rev = None
2066 def rev(self):
2067 if self._rev is not None:
2068 return self._rev
2069 L = list(self)
2070 L.reverse()
2071 self._rev = self.__class__(u"".join(L))
2072 return self._rev
2073 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002074 vereq(u, u"ABCDEF")
2075 vereq(u.rev(), madunicode(u"FEDCBA"))
2076 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002077 base = u"12345"
2078 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002079 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002080 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002081 vereq(hash(u), hash(base))
2082 vereq({u: 1}[base], 1)
2083 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002084 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002085 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002086 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002087 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002088 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002089 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002090 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002091 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002092 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002093 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002094 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002095 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002096 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002097 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002098 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002099 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002100 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002101 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002102 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002103 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002104 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002105 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002106 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002107 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002108 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002109 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002110 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002111 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002112 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002113 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002114 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002115 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002116 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002117 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002118 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002119 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002120 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002121 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002122
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002123 class sublist(list):
2124 pass
2125 a = sublist(range(5))
2126 vereq(a, range(5))
2127 a.append("hello")
2128 vereq(a, range(5) + ["hello"])
2129 a[5] = 5
2130 vereq(a, range(6))
2131 a.extend(range(6, 20))
2132 vereq(a, range(20))
2133 a[-5:] = []
2134 vereq(a, range(15))
2135 del a[10:15]
2136 vereq(len(a), 10)
2137 vereq(a, range(10))
2138 vereq(list(a), range(10))
2139 vereq(a[0], 0)
2140 vereq(a[9], 9)
2141 vereq(a[-10], 0)
2142 vereq(a[-1], 9)
2143 vereq(a[:5], range(5))
2144
Tim Peters59c9a642001-09-13 05:38:56 +00002145 class CountedInput(file):
2146 """Counts lines read by self.readline().
2147
2148 self.lineno is the 0-based ordinal of the last line read, up to
2149 a maximum of one greater than the number of lines in the file.
2150
2151 self.ateof is true if and only if the final "" line has been read,
2152 at which point self.lineno stops incrementing, and further calls
2153 to readline() continue to return "".
2154 """
2155
2156 lineno = 0
2157 ateof = 0
2158 def readline(self):
2159 if self.ateof:
2160 return ""
2161 s = file.readline(self)
2162 # Next line works too.
2163 # s = super(CountedInput, self).readline()
2164 self.lineno += 1
2165 if s == "":
2166 self.ateof = 1
2167 return s
2168
Tim Peters561f8992001-09-13 19:36:36 +00002169 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002170 lines = ['a\n', 'b\n', 'c\n']
2171 try:
2172 f.writelines(lines)
2173 f.close()
2174 f = CountedInput(TESTFN)
2175 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2176 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002177 vereq(expected, got)
2178 vereq(f.lineno, i)
2179 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002180 f.close()
2181 finally:
2182 try:
2183 f.close()
2184 except:
2185 pass
2186 try:
2187 import os
2188 os.unlink(TESTFN)
2189 except:
2190 pass
2191
Tim Peters808b94e2001-09-13 19:33:07 +00002192def keywords():
2193 if verbose:
2194 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002195 vereq(int(x=1), 1)
2196 vereq(float(x=2), 2.0)
2197 vereq(long(x=3), 3L)
2198 vereq(complex(imag=42, real=666), complex(666, 42))
2199 vereq(str(object=500), '500')
2200 vereq(unicode(string='abc', errors='strict'), u'abc')
2201 vereq(tuple(sequence=range(3)), (0, 1, 2))
2202 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002203 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002204
2205 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002206 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002207 try:
2208 constructor(bogus_keyword_arg=1)
2209 except TypeError:
2210 pass
2211 else:
2212 raise TestFailed("expected TypeError from bogus keyword "
2213 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002214
Tim Peters8fa45672001-09-13 21:01:29 +00002215def restricted():
2216 import rexec
2217 if verbose:
2218 print "Testing interaction with restricted execution ..."
2219
2220 sandbox = rexec.RExec()
2221
2222 code1 = """f = open(%r, 'w')""" % TESTFN
2223 code2 = """f = file(%r, 'w')""" % TESTFN
2224 code3 = """\
2225f = open(%r)
2226t = type(f) # a sneaky way to get the file() constructor
2227f.close()
2228f = t(%r, 'w') # rexec can't catch this by itself
2229""" % (TESTFN, TESTFN)
2230
2231 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2232 f.close()
2233
2234 try:
2235 for code in code1, code2, code3:
2236 try:
2237 sandbox.r_exec(code)
2238 except IOError, msg:
2239 if str(msg).find("restricted") >= 0:
2240 outcome = "OK"
2241 else:
2242 outcome = "got an exception, but not an expected one"
2243 else:
2244 outcome = "expected a restricted-execution exception"
2245
2246 if outcome != "OK":
2247 raise TestFailed("%s, in %r" % (outcome, code))
2248
2249 finally:
2250 try:
2251 import os
2252 os.unlink(TESTFN)
2253 except:
2254 pass
2255
Tim Peters0ab085c2001-09-14 00:25:33 +00002256def str_subclass_as_dict_key():
2257 if verbose:
2258 print "Testing a str subclass used as dict key .."
2259
2260 class cistr(str):
2261 """Sublcass of str that computes __eq__ case-insensitively.
2262
2263 Also computes a hash code of the string in canonical form.
2264 """
2265
2266 def __init__(self, value):
2267 self.canonical = value.lower()
2268 self.hashcode = hash(self.canonical)
2269
2270 def __eq__(self, other):
2271 if not isinstance(other, cistr):
2272 other = cistr(other)
2273 return self.canonical == other.canonical
2274
2275 def __hash__(self):
2276 return self.hashcode
2277
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(cistr('ABC'), 'abc')
2279 vereq('aBc', cistr('ABC'))
2280 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002281
2282 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(d[cistr('one')], 1)
2284 vereq(d[cistr('tWo')], 2)
2285 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002286 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002288
Guido van Rossumab3b0342001-09-18 20:38:53 +00002289def classic_comparisons():
2290 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002291 class classic:
2292 pass
2293 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002294 if verbose: print " (base = %s)" % base
2295 class C(base):
2296 def __init__(self, value):
2297 self.value = int(value)
2298 def __cmp__(self, other):
2299 if isinstance(other, C):
2300 return cmp(self.value, other.value)
2301 if isinstance(other, int) or isinstance(other, long):
2302 return cmp(self.value, other)
2303 return NotImplemented
2304 c1 = C(1)
2305 c2 = C(2)
2306 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002307 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002308 c = {1: c1, 2: c2, 3: c3}
2309 for x in 1, 2, 3:
2310 for y in 1, 2, 3:
2311 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2312 for op in "<", "<=", "==", "!=", ">", ">=":
2313 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2314 "x=%d, y=%d" % (x, y))
2315 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2316 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2317
Guido van Rossum0639f592001-09-18 21:06:04 +00002318def rich_comparisons():
2319 if verbose:
2320 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002321 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002322 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002323 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002324 vereq(z, 1+0j)
2325 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002326 class ZZ(complex):
2327 def __eq__(self, other):
2328 try:
2329 return abs(self - other) <= 1e-6
2330 except:
2331 return NotImplemented
2332 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002333 vereq(zz, 1+0j)
2334 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002335
Guido van Rossum0639f592001-09-18 21:06:04 +00002336 class classic:
2337 pass
2338 for base in (classic, int, object, list):
2339 if verbose: print " (base = %s)" % base
2340 class C(base):
2341 def __init__(self, value):
2342 self.value = int(value)
2343 def __cmp__(self, other):
2344 raise TestFailed, "shouldn't call __cmp__"
2345 def __eq__(self, other):
2346 if isinstance(other, C):
2347 return self.value == other.value
2348 if isinstance(other, int) or isinstance(other, long):
2349 return self.value == other
2350 return NotImplemented
2351 def __ne__(self, other):
2352 if isinstance(other, C):
2353 return self.value != other.value
2354 if isinstance(other, int) or isinstance(other, long):
2355 return self.value != other
2356 return NotImplemented
2357 def __lt__(self, other):
2358 if isinstance(other, C):
2359 return self.value < other.value
2360 if isinstance(other, int) or isinstance(other, long):
2361 return self.value < other
2362 return NotImplemented
2363 def __le__(self, other):
2364 if isinstance(other, C):
2365 return self.value <= other.value
2366 if isinstance(other, int) or isinstance(other, long):
2367 return self.value <= other
2368 return NotImplemented
2369 def __gt__(self, other):
2370 if isinstance(other, C):
2371 return self.value > other.value
2372 if isinstance(other, int) or isinstance(other, long):
2373 return self.value > other
2374 return NotImplemented
2375 def __ge__(self, other):
2376 if isinstance(other, C):
2377 return self.value >= other.value
2378 if isinstance(other, int) or isinstance(other, long):
2379 return self.value >= other
2380 return NotImplemented
2381 c1 = C(1)
2382 c2 = C(2)
2383 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002384 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002385 c = {1: c1, 2: c2, 3: c3}
2386 for x in 1, 2, 3:
2387 for y in 1, 2, 3:
2388 for op in "<", "<=", "==", "!=", ">", ">=":
2389 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2390 "x=%d, y=%d" % (x, y))
2391 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2392 "x=%d, y=%d" % (x, y))
2393 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2394 "x=%d, y=%d" % (x, y))
2395
Guido van Rossum1952e382001-09-19 01:25:16 +00002396def coercions():
2397 if verbose: print "Testing coercions..."
2398 class I(int): pass
2399 coerce(I(0), 0)
2400 coerce(0, I(0))
2401 class L(long): pass
2402 coerce(L(0), 0)
2403 coerce(L(0), 0L)
2404 coerce(0, L(0))
2405 coerce(0L, L(0))
2406 class F(float): pass
2407 coerce(F(0), 0)
2408 coerce(F(0), 0L)
2409 coerce(F(0), 0.)
2410 coerce(0, F(0))
2411 coerce(0L, F(0))
2412 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002413 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002414 coerce(C(0), 0)
2415 coerce(C(0), 0L)
2416 coerce(C(0), 0.)
2417 coerce(C(0), 0j)
2418 coerce(0, C(0))
2419 coerce(0L, C(0))
2420 coerce(0., C(0))
2421 coerce(0j, C(0))
2422
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002423def descrdoc():
2424 if verbose: print "Testing descriptor doc strings..."
2425 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002426 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002427 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002428 check(file.name, "file name") # member descriptor
2429
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002430def setclass():
2431 if verbose: print "Testing __class__ assignment..."
2432 class C(object): pass
2433 class D(object): pass
2434 class E(object): pass
2435 class F(D, E): pass
2436 for cls in C, D, E, F:
2437 for cls2 in C, D, E, F:
2438 x = cls()
2439 x.__class__ = cls2
2440 verify(x.__class__ is cls2)
2441 x.__class__ = cls
2442 verify(x.__class__ is cls)
2443 def cant(x, C):
2444 try:
2445 x.__class__ = C
2446 except TypeError:
2447 pass
2448 else:
2449 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002450 try:
2451 delattr(x, "__class__")
2452 except TypeError:
2453 pass
2454 else:
2455 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002456 cant(C(), list)
2457 cant(list(), C)
2458 cant(C(), 1)
2459 cant(C(), object)
2460 cant(object(), list)
2461 cant(list(), object)
2462
Guido van Rossum6661be32001-10-26 04:26:12 +00002463def setdict():
2464 if verbose: print "Testing __dict__ assignment..."
2465 class C(object): pass
2466 a = C()
2467 a.__dict__ = {'b': 1}
2468 vereq(a.b, 1)
2469 def cant(x, dict):
2470 try:
2471 x.__dict__ = dict
2472 except TypeError:
2473 pass
2474 else:
2475 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2476 cant(a, None)
2477 cant(a, [])
2478 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002479 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002480 # Classes don't allow __dict__ assignment
2481 cant(C, {})
2482
Guido van Rossum3926a632001-09-25 16:25:58 +00002483def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002484 if verbose:
2485 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002486 import pickle, cPickle
2487
2488 def sorteditems(d):
2489 L = d.items()
2490 L.sort()
2491 return L
2492
2493 global C
2494 class C(object):
2495 def __init__(self, a, b):
2496 super(C, self).__init__()
2497 self.a = a
2498 self.b = b
2499 def __repr__(self):
2500 return "C(%r, %r)" % (self.a, self.b)
2501
2502 global C1
2503 class C1(list):
2504 def __new__(cls, a, b):
2505 return super(C1, cls).__new__(cls)
2506 def __init__(self, a, b):
2507 self.a = a
2508 self.b = b
2509 def __repr__(self):
2510 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2511
2512 global C2
2513 class C2(int):
2514 def __new__(cls, a, b, val=0):
2515 return super(C2, cls).__new__(cls, val)
2516 def __init__(self, a, b, val=0):
2517 self.a = a
2518 self.b = b
2519 def __repr__(self):
2520 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2521
Guido van Rossum90c45142001-11-24 21:07:01 +00002522 global C3
2523 class C3(object):
2524 def __init__(self, foo):
2525 self.foo = foo
2526 def __getstate__(self):
2527 return self.foo
2528 def __setstate__(self, foo):
2529 self.foo = foo
2530
2531 global C4classic, C4
2532 class C4classic: # classic
2533 pass
2534 class C4(C4classic, object): # mixed inheritance
2535 pass
2536
Guido van Rossum3926a632001-09-25 16:25:58 +00002537 for p in pickle, cPickle:
2538 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002539 if verbose:
2540 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002541
2542 for cls in C, C1, C2:
2543 s = p.dumps(cls, bin)
2544 cls2 = p.loads(s)
2545 verify(cls2 is cls)
2546
2547 a = C1(1, 2); a.append(42); a.append(24)
2548 b = C2("hello", "world", 42)
2549 s = p.dumps((a, b), bin)
2550 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002551 vereq(x.__class__, a.__class__)
2552 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2553 vereq(y.__class__, b.__class__)
2554 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2555 vereq(`x`, `a`)
2556 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002557 if verbose:
2558 print "a = x =", a
2559 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002560 # Test for __getstate__ and __setstate__ on new style class
2561 u = C3(42)
2562 s = p.dumps(u, bin)
2563 v = p.loads(s)
2564 veris(u.__class__, v.__class__)
2565 vereq(u.foo, v.foo)
2566 # Test for picklability of hybrid class
2567 u = C4()
2568 u.foo = 42
2569 s = p.dumps(u, bin)
2570 v = p.loads(s)
2571 veris(u.__class__, v.__class__)
2572 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002573
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002574 # Testing copy.deepcopy()
2575 if verbose:
2576 print "deepcopy"
2577 import copy
2578 for cls in C, C1, C2:
2579 cls2 = copy.deepcopy(cls)
2580 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002581
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002582 a = C1(1, 2); a.append(42); a.append(24)
2583 b = C2("hello", "world", 42)
2584 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002585 vereq(x.__class__, a.__class__)
2586 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2587 vereq(y.__class__, b.__class__)
2588 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2589 vereq(`x`, `a`)
2590 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002591 if verbose:
2592 print "a = x =", a
2593 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002594
Guido van Rossum8c842552002-03-14 23:05:54 +00002595def pickleslots():
2596 if verbose: print "Testing pickling of classes with __slots__ ..."
2597 import pickle, cPickle
2598 # Pickling of classes with __slots__ but without __getstate__ should fail
2599 global B, C, D, E
2600 class B(object):
2601 pass
2602 for base in [object, B]:
2603 class C(base):
2604 __slots__ = ['a']
2605 class D(C):
2606 pass
2607 try:
2608 pickle.dumps(C())
2609 except TypeError:
2610 pass
2611 else:
2612 raise TestFailed, "should fail: pickle C instance - %s" % base
2613 try:
2614 cPickle.dumps(C())
2615 except TypeError:
2616 pass
2617 else:
2618 raise TestFailed, "should fail: cPickle C instance - %s" % base
2619 try:
2620 pickle.dumps(C())
2621 except TypeError:
2622 pass
2623 else:
2624 raise TestFailed, "should fail: pickle D instance - %s" % base
2625 try:
2626 cPickle.dumps(D())
2627 except TypeError:
2628 pass
2629 else:
2630 raise TestFailed, "should fail: cPickle D instance - %s" % base
2631 # Give C a __getstate__ and __setstate__
2632 class C(base):
2633 __slots__ = ['a']
2634 def __getstate__(self):
2635 try:
2636 d = self.__dict__.copy()
2637 except AttributeError:
2638 d = {}
2639 try:
2640 d['a'] = self.a
2641 except AttributeError:
2642 pass
2643 return d
2644 def __setstate__(self, d):
2645 for k, v in d.items():
2646 setattr(self, k, v)
2647 class D(C):
2648 pass
2649 # Now it should work
2650 x = C()
2651 y = pickle.loads(pickle.dumps(x))
2652 vereq(hasattr(y, 'a'), 0)
2653 y = cPickle.loads(cPickle.dumps(x))
2654 vereq(hasattr(y, 'a'), 0)
2655 x.a = 42
2656 y = pickle.loads(pickle.dumps(x))
2657 vereq(y.a, 42)
2658 y = cPickle.loads(cPickle.dumps(x))
2659 vereq(y.a, 42)
2660 x = D()
2661 x.a = 42
2662 x.b = 100
2663 y = pickle.loads(pickle.dumps(x))
2664 vereq(y.a + y.b, 142)
2665 y = cPickle.loads(cPickle.dumps(x))
2666 vereq(y.a + y.b, 142)
2667 # But a subclass that adds a slot should not work
2668 class E(C):
2669 __slots__ = ['b']
2670 try:
2671 pickle.dumps(E())
2672 except TypeError:
2673 pass
2674 else:
2675 raise TestFailed, "should fail: pickle E instance - %s" % base
2676 try:
2677 cPickle.dumps(E())
2678 except TypeError:
2679 pass
2680 else:
2681 raise TestFailed, "should fail: cPickle E instance - %s" % base
2682
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002683def copies():
2684 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2685 import copy
2686 class C(object):
2687 pass
2688
2689 a = C()
2690 a.foo = 12
2691 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002692 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002693
2694 a.bar = [1,2,3]
2695 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002696 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002697 verify(c.bar is a.bar)
2698
2699 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002700 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002701 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002702 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002703
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002704def binopoverride():
2705 if verbose: print "Testing overrides of binary operations..."
2706 class I(int):
2707 def __repr__(self):
2708 return "I(%r)" % int(self)
2709 def __add__(self, other):
2710 return I(int(self) + int(other))
2711 __radd__ = __add__
2712 def __pow__(self, other, mod=None):
2713 if mod is None:
2714 return I(pow(int(self), int(other)))
2715 else:
2716 return I(pow(int(self), int(other), int(mod)))
2717 def __rpow__(self, other, mod=None):
2718 if mod is None:
2719 return I(pow(int(other), int(self), mod))
2720 else:
2721 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002722
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002723 vereq(`I(1) + I(2)`, "I(3)")
2724 vereq(`I(1) + 2`, "I(3)")
2725 vereq(`1 + I(2)`, "I(3)")
2726 vereq(`I(2) ** I(3)`, "I(8)")
2727 vereq(`2 ** I(3)`, "I(8)")
2728 vereq(`I(2) ** 3`, "I(8)")
2729 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2730 class S(str):
2731 def __eq__(self, other):
2732 return self.lower() == other.lower()
2733
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002734def subclasspropagation():
2735 if verbose: print "Testing propagation of slot functions to subclasses..."
2736 class A(object):
2737 pass
2738 class B(A):
2739 pass
2740 class C(A):
2741 pass
2742 class D(B, C):
2743 pass
2744 d = D()
2745 vereq(hash(d), id(d))
2746 A.__hash__ = lambda self: 42
2747 vereq(hash(d), 42)
2748 C.__hash__ = lambda self: 314
2749 vereq(hash(d), 314)
2750 B.__hash__ = lambda self: 144
2751 vereq(hash(d), 144)
2752 D.__hash__ = lambda self: 100
2753 vereq(hash(d), 100)
2754 del D.__hash__
2755 vereq(hash(d), 144)
2756 del B.__hash__
2757 vereq(hash(d), 314)
2758 del C.__hash__
2759 vereq(hash(d), 42)
2760 del A.__hash__
2761 vereq(hash(d), id(d))
2762 d.foo = 42
2763 d.bar = 42
2764 vereq(d.foo, 42)
2765 vereq(d.bar, 42)
2766 def __getattribute__(self, name):
2767 if name == "foo":
2768 return 24
2769 return object.__getattribute__(self, name)
2770 A.__getattribute__ = __getattribute__
2771 vereq(d.foo, 24)
2772 vereq(d.bar, 42)
2773 def __getattr__(self, name):
2774 if name in ("spam", "foo", "bar"):
2775 return "hello"
2776 raise AttributeError, name
2777 B.__getattr__ = __getattr__
2778 vereq(d.spam, "hello")
2779 vereq(d.foo, 24)
2780 vereq(d.bar, 42)
2781 del A.__getattribute__
2782 vereq(d.foo, 42)
2783 del d.foo
2784 vereq(d.foo, "hello")
2785 vereq(d.bar, 42)
2786 del B.__getattr__
2787 try:
2788 d.foo
2789 except AttributeError:
2790 pass
2791 else:
2792 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002793
Guido van Rossume7f3e242002-06-14 02:35:45 +00002794 # Test a nasty bug in recurse_down_subclasses()
2795 import gc
2796 class A(object):
2797 pass
2798 class B(A):
2799 pass
2800 del B
2801 gc.collect()
2802 A.__setitem__ = lambda *a: None # crash
2803
Tim Petersfc57ccb2001-10-12 02:38:24 +00002804def buffer_inherit():
2805 import binascii
2806 # SF bug [#470040] ParseTuple t# vs subclasses.
2807 if verbose:
2808 print "Testing that buffer interface is inherited ..."
2809
2810 class MyStr(str):
2811 pass
2812 base = 'abc'
2813 m = MyStr(base)
2814 # b2a_hex uses the buffer interface to get its argument's value, via
2815 # PyArg_ParseTuple 't#' code.
2816 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2817
2818 # It's not clear that unicode will continue to support the character
2819 # buffer interface, and this test will fail if that's taken away.
2820 class MyUni(unicode):
2821 pass
2822 base = u'abc'
2823 m = MyUni(base)
2824 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2825
2826 class MyInt(int):
2827 pass
2828 m = MyInt(42)
2829 try:
2830 binascii.b2a_hex(m)
2831 raise TestFailed('subclass of int should not have a buffer interface')
2832 except TypeError:
2833 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002834
Tim Petersc9933152001-10-16 20:18:24 +00002835def str_of_str_subclass():
2836 import binascii
2837 import cStringIO
2838
2839 if verbose:
2840 print "Testing __str__ defined in subclass of str ..."
2841
2842 class octetstring(str):
2843 def __str__(self):
2844 return binascii.b2a_hex(self)
2845 def __repr__(self):
2846 return self + " repr"
2847
2848 o = octetstring('A')
2849 vereq(type(o), octetstring)
2850 vereq(type(str(o)), str)
2851 vereq(type(repr(o)), str)
2852 vereq(ord(o), 0x41)
2853 vereq(str(o), '41')
2854 vereq(repr(o), 'A repr')
2855 vereq(o.__str__(), '41')
2856 vereq(o.__repr__(), 'A repr')
2857
2858 capture = cStringIO.StringIO()
2859 # Calling str() or not exercises different internal paths.
2860 print >> capture, o
2861 print >> capture, str(o)
2862 vereq(capture.getvalue(), '41\n41\n')
2863 capture.close()
2864
Guido van Rossumc8e56452001-10-22 00:43:43 +00002865def kwdargs():
2866 if verbose: print "Testing keyword arguments to __init__, __call__..."
2867 def f(a): return a
2868 vereq(f.__call__(a=42), 42)
2869 a = []
2870 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002871 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002872
Guido van Rossumed87ad82001-10-30 02:33:02 +00002873def delhook():
2874 if verbose: print "Testing __del__ hook..."
2875 log = []
2876 class C(object):
2877 def __del__(self):
2878 log.append(1)
2879 c = C()
2880 vereq(log, [])
2881 del c
2882 vereq(log, [1])
2883
Guido van Rossum29d26062001-12-11 04:37:34 +00002884 class D(object): pass
2885 d = D()
2886 try: del d[0]
2887 except TypeError: pass
2888 else: raise TestFailed, "invalid del() didn't raise TypeError"
2889
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002890def hashinherit():
2891 if verbose: print "Testing hash of mutable subclasses..."
2892
2893 class mydict(dict):
2894 pass
2895 d = mydict()
2896 try:
2897 hash(d)
2898 except TypeError:
2899 pass
2900 else:
2901 raise TestFailed, "hash() of dict subclass should fail"
2902
2903 class mylist(list):
2904 pass
2905 d = mylist()
2906 try:
2907 hash(d)
2908 except TypeError:
2909 pass
2910 else:
2911 raise TestFailed, "hash() of list subclass should fail"
2912
Guido van Rossum29d26062001-12-11 04:37:34 +00002913def strops():
2914 try: 'a' + 5
2915 except TypeError: pass
2916 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2917
2918 try: ''.split('')
2919 except ValueError: pass
2920 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2921
2922 try: ''.join([0])
2923 except TypeError: pass
2924 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2925
2926 try: ''.rindex('5')
2927 except ValueError: pass
2928 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2929
2930 try: ''.replace('', '')
2931 except ValueError: pass
2932 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2933
2934 try: '%(n)s' % None
2935 except TypeError: pass
2936 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2937
2938 try: '%(n' % {}
2939 except ValueError: pass
2940 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2941
2942 try: '%*s' % ('abc')
2943 except TypeError: pass
2944 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2945
2946 try: '%*.*s' % ('abc', 5)
2947 except TypeError: pass
2948 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2949
2950 try: '%s' % (1, 2)
2951 except TypeError: pass
2952 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2953
2954 try: '%' % None
2955 except ValueError: pass
2956 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2957
2958 vereq('534253'.isdigit(), 1)
2959 vereq('534253x'.isdigit(), 0)
2960 vereq('%c' % 5, '\x05')
2961 vereq('%c' % '5', '5')
2962
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002963def deepcopyrecursive():
2964 if verbose: print "Testing deepcopy of recursive objects..."
2965 class Node:
2966 pass
2967 a = Node()
2968 b = Node()
2969 a.b = b
2970 b.a = a
2971 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002972
Guido van Rossumd7035672002-03-12 20:43:31 +00002973def modules():
2974 if verbose: print "Testing uninitialized module objects..."
2975 from types import ModuleType as M
2976 m = M.__new__(M)
2977 str(m)
2978 vereq(hasattr(m, "__name__"), 0)
2979 vereq(hasattr(m, "__file__"), 0)
2980 vereq(hasattr(m, "foo"), 0)
2981 vereq(m.__dict__, None)
2982 m.foo = 1
2983 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00002984
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002985def dictproxyiterkeys():
2986 class C(object):
2987 def meth(self):
2988 pass
2989 if verbose: print "Testing dict-proxy iterkeys..."
2990 keys = [ key for key in C.__dict__.iterkeys() ]
2991 keys.sort()
2992 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
2993
2994def dictproxyitervalues():
2995 class C(object):
2996 def meth(self):
2997 pass
2998 if verbose: print "Testing dict-proxy itervalues..."
2999 values = [ values for values in C.__dict__.itervalues() ]
3000 vereq(len(values), 5)
3001
3002def dictproxyiteritems():
3003 class C(object):
3004 def meth(self):
3005 pass
3006 if verbose: print "Testing dict-proxy iteritems..."
3007 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3008 keys.sort()
3009 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3010
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003011def funnynew():
3012 if verbose: print "Testing __new__ returning something unexpected..."
3013 class C(object):
3014 def __new__(cls, arg):
3015 if isinstance(arg, str): return [1, 2, 3]
3016 elif isinstance(arg, int): return object.__new__(D)
3017 else: return object.__new__(cls)
3018 class D(C):
3019 def __init__(self, arg):
3020 self.foo = arg
3021 vereq(C("1"), [1, 2, 3])
3022 vereq(D("1"), [1, 2, 3])
3023 d = D(None)
3024 veris(d.foo, None)
3025 d = C(1)
3026 vereq(isinstance(d, D), True)
3027 vereq(d.foo, 1)
3028 d = D(1)
3029 vereq(isinstance(d, D), True)
3030 vereq(d.foo, 1)
3031
Guido van Rossume8fc6402002-04-16 16:44:51 +00003032def imulbug():
3033 # SF bug 544647
3034 if verbose: print "Testing for __imul__ problems..."
3035 class C(object):
3036 def __imul__(self, other):
3037 return (self, other)
3038 x = C()
3039 y = x
3040 y *= 1.0
3041 vereq(y, (x, 1.0))
3042 y = x
3043 y *= 2
3044 vereq(y, (x, 2))
3045 y = x
3046 y *= 3L
3047 vereq(y, (x, 3L))
3048 y = x
3049 y *= 1L<<100
3050 vereq(y, (x, 1L<<100))
3051 y = x
3052 y *= None
3053 vereq(y, (x, None))
3054 y = x
3055 y *= "foo"
3056 vereq(y, (x, "foo"))
3057
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003058def docdescriptor():
3059 # SF bug 542984
3060 if verbose: print "Testing __doc__ descriptor..."
3061 class DocDescr(object):
3062 def __get__(self, object, otype):
3063 if object:
3064 object = object.__class__.__name__ + ' instance'
3065 if otype:
3066 otype = otype.__name__
3067 return 'object=%s; type=%s' % (object, otype)
3068 class OldClass:
3069 __doc__ = DocDescr()
3070 class NewClass(object):
3071 __doc__ = DocDescr()
3072 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3073 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3074 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3075 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3076
Tim Petersafb2c802002-04-18 18:06:20 +00003077def string_exceptions():
3078 if verbose:
3079 print "Testing string exceptions ..."
3080
3081 # Ensure builtin strings work OK as exceptions.
3082 astring = "An exception string."
3083 try:
3084 raise astring
3085 except astring:
3086 pass
3087 else:
3088 raise TestFailed, "builtin string not usable as exception"
3089
3090 # Ensure string subclass instances do not.
3091 class MyStr(str):
3092 pass
3093
3094 newstring = MyStr("oops -- shouldn't work")
3095 try:
3096 raise newstring
3097 except TypeError:
3098 pass
3099 except:
3100 raise TestFailed, "string subclass allowed as exception"
3101
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003102def copy_setstate():
3103 if verbose:
3104 print "Testing that copy.*copy() correctly uses __setstate__..."
3105 import copy
3106 class C(object):
3107 def __init__(self, foo=None):
3108 self.foo = foo
3109 self.__foo = foo
3110 def setfoo(self, foo=None):
3111 self.foo = foo
3112 def getfoo(self):
3113 return self.__foo
3114 def __getstate__(self):
3115 return [self.foo]
3116 def __setstate__(self, lst):
3117 assert len(lst) == 1
3118 self.__foo = self.foo = lst[0]
3119 a = C(42)
3120 a.setfoo(24)
3121 vereq(a.foo, 24)
3122 vereq(a.getfoo(), 42)
3123 b = copy.copy(a)
3124 vereq(b.foo, 24)
3125 vereq(b.getfoo(), 24)
3126 b = copy.deepcopy(a)
3127 vereq(b.foo, 24)
3128 vereq(b.getfoo(), 24)
3129
Guido van Rossum09638c12002-06-13 19:17:46 +00003130def slices():
3131 if verbose:
3132 print "Testing cases with slices and overridden __getitem__ ..."
3133 # Strings
3134 vereq("hello"[:4], "hell")
3135 vereq("hello"[slice(4)], "hell")
3136 vereq(str.__getitem__("hello", slice(4)), "hell")
3137 class S(str):
3138 def __getitem__(self, x):
3139 return str.__getitem__(self, x)
3140 vereq(S("hello")[:4], "hell")
3141 vereq(S("hello")[slice(4)], "hell")
3142 vereq(S("hello").__getitem__(slice(4)), "hell")
3143 # Tuples
3144 vereq((1,2,3)[:2], (1,2))
3145 vereq((1,2,3)[slice(2)], (1,2))
3146 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3147 class T(tuple):
3148 def __getitem__(self, x):
3149 return tuple.__getitem__(self, x)
3150 vereq(T((1,2,3))[:2], (1,2))
3151 vereq(T((1,2,3))[slice(2)], (1,2))
3152 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3153 # Lists
3154 vereq([1,2,3][:2], [1,2])
3155 vereq([1,2,3][slice(2)], [1,2])
3156 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3157 class L(list):
3158 def __getitem__(self, x):
3159 return list.__getitem__(self, x)
3160 vereq(L([1,2,3])[:2], [1,2])
3161 vereq(L([1,2,3])[slice(2)], [1,2])
3162 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3163 # Now do lists and __setitem__
3164 a = L([1,2,3])
3165 a[slice(1, 3)] = [3,2]
3166 vereq(a, [1,3,2])
3167 a[slice(0, 2, 1)] = [3,1]
3168 vereq(a, [3,1,2])
3169 a.__setitem__(slice(1, 3), [2,1])
3170 vereq(a, [3,2,1])
3171 a.__setitem__(slice(0, 2, 1), [2,3])
3172 vereq(a, [2,3,1])
3173
3174
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003175def do_this_first():
3176 if verbose:
3177 print "Testing SF bug 551412 ..."
3178 # This dumps core when SF bug 551412 isn't fixed --
3179 # but only when test_descr.py is run separately.
3180 # (That can't be helped -- as soon as PyType_Ready()
3181 # is called for PyLong_Type, the bug is gone.)
3182 class UserLong(object):
3183 def __pow__(self, *args):
3184 pass
3185 try:
3186 pow(0L, UserLong(), 0L)
3187 except:
3188 pass
3189
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003190 if verbose:
3191 print "Testing SF bug 570483..."
3192 # Another segfault only when run early
3193 # (before PyType_Ready(tuple) is called)
3194 type.mro(tuple)
3195
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003196def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003197 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003198 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003199 lists()
3200 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003201 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003202 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003203 ints()
3204 longs()
3205 floats()
3206 complexes()
3207 spamlists()
3208 spamdicts()
3209 pydicts()
3210 pylists()
3211 metaclass()
3212 pymods()
3213 multi()
3214 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00003215 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003216 slots()
3217 dynamics()
3218 errors()
3219 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003220 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003221 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003222 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003223 classic()
3224 compattr()
3225 newslot()
3226 altmro()
3227 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003228 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003229 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003230 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003231 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003232 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003233 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003234 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003235 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003236 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003237 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003238 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003239 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003240 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003241 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003242 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003243 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003244 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003245 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003246 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003247 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003248 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003249 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003250 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003251 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003252 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003253 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003254 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003255 dictproxyiterkeys()
3256 dictproxyitervalues()
3257 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003258 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003259 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003260 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003261 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003262 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003263 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003264 slices()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003265 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003266
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003267if __name__ == "__main__":
3268 test_main()