blob: 696e99c92790571e65bb52dab4eeb5a4b3d5b65f [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
5
Guido van Rossum875eeaa2001-10-11 18:33:53 +00006def veris(a, b):
7 if a is not b:
8 raise TestFailed, "%r is %r" % (a, b)
9
Tim Peters6d6c1a32001-08-02 04:15:00 +000010def testunop(a, res, expr="len(a)", meth="__len__"):
11 if verbose: print "checking", expr
12 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000013 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000014 t = type(a)
15 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000016 while meth not in t.__dict__:
17 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(m, t.__dict__[meth])
19 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000020 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000021 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000022
23def testbinop(a, b, res, expr="a+b", meth="__add__"):
24 if verbose: print "checking", expr
25 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000026
27 # XXX Hack so this passes before 2.3 when -Qnew is specified.
28 if meth == "__div__" and 1/2 == 0.5:
29 meth = "__truediv__"
30
Guido van Rossum45704552001-10-08 16:35:45 +000031 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000032 t = type(a)
33 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000034 while meth not in t.__dict__:
35 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000036 vereq(m, t.__dict__[meth])
37 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000038 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000039 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000040
41def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
42 if verbose: print "checking", expr
43 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045 t = type(a)
46 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000047 while meth not in t.__dict__:
48 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000049 vereq(m, t.__dict__[meth])
50 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000051 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000052 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000053
54def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
55 if verbose: print "checking", stmt
56 dict = {'a': deepcopy(a), 'b': b}
57 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000058 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000059 t = type(a)
60 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000061 while meth not in t.__dict__:
62 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 dict['a'] = deepcopy(a)
65 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000066 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000067 dict['a'] = deepcopy(a)
68 bm = getattr(dict['a'], meth)
69 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000070 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000071
72def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
73 if verbose: print "checking", stmt
74 dict = {'a': deepcopy(a), 'b': b, 'c': c}
75 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000076 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000077 t = type(a)
78 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000079 while meth not in t.__dict__:
80 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000081 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 dict['a'] = deepcopy(a)
83 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000084 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000085 dict['a'] = deepcopy(a)
86 bm = getattr(dict['a'], meth)
87 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000088 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000089
90def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
91 if verbose: print "checking", stmt
92 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
93 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000094 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000095 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000096 while meth not in t.__dict__:
97 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000098 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000099 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100 dict['a'] = deepcopy(a)
101 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000102 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 dict['a'] = deepcopy(a)
104 bm = getattr(dict['a'], meth)
105 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000106 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000107
Tim Peters2f93e282001-10-04 05:27:00 +0000108def class_docstrings():
109 class Classic:
110 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000111 vereq(Classic.__doc__, "A classic docstring.")
112 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000113
114 class Classic2:
115 pass
116 verify(Classic2.__doc__ is None)
117
Tim Peters4fb1fe82001-10-04 05:48:13 +0000118 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000119 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000120 vereq(NewStatic.__doc__, "Another docstring.")
121 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000122
Tim Peters4fb1fe82001-10-04 05:48:13 +0000123 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000124 pass
125 verify(NewStatic2.__doc__ is None)
126
Tim Peters4fb1fe82001-10-04 05:48:13 +0000127 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000128 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000129 vereq(NewDynamic.__doc__, "Another docstring.")
130 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000131
Tim Peters4fb1fe82001-10-04 05:48:13 +0000132 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000133 pass
134 verify(NewDynamic2.__doc__ is None)
135
Tim Peters6d6c1a32001-08-02 04:15:00 +0000136def lists():
137 if verbose: print "Testing list operations..."
138 testbinop([1], [2], [1,2], "a+b", "__add__")
139 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
140 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
141 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
142 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
143 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
144 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
145 testunop([1,2,3], 3, "len(a)", "__len__")
146 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
147 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
148 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
149 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
150
151def dicts():
152 if verbose: print "Testing dict operations..."
153 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
154 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
155 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
156 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
157 d = {1:2,3:4}
158 l1 = []
159 for i in d.keys(): l1.append(i)
160 l = []
161 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000162 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000163 l = []
164 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000165 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000166 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000167 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000168 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000169 d = {1:2, 3:4}
170 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000171 vereq(eval(repr(d), {}), d)
172 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000173 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
174
Tim Peters25786c02001-09-02 08:22:48 +0000175def dict_constructor():
176 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000177 print "Testing dict constructor ..."
178 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000179 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000180 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000181 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 d = dict(items={})
Guido van Rossum45704552001-10-08 16:35:45 +0000183 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000184 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000185 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000186 vereq(d, dict(d.items()))
187 vereq(d, dict(items=d.iteritems()))
Tim Peters25786c02001-09-02 08:22:48 +0000188 for badarg in 0, 0L, 0j, "0", [0], (0,):
189 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000190 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000191 except TypeError:
192 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000193 except ValueError:
194 if badarg == "0":
195 # It's a sequence, and its elements are also sequences (gotta
196 # love strings <wink>), but they aren't of length 2, so this
197 # one seemed better as a ValueError than a TypeError.
198 pass
199 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000200 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000201 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000202 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000203 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000204 dict(senseless={})
Tim Peters25786c02001-09-02 08:22:48 +0000205 except TypeError:
206 pass
207 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000208 raise TestFailed("no TypeError from dict(senseless={})")
Tim Peters25786c02001-09-02 08:22:48 +0000209
210 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000211 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000212 except TypeError:
213 pass
214 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000216
217 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000218 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000219 dict = {1:2, 3:4, 'a':1j}
220
Tim Peters25786c02001-09-02 08:22:48 +0000221 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000222 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000223 except TypeError:
224 pass
225 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000226 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000227
228 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000229 Mapping.__getitem__ = lambda self, i: self.dict[i]
Tim Petersa427a2b2001-10-29 22:25:45 +0000230 d = dict(items=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000231 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000232
Tim Peters1fc240e2001-10-26 05:06:50 +0000233 # Init from sequence of iterable objects, each producing a 2-sequence.
234 class AddressBookEntry:
235 def __init__(self, first, last):
236 self.first = first
237 self.last = last
238 def __iter__(self):
239 return iter([self.first, self.last])
240
Tim Petersa427a2b2001-10-29 22:25:45 +0000241 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000242 AddressBookEntry('Barry', 'Peters'),
243 AddressBookEntry('Tim', 'Peters'),
244 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000245 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
246
Tim Petersa427a2b2001-10-29 22:25:45 +0000247 d = dict(zip(range(4), range(1, 5)))
248 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000249
250 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000251 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000252 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000253 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000254 except ValueError:
255 pass
256 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000257 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000258
Tim Peters5d2b77c2001-09-03 05:47:38 +0000259def test_dir():
260 if verbose:
261 print "Testing dir() ..."
262 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000263 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264 del junk
265
266 # Just make sure these don't blow up!
267 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
268 dir(arg)
269
Tim Peters37a309d2001-09-04 01:20:04 +0000270 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000271 class C:
272 Cdata = 1
273 def Cmethod(self): pass
274
275 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000276 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000277 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000278
279 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000281
282 c.cdata = 2
283 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000284 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000285 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000286
287 class A(C):
288 Adata = 1
289 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000290
Tim Peters37a309d2001-09-04 01:20:04 +0000291 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000292 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000293 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000294 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000295 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000296 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000297 a.adata = 42
298 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000300
301 # The same, but with new-style classes. Since these have object as a
302 # base class, a lot more gets sucked in.
303 def interesting(strings):
304 return [s for s in strings if not s.startswith('_')]
305
Tim Peters5d2b77c2001-09-03 05:47:38 +0000306 class C(object):
307 Cdata = 1
308 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000309
310 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000311 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000312
313 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000314 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000315 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000316
317 c.cdata = 2
318 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000319 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000320 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000321
Tim Peters5d2b77c2001-09-03 05:47:38 +0000322 class A(C):
323 Adata = 1
324 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000325
326 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000327 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000328 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000329 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000330 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000331 a.adata = 42
332 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000333 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000334 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000335
Tim Peterscaaff8d2001-09-10 23:12:14 +0000336 # Try a module subclass.
337 import sys
338 class M(type(sys)):
339 pass
340 minstance = M()
341 minstance.b = 2
342 minstance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000343 vereq(dir(minstance), ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000344
345 class M2(M):
346 def getdict(self):
347 return "Not a dict!"
348 __dict__ = property(getdict)
349
350 m2instance = M2()
351 m2instance.b = 2
352 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000353 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000354 try:
355 dir(m2instance)
356 except TypeError:
357 pass
358
Tim Peters9e6a3992001-10-30 05:45:26 +0000359 # Two essentially featureless objects, just inheriting stuff from
360 # object.
361 vereq(dir(None), dir(Ellipsis))
362
Tim Peters6d6c1a32001-08-02 04:15:00 +0000363binops = {
364 'add': '+',
365 'sub': '-',
366 'mul': '*',
367 'div': '/',
368 'mod': '%',
369 'divmod': 'divmod',
370 'pow': '**',
371 'lshift': '<<',
372 'rshift': '>>',
373 'and': '&',
374 'xor': '^',
375 'or': '|',
376 'cmp': 'cmp',
377 'lt': '<',
378 'le': '<=',
379 'eq': '==',
380 'ne': '!=',
381 'gt': '>',
382 'ge': '>=',
383 }
384
385for name, expr in binops.items():
386 if expr.islower():
387 expr = expr + "(a, b)"
388 else:
389 expr = 'a %s b' % expr
390 binops[name] = expr
391
392unops = {
393 'pos': '+',
394 'neg': '-',
395 'abs': 'abs',
396 'invert': '~',
397 'int': 'int',
398 'long': 'long',
399 'float': 'float',
400 'oct': 'oct',
401 'hex': 'hex',
402 }
403
404for name, expr in unops.items():
405 if expr.islower():
406 expr = expr + "(a)"
407 else:
408 expr = '%s a' % expr
409 unops[name] = expr
410
411def numops(a, b, skip=[]):
412 dict = {'a': a, 'b': b}
413 for name, expr in binops.items():
414 if name not in skip:
415 name = "__%s__" % name
416 if hasattr(a, name):
417 res = eval(expr, dict)
418 testbinop(a, b, res, expr, name)
419 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000420 if name not in skip:
421 name = "__%s__" % name
422 if hasattr(a, name):
423 res = eval(expr, dict)
424 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000425
426def ints():
427 if verbose: print "Testing int operations..."
428 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000429 # The following crashes in Python 2.2
430 vereq((1).__nonzero__(), 1)
431 vereq((0).__nonzero__(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000432
433def longs():
434 if verbose: print "Testing long operations..."
435 numops(100L, 3L)
436
437def floats():
438 if verbose: print "Testing float operations..."
439 numops(100.0, 3.0)
440
441def complexes():
442 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000443 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000444 class Number(complex):
445 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000446 def __new__(cls, *args, **kwds):
447 result = complex.__new__(cls, *args)
448 result.prec = kwds.get('prec', 12)
449 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 def __repr__(self):
451 prec = self.prec
452 if self.imag == 0.0:
453 return "%.*g" % (prec, self.real)
454 if self.real == 0.0:
455 return "%.*gj" % (prec, self.imag)
456 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
457 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000458
Tim Peters6d6c1a32001-08-02 04:15:00 +0000459 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000460 vereq(`a`, "3.14")
461 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000462
Tim Peters3f996e72001-09-13 19:18:27 +0000463 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000464 vereq(`a`, "3.1")
465 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000466
467 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000468 vereq(`a`, "234.5")
469 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000470
Tim Peters6d6c1a32001-08-02 04:15:00 +0000471def spamlists():
472 if verbose: print "Testing spamlist operations..."
473 import copy, xxsubtype as spam
474 def spamlist(l, memo=None):
475 import xxsubtype as spam
476 return spam.spamlist(l)
477 # This is an ugly hack:
478 copy._deepcopy_dispatch[spam.spamlist] = spamlist
479
480 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
481 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
482 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
483 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
484 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
485 "a[b:c]", "__getslice__")
486 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
487 "a+=b", "__iadd__")
488 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
489 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
490 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
491 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
492 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
493 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
494 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
495 # Test subclassing
496 class C(spam.spamlist):
497 def foo(self): return 1
498 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(a, [])
500 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000502 vereq(a, [100])
503 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000504 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000505 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506
507def spamdicts():
508 if verbose: print "Testing spamdict operations..."
509 import copy, xxsubtype as spam
510 def spamdict(d, memo=None):
511 import xxsubtype as spam
512 sd = spam.spamdict()
513 for k, v in d.items(): sd[k] = v
514 return sd
515 # This is an ugly hack:
516 copy._deepcopy_dispatch[spam.spamdict] = spamdict
517
518 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
519 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
520 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
521 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
522 d = spamdict({1:2,3:4})
523 l1 = []
524 for i in d.keys(): l1.append(i)
525 l = []
526 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000527 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000528 l = []
529 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 l = []
532 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000533 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000534 straightd = {1:2, 3:4}
535 spamd = spamdict(straightd)
536 testunop(spamd, 2, "len(a)", "__len__")
537 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
538 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
539 "a[b]=c", "__setitem__")
540 # Test subclassing
541 class C(spam.spamdict):
542 def foo(self): return 1
543 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000544 vereq(a.items(), [])
545 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000547 vereq(a.items(), [('foo', 'bar')])
548 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551
552def pydicts():
553 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000554 verify(issubclass(dict, dict))
555 verify(isinstance({}, dict))
556 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000557 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000558 verify(d.__class__ is dict)
559 verify(isinstance(d, dict))
560 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561 state = -1
562 def __init__(self, *a, **kw):
563 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000564 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565 self.state = a[0]
566 if kw:
567 for k, v in kw.items(): self[v] = k
568 def __getitem__(self, key):
569 return self.get(key, 0)
570 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000571 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000572 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000573 def setstate(self, state):
574 self.state = state
575 def getstate(self):
576 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000577 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000581 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.state, -1)
584 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.state, 0)
587 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000588 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a.state, 10)
590 vereq(a.getstate(), 10)
591 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000594 if verbose: print "pydict stress test ..."
595 N = 50
596 for i in range(N):
597 a[i] = C()
598 for j in range(N):
599 a[i][j] = i*j
600 for i in range(N):
601 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000602 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603
604def pylists():
605 if verbose: print "Testing Python subclass of list..."
606 class C(list):
607 def __getitem__(self, i):
608 return list.__getitem__(self, i) + 100
609 def __getslice__(self, i, j):
610 return (i, j)
611 a = C()
612 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000613 vereq(a[0], 100)
614 vereq(a[1], 101)
615 vereq(a[2], 102)
616 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617
618def metaclass():
619 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000620 class C:
621 __metaclass__ = type
622 def __init__(self):
623 self.__state = 0
624 def getstate(self):
625 return self.__state
626 def setstate(self, state):
627 self.__state = state
628 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000631 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000632 class D:
633 class __metaclass__(type):
634 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000635 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000636 d = D()
637 verify(d.__class__ is D)
638 class M1(type):
639 def __new__(cls, name, bases, dict):
640 dict['__spam__'] = 1
641 return type.__new__(cls, name, bases, dict)
642 class C:
643 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000644 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000645 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000646 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000647
Guido van Rossum309b5662001-08-17 11:43:17 +0000648 class _instance(object):
649 pass
650 class M2(object):
651 def __new__(cls, name, bases, dict):
652 self = object.__new__(cls)
653 self.name = name
654 self.bases = bases
655 self.dict = dict
656 return self
657 __new__ = staticmethod(__new__)
658 def __call__(self):
659 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000660 # Early binding of methods
661 for key in self.dict:
662 if key.startswith("__"):
663 continue
664 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000665 return it
666 class C:
667 __metaclass__ = M2
668 def spam(self):
669 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000670 vereq(C.name, 'C')
671 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000672 verify('spam' in C.dict)
673 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675
Guido van Rossum91ee7982001-08-30 20:52:40 +0000676 # More metaclass examples
677
678 class autosuper(type):
679 # Automatically add __super to the class
680 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 cls = super(autosuper, metaclass).__new__(metaclass,
683 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000684 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000685 while name[:1] == "_":
686 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000687 if name:
688 name = "_%s__super" % name
689 else:
690 name = "__super"
691 setattr(cls, name, super(cls))
692 return cls
693 class A:
694 __metaclass__ = autosuper
695 def meth(self):
696 return "A"
697 class B(A):
698 def meth(self):
699 return "B" + self.__super.meth()
700 class C(A):
701 def meth(self):
702 return "C" + self.__super.meth()
703 class D(C, B):
704 def meth(self):
705 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000706 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000707 class E(B, C):
708 def meth(self):
709 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000710 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000711
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000712 class autoproperty(type):
713 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000714 # named _get_x and/or _set_x are found
715 def __new__(metaclass, name, bases, dict):
716 hits = {}
717 for key, val in dict.iteritems():
718 if key.startswith("_get_"):
719 key = key[5:]
720 get, set = hits.get(key, (None, None))
721 get = val
722 hits[key] = get, set
723 elif key.startswith("_set_"):
724 key = key[5:]
725 get, set = hits.get(key, (None, None))
726 set = val
727 hits[key] = get, set
728 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000729 dict[key] = property(get, set)
730 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 name, bases, dict)
732 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000733 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000734 def _get_x(self):
735 return -self.__x
736 def _set_x(self, x):
737 self.__x = -x
738 a = A()
739 verify(not hasattr(a, "x"))
740 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000741 vereq(a.x, 12)
742 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000743
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000744 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000745 # Merge of multiple cooperating metaclasses
746 pass
747 class A:
748 __metaclass__ = multimetaclass
749 def _get_x(self):
750 return "A"
751 class B(A):
752 def _get_x(self):
753 return "B" + self.__super._get_x()
754 class C(A):
755 def _get_x(self):
756 return "C" + self.__super._get_x()
757 class D(C, B):
758 def _get_x(self):
759 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000760 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000761
Guido van Rossumf76de622001-10-18 15:49:21 +0000762 # Make sure type(x) doesn't call x.__class__.__init__
763 class T(type):
764 counter = 0
765 def __init__(self, *args):
766 T.counter += 1
767 class C:
768 __metaclass__ = T
769 vereq(T.counter, 1)
770 a = C()
771 vereq(type(a), C)
772 vereq(T.counter, 1)
773
Guido van Rossum29d26062001-12-11 04:37:34 +0000774 class C(object): pass
775 c = C()
776 try: c()
777 except TypeError: pass
778 else: raise TestError, "calling object w/o call method should raise TypeError"
779
Tim Peters6d6c1a32001-08-02 04:15:00 +0000780def pymods():
781 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000782 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000783 import sys
784 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000785 class MM(MT):
786 def __init__(self):
787 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000788 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000789 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000790 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000791 def __setattr__(self, name, value):
792 log.append(("setattr", name, value))
793 MT.__setattr__(self, name, value)
794 def __delattr__(self, name):
795 log.append(("delattr", name))
796 MT.__delattr__(self, name)
797 a = MM()
798 a.foo = 12
799 x = a.foo
800 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000801 vereq(log, [("setattr", "foo", 12),
802 ("getattr", "foo"),
803 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804
805def multi():
806 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 class C(object):
808 def __init__(self):
809 self.__state = 0
810 def getstate(self):
811 return self.__state
812 def setstate(self, state):
813 self.__state = state
814 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000815 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000817 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000818 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819 def __init__(self):
820 type({}).__init__(self)
821 C.__init__(self)
822 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000823 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000824 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000825 vereq(d.items(), [("hello", "world")])
826 vereq(d["hello"], "world")
827 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000829 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000830 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831
Guido van Rossume45763a2001-08-10 21:28:46 +0000832 # SF bug #442833
833 class Node(object):
834 def __int__(self):
835 return int(self.foo())
836 def foo(self):
837 return "23"
838 class Frag(Node, list):
839 def foo(self):
840 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000841 vereq(Node().__int__(), 23)
842 vereq(int(Node()), 23)
843 vereq(Frag().__int__(), 42)
844 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000845
Tim Petersa91e9642001-11-14 23:32:33 +0000846 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000847
848 class A:
849 x = 1
850
851 class B(A):
852 pass
853
854 class C(A):
855 x = 2
856
857 class D(B, C):
858 pass
859 vereq(D.x, 1)
860
861 # Classic MRO is preserved for a classic base class.
862 class E(D, object):
863 pass
864 vereq(E.__mro__, (E, D, B, A, C, object))
865 vereq(E.x, 1)
866
867 # But with a mix of classic bases, their MROs are combined using
868 # new-style MRO.
869 class F(B, C, object):
870 pass
871 vereq(F.__mro__, (F, B, C, A, object))
872 vereq(F.x, 2)
873
874 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000875 class C:
876 def cmethod(self):
877 return "C a"
878 def all_method(self):
879 return "C b"
880
881 class M1(C, object):
882 def m1method(self):
883 return "M1 a"
884 def all_method(self):
885 return "M1 b"
886
887 vereq(M1.__mro__, (M1, C, object))
888 m = M1()
889 vereq(m.cmethod(), "C a")
890 vereq(m.m1method(), "M1 a")
891 vereq(m.all_method(), "M1 b")
892
893 class D(C):
894 def dmethod(self):
895 return "D a"
896 def all_method(self):
897 return "D b"
898
899 class M2(object, D):
900 def m2method(self):
901 return "M2 a"
902 def all_method(self):
903 return "M2 b"
904
905 vereq(M2.__mro__, (M2, object, D, C))
906 m = M2()
907 vereq(m.cmethod(), "C a")
908 vereq(m.dmethod(), "D a")
909 vereq(m.m2method(), "M2 a")
910 vereq(m.all_method(), "M2 b")
911
912 class M3(M1, object, M2):
913 def m3method(self):
914 return "M3 a"
915 def all_method(self):
916 return "M3 b"
917 # XXX Expected this (the commented-out result):
918 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
919 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000920 m = M3()
921 vereq(m.cmethod(), "C a")
922 vereq(m.dmethod(), "D a")
923 vereq(m.m1method(), "M1 a")
924 vereq(m.m2method(), "M2 a")
925 vereq(m.m3method(), "M3 a")
926 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000927
Guido van Rossume54616c2001-12-14 04:19:56 +0000928 class Classic:
929 pass
930 try:
931 class New(Classic):
932 __metaclass__ = type
933 except TypeError:
934 pass
935 else:
936 raise TestFailed, "new class with only classic bases - shouldn't be"
937
Tim Peters6d6c1a32001-08-02 04:15:00 +0000938def diamond():
939 if verbose: print "Testing multiple inheritance special cases..."
940 class A(object):
941 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000942 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000943 class B(A):
944 def boo(self): return "B"
945 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000946 vereq(B().spam(), "B")
947 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000948 class C(A):
949 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000950 vereq(C().spam(), "A")
951 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000952 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000953 vereq(D().spam(), "B")
954 vereq(D().boo(), "B")
955 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000956 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000957 vereq(E().spam(), "B")
958 vereq(E().boo(), "C")
959 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000960 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000961 vereq(F().spam(), "B")
962 vereq(F().boo(), "B")
963 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000964 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000965 vereq(G().spam(), "B")
966 vereq(G().boo(), "C")
967 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000968
Guido van Rossum37202612001-08-09 19:45:21 +0000969def objects():
970 if verbose: print "Testing object class..."
971 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000972 vereq(a.__class__, object)
973 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000974 b = object()
975 verify(a is not b)
976 verify(not hasattr(a, "foo"))
977 try:
978 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000979 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000980 pass
981 else:
982 verify(0, "object() should not allow setting a foo attribute")
983 verify(not hasattr(object(), "__dict__"))
984
985 class Cdict(object):
986 pass
987 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000988 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000989 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000990 vereq(x.foo, 1)
991 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000992
Tim Peters6d6c1a32001-08-02 04:15:00 +0000993def slots():
994 if verbose: print "Testing __slots__..."
995 class C0(object):
996 __slots__ = []
997 x = C0()
998 verify(not hasattr(x, "__dict__"))
999 verify(not hasattr(x, "foo"))
1000
1001 class C1(object):
1002 __slots__ = ['a']
1003 x = C1()
1004 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001005 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001006 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001007 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001008 x.a = None
1009 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001010 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001011 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012
1013 class C3(object):
1014 __slots__ = ['a', 'b', 'c']
1015 x = C3()
1016 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001017 verify(not hasattr(x, 'a'))
1018 verify(not hasattr(x, 'b'))
1019 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020 x.a = 1
1021 x.b = 2
1022 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001023 vereq(x.a, 1)
1024 vereq(x.b, 2)
1025 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001026
Guido van Rossum33bab012001-12-05 22:45:48 +00001027 # Test leaks
1028 class Counted(object):
1029 counter = 0 # counts the number of instances alive
1030 def __init__(self):
1031 Counted.counter += 1
1032 def __del__(self):
1033 Counted.counter -= 1
1034 class C(object):
1035 __slots__ = ['a', 'b', 'c']
1036 x = C()
1037 x.a = Counted()
1038 x.b = Counted()
1039 x.c = Counted()
1040 vereq(Counted.counter, 3)
1041 del x
1042 vereq(Counted.counter, 0)
1043 class D(C):
1044 pass
1045 x = D()
1046 x.a = Counted()
1047 x.z = Counted()
1048 vereq(Counted.counter, 2)
1049 del x
1050 vereq(Counted.counter, 0)
1051 class E(D):
1052 __slots__ = ['e']
1053 x = E()
1054 x.a = Counted()
1055 x.z = Counted()
1056 x.e = Counted()
1057 vereq(Counted.counter, 3)
1058 del x
1059 vereq(Counted.counter, 0)
1060
Tim Peters6d6c1a32001-08-02 04:15:00 +00001061def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001062 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001063 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001064 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001065 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001066 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001067 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001068 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001069 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001070 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001072 vereq(E.foo, 1)
1073 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001074 # Test dynamic instances
1075 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001076 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001077 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001078 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001079 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001080 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001081 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001082 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001083 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001084 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001085 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001086 vereq(int(a), 100)
1087 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001088 verify(not hasattr(a, "spam"))
1089 def mygetattr(self, name):
1090 if name == "spam":
1091 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001092 raise AttributeError
1093 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001094 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001095 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001096 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001097 def mysetattr(self, name, value):
1098 if name == "spam":
1099 raise AttributeError
1100 return object.__setattr__(self, name, value)
1101 C.__setattr__ = mysetattr
1102 try:
1103 a.spam = "not spam"
1104 except AttributeError:
1105 pass
1106 else:
1107 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001108 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001109 class D(C):
1110 pass
1111 d = D()
1112 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001113 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001114
Guido van Rossum7e35d572001-09-15 03:14:32 +00001115 # Test handling of int*seq and seq*int
1116 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001117 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001118 vereq("a"*I(2), "aa")
1119 vereq(I(2)*"a", "aa")
1120 vereq(2*I(3), 6)
1121 vereq(I(3)*2, 6)
1122 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001123
1124 # Test handling of long*seq and seq*long
1125 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001126 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001127 vereq("a"*L(2L), "aa")
1128 vereq(L(2L)*"a", "aa")
1129 vereq(2*L(3), 6)
1130 vereq(L(3)*2, 6)
1131 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001132
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001133 # Test comparison of classes with dynamic metaclasses
1134 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001135 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001136 class someclass:
1137 __metaclass__ = dynamicmetaclass
1138 verify(someclass != object)
1139
Tim Peters6d6c1a32001-08-02 04:15:00 +00001140def errors():
1141 if verbose: print "Testing errors..."
1142
1143 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001144 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001145 pass
1146 except TypeError:
1147 pass
1148 else:
1149 verify(0, "inheritance from both list and dict should be illegal")
1150
1151 try:
1152 class C(object, None):
1153 pass
1154 except TypeError:
1155 pass
1156 else:
1157 verify(0, "inheritance from non-type should be illegal")
1158 class Classic:
1159 pass
1160
1161 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001162 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001163 pass
1164 except TypeError:
1165 pass
1166 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001167 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001168
1169 try:
1170 class C(object):
1171 __slots__ = 1
1172 except TypeError:
1173 pass
1174 else:
1175 verify(0, "__slots__ = 1 should be illegal")
1176
1177 try:
1178 class C(object):
1179 __slots__ = [1]
1180 except TypeError:
1181 pass
1182 else:
1183 verify(0, "__slots__ = [1] should be illegal")
1184
1185def classmethods():
1186 if verbose: print "Testing class methods..."
1187 class C(object):
1188 def foo(*a): return a
1189 goo = classmethod(foo)
1190 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001191 vereq(C.goo(1), (C, 1))
1192 vereq(c.goo(1), (C, 1))
1193 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001194 class D(C):
1195 pass
1196 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001197 vereq(D.goo(1), (D, 1))
1198 vereq(d.goo(1), (D, 1))
1199 vereq(d.foo(1), (d, 1))
1200 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001201
1202def staticmethods():
1203 if verbose: print "Testing static methods..."
1204 class C(object):
1205 def foo(*a): return a
1206 goo = staticmethod(foo)
1207 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001208 vereq(C.goo(1), (1,))
1209 vereq(c.goo(1), (1,))
1210 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001211 class D(C):
1212 pass
1213 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001214 vereq(D.goo(1), (1,))
1215 vereq(d.goo(1), (1,))
1216 vereq(d.foo(1), (d, 1))
1217 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001218
1219def classic():
1220 if verbose: print "Testing classic classes..."
1221 class C:
1222 def foo(*a): return a
1223 goo = classmethod(foo)
1224 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001225 vereq(C.goo(1), (C, 1))
1226 vereq(c.goo(1), (C, 1))
1227 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001228 class D(C):
1229 pass
1230 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001231 vereq(D.goo(1), (D, 1))
1232 vereq(d.goo(1), (D, 1))
1233 vereq(d.foo(1), (d, 1))
1234 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001235 class E: # *not* subclassing from C
1236 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001237 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001238 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001239
1240def compattr():
1241 if verbose: print "Testing computed attributes..."
1242 class C(object):
1243 class computed_attribute(object):
1244 def __init__(self, get, set=None):
1245 self.__get = get
1246 self.__set = set
1247 def __get__(self, obj, type=None):
1248 return self.__get(obj)
1249 def __set__(self, obj, value):
1250 return self.__set(obj, value)
1251 def __init__(self):
1252 self.__x = 0
1253 def __get_x(self):
1254 x = self.__x
1255 self.__x = x+1
1256 return x
1257 def __set_x(self, x):
1258 self.__x = x
1259 x = computed_attribute(__get_x, __set_x)
1260 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001261 vereq(a.x, 0)
1262 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001263 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001264 vereq(a.x, 10)
1265 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266
1267def newslot():
1268 if verbose: print "Testing __new__ slot override..."
1269 class C(list):
1270 def __new__(cls):
1271 self = list.__new__(cls)
1272 self.foo = 1
1273 return self
1274 def __init__(self):
1275 self.foo = self.foo + 2
1276 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001277 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001278 verify(a.__class__ is C)
1279 class D(C):
1280 pass
1281 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001282 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001283 verify(b.__class__ is D)
1284
Tim Peters6d6c1a32001-08-02 04:15:00 +00001285def altmro():
1286 if verbose: print "Testing mro() and overriding it..."
1287 class A(object):
1288 def f(self): return "A"
1289 class B(A):
1290 pass
1291 class C(A):
1292 def f(self): return "C"
1293 class D(B, C):
1294 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001295 vereq(D.mro(), [D, B, C, A, object])
1296 vereq(D.__mro__, (D, B, C, A, object))
1297 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001298 class PerverseMetaType(type):
1299 def mro(cls):
1300 L = type.mro(cls)
1301 L.reverse()
1302 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001303 class X(A,B,C,D):
1304 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001305 vereq(X.__mro__, (object, A, C, B, D, X))
1306 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001307
1308def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001309 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001310
1311 class B(object):
1312 "Intermediate class because object doesn't have a __setattr__"
1313
1314 class C(B):
1315
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001316 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001317 if name == "foo":
1318 return ("getattr", name)
1319 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001320 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001321 def __setattr__(self, name, value):
1322 if name == "foo":
1323 self.setattr = (name, value)
1324 else:
1325 return B.__setattr__(self, name, value)
1326 def __delattr__(self, name):
1327 if name == "foo":
1328 self.delattr = name
1329 else:
1330 return B.__delattr__(self, name)
1331
1332 def __getitem__(self, key):
1333 return ("getitem", key)
1334 def __setitem__(self, key, value):
1335 self.setitem = (key, value)
1336 def __delitem__(self, key):
1337 self.delitem = key
1338
1339 def __getslice__(self, i, j):
1340 return ("getslice", i, j)
1341 def __setslice__(self, i, j, value):
1342 self.setslice = (i, j, value)
1343 def __delslice__(self, i, j):
1344 self.delslice = (i, j)
1345
1346 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001347 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001348 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001349 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001350 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001351 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001352
Guido van Rossum45704552001-10-08 16:35:45 +00001353 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001354 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001355 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001356 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001357 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001358
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001361 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001362 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001363 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001365def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001366 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001367 class C(object):
1368 def __init__(self, x):
1369 self.x = x
1370 def foo(self):
1371 return self.x
1372 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001373 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001374 class D(C):
1375 boo = C.foo
1376 goo = c1.foo
1377 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001378 vereq(d2.foo(), 2)
1379 vereq(d2.boo(), 2)
1380 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001381 class E(object):
1382 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001383 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001384 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001385
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001386def specials():
1387 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001388 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001389 # Test the default behavior for static classes
1390 class C(object):
1391 def __getitem__(self, i):
1392 if 0 <= i < 10: return i
1393 raise IndexError
1394 c1 = C()
1395 c2 = C()
1396 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001397 vereq(hash(c1), id(c1))
1398 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1399 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001400 verify(c1 != c2)
1401 verify(not c1 != c1)
1402 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001403 # Note that the module name appears in str/repr, and that varies
1404 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001405 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001406 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001407 verify(-1 not in c1)
1408 for i in range(10):
1409 verify(i in c1)
1410 verify(10 not in c1)
1411 # Test the default behavior for dynamic classes
1412 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001413 def __getitem__(self, i):
1414 if 0 <= i < 10: return i
1415 raise IndexError
1416 d1 = D()
1417 d2 = D()
1418 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001419 vereq(hash(d1), id(d1))
1420 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1421 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001422 verify(d1 != d2)
1423 verify(not d1 != d1)
1424 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001425 # Note that the module name appears in str/repr, and that varies
1426 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001427 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001428 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001429 verify(-1 not in d1)
1430 for i in range(10):
1431 verify(i in d1)
1432 verify(10 not in d1)
1433 # Test overridden behavior for static classes
1434 class Proxy(object):
1435 def __init__(self, x):
1436 self.x = x
1437 def __nonzero__(self):
1438 return not not self.x
1439 def __hash__(self):
1440 return hash(self.x)
1441 def __eq__(self, other):
1442 return self.x == other
1443 def __ne__(self, other):
1444 return self.x != other
1445 def __cmp__(self, other):
1446 return cmp(self.x, other.x)
1447 def __str__(self):
1448 return "Proxy:%s" % self.x
1449 def __repr__(self):
1450 return "Proxy(%r)" % self.x
1451 def __contains__(self, value):
1452 return value in self.x
1453 p0 = Proxy(0)
1454 p1 = Proxy(1)
1455 p_1 = Proxy(-1)
1456 verify(not p0)
1457 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001458 vereq(hash(p0), hash(0))
1459 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001460 verify(p0 != p1)
1461 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001462 vereq(not p0, p1)
1463 vereq(cmp(p0, p1), -1)
1464 vereq(cmp(p0, p0), 0)
1465 vereq(cmp(p0, p_1), 1)
1466 vereq(str(p0), "Proxy:0")
1467 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001468 p10 = Proxy(range(10))
1469 verify(-1 not in p10)
1470 for i in range(10):
1471 verify(i in p10)
1472 verify(10 not in p10)
1473 # Test overridden behavior for dynamic classes
1474 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001475 def __init__(self, x):
1476 self.x = x
1477 def __nonzero__(self):
1478 return not not self.x
1479 def __hash__(self):
1480 return hash(self.x)
1481 def __eq__(self, other):
1482 return self.x == other
1483 def __ne__(self, other):
1484 return self.x != other
1485 def __cmp__(self, other):
1486 return cmp(self.x, other.x)
1487 def __str__(self):
1488 return "DProxy:%s" % self.x
1489 def __repr__(self):
1490 return "DProxy(%r)" % self.x
1491 def __contains__(self, value):
1492 return value in self.x
1493 p0 = DProxy(0)
1494 p1 = DProxy(1)
1495 p_1 = DProxy(-1)
1496 verify(not p0)
1497 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001498 vereq(hash(p0), hash(0))
1499 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001500 verify(p0 != p1)
1501 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001502 vereq(not p0, p1)
1503 vereq(cmp(p0, p1), -1)
1504 vereq(cmp(p0, p0), 0)
1505 vereq(cmp(p0, p_1), 1)
1506 vereq(str(p0), "DProxy:0")
1507 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001508 p10 = DProxy(range(10))
1509 verify(-1 not in p10)
1510 for i in range(10):
1511 verify(i in p10)
1512 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001513 # Safety test for __cmp__
1514 def unsafecmp(a, b):
1515 try:
1516 a.__class__.__cmp__(a, b)
1517 except TypeError:
1518 pass
1519 else:
1520 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1521 a.__class__, a, b)
1522 unsafecmp(u"123", "123")
1523 unsafecmp("123", u"123")
1524 unsafecmp(1, 1.0)
1525 unsafecmp(1.0, 1)
1526 unsafecmp(1, 1L)
1527 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001528
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001529def weakrefs():
1530 if verbose: print "Testing weak references..."
1531 import weakref
1532 class C(object):
1533 pass
1534 c = C()
1535 r = weakref.ref(c)
1536 verify(r() is c)
1537 del c
1538 verify(r() is None)
1539 del r
1540 class NoWeak(object):
1541 __slots__ = ['foo']
1542 no = NoWeak()
1543 try:
1544 weakref.ref(no)
1545 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001546 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001547 else:
1548 verify(0, "weakref.ref(no) should be illegal")
1549 class Weak(object):
1550 __slots__ = ['foo', '__weakref__']
1551 yes = Weak()
1552 r = weakref.ref(yes)
1553 verify(r() is yes)
1554 del yes
1555 verify(r() is None)
1556 del r
1557
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001558def properties():
1559 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001560 class C(object):
1561 def getx(self):
1562 return self.__x
1563 def setx(self, value):
1564 self.__x = value
1565 def delx(self):
1566 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001567 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001568 a = C()
1569 verify(not hasattr(a, "x"))
1570 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001571 vereq(a._C__x, 42)
1572 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001573 del a.x
1574 verify(not hasattr(a, "x"))
1575 verify(not hasattr(a, "_C__x"))
1576 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001577 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001578## C.x.__set__(a)
1579## verify(not hasattr(a, "x"))
1580
Tim Peters66c1a522001-09-24 21:17:50 +00001581 raw = C.__dict__['x']
1582 verify(isinstance(raw, property))
1583
1584 attrs = dir(raw)
1585 verify("__doc__" in attrs)
1586 verify("fget" in attrs)
1587 verify("fset" in attrs)
1588 verify("fdel" in attrs)
1589
Guido van Rossum45704552001-10-08 16:35:45 +00001590 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001591 verify(raw.fget is C.__dict__['getx'])
1592 verify(raw.fset is C.__dict__['setx'])
1593 verify(raw.fdel is C.__dict__['delx'])
1594
1595 for attr in "__doc__", "fget", "fset", "fdel":
1596 try:
1597 setattr(raw, attr, 42)
1598 except TypeError, msg:
1599 if str(msg).find('readonly') < 0:
1600 raise TestFailed("when setting readonly attr %r on a "
1601 "property, got unexpected TypeError "
1602 "msg %r" % (attr, str(msg)))
1603 else:
1604 raise TestFailed("expected TypeError from trying to set "
1605 "readonly %r attr on a property" % attr)
1606
Guido van Rossumc4a18802001-08-24 16:55:27 +00001607def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001608 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001609
1610 class A(object):
1611 def meth(self, a):
1612 return "A(%r)" % a
1613
Guido van Rossum45704552001-10-08 16:35:45 +00001614 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001615
1616 class B(A):
1617 def __init__(self):
1618 self.__super = super(B, self)
1619 def meth(self, a):
1620 return "B(%r)" % a + self.__super.meth(a)
1621
Guido van Rossum45704552001-10-08 16:35:45 +00001622 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001623
1624 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001625 def meth(self, a):
1626 return "C(%r)" % a + self.__super.meth(a)
1627 C._C__super = super(C)
1628
Guido van Rossum45704552001-10-08 16:35:45 +00001629 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001630
1631 class D(C, B):
1632 def meth(self, a):
1633 return "D(%r)" % a + super(D, self).meth(a)
1634
Guido van Rossum5b443c62001-12-03 15:38:28 +00001635 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1636
1637 # Test for subclassing super
1638
1639 class mysuper(super):
1640 def __init__(self, *args):
1641 return super(mysuper, self).__init__(*args)
1642
1643 class E(D):
1644 def meth(self, a):
1645 return "E(%r)" % a + mysuper(E, self).meth(a)
1646
1647 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1648
1649 class F(E):
1650 def meth(self, a):
1651 s = self.__super
1652 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1653 F._F__super = mysuper(F)
1654
1655 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1656
1657 # Make sure certain errors are raised
1658
1659 try:
1660 super(D, 42)
1661 except TypeError:
1662 pass
1663 else:
1664 raise TestFailed, "shouldn't allow super(D, 42)"
1665
1666 try:
1667 super(D, C())
1668 except TypeError:
1669 pass
1670 else:
1671 raise TestFailed, "shouldn't allow super(D, C())"
1672
1673 try:
1674 super(D).__get__(12)
1675 except TypeError:
1676 pass
1677 else:
1678 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1679
1680 try:
1681 super(D).__get__(C())
1682 except TypeError:
1683 pass
1684 else:
1685 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001686
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001687def inherits():
1688 if verbose: print "Testing inheritance from basic types..."
1689
1690 class hexint(int):
1691 def __repr__(self):
1692 return hex(self)
1693 def __add__(self, other):
1694 return hexint(int.__add__(self, other))
1695 # (Note that overriding __radd__ doesn't work,
1696 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001697 vereq(repr(hexint(7) + 9), "0x10")
1698 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001699 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001700 vereq(a, 12345)
1701 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001702 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001703 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001704 verify((+a).__class__ is int)
1705 verify((a >> 0).__class__ is int)
1706 verify((a << 0).__class__ is int)
1707 verify((hexint(0) << 12).__class__ is int)
1708 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001709
1710 class octlong(long):
1711 __slots__ = []
1712 def __str__(self):
1713 s = oct(self)
1714 if s[-1] == 'L':
1715 s = s[:-1]
1716 return s
1717 def __add__(self, other):
1718 return self.__class__(super(octlong, self).__add__(other))
1719 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001720 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001721 # (Note that overriding __radd__ here only seems to work
1722 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001723 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001724 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001725 vereq(a, 12345L)
1726 vereq(long(a), 12345L)
1727 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001728 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001729 verify((+a).__class__ is long)
1730 verify((-a).__class__ is long)
1731 verify((-octlong(0)).__class__ is long)
1732 verify((a >> 0).__class__ is long)
1733 verify((a << 0).__class__ is long)
1734 verify((a - 0).__class__ is long)
1735 verify((a * 1).__class__ is long)
1736 verify((a ** 1).__class__ is long)
1737 verify((a // 1).__class__ is long)
1738 verify((1 * a).__class__ is long)
1739 verify((a | 0).__class__ is long)
1740 verify((a ^ 0).__class__ is long)
1741 verify((a & -1L).__class__ is long)
1742 verify((octlong(0) << 12).__class__ is long)
1743 verify((octlong(0) >> 12).__class__ is long)
1744 verify(abs(octlong(0)).__class__ is long)
1745
1746 # Because octlong overrides __add__, we can't check the absence of +0
1747 # optimizations using octlong.
1748 class longclone(long):
1749 pass
1750 a = longclone(1)
1751 verify((a + 0).__class__ is long)
1752 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001753
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001754 # Check that negative clones don't segfault
1755 a = longclone(-1)
1756 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001757 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001758
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001759 class precfloat(float):
1760 __slots__ = ['prec']
1761 def __init__(self, value=0.0, prec=12):
1762 self.prec = int(prec)
1763 float.__init__(value)
1764 def __repr__(self):
1765 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001766 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001767 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(a, 12345.0)
1769 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001770 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001771 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001772 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001773
Tim Peters2400fa42001-09-12 19:12:49 +00001774 class madcomplex(complex):
1775 def __repr__(self):
1776 return "%.17gj%+.17g" % (self.imag, self.real)
1777 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001778 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001779 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001780 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(a, base)
1782 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001783 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001784 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001785 vereq(repr(a), "4j-3")
1786 vereq(a, base)
1787 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001788 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001789 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001790 veris((+a).__class__, complex)
1791 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001792 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001793 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001794 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001795 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001796 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001797 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001798 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001799
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001800 class madtuple(tuple):
1801 _rev = None
1802 def rev(self):
1803 if self._rev is not None:
1804 return self._rev
1805 L = list(self)
1806 L.reverse()
1807 self._rev = self.__class__(L)
1808 return self._rev
1809 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001810 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1811 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1812 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001813 for i in range(512):
1814 t = madtuple(range(i))
1815 u = t.rev()
1816 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001817 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001818 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001819 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001820 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001821 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001822 verify(a[:].__class__ is tuple)
1823 verify((a * 1).__class__ is tuple)
1824 verify((a * 0).__class__ is tuple)
1825 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001826 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001827 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001828 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001829 verify((a + a).__class__ is tuple)
1830 verify((a * 0).__class__ is tuple)
1831 verify((a * 1).__class__ is tuple)
1832 verify((a * 2).__class__ is tuple)
1833 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001834
1835 class madstring(str):
1836 _rev = None
1837 def rev(self):
1838 if self._rev is not None:
1839 return self._rev
1840 L = list(self)
1841 L.reverse()
1842 self._rev = self.__class__("".join(L))
1843 return self._rev
1844 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001845 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1846 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1847 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001848 for i in range(256):
1849 s = madstring("".join(map(chr, range(i))))
1850 t = s.rev()
1851 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001852 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001853 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001854 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001855 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001856
Tim Peters8fa5dd02001-09-12 02:18:30 +00001857 base = "\x00" * 5
1858 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001859 vereq(s, base)
1860 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001861 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001862 vereq(hash(s), hash(base))
1863 vereq({s: 1}[base], 1)
1864 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001865 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001866 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001867 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001868 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001869 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001870 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001871 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001872 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001873 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001874 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001875 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001876 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001877 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001878 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001879 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001880 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001881 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001882 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001883 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001884 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001885 identitytab = ''.join([chr(i) for i in range(256)])
1886 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001887 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001888 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001889 vereq(s.translate(identitytab, "x"), base)
1890 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001891 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001892 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001893 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001894 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001895 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001896 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001897 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001898 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001899 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001900 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001901
Tim Peters111f6092001-09-12 07:54:51 +00001902 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001903 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001904 verify(intern(s).__class__ is str)
1905 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001906 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001907
1908 i = intern("y x")
1909 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001911 verify(intern(s).__class__ is str)
1912 verify(intern(s) is i)
1913
1914 s = madstring(i)
1915 verify(intern(s).__class__ is str)
1916 verify(intern(s) is i)
1917
Guido van Rossum91ee7982001-08-30 20:52:40 +00001918 class madunicode(unicode):
1919 _rev = None
1920 def rev(self):
1921 if self._rev is not None:
1922 return self._rev
1923 L = list(self)
1924 L.reverse()
1925 self._rev = self.__class__(u"".join(L))
1926 return self._rev
1927 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001928 vereq(u, u"ABCDEF")
1929 vereq(u.rev(), madunicode(u"FEDCBA"))
1930 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001931 base = u"12345"
1932 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001933 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001934 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(hash(u), hash(base))
1936 vereq({u: 1}[base], 1)
1937 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001938 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001939 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001940 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001941 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001942 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001944 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001945 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001946 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001947 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001948 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001949 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001950 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001951 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001952 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001953 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001954 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001955 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001956 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001957 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001958 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001959 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001960 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001961 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001962 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001963 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001964 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001965 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001966 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001967 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001968 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001969 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001970 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001971 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001972 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001973 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001974 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001975 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001976
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001977 class sublist(list):
1978 pass
1979 a = sublist(range(5))
1980 vereq(a, range(5))
1981 a.append("hello")
1982 vereq(a, range(5) + ["hello"])
1983 a[5] = 5
1984 vereq(a, range(6))
1985 a.extend(range(6, 20))
1986 vereq(a, range(20))
1987 a[-5:] = []
1988 vereq(a, range(15))
1989 del a[10:15]
1990 vereq(len(a), 10)
1991 vereq(a, range(10))
1992 vereq(list(a), range(10))
1993 vereq(a[0], 0)
1994 vereq(a[9], 9)
1995 vereq(a[-10], 0)
1996 vereq(a[-1], 9)
1997 vereq(a[:5], range(5))
1998
Tim Peters59c9a642001-09-13 05:38:56 +00001999 class CountedInput(file):
2000 """Counts lines read by self.readline().
2001
2002 self.lineno is the 0-based ordinal of the last line read, up to
2003 a maximum of one greater than the number of lines in the file.
2004
2005 self.ateof is true if and only if the final "" line has been read,
2006 at which point self.lineno stops incrementing, and further calls
2007 to readline() continue to return "".
2008 """
2009
2010 lineno = 0
2011 ateof = 0
2012 def readline(self):
2013 if self.ateof:
2014 return ""
2015 s = file.readline(self)
2016 # Next line works too.
2017 # s = super(CountedInput, self).readline()
2018 self.lineno += 1
2019 if s == "":
2020 self.ateof = 1
2021 return s
2022
Tim Peters561f8992001-09-13 19:36:36 +00002023 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002024 lines = ['a\n', 'b\n', 'c\n']
2025 try:
2026 f.writelines(lines)
2027 f.close()
2028 f = CountedInput(TESTFN)
2029 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2030 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002031 vereq(expected, got)
2032 vereq(f.lineno, i)
2033 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002034 f.close()
2035 finally:
2036 try:
2037 f.close()
2038 except:
2039 pass
2040 try:
2041 import os
2042 os.unlink(TESTFN)
2043 except:
2044 pass
2045
Tim Peters808b94e2001-09-13 19:33:07 +00002046def keywords():
2047 if verbose:
2048 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002049 vereq(int(x=1), 1)
2050 vereq(float(x=2), 2.0)
2051 vereq(long(x=3), 3L)
2052 vereq(complex(imag=42, real=666), complex(666, 42))
2053 vereq(str(object=500), '500')
2054 vereq(unicode(string='abc', errors='strict'), u'abc')
2055 vereq(tuple(sequence=range(3)), (0, 1, 2))
2056 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002057 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002058
2059 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002060 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002061 try:
2062 constructor(bogus_keyword_arg=1)
2063 except TypeError:
2064 pass
2065 else:
2066 raise TestFailed("expected TypeError from bogus keyword "
2067 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002068
Tim Peters8fa45672001-09-13 21:01:29 +00002069def restricted():
2070 import rexec
2071 if verbose:
2072 print "Testing interaction with restricted execution ..."
2073
2074 sandbox = rexec.RExec()
2075
2076 code1 = """f = open(%r, 'w')""" % TESTFN
2077 code2 = """f = file(%r, 'w')""" % TESTFN
2078 code3 = """\
2079f = open(%r)
2080t = type(f) # a sneaky way to get the file() constructor
2081f.close()
2082f = t(%r, 'w') # rexec can't catch this by itself
2083""" % (TESTFN, TESTFN)
2084
2085 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2086 f.close()
2087
2088 try:
2089 for code in code1, code2, code3:
2090 try:
2091 sandbox.r_exec(code)
2092 except IOError, msg:
2093 if str(msg).find("restricted") >= 0:
2094 outcome = "OK"
2095 else:
2096 outcome = "got an exception, but not an expected one"
2097 else:
2098 outcome = "expected a restricted-execution exception"
2099
2100 if outcome != "OK":
2101 raise TestFailed("%s, in %r" % (outcome, code))
2102
2103 finally:
2104 try:
2105 import os
2106 os.unlink(TESTFN)
2107 except:
2108 pass
2109
Tim Peters0ab085c2001-09-14 00:25:33 +00002110def str_subclass_as_dict_key():
2111 if verbose:
2112 print "Testing a str subclass used as dict key .."
2113
2114 class cistr(str):
2115 """Sublcass of str that computes __eq__ case-insensitively.
2116
2117 Also computes a hash code of the string in canonical form.
2118 """
2119
2120 def __init__(self, value):
2121 self.canonical = value.lower()
2122 self.hashcode = hash(self.canonical)
2123
2124 def __eq__(self, other):
2125 if not isinstance(other, cistr):
2126 other = cistr(other)
2127 return self.canonical == other.canonical
2128
2129 def __hash__(self):
2130 return self.hashcode
2131
Guido van Rossum45704552001-10-08 16:35:45 +00002132 vereq(cistr('ABC'), 'abc')
2133 vereq('aBc', cistr('ABC'))
2134 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002135
2136 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002137 vereq(d[cistr('one')], 1)
2138 vereq(d[cistr('tWo')], 2)
2139 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002140 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002141 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002142
Guido van Rossumab3b0342001-09-18 20:38:53 +00002143def classic_comparisons():
2144 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002145 class classic:
2146 pass
2147 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002148 if verbose: print " (base = %s)" % base
2149 class C(base):
2150 def __init__(self, value):
2151 self.value = int(value)
2152 def __cmp__(self, other):
2153 if isinstance(other, C):
2154 return cmp(self.value, other.value)
2155 if isinstance(other, int) or isinstance(other, long):
2156 return cmp(self.value, other)
2157 return NotImplemented
2158 c1 = C(1)
2159 c2 = C(2)
2160 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002161 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002162 c = {1: c1, 2: c2, 3: c3}
2163 for x in 1, 2, 3:
2164 for y in 1, 2, 3:
2165 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2166 for op in "<", "<=", "==", "!=", ">", ">=":
2167 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2168 "x=%d, y=%d" % (x, y))
2169 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2170 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2171
Guido van Rossum0639f592001-09-18 21:06:04 +00002172def rich_comparisons():
2173 if verbose:
2174 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002175 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002176 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002177 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(z, 1+0j)
2179 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002180 class ZZ(complex):
2181 def __eq__(self, other):
2182 try:
2183 return abs(self - other) <= 1e-6
2184 except:
2185 return NotImplemented
2186 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(zz, 1+0j)
2188 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002189
Guido van Rossum0639f592001-09-18 21:06:04 +00002190 class classic:
2191 pass
2192 for base in (classic, int, object, list):
2193 if verbose: print " (base = %s)" % base
2194 class C(base):
2195 def __init__(self, value):
2196 self.value = int(value)
2197 def __cmp__(self, other):
2198 raise TestFailed, "shouldn't call __cmp__"
2199 def __eq__(self, other):
2200 if isinstance(other, C):
2201 return self.value == other.value
2202 if isinstance(other, int) or isinstance(other, long):
2203 return self.value == other
2204 return NotImplemented
2205 def __ne__(self, other):
2206 if isinstance(other, C):
2207 return self.value != other.value
2208 if isinstance(other, int) or isinstance(other, long):
2209 return self.value != other
2210 return NotImplemented
2211 def __lt__(self, other):
2212 if isinstance(other, C):
2213 return self.value < other.value
2214 if isinstance(other, int) or isinstance(other, long):
2215 return self.value < other
2216 return NotImplemented
2217 def __le__(self, other):
2218 if isinstance(other, C):
2219 return self.value <= other.value
2220 if isinstance(other, int) or isinstance(other, long):
2221 return self.value <= other
2222 return NotImplemented
2223 def __gt__(self, other):
2224 if isinstance(other, C):
2225 return self.value > other.value
2226 if isinstance(other, int) or isinstance(other, long):
2227 return self.value > other
2228 return NotImplemented
2229 def __ge__(self, other):
2230 if isinstance(other, C):
2231 return self.value >= other.value
2232 if isinstance(other, int) or isinstance(other, long):
2233 return 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 Rossum0639f592001-09-18 21:06:04 +00002239 c = {1: c1, 2: c2, 3: c3}
2240 for x in 1, 2, 3:
2241 for y in 1, 2, 3:
2242 for op in "<", "<=", "==", "!=", ">", ">=":
2243 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2244 "x=%d, y=%d" % (x, y))
2245 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2246 "x=%d, y=%d" % (x, y))
2247 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2248 "x=%d, y=%d" % (x, y))
2249
Guido van Rossum1952e382001-09-19 01:25:16 +00002250def coercions():
2251 if verbose: print "Testing coercions..."
2252 class I(int): pass
2253 coerce(I(0), 0)
2254 coerce(0, I(0))
2255 class L(long): pass
2256 coerce(L(0), 0)
2257 coerce(L(0), 0L)
2258 coerce(0, L(0))
2259 coerce(0L, L(0))
2260 class F(float): pass
2261 coerce(F(0), 0)
2262 coerce(F(0), 0L)
2263 coerce(F(0), 0.)
2264 coerce(0, F(0))
2265 coerce(0L, F(0))
2266 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002267 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002268 coerce(C(0), 0)
2269 coerce(C(0), 0L)
2270 coerce(C(0), 0.)
2271 coerce(C(0), 0j)
2272 coerce(0, C(0))
2273 coerce(0L, C(0))
2274 coerce(0., C(0))
2275 coerce(0j, C(0))
2276
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002277def descrdoc():
2278 if verbose: print "Testing descriptor doc strings..."
2279 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002281 check(file.closed, "flag set if the file is closed") # getset descriptor
2282 check(file.name, "file name") # member descriptor
2283
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002284def setclass():
2285 if verbose: print "Testing __class__ assignment..."
2286 class C(object): pass
2287 class D(object): pass
2288 class E(object): pass
2289 class F(D, E): pass
2290 for cls in C, D, E, F:
2291 for cls2 in C, D, E, F:
2292 x = cls()
2293 x.__class__ = cls2
2294 verify(x.__class__ is cls2)
2295 x.__class__ = cls
2296 verify(x.__class__ is cls)
2297 def cant(x, C):
2298 try:
2299 x.__class__ = C
2300 except TypeError:
2301 pass
2302 else:
2303 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2304 cant(C(), list)
2305 cant(list(), C)
2306 cant(C(), 1)
2307 cant(C(), object)
2308 cant(object(), list)
2309 cant(list(), object)
2310
Guido van Rossum6661be32001-10-26 04:26:12 +00002311def setdict():
2312 if verbose: print "Testing __dict__ assignment..."
2313 class C(object): pass
2314 a = C()
2315 a.__dict__ = {'b': 1}
2316 vereq(a.b, 1)
2317 def cant(x, dict):
2318 try:
2319 x.__dict__ = dict
2320 except TypeError:
2321 pass
2322 else:
2323 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2324 cant(a, None)
2325 cant(a, [])
2326 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002327 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002328 # Classes don't allow __dict__ assignment
2329 cant(C, {})
2330
Guido van Rossum3926a632001-09-25 16:25:58 +00002331def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002332 if verbose:
2333 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002334 import pickle, cPickle
2335
2336 def sorteditems(d):
2337 L = d.items()
2338 L.sort()
2339 return L
2340
2341 global C
2342 class C(object):
2343 def __init__(self, a, b):
2344 super(C, self).__init__()
2345 self.a = a
2346 self.b = b
2347 def __repr__(self):
2348 return "C(%r, %r)" % (self.a, self.b)
2349
2350 global C1
2351 class C1(list):
2352 def __new__(cls, a, b):
2353 return super(C1, cls).__new__(cls)
2354 def __init__(self, a, b):
2355 self.a = a
2356 self.b = b
2357 def __repr__(self):
2358 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2359
2360 global C2
2361 class C2(int):
2362 def __new__(cls, a, b, val=0):
2363 return super(C2, cls).__new__(cls, val)
2364 def __init__(self, a, b, val=0):
2365 self.a = a
2366 self.b = b
2367 def __repr__(self):
2368 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2369
Guido van Rossum90c45142001-11-24 21:07:01 +00002370 global C3
2371 class C3(object):
2372 def __init__(self, foo):
2373 self.foo = foo
2374 def __getstate__(self):
2375 return self.foo
2376 def __setstate__(self, foo):
2377 self.foo = foo
2378
2379 global C4classic, C4
2380 class C4classic: # classic
2381 pass
2382 class C4(C4classic, object): # mixed inheritance
2383 pass
2384
Guido van Rossum3926a632001-09-25 16:25:58 +00002385 for p in pickle, cPickle:
2386 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002387 if verbose:
2388 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002389
2390 for cls in C, C1, C2:
2391 s = p.dumps(cls, bin)
2392 cls2 = p.loads(s)
2393 verify(cls2 is cls)
2394
2395 a = C1(1, 2); a.append(42); a.append(24)
2396 b = C2("hello", "world", 42)
2397 s = p.dumps((a, b), bin)
2398 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002399 vereq(x.__class__, a.__class__)
2400 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2401 vereq(y.__class__, b.__class__)
2402 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2403 vereq(`x`, `a`)
2404 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002405 if verbose:
2406 print "a = x =", a
2407 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002408 # Test for __getstate__ and __setstate__ on new style class
2409 u = C3(42)
2410 s = p.dumps(u, bin)
2411 v = p.loads(s)
2412 veris(u.__class__, v.__class__)
2413 vereq(u.foo, v.foo)
2414 # Test for picklability of hybrid class
2415 u = C4()
2416 u.foo = 42
2417 s = p.dumps(u, bin)
2418 v = p.loads(s)
2419 veris(u.__class__, v.__class__)
2420 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002421
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002422 # Testing copy.deepcopy()
2423 if verbose:
2424 print "deepcopy"
2425 import copy
2426 for cls in C, C1, C2:
2427 cls2 = copy.deepcopy(cls)
2428 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002429
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002430 a = C1(1, 2); a.append(42); a.append(24)
2431 b = C2("hello", "world", 42)
2432 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002433 vereq(x.__class__, a.__class__)
2434 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2435 vereq(y.__class__, b.__class__)
2436 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2437 vereq(`x`, `a`)
2438 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002439 if verbose:
2440 print "a = x =", a
2441 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002442
2443def copies():
2444 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2445 import copy
2446 class C(object):
2447 pass
2448
2449 a = C()
2450 a.foo = 12
2451 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002452 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002453
2454 a.bar = [1,2,3]
2455 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002456 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002457 verify(c.bar is a.bar)
2458
2459 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002460 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002461 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002462 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002463
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002464def binopoverride():
2465 if verbose: print "Testing overrides of binary operations..."
2466 class I(int):
2467 def __repr__(self):
2468 return "I(%r)" % int(self)
2469 def __add__(self, other):
2470 return I(int(self) + int(other))
2471 __radd__ = __add__
2472 def __pow__(self, other, mod=None):
2473 if mod is None:
2474 return I(pow(int(self), int(other)))
2475 else:
2476 return I(pow(int(self), int(other), int(mod)))
2477 def __rpow__(self, other, mod=None):
2478 if mod is None:
2479 return I(pow(int(other), int(self), mod))
2480 else:
2481 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002482
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002483 vereq(`I(1) + I(2)`, "I(3)")
2484 vereq(`I(1) + 2`, "I(3)")
2485 vereq(`1 + I(2)`, "I(3)")
2486 vereq(`I(2) ** I(3)`, "I(8)")
2487 vereq(`2 ** I(3)`, "I(8)")
2488 vereq(`I(2) ** 3`, "I(8)")
2489 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2490 class S(str):
2491 def __eq__(self, other):
2492 return self.lower() == other.lower()
2493
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002494def subclasspropagation():
2495 if verbose: print "Testing propagation of slot functions to subclasses..."
2496 class A(object):
2497 pass
2498 class B(A):
2499 pass
2500 class C(A):
2501 pass
2502 class D(B, C):
2503 pass
2504 d = D()
2505 vereq(hash(d), id(d))
2506 A.__hash__ = lambda self: 42
2507 vereq(hash(d), 42)
2508 C.__hash__ = lambda self: 314
2509 vereq(hash(d), 314)
2510 B.__hash__ = lambda self: 144
2511 vereq(hash(d), 144)
2512 D.__hash__ = lambda self: 100
2513 vereq(hash(d), 100)
2514 del D.__hash__
2515 vereq(hash(d), 144)
2516 del B.__hash__
2517 vereq(hash(d), 314)
2518 del C.__hash__
2519 vereq(hash(d), 42)
2520 del A.__hash__
2521 vereq(hash(d), id(d))
2522 d.foo = 42
2523 d.bar = 42
2524 vereq(d.foo, 42)
2525 vereq(d.bar, 42)
2526 def __getattribute__(self, name):
2527 if name == "foo":
2528 return 24
2529 return object.__getattribute__(self, name)
2530 A.__getattribute__ = __getattribute__
2531 vereq(d.foo, 24)
2532 vereq(d.bar, 42)
2533 def __getattr__(self, name):
2534 if name in ("spam", "foo", "bar"):
2535 return "hello"
2536 raise AttributeError, name
2537 B.__getattr__ = __getattr__
2538 vereq(d.spam, "hello")
2539 vereq(d.foo, 24)
2540 vereq(d.bar, 42)
2541 del A.__getattribute__
2542 vereq(d.foo, 42)
2543 del d.foo
2544 vereq(d.foo, "hello")
2545 vereq(d.bar, 42)
2546 del B.__getattr__
2547 try:
2548 d.foo
2549 except AttributeError:
2550 pass
2551 else:
2552 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002553
2554def buffer_inherit():
2555 import binascii
2556 # SF bug [#470040] ParseTuple t# vs subclasses.
2557 if verbose:
2558 print "Testing that buffer interface is inherited ..."
2559
2560 class MyStr(str):
2561 pass
2562 base = 'abc'
2563 m = MyStr(base)
2564 # b2a_hex uses the buffer interface to get its argument's value, via
2565 # PyArg_ParseTuple 't#' code.
2566 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2567
2568 # It's not clear that unicode will continue to support the character
2569 # buffer interface, and this test will fail if that's taken away.
2570 class MyUni(unicode):
2571 pass
2572 base = u'abc'
2573 m = MyUni(base)
2574 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2575
2576 class MyInt(int):
2577 pass
2578 m = MyInt(42)
2579 try:
2580 binascii.b2a_hex(m)
2581 raise TestFailed('subclass of int should not have a buffer interface')
2582 except TypeError:
2583 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002584
Tim Petersc9933152001-10-16 20:18:24 +00002585def str_of_str_subclass():
2586 import binascii
2587 import cStringIO
2588
2589 if verbose:
2590 print "Testing __str__ defined in subclass of str ..."
2591
2592 class octetstring(str):
2593 def __str__(self):
2594 return binascii.b2a_hex(self)
2595 def __repr__(self):
2596 return self + " repr"
2597
2598 o = octetstring('A')
2599 vereq(type(o), octetstring)
2600 vereq(type(str(o)), str)
2601 vereq(type(repr(o)), str)
2602 vereq(ord(o), 0x41)
2603 vereq(str(o), '41')
2604 vereq(repr(o), 'A repr')
2605 vereq(o.__str__(), '41')
2606 vereq(o.__repr__(), 'A repr')
2607
2608 capture = cStringIO.StringIO()
2609 # Calling str() or not exercises different internal paths.
2610 print >> capture, o
2611 print >> capture, str(o)
2612 vereq(capture.getvalue(), '41\n41\n')
2613 capture.close()
2614
Guido van Rossumc8e56452001-10-22 00:43:43 +00002615def kwdargs():
2616 if verbose: print "Testing keyword arguments to __init__, __call__..."
2617 def f(a): return a
2618 vereq(f.__call__(a=42), 42)
2619 a = []
2620 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002621 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002622
Guido van Rossumed87ad82001-10-30 02:33:02 +00002623def delhook():
2624 if verbose: print "Testing __del__ hook..."
2625 log = []
2626 class C(object):
2627 def __del__(self):
2628 log.append(1)
2629 c = C()
2630 vereq(log, [])
2631 del c
2632 vereq(log, [1])
2633
Guido van Rossum29d26062001-12-11 04:37:34 +00002634 class D(object): pass
2635 d = D()
2636 try: del d[0]
2637 except TypeError: pass
2638 else: raise TestFailed, "invalid del() didn't raise TypeError"
2639
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002640def hashinherit():
2641 if verbose: print "Testing hash of mutable subclasses..."
2642
2643 class mydict(dict):
2644 pass
2645 d = mydict()
2646 try:
2647 hash(d)
2648 except TypeError:
2649 pass
2650 else:
2651 raise TestFailed, "hash() of dict subclass should fail"
2652
2653 class mylist(list):
2654 pass
2655 d = mylist()
2656 try:
2657 hash(d)
2658 except TypeError:
2659 pass
2660 else:
2661 raise TestFailed, "hash() of list subclass should fail"
2662
Guido van Rossum29d26062001-12-11 04:37:34 +00002663def strops():
2664 try: 'a' + 5
2665 except TypeError: pass
2666 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2667
2668 try: ''.split('')
2669 except ValueError: pass
2670 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2671
2672 try: ''.join([0])
2673 except TypeError: pass
2674 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2675
2676 try: ''.rindex('5')
2677 except ValueError: pass
2678 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2679
2680 try: ''.replace('', '')
2681 except ValueError: pass
2682 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2683
2684 try: '%(n)s' % None
2685 except TypeError: pass
2686 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2687
2688 try: '%(n' % {}
2689 except ValueError: pass
2690 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2691
2692 try: '%*s' % ('abc')
2693 except TypeError: pass
2694 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2695
2696 try: '%*.*s' % ('abc', 5)
2697 except TypeError: pass
2698 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2699
2700 try: '%s' % (1, 2)
2701 except TypeError: pass
2702 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2703
2704 try: '%' % None
2705 except ValueError: pass
2706 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2707
2708 vereq('534253'.isdigit(), 1)
2709 vereq('534253x'.isdigit(), 0)
2710 vereq('%c' % 5, '\x05')
2711 vereq('%c' % '5', '5')
2712
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002713def deepcopyrecursive():
2714 if verbose: print "Testing deepcopy of recursive objects..."
2715 class Node:
2716 pass
2717 a = Node()
2718 b = Node()
2719 a.b = b
2720 b.a = a
2721 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002722
2723
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002724def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002725 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002726 lists()
2727 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002728 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002729 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002730 ints()
2731 longs()
2732 floats()
2733 complexes()
2734 spamlists()
2735 spamdicts()
2736 pydicts()
2737 pylists()
2738 metaclass()
2739 pymods()
2740 multi()
2741 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002742 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002743 slots()
2744 dynamics()
2745 errors()
2746 classmethods()
2747 staticmethods()
2748 classic()
2749 compattr()
2750 newslot()
2751 altmro()
2752 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002753 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002754 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002755 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002756 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002757 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002758 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002759 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002760 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002761 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002762 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002763 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002764 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002765 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002766 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002767 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002768 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002769 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002770 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002771 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002772 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002773 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002774 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002775 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002776 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00002777 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002778 deepcopyrecursive()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002779 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002780
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002781if __name__ == "__main__":
2782 test_main()