blob: 61a52f8136c936e8d2e7c5db55543d242b8ad54a [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
Guido van Rossum33bab012001-12-05 22:45:48 +00001063 # Test leaks
1064 class Counted(object):
1065 counter = 0 # counts the number of instances alive
1066 def __init__(self):
1067 Counted.counter += 1
1068 def __del__(self):
1069 Counted.counter -= 1
1070 class C(object):
1071 __slots__ = ['a', 'b', 'c']
1072 x = C()
1073 x.a = Counted()
1074 x.b = Counted()
1075 x.c = Counted()
1076 vereq(Counted.counter, 3)
1077 del x
1078 vereq(Counted.counter, 0)
1079 class D(C):
1080 pass
1081 x = D()
1082 x.a = Counted()
1083 x.z = Counted()
1084 vereq(Counted.counter, 2)
1085 del x
1086 vereq(Counted.counter, 0)
1087 class E(D):
1088 __slots__ = ['e']
1089 x = E()
1090 x.a = Counted()
1091 x.z = Counted()
1092 x.e = Counted()
1093 vereq(Counted.counter, 3)
1094 del x
1095 vereq(Counted.counter, 0)
1096
Tim Peters6d6c1a32001-08-02 04:15:00 +00001097def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001098 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001099 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001100 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001101 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001102 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001103 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001104 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001105 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001106 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001107 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001108 vereq(E.foo, 1)
1109 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001110 # Test dynamic instances
1111 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001112 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001113 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001114 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001115 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001116 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001117 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001118 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001119 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001120 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001121 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001122 vereq(int(a), 100)
1123 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001124 verify(not hasattr(a, "spam"))
1125 def mygetattr(self, name):
1126 if name == "spam":
1127 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001128 raise AttributeError
1129 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001130 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001131 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001132 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001133 def mysetattr(self, name, value):
1134 if name == "spam":
1135 raise AttributeError
1136 return object.__setattr__(self, name, value)
1137 C.__setattr__ = mysetattr
1138 try:
1139 a.spam = "not spam"
1140 except AttributeError:
1141 pass
1142 else:
1143 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001144 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001145 class D(C):
1146 pass
1147 d = D()
1148 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001149 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150
Guido van Rossum7e35d572001-09-15 03:14:32 +00001151 # Test handling of int*seq and seq*int
1152 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001153 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001154 vereq("a"*I(2), "aa")
1155 vereq(I(2)*"a", "aa")
1156 vereq(2*I(3), 6)
1157 vereq(I(3)*2, 6)
1158 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001159
1160 # Test handling of long*seq and seq*long
1161 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001162 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001163 vereq("a"*L(2L), "aa")
1164 vereq(L(2L)*"a", "aa")
1165 vereq(2*L(3), 6)
1166 vereq(L(3)*2, 6)
1167 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001168
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001169 # Test comparison of classes with dynamic metaclasses
1170 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001171 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001172 class someclass:
1173 __metaclass__ = dynamicmetaclass
1174 verify(someclass != object)
1175
Tim Peters6d6c1a32001-08-02 04:15:00 +00001176def errors():
1177 if verbose: print "Testing errors..."
1178
1179 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001180 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001181 pass
1182 except TypeError:
1183 pass
1184 else:
1185 verify(0, "inheritance from both list and dict should be illegal")
1186
1187 try:
1188 class C(object, None):
1189 pass
1190 except TypeError:
1191 pass
1192 else:
1193 verify(0, "inheritance from non-type should be illegal")
1194 class Classic:
1195 pass
1196
1197 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001198 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199 pass
1200 except TypeError:
1201 pass
1202 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001203 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204
1205 try:
1206 class C(object):
1207 __slots__ = 1
1208 except TypeError:
1209 pass
1210 else:
1211 verify(0, "__slots__ = 1 should be illegal")
1212
1213 try:
1214 class C(object):
1215 __slots__ = [1]
1216 except TypeError:
1217 pass
1218 else:
1219 verify(0, "__slots__ = [1] should be illegal")
1220
1221def classmethods():
1222 if verbose: print "Testing class methods..."
1223 class C(object):
1224 def foo(*a): return a
1225 goo = classmethod(foo)
1226 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001227 vereq(C.goo(1), (C, 1))
1228 vereq(c.goo(1), (C, 1))
1229 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001230 class D(C):
1231 pass
1232 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001233 vereq(D.goo(1), (D, 1))
1234 vereq(d.goo(1), (D, 1))
1235 vereq(d.foo(1), (d, 1))
1236 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001237 # Test for a specific crash (SF bug 528132)
1238 def f(cls, arg): return (cls, arg)
1239 ff = classmethod(f)
1240 vereq(ff.__get__(0, int)(42), (int, 42))
1241 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001242
Guido van Rossum155db9a2002-04-02 17:53:47 +00001243 # Test super() with classmethods (SF bug 535444)
1244 veris(C.goo.im_self, C)
1245 veris(D.goo.im_self, D)
1246 veris(super(D,D).goo.im_self, D)
1247 veris(super(D,d).goo.im_self, D)
1248 vereq(super(D,D).goo(), (D,))
1249 vereq(super(D,d).goo(), (D,))
1250
Fred Drakef841aa62002-03-28 15:49:54 +00001251def classmethods_in_c():
1252 if verbose: print "Testing C-based class methods..."
1253 import xxsubtype as spam
1254 a = (1, 2, 3)
1255 d = {'abc': 123}
1256 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1257 veris(x, None)
1258 vereq((spam.spamlist,) + a, a1)
1259 vereq(d, d1)
1260 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1261 veris(x, None)
1262 vereq((spam.spamlist,) + a, a1)
1263 vereq(d, d1)
1264
Tim Peters6d6c1a32001-08-02 04:15:00 +00001265def staticmethods():
1266 if verbose: print "Testing static methods..."
1267 class C(object):
1268 def foo(*a): return a
1269 goo = staticmethod(foo)
1270 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001271 vereq(C.goo(1), (1,))
1272 vereq(c.goo(1), (1,))
1273 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001274 class D(C):
1275 pass
1276 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001277 vereq(D.goo(1), (1,))
1278 vereq(d.goo(1), (1,))
1279 vereq(d.foo(1), (d, 1))
1280 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001281
Fred Drakef841aa62002-03-28 15:49:54 +00001282def staticmethods_in_c():
1283 if verbose: print "Testing C-based static methods..."
1284 import xxsubtype as spam
1285 a = (1, 2, 3)
1286 d = {"abc": 123}
1287 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1288 veris(x, None)
1289 vereq(a, a1)
1290 vereq(d, d1)
1291 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1292 veris(x, None)
1293 vereq(a, a1)
1294 vereq(d, d1)
1295
Tim Peters6d6c1a32001-08-02 04:15:00 +00001296def classic():
1297 if verbose: print "Testing classic classes..."
1298 class C:
1299 def foo(*a): return a
1300 goo = classmethod(foo)
1301 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001302 vereq(C.goo(1), (C, 1))
1303 vereq(c.goo(1), (C, 1))
1304 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001305 class D(C):
1306 pass
1307 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001308 vereq(D.goo(1), (D, 1))
1309 vereq(d.goo(1), (D, 1))
1310 vereq(d.foo(1), (d, 1))
1311 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001312 class E: # *not* subclassing from C
1313 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001314 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001315 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001316
1317def compattr():
1318 if verbose: print "Testing computed attributes..."
1319 class C(object):
1320 class computed_attribute(object):
1321 def __init__(self, get, set=None):
1322 self.__get = get
1323 self.__set = set
1324 def __get__(self, obj, type=None):
1325 return self.__get(obj)
1326 def __set__(self, obj, value):
1327 return self.__set(obj, value)
1328 def __init__(self):
1329 self.__x = 0
1330 def __get_x(self):
1331 x = self.__x
1332 self.__x = x+1
1333 return x
1334 def __set_x(self, x):
1335 self.__x = x
1336 x = computed_attribute(__get_x, __set_x)
1337 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001338 vereq(a.x, 0)
1339 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001340 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001341 vereq(a.x, 10)
1342 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001343
1344def newslot():
1345 if verbose: print "Testing __new__ slot override..."
1346 class C(list):
1347 def __new__(cls):
1348 self = list.__new__(cls)
1349 self.foo = 1
1350 return self
1351 def __init__(self):
1352 self.foo = self.foo + 2
1353 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001354 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001355 verify(a.__class__ is C)
1356 class D(C):
1357 pass
1358 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 verify(b.__class__ is D)
1361
Tim Peters6d6c1a32001-08-02 04:15:00 +00001362def altmro():
1363 if verbose: print "Testing mro() and overriding it..."
1364 class A(object):
1365 def f(self): return "A"
1366 class B(A):
1367 pass
1368 class C(A):
1369 def f(self): return "C"
1370 class D(B, C):
1371 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001372 vereq(D.mro(), [D, B, C, A, object])
1373 vereq(D.__mro__, (D, B, C, A, object))
1374 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001375 class PerverseMetaType(type):
1376 def mro(cls):
1377 L = type.mro(cls)
1378 L.reverse()
1379 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001380 class X(A,B,C,D):
1381 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001382 vereq(X.__mro__, (object, A, C, B, D, X))
1383 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001384
1385def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001386 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001387
1388 class B(object):
1389 "Intermediate class because object doesn't have a __setattr__"
1390
1391 class C(B):
1392
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001393 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001394 if name == "foo":
1395 return ("getattr", name)
1396 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001397 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001398 def __setattr__(self, name, value):
1399 if name == "foo":
1400 self.setattr = (name, value)
1401 else:
1402 return B.__setattr__(self, name, value)
1403 def __delattr__(self, name):
1404 if name == "foo":
1405 self.delattr = name
1406 else:
1407 return B.__delattr__(self, name)
1408
1409 def __getitem__(self, key):
1410 return ("getitem", key)
1411 def __setitem__(self, key, value):
1412 self.setitem = (key, value)
1413 def __delitem__(self, key):
1414 self.delitem = key
1415
1416 def __getslice__(self, i, j):
1417 return ("getslice", i, j)
1418 def __setslice__(self, i, j, value):
1419 self.setslice = (i, j, value)
1420 def __delslice__(self, i, j):
1421 self.delslice = (i, j)
1422
1423 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001424 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001425 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001426 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001427 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001428 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001429
Guido van Rossum45704552001-10-08 16:35:45 +00001430 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001431 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001432 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001433 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001435
Guido van Rossum45704552001-10-08 16:35:45 +00001436 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001437 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001438 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001439 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001440 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001441
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001442def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001443 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001444 class C(object):
1445 def __init__(self, x):
1446 self.x = x
1447 def foo(self):
1448 return self.x
1449 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001450 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001451 class D(C):
1452 boo = C.foo
1453 goo = c1.foo
1454 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001455 vereq(d2.foo(), 2)
1456 vereq(d2.boo(), 2)
1457 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001458 class E(object):
1459 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001460 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001461 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001462
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001463def specials():
1464 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001465 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001466 # Test the default behavior for static classes
1467 class C(object):
1468 def __getitem__(self, i):
1469 if 0 <= i < 10: return i
1470 raise IndexError
1471 c1 = C()
1472 c2 = C()
1473 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001474 vereq(hash(c1), id(c1))
1475 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1476 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001477 verify(c1 != c2)
1478 verify(not c1 != c1)
1479 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001480 # Note that the module name appears in str/repr, and that varies
1481 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001482 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001483 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001484 verify(-1 not in c1)
1485 for i in range(10):
1486 verify(i in c1)
1487 verify(10 not in c1)
1488 # Test the default behavior for dynamic classes
1489 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001490 def __getitem__(self, i):
1491 if 0 <= i < 10: return i
1492 raise IndexError
1493 d1 = D()
1494 d2 = D()
1495 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001496 vereq(hash(d1), id(d1))
1497 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1498 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001499 verify(d1 != d2)
1500 verify(not d1 != d1)
1501 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001502 # Note that the module name appears in str/repr, and that varies
1503 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001504 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001505 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001506 verify(-1 not in d1)
1507 for i in range(10):
1508 verify(i in d1)
1509 verify(10 not in d1)
1510 # Test overridden behavior for static classes
1511 class Proxy(object):
1512 def __init__(self, x):
1513 self.x = x
1514 def __nonzero__(self):
1515 return not not self.x
1516 def __hash__(self):
1517 return hash(self.x)
1518 def __eq__(self, other):
1519 return self.x == other
1520 def __ne__(self, other):
1521 return self.x != other
1522 def __cmp__(self, other):
1523 return cmp(self.x, other.x)
1524 def __str__(self):
1525 return "Proxy:%s" % self.x
1526 def __repr__(self):
1527 return "Proxy(%r)" % self.x
1528 def __contains__(self, value):
1529 return value in self.x
1530 p0 = Proxy(0)
1531 p1 = Proxy(1)
1532 p_1 = Proxy(-1)
1533 verify(not p0)
1534 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001535 vereq(hash(p0), hash(0))
1536 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001537 verify(p0 != p1)
1538 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001539 vereq(not p0, p1)
1540 vereq(cmp(p0, p1), -1)
1541 vereq(cmp(p0, p0), 0)
1542 vereq(cmp(p0, p_1), 1)
1543 vereq(str(p0), "Proxy:0")
1544 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001545 p10 = Proxy(range(10))
1546 verify(-1 not in p10)
1547 for i in range(10):
1548 verify(i in p10)
1549 verify(10 not in p10)
1550 # Test overridden behavior for dynamic classes
1551 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001552 def __init__(self, x):
1553 self.x = x
1554 def __nonzero__(self):
1555 return not not self.x
1556 def __hash__(self):
1557 return hash(self.x)
1558 def __eq__(self, other):
1559 return self.x == other
1560 def __ne__(self, other):
1561 return self.x != other
1562 def __cmp__(self, other):
1563 return cmp(self.x, other.x)
1564 def __str__(self):
1565 return "DProxy:%s" % self.x
1566 def __repr__(self):
1567 return "DProxy(%r)" % self.x
1568 def __contains__(self, value):
1569 return value in self.x
1570 p0 = DProxy(0)
1571 p1 = DProxy(1)
1572 p_1 = DProxy(-1)
1573 verify(not p0)
1574 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001575 vereq(hash(p0), hash(0))
1576 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001577 verify(p0 != p1)
1578 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001579 vereq(not p0, p1)
1580 vereq(cmp(p0, p1), -1)
1581 vereq(cmp(p0, p0), 0)
1582 vereq(cmp(p0, p_1), 1)
1583 vereq(str(p0), "DProxy:0")
1584 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001585 p10 = DProxy(range(10))
1586 verify(-1 not in p10)
1587 for i in range(10):
1588 verify(i in p10)
1589 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001590 # Safety test for __cmp__
1591 def unsafecmp(a, b):
1592 try:
1593 a.__class__.__cmp__(a, b)
1594 except TypeError:
1595 pass
1596 else:
1597 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1598 a.__class__, a, b)
1599 unsafecmp(u"123", "123")
1600 unsafecmp("123", u"123")
1601 unsafecmp(1, 1.0)
1602 unsafecmp(1.0, 1)
1603 unsafecmp(1, 1L)
1604 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001605
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001606def weakrefs():
1607 if verbose: print "Testing weak references..."
1608 import weakref
1609 class C(object):
1610 pass
1611 c = C()
1612 r = weakref.ref(c)
1613 verify(r() is c)
1614 del c
1615 verify(r() is None)
1616 del r
1617 class NoWeak(object):
1618 __slots__ = ['foo']
1619 no = NoWeak()
1620 try:
1621 weakref.ref(no)
1622 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001623 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001624 else:
1625 verify(0, "weakref.ref(no) should be illegal")
1626 class Weak(object):
1627 __slots__ = ['foo', '__weakref__']
1628 yes = Weak()
1629 r = weakref.ref(yes)
1630 verify(r() is yes)
1631 del yes
1632 verify(r() is None)
1633 del r
1634
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001635def properties():
1636 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001637 class C(object):
1638 def getx(self):
1639 return self.__x
1640 def setx(self, value):
1641 self.__x = value
1642 def delx(self):
1643 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001644 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001645 a = C()
1646 verify(not hasattr(a, "x"))
1647 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001648 vereq(a._C__x, 42)
1649 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001650 del a.x
1651 verify(not hasattr(a, "x"))
1652 verify(not hasattr(a, "_C__x"))
1653 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001654 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001655## C.x.__set__(a)
1656## verify(not hasattr(a, "x"))
1657
Tim Peters66c1a522001-09-24 21:17:50 +00001658 raw = C.__dict__['x']
1659 verify(isinstance(raw, property))
1660
1661 attrs = dir(raw)
1662 verify("__doc__" in attrs)
1663 verify("fget" in attrs)
1664 verify("fset" in attrs)
1665 verify("fdel" in attrs)
1666
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001668 verify(raw.fget is C.__dict__['getx'])
1669 verify(raw.fset is C.__dict__['setx'])
1670 verify(raw.fdel is C.__dict__['delx'])
1671
1672 for attr in "__doc__", "fget", "fset", "fdel":
1673 try:
1674 setattr(raw, attr, 42)
1675 except TypeError, msg:
1676 if str(msg).find('readonly') < 0:
1677 raise TestFailed("when setting readonly attr %r on a "
1678 "property, got unexpected TypeError "
1679 "msg %r" % (attr, str(msg)))
1680 else:
1681 raise TestFailed("expected TypeError from trying to set "
1682 "readonly %r attr on a property" % attr)
1683
Guido van Rossumc4a18802001-08-24 16:55:27 +00001684def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001685 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001686
1687 class A(object):
1688 def meth(self, a):
1689 return "A(%r)" % a
1690
Guido van Rossum45704552001-10-08 16:35:45 +00001691 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001692
1693 class B(A):
1694 def __init__(self):
1695 self.__super = super(B, self)
1696 def meth(self, a):
1697 return "B(%r)" % a + self.__super.meth(a)
1698
Guido van Rossum45704552001-10-08 16:35:45 +00001699 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001700
1701 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001702 def meth(self, a):
1703 return "C(%r)" % a + self.__super.meth(a)
1704 C._C__super = super(C)
1705
Guido van Rossum45704552001-10-08 16:35:45 +00001706 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001707
1708 class D(C, B):
1709 def meth(self, a):
1710 return "D(%r)" % a + super(D, self).meth(a)
1711
Guido van Rossum5b443c62001-12-03 15:38:28 +00001712 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1713
1714 # Test for subclassing super
1715
1716 class mysuper(super):
1717 def __init__(self, *args):
1718 return super(mysuper, self).__init__(*args)
1719
1720 class E(D):
1721 def meth(self, a):
1722 return "E(%r)" % a + mysuper(E, self).meth(a)
1723
1724 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1725
1726 class F(E):
1727 def meth(self, a):
1728 s = self.__super
1729 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1730 F._F__super = mysuper(F)
1731
1732 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1733
1734 # Make sure certain errors are raised
1735
1736 try:
1737 super(D, 42)
1738 except TypeError:
1739 pass
1740 else:
1741 raise TestFailed, "shouldn't allow super(D, 42)"
1742
1743 try:
1744 super(D, C())
1745 except TypeError:
1746 pass
1747 else:
1748 raise TestFailed, "shouldn't allow super(D, C())"
1749
1750 try:
1751 super(D).__get__(12)
1752 except TypeError:
1753 pass
1754 else:
1755 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1756
1757 try:
1758 super(D).__get__(C())
1759 except TypeError:
1760 pass
1761 else:
1762 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001763
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001764def inherits():
1765 if verbose: print "Testing inheritance from basic types..."
1766
1767 class hexint(int):
1768 def __repr__(self):
1769 return hex(self)
1770 def __add__(self, other):
1771 return hexint(int.__add__(self, other))
1772 # (Note that overriding __radd__ doesn't work,
1773 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001774 vereq(repr(hexint(7) + 9), "0x10")
1775 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001776 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001777 vereq(a, 12345)
1778 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001779 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001780 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001781 verify((+a).__class__ is int)
1782 verify((a >> 0).__class__ is int)
1783 verify((a << 0).__class__ is int)
1784 verify((hexint(0) << 12).__class__ is int)
1785 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001786
1787 class octlong(long):
1788 __slots__ = []
1789 def __str__(self):
1790 s = oct(self)
1791 if s[-1] == 'L':
1792 s = s[:-1]
1793 return s
1794 def __add__(self, other):
1795 return self.__class__(super(octlong, self).__add__(other))
1796 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001797 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001798 # (Note that overriding __radd__ here only seems to work
1799 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001800 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001801 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001802 vereq(a, 12345L)
1803 vereq(long(a), 12345L)
1804 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001805 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001806 verify((+a).__class__ is long)
1807 verify((-a).__class__ is long)
1808 verify((-octlong(0)).__class__ is long)
1809 verify((a >> 0).__class__ is long)
1810 verify((a << 0).__class__ is long)
1811 verify((a - 0).__class__ is long)
1812 verify((a * 1).__class__ is long)
1813 verify((a ** 1).__class__ is long)
1814 verify((a // 1).__class__ is long)
1815 verify((1 * a).__class__ is long)
1816 verify((a | 0).__class__ is long)
1817 verify((a ^ 0).__class__ is long)
1818 verify((a & -1L).__class__ is long)
1819 verify((octlong(0) << 12).__class__ is long)
1820 verify((octlong(0) >> 12).__class__ is long)
1821 verify(abs(octlong(0)).__class__ is long)
1822
1823 # Because octlong overrides __add__, we can't check the absence of +0
1824 # optimizations using octlong.
1825 class longclone(long):
1826 pass
1827 a = longclone(1)
1828 verify((a + 0).__class__ is long)
1829 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001830
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001831 # Check that negative clones don't segfault
1832 a = longclone(-1)
1833 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001834 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001835
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001836 class precfloat(float):
1837 __slots__ = ['prec']
1838 def __init__(self, value=0.0, prec=12):
1839 self.prec = int(prec)
1840 float.__init__(value)
1841 def __repr__(self):
1842 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001843 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001844 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001845 vereq(a, 12345.0)
1846 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001847 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001848 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001849 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001850
Tim Peters2400fa42001-09-12 19:12:49 +00001851 class madcomplex(complex):
1852 def __repr__(self):
1853 return "%.17gj%+.17g" % (self.imag, self.real)
1854 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001855 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001856 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001857 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001858 vereq(a, base)
1859 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001860 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001861 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001862 vereq(repr(a), "4j-3")
1863 vereq(a, base)
1864 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001865 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001866 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001867 veris((+a).__class__, complex)
1868 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001869 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001870 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001871 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001872 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001873 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001874 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001875 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001876
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001877 class madtuple(tuple):
1878 _rev = None
1879 def rev(self):
1880 if self._rev is not None:
1881 return self._rev
1882 L = list(self)
1883 L.reverse()
1884 self._rev = self.__class__(L)
1885 return self._rev
1886 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001887 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1888 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1889 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001890 for i in range(512):
1891 t = madtuple(range(i))
1892 u = t.rev()
1893 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001894 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001895 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001896 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001897 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001898 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001899 verify(a[:].__class__ is tuple)
1900 verify((a * 1).__class__ is tuple)
1901 verify((a * 0).__class__ is tuple)
1902 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001903 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001904 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001905 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001906 verify((a + a).__class__ is tuple)
1907 verify((a * 0).__class__ is tuple)
1908 verify((a * 1).__class__ is tuple)
1909 verify((a * 2).__class__ is tuple)
1910 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001911
1912 class madstring(str):
1913 _rev = None
1914 def rev(self):
1915 if self._rev is not None:
1916 return self._rev
1917 L = list(self)
1918 L.reverse()
1919 self._rev = self.__class__("".join(L))
1920 return self._rev
1921 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001922 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1923 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1924 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001925 for i in range(256):
1926 s = madstring("".join(map(chr, range(i))))
1927 t = s.rev()
1928 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001929 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001930 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001931 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001932 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001933
Tim Peters8fa5dd02001-09-12 02:18:30 +00001934 base = "\x00" * 5
1935 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001936 vereq(s, base)
1937 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001938 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001939 vereq(hash(s), hash(base))
1940 vereq({s: 1}[base], 1)
1941 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001942 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001944 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001945 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001946 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001947 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001948 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001949 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001950 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001951 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001952 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001953 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001954 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001955 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001956 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001957 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001958 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001959 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001960 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001961 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001962 identitytab = ''.join([chr(i) for i in range(256)])
1963 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001964 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001965 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001966 vereq(s.translate(identitytab, "x"), base)
1967 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001968 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001969 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001970 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001971 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001972 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001973 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001974 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001975 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001976 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001977 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001978
Tim Peters111f6092001-09-12 07:54:51 +00001979 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001980 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001981 verify(intern(s).__class__ is str)
1982 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001983 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001984
1985 i = intern("y x")
1986 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001987 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001988 verify(intern(s).__class__ is str)
1989 verify(intern(s) is i)
1990
1991 s = madstring(i)
1992 verify(intern(s).__class__ is str)
1993 verify(intern(s) is i)
1994
Guido van Rossum91ee7982001-08-30 20:52:40 +00001995 class madunicode(unicode):
1996 _rev = None
1997 def rev(self):
1998 if self._rev is not None:
1999 return self._rev
2000 L = list(self)
2001 L.reverse()
2002 self._rev = self.__class__(u"".join(L))
2003 return self._rev
2004 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002005 vereq(u, u"ABCDEF")
2006 vereq(u.rev(), madunicode(u"FEDCBA"))
2007 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002008 base = u"12345"
2009 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002010 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002011 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002012 vereq(hash(u), hash(base))
2013 vereq({u: 1}[base], 1)
2014 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002015 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002016 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002017 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002018 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002019 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002020 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002021 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002022 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002023 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002024 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002025 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002026 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002027 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002028 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002029 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002030 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002031 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002032 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002033 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002034 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002035 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002036 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002037 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002038 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002039 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002040 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002041 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002042 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002043 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002044 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002045 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002046 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002047 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002048 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002049 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002050 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002051 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002052 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002053
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002054 class sublist(list):
2055 pass
2056 a = sublist(range(5))
2057 vereq(a, range(5))
2058 a.append("hello")
2059 vereq(a, range(5) + ["hello"])
2060 a[5] = 5
2061 vereq(a, range(6))
2062 a.extend(range(6, 20))
2063 vereq(a, range(20))
2064 a[-5:] = []
2065 vereq(a, range(15))
2066 del a[10:15]
2067 vereq(len(a), 10)
2068 vereq(a, range(10))
2069 vereq(list(a), range(10))
2070 vereq(a[0], 0)
2071 vereq(a[9], 9)
2072 vereq(a[-10], 0)
2073 vereq(a[-1], 9)
2074 vereq(a[:5], range(5))
2075
Tim Peters59c9a642001-09-13 05:38:56 +00002076 class CountedInput(file):
2077 """Counts lines read by self.readline().
2078
2079 self.lineno is the 0-based ordinal of the last line read, up to
2080 a maximum of one greater than the number of lines in the file.
2081
2082 self.ateof is true if and only if the final "" line has been read,
2083 at which point self.lineno stops incrementing, and further calls
2084 to readline() continue to return "".
2085 """
2086
2087 lineno = 0
2088 ateof = 0
2089 def readline(self):
2090 if self.ateof:
2091 return ""
2092 s = file.readline(self)
2093 # Next line works too.
2094 # s = super(CountedInput, self).readline()
2095 self.lineno += 1
2096 if s == "":
2097 self.ateof = 1
2098 return s
2099
Tim Peters561f8992001-09-13 19:36:36 +00002100 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002101 lines = ['a\n', 'b\n', 'c\n']
2102 try:
2103 f.writelines(lines)
2104 f.close()
2105 f = CountedInput(TESTFN)
2106 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2107 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002108 vereq(expected, got)
2109 vereq(f.lineno, i)
2110 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002111 f.close()
2112 finally:
2113 try:
2114 f.close()
2115 except:
2116 pass
2117 try:
2118 import os
2119 os.unlink(TESTFN)
2120 except:
2121 pass
2122
Tim Peters808b94e2001-09-13 19:33:07 +00002123def keywords():
2124 if verbose:
2125 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002126 vereq(int(x=1), 1)
2127 vereq(float(x=2), 2.0)
2128 vereq(long(x=3), 3L)
2129 vereq(complex(imag=42, real=666), complex(666, 42))
2130 vereq(str(object=500), '500')
2131 vereq(unicode(string='abc', errors='strict'), u'abc')
2132 vereq(tuple(sequence=range(3)), (0, 1, 2))
2133 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002134 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002135
2136 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002137 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002138 try:
2139 constructor(bogus_keyword_arg=1)
2140 except TypeError:
2141 pass
2142 else:
2143 raise TestFailed("expected TypeError from bogus keyword "
2144 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002145
Tim Peters8fa45672001-09-13 21:01:29 +00002146def restricted():
2147 import rexec
2148 if verbose:
2149 print "Testing interaction with restricted execution ..."
2150
2151 sandbox = rexec.RExec()
2152
2153 code1 = """f = open(%r, 'w')""" % TESTFN
2154 code2 = """f = file(%r, 'w')""" % TESTFN
2155 code3 = """\
2156f = open(%r)
2157t = type(f) # a sneaky way to get the file() constructor
2158f.close()
2159f = t(%r, 'w') # rexec can't catch this by itself
2160""" % (TESTFN, TESTFN)
2161
2162 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2163 f.close()
2164
2165 try:
2166 for code in code1, code2, code3:
2167 try:
2168 sandbox.r_exec(code)
2169 except IOError, msg:
2170 if str(msg).find("restricted") >= 0:
2171 outcome = "OK"
2172 else:
2173 outcome = "got an exception, but not an expected one"
2174 else:
2175 outcome = "expected a restricted-execution exception"
2176
2177 if outcome != "OK":
2178 raise TestFailed("%s, in %r" % (outcome, code))
2179
2180 finally:
2181 try:
2182 import os
2183 os.unlink(TESTFN)
2184 except:
2185 pass
2186
Tim Peters0ab085c2001-09-14 00:25:33 +00002187def str_subclass_as_dict_key():
2188 if verbose:
2189 print "Testing a str subclass used as dict key .."
2190
2191 class cistr(str):
2192 """Sublcass of str that computes __eq__ case-insensitively.
2193
2194 Also computes a hash code of the string in canonical form.
2195 """
2196
2197 def __init__(self, value):
2198 self.canonical = value.lower()
2199 self.hashcode = hash(self.canonical)
2200
2201 def __eq__(self, other):
2202 if not isinstance(other, cistr):
2203 other = cistr(other)
2204 return self.canonical == other.canonical
2205
2206 def __hash__(self):
2207 return self.hashcode
2208
Guido van Rossum45704552001-10-08 16:35:45 +00002209 vereq(cistr('ABC'), 'abc')
2210 vereq('aBc', cistr('ABC'))
2211 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002212
2213 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(d[cistr('one')], 1)
2215 vereq(d[cistr('tWo')], 2)
2216 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002217 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002218 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002219
Guido van Rossumab3b0342001-09-18 20:38:53 +00002220def classic_comparisons():
2221 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002222 class classic:
2223 pass
2224 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002225 if verbose: print " (base = %s)" % base
2226 class C(base):
2227 def __init__(self, value):
2228 self.value = int(value)
2229 def __cmp__(self, other):
2230 if isinstance(other, C):
2231 return cmp(self.value, other.value)
2232 if isinstance(other, int) or isinstance(other, long):
2233 return cmp(self.value, other)
2234 return NotImplemented
2235 c1 = C(1)
2236 c2 = C(2)
2237 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002238 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002239 c = {1: c1, 2: c2, 3: c3}
2240 for x in 1, 2, 3:
2241 for y in 1, 2, 3:
2242 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2243 for op in "<", "<=", "==", "!=", ">", ">=":
2244 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2245 "x=%d, y=%d" % (x, y))
2246 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2247 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2248
Guido van Rossum0639f592001-09-18 21:06:04 +00002249def rich_comparisons():
2250 if verbose:
2251 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002252 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002253 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002254 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002255 vereq(z, 1+0j)
2256 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002257 class ZZ(complex):
2258 def __eq__(self, other):
2259 try:
2260 return abs(self - other) <= 1e-6
2261 except:
2262 return NotImplemented
2263 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(zz, 1+0j)
2265 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002266
Guido van Rossum0639f592001-09-18 21:06:04 +00002267 class classic:
2268 pass
2269 for base in (classic, int, object, list):
2270 if verbose: print " (base = %s)" % base
2271 class C(base):
2272 def __init__(self, value):
2273 self.value = int(value)
2274 def __cmp__(self, other):
2275 raise TestFailed, "shouldn't call __cmp__"
2276 def __eq__(self, other):
2277 if isinstance(other, C):
2278 return self.value == other.value
2279 if isinstance(other, int) or isinstance(other, long):
2280 return self.value == other
2281 return NotImplemented
2282 def __ne__(self, other):
2283 if isinstance(other, C):
2284 return self.value != other.value
2285 if isinstance(other, int) or isinstance(other, long):
2286 return self.value != other
2287 return NotImplemented
2288 def __lt__(self, other):
2289 if isinstance(other, C):
2290 return self.value < other.value
2291 if isinstance(other, int) or isinstance(other, long):
2292 return self.value < other
2293 return NotImplemented
2294 def __le__(self, other):
2295 if isinstance(other, C):
2296 return self.value <= other.value
2297 if isinstance(other, int) or isinstance(other, long):
2298 return self.value <= other
2299 return NotImplemented
2300 def __gt__(self, other):
2301 if isinstance(other, C):
2302 return self.value > other.value
2303 if isinstance(other, int) or isinstance(other, long):
2304 return self.value > other
2305 return NotImplemented
2306 def __ge__(self, other):
2307 if isinstance(other, C):
2308 return self.value >= other.value
2309 if isinstance(other, int) or isinstance(other, long):
2310 return self.value >= other
2311 return NotImplemented
2312 c1 = C(1)
2313 c2 = C(2)
2314 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002315 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002316 c = {1: c1, 2: c2, 3: c3}
2317 for x in 1, 2, 3:
2318 for y in 1, 2, 3:
2319 for op in "<", "<=", "==", "!=", ">", ">=":
2320 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2321 "x=%d, y=%d" % (x, y))
2322 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2323 "x=%d, y=%d" % (x, y))
2324 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2325 "x=%d, y=%d" % (x, y))
2326
Guido van Rossum1952e382001-09-19 01:25:16 +00002327def coercions():
2328 if verbose: print "Testing coercions..."
2329 class I(int): pass
2330 coerce(I(0), 0)
2331 coerce(0, I(0))
2332 class L(long): pass
2333 coerce(L(0), 0)
2334 coerce(L(0), 0L)
2335 coerce(0, L(0))
2336 coerce(0L, L(0))
2337 class F(float): pass
2338 coerce(F(0), 0)
2339 coerce(F(0), 0L)
2340 coerce(F(0), 0.)
2341 coerce(0, F(0))
2342 coerce(0L, F(0))
2343 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002344 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002345 coerce(C(0), 0)
2346 coerce(C(0), 0L)
2347 coerce(C(0), 0.)
2348 coerce(C(0), 0j)
2349 coerce(0, C(0))
2350 coerce(0L, C(0))
2351 coerce(0., C(0))
2352 coerce(0j, C(0))
2353
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002354def descrdoc():
2355 if verbose: print "Testing descriptor doc strings..."
2356 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002358 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002359 check(file.name, "file name") # member descriptor
2360
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002361def setclass():
2362 if verbose: print "Testing __class__ assignment..."
2363 class C(object): pass
2364 class D(object): pass
2365 class E(object): pass
2366 class F(D, E): pass
2367 for cls in C, D, E, F:
2368 for cls2 in C, D, E, F:
2369 x = cls()
2370 x.__class__ = cls2
2371 verify(x.__class__ is cls2)
2372 x.__class__ = cls
2373 verify(x.__class__ is cls)
2374 def cant(x, C):
2375 try:
2376 x.__class__ = C
2377 except TypeError:
2378 pass
2379 else:
2380 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002381 try:
2382 delattr(x, "__class__")
2383 except TypeError:
2384 pass
2385 else:
2386 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002387 cant(C(), list)
2388 cant(list(), C)
2389 cant(C(), 1)
2390 cant(C(), object)
2391 cant(object(), list)
2392 cant(list(), object)
2393
Guido van Rossum6661be32001-10-26 04:26:12 +00002394def setdict():
2395 if verbose: print "Testing __dict__ assignment..."
2396 class C(object): pass
2397 a = C()
2398 a.__dict__ = {'b': 1}
2399 vereq(a.b, 1)
2400 def cant(x, dict):
2401 try:
2402 x.__dict__ = dict
2403 except TypeError:
2404 pass
2405 else:
2406 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2407 cant(a, None)
2408 cant(a, [])
2409 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002410 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002411 # Classes don't allow __dict__ assignment
2412 cant(C, {})
2413
Guido van Rossum3926a632001-09-25 16:25:58 +00002414def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002415 if verbose:
2416 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002417 import pickle, cPickle
2418
2419 def sorteditems(d):
2420 L = d.items()
2421 L.sort()
2422 return L
2423
2424 global C
2425 class C(object):
2426 def __init__(self, a, b):
2427 super(C, self).__init__()
2428 self.a = a
2429 self.b = b
2430 def __repr__(self):
2431 return "C(%r, %r)" % (self.a, self.b)
2432
2433 global C1
2434 class C1(list):
2435 def __new__(cls, a, b):
2436 return super(C1, cls).__new__(cls)
2437 def __init__(self, a, b):
2438 self.a = a
2439 self.b = b
2440 def __repr__(self):
2441 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2442
2443 global C2
2444 class C2(int):
2445 def __new__(cls, a, b, val=0):
2446 return super(C2, cls).__new__(cls, val)
2447 def __init__(self, a, b, val=0):
2448 self.a = a
2449 self.b = b
2450 def __repr__(self):
2451 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2452
Guido van Rossum90c45142001-11-24 21:07:01 +00002453 global C3
2454 class C3(object):
2455 def __init__(self, foo):
2456 self.foo = foo
2457 def __getstate__(self):
2458 return self.foo
2459 def __setstate__(self, foo):
2460 self.foo = foo
2461
2462 global C4classic, C4
2463 class C4classic: # classic
2464 pass
2465 class C4(C4classic, object): # mixed inheritance
2466 pass
2467
Guido van Rossum3926a632001-09-25 16:25:58 +00002468 for p in pickle, cPickle:
2469 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002470 if verbose:
2471 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002472
2473 for cls in C, C1, C2:
2474 s = p.dumps(cls, bin)
2475 cls2 = p.loads(s)
2476 verify(cls2 is cls)
2477
2478 a = C1(1, 2); a.append(42); a.append(24)
2479 b = C2("hello", "world", 42)
2480 s = p.dumps((a, b), bin)
2481 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002482 vereq(x.__class__, a.__class__)
2483 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2484 vereq(y.__class__, b.__class__)
2485 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2486 vereq(`x`, `a`)
2487 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002488 if verbose:
2489 print "a = x =", a
2490 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002491 # Test for __getstate__ and __setstate__ on new style class
2492 u = C3(42)
2493 s = p.dumps(u, bin)
2494 v = p.loads(s)
2495 veris(u.__class__, v.__class__)
2496 vereq(u.foo, v.foo)
2497 # Test for picklability of hybrid class
2498 u = C4()
2499 u.foo = 42
2500 s = p.dumps(u, bin)
2501 v = p.loads(s)
2502 veris(u.__class__, v.__class__)
2503 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002504
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002505 # Testing copy.deepcopy()
2506 if verbose:
2507 print "deepcopy"
2508 import copy
2509 for cls in C, C1, C2:
2510 cls2 = copy.deepcopy(cls)
2511 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002512
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002513 a = C1(1, 2); a.append(42); a.append(24)
2514 b = C2("hello", "world", 42)
2515 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002516 vereq(x.__class__, a.__class__)
2517 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2518 vereq(y.__class__, b.__class__)
2519 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2520 vereq(`x`, `a`)
2521 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002522 if verbose:
2523 print "a = x =", a
2524 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002525
Guido van Rossum8c842552002-03-14 23:05:54 +00002526def pickleslots():
2527 if verbose: print "Testing pickling of classes with __slots__ ..."
2528 import pickle, cPickle
2529 # Pickling of classes with __slots__ but without __getstate__ should fail
2530 global B, C, D, E
2531 class B(object):
2532 pass
2533 for base in [object, B]:
2534 class C(base):
2535 __slots__ = ['a']
2536 class D(C):
2537 pass
2538 try:
2539 pickle.dumps(C())
2540 except TypeError:
2541 pass
2542 else:
2543 raise TestFailed, "should fail: pickle C instance - %s" % base
2544 try:
2545 cPickle.dumps(C())
2546 except TypeError:
2547 pass
2548 else:
2549 raise TestFailed, "should fail: cPickle C instance - %s" % base
2550 try:
2551 pickle.dumps(C())
2552 except TypeError:
2553 pass
2554 else:
2555 raise TestFailed, "should fail: pickle D instance - %s" % base
2556 try:
2557 cPickle.dumps(D())
2558 except TypeError:
2559 pass
2560 else:
2561 raise TestFailed, "should fail: cPickle D instance - %s" % base
2562 # Give C a __getstate__ and __setstate__
2563 class C(base):
2564 __slots__ = ['a']
2565 def __getstate__(self):
2566 try:
2567 d = self.__dict__.copy()
2568 except AttributeError:
2569 d = {}
2570 try:
2571 d['a'] = self.a
2572 except AttributeError:
2573 pass
2574 return d
2575 def __setstate__(self, d):
2576 for k, v in d.items():
2577 setattr(self, k, v)
2578 class D(C):
2579 pass
2580 # Now it should work
2581 x = C()
2582 y = pickle.loads(pickle.dumps(x))
2583 vereq(hasattr(y, 'a'), 0)
2584 y = cPickle.loads(cPickle.dumps(x))
2585 vereq(hasattr(y, 'a'), 0)
2586 x.a = 42
2587 y = pickle.loads(pickle.dumps(x))
2588 vereq(y.a, 42)
2589 y = cPickle.loads(cPickle.dumps(x))
2590 vereq(y.a, 42)
2591 x = D()
2592 x.a = 42
2593 x.b = 100
2594 y = pickle.loads(pickle.dumps(x))
2595 vereq(y.a + y.b, 142)
2596 y = cPickle.loads(cPickle.dumps(x))
2597 vereq(y.a + y.b, 142)
2598 # But a subclass that adds a slot should not work
2599 class E(C):
2600 __slots__ = ['b']
2601 try:
2602 pickle.dumps(E())
2603 except TypeError:
2604 pass
2605 else:
2606 raise TestFailed, "should fail: pickle E instance - %s" % base
2607 try:
2608 cPickle.dumps(E())
2609 except TypeError:
2610 pass
2611 else:
2612 raise TestFailed, "should fail: cPickle E instance - %s" % base
2613
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002614def copies():
2615 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2616 import copy
2617 class C(object):
2618 pass
2619
2620 a = C()
2621 a.foo = 12
2622 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002623 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002624
2625 a.bar = [1,2,3]
2626 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002627 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002628 verify(c.bar is a.bar)
2629
2630 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002631 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002632 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002633 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002634
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002635def binopoverride():
2636 if verbose: print "Testing overrides of binary operations..."
2637 class I(int):
2638 def __repr__(self):
2639 return "I(%r)" % int(self)
2640 def __add__(self, other):
2641 return I(int(self) + int(other))
2642 __radd__ = __add__
2643 def __pow__(self, other, mod=None):
2644 if mod is None:
2645 return I(pow(int(self), int(other)))
2646 else:
2647 return I(pow(int(self), int(other), int(mod)))
2648 def __rpow__(self, other, mod=None):
2649 if mod is None:
2650 return I(pow(int(other), int(self), mod))
2651 else:
2652 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002653
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002654 vereq(`I(1) + I(2)`, "I(3)")
2655 vereq(`I(1) + 2`, "I(3)")
2656 vereq(`1 + I(2)`, "I(3)")
2657 vereq(`I(2) ** I(3)`, "I(8)")
2658 vereq(`2 ** I(3)`, "I(8)")
2659 vereq(`I(2) ** 3`, "I(8)")
2660 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2661 class S(str):
2662 def __eq__(self, other):
2663 return self.lower() == other.lower()
2664
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002665def subclasspropagation():
2666 if verbose: print "Testing propagation of slot functions to subclasses..."
2667 class A(object):
2668 pass
2669 class B(A):
2670 pass
2671 class C(A):
2672 pass
2673 class D(B, C):
2674 pass
2675 d = D()
2676 vereq(hash(d), id(d))
2677 A.__hash__ = lambda self: 42
2678 vereq(hash(d), 42)
2679 C.__hash__ = lambda self: 314
2680 vereq(hash(d), 314)
2681 B.__hash__ = lambda self: 144
2682 vereq(hash(d), 144)
2683 D.__hash__ = lambda self: 100
2684 vereq(hash(d), 100)
2685 del D.__hash__
2686 vereq(hash(d), 144)
2687 del B.__hash__
2688 vereq(hash(d), 314)
2689 del C.__hash__
2690 vereq(hash(d), 42)
2691 del A.__hash__
2692 vereq(hash(d), id(d))
2693 d.foo = 42
2694 d.bar = 42
2695 vereq(d.foo, 42)
2696 vereq(d.bar, 42)
2697 def __getattribute__(self, name):
2698 if name == "foo":
2699 return 24
2700 return object.__getattribute__(self, name)
2701 A.__getattribute__ = __getattribute__
2702 vereq(d.foo, 24)
2703 vereq(d.bar, 42)
2704 def __getattr__(self, name):
2705 if name in ("spam", "foo", "bar"):
2706 return "hello"
2707 raise AttributeError, name
2708 B.__getattr__ = __getattr__
2709 vereq(d.spam, "hello")
2710 vereq(d.foo, 24)
2711 vereq(d.bar, 42)
2712 del A.__getattribute__
2713 vereq(d.foo, 42)
2714 del d.foo
2715 vereq(d.foo, "hello")
2716 vereq(d.bar, 42)
2717 del B.__getattr__
2718 try:
2719 d.foo
2720 except AttributeError:
2721 pass
2722 else:
2723 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002724
2725def buffer_inherit():
2726 import binascii
2727 # SF bug [#470040] ParseTuple t# vs subclasses.
2728 if verbose:
2729 print "Testing that buffer interface is inherited ..."
2730
2731 class MyStr(str):
2732 pass
2733 base = 'abc'
2734 m = MyStr(base)
2735 # b2a_hex uses the buffer interface to get its argument's value, via
2736 # PyArg_ParseTuple 't#' code.
2737 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2738
2739 # It's not clear that unicode will continue to support the character
2740 # buffer interface, and this test will fail if that's taken away.
2741 class MyUni(unicode):
2742 pass
2743 base = u'abc'
2744 m = MyUni(base)
2745 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2746
2747 class MyInt(int):
2748 pass
2749 m = MyInt(42)
2750 try:
2751 binascii.b2a_hex(m)
2752 raise TestFailed('subclass of int should not have a buffer interface')
2753 except TypeError:
2754 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002755
Tim Petersc9933152001-10-16 20:18:24 +00002756def str_of_str_subclass():
2757 import binascii
2758 import cStringIO
2759
2760 if verbose:
2761 print "Testing __str__ defined in subclass of str ..."
2762
2763 class octetstring(str):
2764 def __str__(self):
2765 return binascii.b2a_hex(self)
2766 def __repr__(self):
2767 return self + " repr"
2768
2769 o = octetstring('A')
2770 vereq(type(o), octetstring)
2771 vereq(type(str(o)), str)
2772 vereq(type(repr(o)), str)
2773 vereq(ord(o), 0x41)
2774 vereq(str(o), '41')
2775 vereq(repr(o), 'A repr')
2776 vereq(o.__str__(), '41')
2777 vereq(o.__repr__(), 'A repr')
2778
2779 capture = cStringIO.StringIO()
2780 # Calling str() or not exercises different internal paths.
2781 print >> capture, o
2782 print >> capture, str(o)
2783 vereq(capture.getvalue(), '41\n41\n')
2784 capture.close()
2785
Guido van Rossumc8e56452001-10-22 00:43:43 +00002786def kwdargs():
2787 if verbose: print "Testing keyword arguments to __init__, __call__..."
2788 def f(a): return a
2789 vereq(f.__call__(a=42), 42)
2790 a = []
2791 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002792 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002793
Guido van Rossumed87ad82001-10-30 02:33:02 +00002794def delhook():
2795 if verbose: print "Testing __del__ hook..."
2796 log = []
2797 class C(object):
2798 def __del__(self):
2799 log.append(1)
2800 c = C()
2801 vereq(log, [])
2802 del c
2803 vereq(log, [1])
2804
Guido van Rossum29d26062001-12-11 04:37:34 +00002805 class D(object): pass
2806 d = D()
2807 try: del d[0]
2808 except TypeError: pass
2809 else: raise TestFailed, "invalid del() didn't raise TypeError"
2810
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002811def hashinherit():
2812 if verbose: print "Testing hash of mutable subclasses..."
2813
2814 class mydict(dict):
2815 pass
2816 d = mydict()
2817 try:
2818 hash(d)
2819 except TypeError:
2820 pass
2821 else:
2822 raise TestFailed, "hash() of dict subclass should fail"
2823
2824 class mylist(list):
2825 pass
2826 d = mylist()
2827 try:
2828 hash(d)
2829 except TypeError:
2830 pass
2831 else:
2832 raise TestFailed, "hash() of list subclass should fail"
2833
Guido van Rossum29d26062001-12-11 04:37:34 +00002834def strops():
2835 try: 'a' + 5
2836 except TypeError: pass
2837 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2838
2839 try: ''.split('')
2840 except ValueError: pass
2841 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2842
2843 try: ''.join([0])
2844 except TypeError: pass
2845 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2846
2847 try: ''.rindex('5')
2848 except ValueError: pass
2849 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2850
2851 try: ''.replace('', '')
2852 except ValueError: pass
2853 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2854
2855 try: '%(n)s' % None
2856 except TypeError: pass
2857 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2858
2859 try: '%(n' % {}
2860 except ValueError: pass
2861 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2862
2863 try: '%*s' % ('abc')
2864 except TypeError: pass
2865 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2866
2867 try: '%*.*s' % ('abc', 5)
2868 except TypeError: pass
2869 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2870
2871 try: '%s' % (1, 2)
2872 except TypeError: pass
2873 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2874
2875 try: '%' % None
2876 except ValueError: pass
2877 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2878
2879 vereq('534253'.isdigit(), 1)
2880 vereq('534253x'.isdigit(), 0)
2881 vereq('%c' % 5, '\x05')
2882 vereq('%c' % '5', '5')
2883
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002884def deepcopyrecursive():
2885 if verbose: print "Testing deepcopy of recursive objects..."
2886 class Node:
2887 pass
2888 a = Node()
2889 b = Node()
2890 a.b = b
2891 b.a = a
2892 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002893
Guido van Rossumd7035672002-03-12 20:43:31 +00002894def modules():
2895 if verbose: print "Testing uninitialized module objects..."
2896 from types import ModuleType as M
2897 m = M.__new__(M)
2898 str(m)
2899 vereq(hasattr(m, "__name__"), 0)
2900 vereq(hasattr(m, "__file__"), 0)
2901 vereq(hasattr(m, "foo"), 0)
2902 vereq(m.__dict__, None)
2903 m.foo = 1
2904 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00002905
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002906def dictproxyiterkeys():
2907 class C(object):
2908 def meth(self):
2909 pass
2910 if verbose: print "Testing dict-proxy iterkeys..."
2911 keys = [ key for key in C.__dict__.iterkeys() ]
2912 keys.sort()
2913 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
2914
2915def dictproxyitervalues():
2916 class C(object):
2917 def meth(self):
2918 pass
2919 if verbose: print "Testing dict-proxy itervalues..."
2920 values = [ values for values in C.__dict__.itervalues() ]
2921 vereq(len(values), 5)
2922
2923def dictproxyiteritems():
2924 class C(object):
2925 def meth(self):
2926 pass
2927 if verbose: print "Testing dict-proxy iteritems..."
2928 keys = [ key for (key, value) in C.__dict__.iteritems() ]
2929 keys.sort()
2930 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
2931
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00002932def funnynew():
2933 if verbose: print "Testing __new__ returning something unexpected..."
2934 class C(object):
2935 def __new__(cls, arg):
2936 if isinstance(arg, str): return [1, 2, 3]
2937 elif isinstance(arg, int): return object.__new__(D)
2938 else: return object.__new__(cls)
2939 class D(C):
2940 def __init__(self, arg):
2941 self.foo = arg
2942 vereq(C("1"), [1, 2, 3])
2943 vereq(D("1"), [1, 2, 3])
2944 d = D(None)
2945 veris(d.foo, None)
2946 d = C(1)
2947 vereq(isinstance(d, D), True)
2948 vereq(d.foo, 1)
2949 d = D(1)
2950 vereq(isinstance(d, D), True)
2951 vereq(d.foo, 1)
2952
Guido van Rossume8fc6402002-04-16 16:44:51 +00002953def imulbug():
2954 # SF bug 544647
2955 if verbose: print "Testing for __imul__ problems..."
2956 class C(object):
2957 def __imul__(self, other):
2958 return (self, other)
2959 x = C()
2960 y = x
2961 y *= 1.0
2962 vereq(y, (x, 1.0))
2963 y = x
2964 y *= 2
2965 vereq(y, (x, 2))
2966 y = x
2967 y *= 3L
2968 vereq(y, (x, 3L))
2969 y = x
2970 y *= 1L<<100
2971 vereq(y, (x, 1L<<100))
2972 y = x
2973 y *= None
2974 vereq(y, (x, None))
2975 y = x
2976 y *= "foo"
2977 vereq(y, (x, "foo"))
2978
Guido van Rossumd99b3e72002-04-18 00:27:33 +00002979def docdescriptor():
2980 # SF bug 542984
2981 if verbose: print "Testing __doc__ descriptor..."
2982 class DocDescr(object):
2983 def __get__(self, object, otype):
2984 if object:
2985 object = object.__class__.__name__ + ' instance'
2986 if otype:
2987 otype = otype.__name__
2988 return 'object=%s; type=%s' % (object, otype)
2989 class OldClass:
2990 __doc__ = DocDescr()
2991 class NewClass(object):
2992 __doc__ = DocDescr()
2993 vereq(OldClass.__doc__, 'object=None; type=OldClass')
2994 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
2995 vereq(NewClass.__doc__, 'object=None; type=NewClass')
2996 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
2997
Tim Petersafb2c802002-04-18 18:06:20 +00002998def string_exceptions():
2999 if verbose:
3000 print "Testing string exceptions ..."
3001
3002 # Ensure builtin strings work OK as exceptions.
3003 astring = "An exception string."
3004 try:
3005 raise astring
3006 except astring:
3007 pass
3008 else:
3009 raise TestFailed, "builtin string not usable as exception"
3010
3011 # Ensure string subclass instances do not.
3012 class MyStr(str):
3013 pass
3014
3015 newstring = MyStr("oops -- shouldn't work")
3016 try:
3017 raise newstring
3018 except TypeError:
3019 pass
3020 except:
3021 raise TestFailed, "string subclass allowed as exception"
3022
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003023def do_this_first():
3024 if verbose:
3025 print "Testing SF bug 551412 ..."
3026 # This dumps core when SF bug 551412 isn't fixed --
3027 # but only when test_descr.py is run separately.
3028 # (That can't be helped -- as soon as PyType_Ready()
3029 # is called for PyLong_Type, the bug is gone.)
3030 class UserLong(object):
3031 def __pow__(self, *args):
3032 pass
3033 try:
3034 pow(0L, UserLong(), 0L)
3035 except:
3036 pass
3037
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003038def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003039 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003040 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003041 lists()
3042 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003043 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003044 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003045 ints()
3046 longs()
3047 floats()
3048 complexes()
3049 spamlists()
3050 spamdicts()
3051 pydicts()
3052 pylists()
3053 metaclass()
3054 pymods()
3055 multi()
3056 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00003057 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003058 slots()
3059 dynamics()
3060 errors()
3061 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003062 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003063 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003064 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003065 classic()
3066 compattr()
3067 newslot()
3068 altmro()
3069 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003070 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003071 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003072 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003073 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003074 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003075 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003076 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003077 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003078 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003079 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003080 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003081 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003082 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003083 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003084 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003085 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003086 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003087 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003088 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003089 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003090 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003091 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003092 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003093 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003094 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003095 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003096 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003097 dictproxyiterkeys()
3098 dictproxyitervalues()
3099 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003100 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003101 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003102 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003103 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003104 string_exceptions()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003105 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003106
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003107if __name__ == "__main__":
3108 test_main()