blob: a640bb45f5503ef28e759c325a94d9dcd490741d [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)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000432 # This returns 'NotImplemented' in Python 2.2
433 class C(int):
434 def __add__(self, other):
435 return NotImplemented
436 try:
437 C() + ""
438 except TypeError:
439 pass
440 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000441 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000442
443def longs():
444 if verbose: print "Testing long operations..."
445 numops(100L, 3L)
446
447def floats():
448 if verbose: print "Testing float operations..."
449 numops(100.0, 3.0)
450
451def complexes():
452 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000453 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000454 class Number(complex):
455 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000456 def __new__(cls, *args, **kwds):
457 result = complex.__new__(cls, *args)
458 result.prec = kwds.get('prec', 12)
459 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000460 def __repr__(self):
461 prec = self.prec
462 if self.imag == 0.0:
463 return "%.*g" % (prec, self.real)
464 if self.real == 0.0:
465 return "%.*gj" % (prec, self.imag)
466 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
467 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000468
Tim Peters6d6c1a32001-08-02 04:15:00 +0000469 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000470 vereq(`a`, "3.14")
471 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472
Tim Peters3f996e72001-09-13 19:18:27 +0000473 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000474 vereq(`a`, "3.1")
475 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000476
477 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000478 vereq(`a`, "234.5")
479 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000480
Tim Peters6d6c1a32001-08-02 04:15:00 +0000481def spamlists():
482 if verbose: print "Testing spamlist operations..."
483 import copy, xxsubtype as spam
484 def spamlist(l, memo=None):
485 import xxsubtype as spam
486 return spam.spamlist(l)
487 # This is an ugly hack:
488 copy._deepcopy_dispatch[spam.spamlist] = spamlist
489
490 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
491 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
492 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
493 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
494 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
495 "a[b:c]", "__getslice__")
496 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
497 "a+=b", "__iadd__")
498 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
499 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
500 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
501 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
502 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
503 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
504 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
505 # Test subclassing
506 class C(spam.spamlist):
507 def foo(self): return 1
508 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000509 vereq(a, [])
510 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000511 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000512 vereq(a, [100])
513 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000514 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000515 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000516
517def spamdicts():
518 if verbose: print "Testing spamdict operations..."
519 import copy, xxsubtype as spam
520 def spamdict(d, memo=None):
521 import xxsubtype as spam
522 sd = spam.spamdict()
523 for k, v in d.items(): sd[k] = v
524 return sd
525 # This is an ugly hack:
526 copy._deepcopy_dispatch[spam.spamdict] = spamdict
527
528 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
529 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
530 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
531 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
532 d = spamdict({1:2,3:4})
533 l1 = []
534 for i in d.keys(): l1.append(i)
535 l = []
536 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000537 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000538 l = []
539 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000540 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000541 l = []
542 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000543 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000544 straightd = {1:2, 3:4}
545 spamd = spamdict(straightd)
546 testunop(spamd, 2, "len(a)", "__len__")
547 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
548 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
549 "a[b]=c", "__setitem__")
550 # Test subclassing
551 class C(spam.spamdict):
552 def foo(self): return 1
553 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000554 vereq(a.items(), [])
555 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000556 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000557 vereq(a.items(), [('foo', 'bar')])
558 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000559 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000560 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561
562def pydicts():
563 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000564 verify(issubclass(dict, dict))
565 verify(isinstance({}, dict))
566 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000567 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000568 verify(d.__class__ is dict)
569 verify(isinstance(d, dict))
570 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000571 state = -1
572 def __init__(self, *a, **kw):
573 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000574 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575 self.state = a[0]
576 if kw:
577 for k, v in kw.items(): self[v] = k
578 def __getitem__(self, key):
579 return self.get(key, 0)
580 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000581 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000582 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 def setstate(self, state):
584 self.state = state
585 def getstate(self):
586 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000587 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000588 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000590 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000591 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a.state, -1)
594 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000596 vereq(a.state, 0)
597 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000598 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000599 vereq(a.state, 10)
600 vereq(a.getstate(), 10)
601 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000602 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000603 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604 if verbose: print "pydict stress test ..."
605 N = 50
606 for i in range(N):
607 a[i] = C()
608 for j in range(N):
609 a[i][j] = i*j
610 for i in range(N):
611 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000612 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000613
614def pylists():
615 if verbose: print "Testing Python subclass of list..."
616 class C(list):
617 def __getitem__(self, i):
618 return list.__getitem__(self, i) + 100
619 def __getslice__(self, i, j):
620 return (i, j)
621 a = C()
622 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000623 vereq(a[0], 100)
624 vereq(a[1], 101)
625 vereq(a[2], 102)
626 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627
628def metaclass():
629 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 class C:
631 __metaclass__ = type
632 def __init__(self):
633 self.__state = 0
634 def getstate(self):
635 return self.__state
636 def setstate(self, state):
637 self.__state = state
638 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000639 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000640 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000641 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000642 class D:
643 class __metaclass__(type):
644 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000645 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000646 d = D()
647 verify(d.__class__ is D)
648 class M1(type):
649 def __new__(cls, name, bases, dict):
650 dict['__spam__'] = 1
651 return type.__new__(cls, name, bases, dict)
652 class C:
653 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000654 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000655 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000656 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000657
Guido van Rossum309b5662001-08-17 11:43:17 +0000658 class _instance(object):
659 pass
660 class M2(object):
661 def __new__(cls, name, bases, dict):
662 self = object.__new__(cls)
663 self.name = name
664 self.bases = bases
665 self.dict = dict
666 return self
667 __new__ = staticmethod(__new__)
668 def __call__(self):
669 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000670 # Early binding of methods
671 for key in self.dict:
672 if key.startswith("__"):
673 continue
674 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000675 return it
676 class C:
677 __metaclass__ = M2
678 def spam(self):
679 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000680 vereq(C.name, 'C')
681 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000682 verify('spam' in C.dict)
683 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000684 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685
Guido van Rossum91ee7982001-08-30 20:52:40 +0000686 # More metaclass examples
687
688 class autosuper(type):
689 # Automatically add __super to the class
690 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000691 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000692 cls = super(autosuper, metaclass).__new__(metaclass,
693 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000694 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000695 while name[:1] == "_":
696 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000697 if name:
698 name = "_%s__super" % name
699 else:
700 name = "__super"
701 setattr(cls, name, super(cls))
702 return cls
703 class A:
704 __metaclass__ = autosuper
705 def meth(self):
706 return "A"
707 class B(A):
708 def meth(self):
709 return "B" + self.__super.meth()
710 class C(A):
711 def meth(self):
712 return "C" + self.__super.meth()
713 class D(C, B):
714 def meth(self):
715 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000716 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 class E(B, C):
718 def meth(self):
719 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000720 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000721
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000722 class autoproperty(type):
723 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000724 # named _get_x and/or _set_x are found
725 def __new__(metaclass, name, bases, dict):
726 hits = {}
727 for key, val in dict.iteritems():
728 if key.startswith("_get_"):
729 key = key[5:]
730 get, set = hits.get(key, (None, None))
731 get = val
732 hits[key] = get, set
733 elif key.startswith("_set_"):
734 key = key[5:]
735 get, set = hits.get(key, (None, None))
736 set = val
737 hits[key] = get, set
738 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000739 dict[key] = property(get, set)
740 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000741 name, bases, dict)
742 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000743 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000744 def _get_x(self):
745 return -self.__x
746 def _set_x(self, x):
747 self.__x = -x
748 a = A()
749 verify(not hasattr(a, "x"))
750 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000751 vereq(a.x, 12)
752 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000753
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000754 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000755 # Merge of multiple cooperating metaclasses
756 pass
757 class A:
758 __metaclass__ = multimetaclass
759 def _get_x(self):
760 return "A"
761 class B(A):
762 def _get_x(self):
763 return "B" + self.__super._get_x()
764 class C(A):
765 def _get_x(self):
766 return "C" + self.__super._get_x()
767 class D(C, B):
768 def _get_x(self):
769 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000770 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000771
Guido van Rossumf76de622001-10-18 15:49:21 +0000772 # Make sure type(x) doesn't call x.__class__.__init__
773 class T(type):
774 counter = 0
775 def __init__(self, *args):
776 T.counter += 1
777 class C:
778 __metaclass__ = T
779 vereq(T.counter, 1)
780 a = C()
781 vereq(type(a), C)
782 vereq(T.counter, 1)
783
Guido van Rossum29d26062001-12-11 04:37:34 +0000784 class C(object): pass
785 c = C()
786 try: c()
787 except TypeError: pass
788 else: raise TestError, "calling object w/o call method should raise TypeError"
789
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790def pymods():
791 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000792 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000793 import sys
794 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795 class MM(MT):
796 def __init__(self):
797 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000798 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000800 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801 def __setattr__(self, name, value):
802 log.append(("setattr", name, value))
803 MT.__setattr__(self, name, value)
804 def __delattr__(self, name):
805 log.append(("delattr", name))
806 MT.__delattr__(self, name)
807 a = MM()
808 a.foo = 12
809 x = a.foo
810 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000811 vereq(log, [("setattr", "foo", 12),
812 ("getattr", "foo"),
813 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814
815def multi():
816 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817 class C(object):
818 def __init__(self):
819 self.__state = 0
820 def getstate(self):
821 return self.__state
822 def setstate(self, state):
823 self.__state = state
824 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000825 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000826 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000827 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000828 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000829 def __init__(self):
830 type({}).__init__(self)
831 C.__init__(self)
832 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000833 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000835 vereq(d.items(), [("hello", "world")])
836 vereq(d["hello"], "world")
837 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000838 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000839 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000840 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841
Guido van Rossume45763a2001-08-10 21:28:46 +0000842 # SF bug #442833
843 class Node(object):
844 def __int__(self):
845 return int(self.foo())
846 def foo(self):
847 return "23"
848 class Frag(Node, list):
849 def foo(self):
850 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000851 vereq(Node().__int__(), 23)
852 vereq(int(Node()), 23)
853 vereq(Frag().__int__(), 42)
854 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000855
Tim Petersa91e9642001-11-14 23:32:33 +0000856 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000857
858 class A:
859 x = 1
860
861 class B(A):
862 pass
863
864 class C(A):
865 x = 2
866
867 class D(B, C):
868 pass
869 vereq(D.x, 1)
870
871 # Classic MRO is preserved for a classic base class.
872 class E(D, object):
873 pass
874 vereq(E.__mro__, (E, D, B, A, C, object))
875 vereq(E.x, 1)
876
877 # But with a mix of classic bases, their MROs are combined using
878 # new-style MRO.
879 class F(B, C, object):
880 pass
881 vereq(F.__mro__, (F, B, C, A, object))
882 vereq(F.x, 2)
883
884 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000885 class C:
886 def cmethod(self):
887 return "C a"
888 def all_method(self):
889 return "C b"
890
891 class M1(C, object):
892 def m1method(self):
893 return "M1 a"
894 def all_method(self):
895 return "M1 b"
896
897 vereq(M1.__mro__, (M1, C, object))
898 m = M1()
899 vereq(m.cmethod(), "C a")
900 vereq(m.m1method(), "M1 a")
901 vereq(m.all_method(), "M1 b")
902
903 class D(C):
904 def dmethod(self):
905 return "D a"
906 def all_method(self):
907 return "D b"
908
909 class M2(object, D):
910 def m2method(self):
911 return "M2 a"
912 def all_method(self):
913 return "M2 b"
914
915 vereq(M2.__mro__, (M2, object, D, C))
916 m = M2()
917 vereq(m.cmethod(), "C a")
918 vereq(m.dmethod(), "D a")
919 vereq(m.m2method(), "M2 a")
920 vereq(m.all_method(), "M2 b")
921
922 class M3(M1, object, M2):
923 def m3method(self):
924 return "M3 a"
925 def all_method(self):
926 return "M3 b"
927 # XXX Expected this (the commented-out result):
928 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
929 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000930 m = M3()
931 vereq(m.cmethod(), "C a")
932 vereq(m.dmethod(), "D a")
933 vereq(m.m1method(), "M1 a")
934 vereq(m.m2method(), "M2 a")
935 vereq(m.m3method(), "M3 a")
936 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000937
Guido van Rossume54616c2001-12-14 04:19:56 +0000938 class Classic:
939 pass
940 try:
941 class New(Classic):
942 __metaclass__ = type
943 except TypeError:
944 pass
945 else:
946 raise TestFailed, "new class with only classic bases - shouldn't be"
947
Tim Peters6d6c1a32001-08-02 04:15:00 +0000948def diamond():
949 if verbose: print "Testing multiple inheritance special cases..."
950 class A(object):
951 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000952 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000953 class B(A):
954 def boo(self): return "B"
955 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000956 vereq(B().spam(), "B")
957 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000958 class C(A):
959 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000960 vereq(C().spam(), "A")
961 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000962 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000963 vereq(D().spam(), "B")
964 vereq(D().boo(), "B")
965 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000966 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000967 vereq(E().spam(), "B")
968 vereq(E().boo(), "C")
969 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000970 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000971 vereq(F().spam(), "B")
972 vereq(F().boo(), "B")
973 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000975 vereq(G().spam(), "B")
976 vereq(G().boo(), "C")
977 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000978
Guido van Rossum37202612001-08-09 19:45:21 +0000979def objects():
980 if verbose: print "Testing object class..."
981 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000982 vereq(a.__class__, object)
983 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000984 b = object()
985 verify(a is not b)
986 verify(not hasattr(a, "foo"))
987 try:
988 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000989 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000990 pass
991 else:
992 verify(0, "object() should not allow setting a foo attribute")
993 verify(not hasattr(object(), "__dict__"))
994
995 class Cdict(object):
996 pass
997 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000998 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000999 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001000 vereq(x.foo, 1)
1001 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001002
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003def slots():
1004 if verbose: print "Testing __slots__..."
1005 class C0(object):
1006 __slots__ = []
1007 x = C0()
1008 verify(not hasattr(x, "__dict__"))
1009 verify(not hasattr(x, "foo"))
1010
1011 class C1(object):
1012 __slots__ = ['a']
1013 x = C1()
1014 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001015 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001017 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001018 x.a = None
1019 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001021 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001022
1023 class C3(object):
1024 __slots__ = ['a', 'b', 'c']
1025 x = C3()
1026 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001027 verify(not hasattr(x, 'a'))
1028 verify(not hasattr(x, 'b'))
1029 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001030 x.a = 1
1031 x.b = 2
1032 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001033 vereq(x.a, 1)
1034 vereq(x.b, 2)
1035 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001036
Guido van Rossum33bab012001-12-05 22:45:48 +00001037 # Test leaks
1038 class Counted(object):
1039 counter = 0 # counts the number of instances alive
1040 def __init__(self):
1041 Counted.counter += 1
1042 def __del__(self):
1043 Counted.counter -= 1
1044 class C(object):
1045 __slots__ = ['a', 'b', 'c']
1046 x = C()
1047 x.a = Counted()
1048 x.b = Counted()
1049 x.c = Counted()
1050 vereq(Counted.counter, 3)
1051 del x
1052 vereq(Counted.counter, 0)
1053 class D(C):
1054 pass
1055 x = D()
1056 x.a = Counted()
1057 x.z = Counted()
1058 vereq(Counted.counter, 2)
1059 del x
1060 vereq(Counted.counter, 0)
1061 class E(D):
1062 __slots__ = ['e']
1063 x = E()
1064 x.a = Counted()
1065 x.z = Counted()
1066 x.e = Counted()
1067 vereq(Counted.counter, 3)
1068 del x
1069 vereq(Counted.counter, 0)
1070
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001072 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001073 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001074 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001075 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001076 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001077 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001079 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001080 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001081 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001082 vereq(E.foo, 1)
1083 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001084 # Test dynamic instances
1085 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001086 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001087 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001088 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001089 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001090 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001091 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001092 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001093 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001094 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001095 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001096 vereq(int(a), 100)
1097 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001098 verify(not hasattr(a, "spam"))
1099 def mygetattr(self, name):
1100 if name == "spam":
1101 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001102 raise AttributeError
1103 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001104 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001105 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001106 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001107 def mysetattr(self, name, value):
1108 if name == "spam":
1109 raise AttributeError
1110 return object.__setattr__(self, name, value)
1111 C.__setattr__ = mysetattr
1112 try:
1113 a.spam = "not spam"
1114 except AttributeError:
1115 pass
1116 else:
1117 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001118 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001119 class D(C):
1120 pass
1121 d = D()
1122 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001123 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001124
Guido van Rossum7e35d572001-09-15 03:14:32 +00001125 # Test handling of int*seq and seq*int
1126 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001127 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001128 vereq("a"*I(2), "aa")
1129 vereq(I(2)*"a", "aa")
1130 vereq(2*I(3), 6)
1131 vereq(I(3)*2, 6)
1132 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001133
1134 # Test handling of long*seq and seq*long
1135 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001136 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001137 vereq("a"*L(2L), "aa")
1138 vereq(L(2L)*"a", "aa")
1139 vereq(2*L(3), 6)
1140 vereq(L(3)*2, 6)
1141 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001142
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001143 # Test comparison of classes with dynamic metaclasses
1144 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001145 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001146 class someclass:
1147 __metaclass__ = dynamicmetaclass
1148 verify(someclass != object)
1149
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150def errors():
1151 if verbose: print "Testing errors..."
1152
1153 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001154 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155 pass
1156 except TypeError:
1157 pass
1158 else:
1159 verify(0, "inheritance from both list and dict should be illegal")
1160
1161 try:
1162 class C(object, None):
1163 pass
1164 except TypeError:
1165 pass
1166 else:
1167 verify(0, "inheritance from non-type should be illegal")
1168 class Classic:
1169 pass
1170
1171 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001172 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001173 pass
1174 except TypeError:
1175 pass
1176 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001177 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001178
1179 try:
1180 class C(object):
1181 __slots__ = 1
1182 except TypeError:
1183 pass
1184 else:
1185 verify(0, "__slots__ = 1 should be illegal")
1186
1187 try:
1188 class C(object):
1189 __slots__ = [1]
1190 except TypeError:
1191 pass
1192 else:
1193 verify(0, "__slots__ = [1] should be illegal")
1194
1195def classmethods():
1196 if verbose: print "Testing class methods..."
1197 class C(object):
1198 def foo(*a): return a
1199 goo = classmethod(foo)
1200 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001201 vereq(C.goo(1), (C, 1))
1202 vereq(c.goo(1), (C, 1))
1203 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204 class D(C):
1205 pass
1206 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001207 vereq(D.goo(1), (D, 1))
1208 vereq(d.goo(1), (D, 1))
1209 vereq(d.foo(1), (d, 1))
1210 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001211
1212def staticmethods():
1213 if verbose: print "Testing static methods..."
1214 class C(object):
1215 def foo(*a): return a
1216 goo = staticmethod(foo)
1217 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001218 vereq(C.goo(1), (1,))
1219 vereq(c.goo(1), (1,))
1220 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001221 class D(C):
1222 pass
1223 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001224 vereq(D.goo(1), (1,))
1225 vereq(d.goo(1), (1,))
1226 vereq(d.foo(1), (d, 1))
1227 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001228
1229def classic():
1230 if verbose: print "Testing classic classes..."
1231 class C:
1232 def foo(*a): return a
1233 goo = classmethod(foo)
1234 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001235 vereq(C.goo(1), (C, 1))
1236 vereq(c.goo(1), (C, 1))
1237 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001238 class D(C):
1239 pass
1240 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001241 vereq(D.goo(1), (D, 1))
1242 vereq(d.goo(1), (D, 1))
1243 vereq(d.foo(1), (d, 1))
1244 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001245 class E: # *not* subclassing from C
1246 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001247 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001248 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001249
1250def compattr():
1251 if verbose: print "Testing computed attributes..."
1252 class C(object):
1253 class computed_attribute(object):
1254 def __init__(self, get, set=None):
1255 self.__get = get
1256 self.__set = set
1257 def __get__(self, obj, type=None):
1258 return self.__get(obj)
1259 def __set__(self, obj, value):
1260 return self.__set(obj, value)
1261 def __init__(self):
1262 self.__x = 0
1263 def __get_x(self):
1264 x = self.__x
1265 self.__x = x+1
1266 return x
1267 def __set_x(self, x):
1268 self.__x = x
1269 x = computed_attribute(__get_x, __set_x)
1270 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001271 vereq(a.x, 0)
1272 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001273 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001274 vereq(a.x, 10)
1275 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001276
1277def newslot():
1278 if verbose: print "Testing __new__ slot override..."
1279 class C(list):
1280 def __new__(cls):
1281 self = list.__new__(cls)
1282 self.foo = 1
1283 return self
1284 def __init__(self):
1285 self.foo = self.foo + 2
1286 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001287 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001288 verify(a.__class__ is C)
1289 class D(C):
1290 pass
1291 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001292 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001293 verify(b.__class__ is D)
1294
Tim Peters6d6c1a32001-08-02 04:15:00 +00001295def altmro():
1296 if verbose: print "Testing mro() and overriding it..."
1297 class A(object):
1298 def f(self): return "A"
1299 class B(A):
1300 pass
1301 class C(A):
1302 def f(self): return "C"
1303 class D(B, C):
1304 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001305 vereq(D.mro(), [D, B, C, A, object])
1306 vereq(D.__mro__, (D, B, C, A, object))
1307 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001308 class PerverseMetaType(type):
1309 def mro(cls):
1310 L = type.mro(cls)
1311 L.reverse()
1312 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001313 class X(A,B,C,D):
1314 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001315 vereq(X.__mro__, (object, A, C, B, D, X))
1316 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001317
1318def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001319 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001320
1321 class B(object):
1322 "Intermediate class because object doesn't have a __setattr__"
1323
1324 class C(B):
1325
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001326 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001327 if name == "foo":
1328 return ("getattr", name)
1329 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001330 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001331 def __setattr__(self, name, value):
1332 if name == "foo":
1333 self.setattr = (name, value)
1334 else:
1335 return B.__setattr__(self, name, value)
1336 def __delattr__(self, name):
1337 if name == "foo":
1338 self.delattr = name
1339 else:
1340 return B.__delattr__(self, name)
1341
1342 def __getitem__(self, key):
1343 return ("getitem", key)
1344 def __setitem__(self, key, value):
1345 self.setitem = (key, value)
1346 def __delitem__(self, key):
1347 self.delitem = key
1348
1349 def __getslice__(self, i, j):
1350 return ("getslice", i, j)
1351 def __setslice__(self, i, j, value):
1352 self.setslice = (i, j, value)
1353 def __delslice__(self, i, j):
1354 self.delslice = (i, j)
1355
1356 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001357 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001358 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001361 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001362
Guido van Rossum45704552001-10-08 16:35:45 +00001363 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001365 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001366 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001367 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001368
Guido van Rossum45704552001-10-08 16:35:45 +00001369 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001370 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001371 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001372 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001373 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001374
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001375def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001376 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001377 class C(object):
1378 def __init__(self, x):
1379 self.x = x
1380 def foo(self):
1381 return self.x
1382 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001383 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001384 class D(C):
1385 boo = C.foo
1386 goo = c1.foo
1387 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001388 vereq(d2.foo(), 2)
1389 vereq(d2.boo(), 2)
1390 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001391 class E(object):
1392 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001393 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001394 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001395
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001396def specials():
1397 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001398 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001399 # Test the default behavior for static classes
1400 class C(object):
1401 def __getitem__(self, i):
1402 if 0 <= i < 10: return i
1403 raise IndexError
1404 c1 = C()
1405 c2 = C()
1406 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001407 vereq(hash(c1), id(c1))
1408 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1409 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001410 verify(c1 != c2)
1411 verify(not c1 != c1)
1412 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001413 # Note that the module name appears in str/repr, and that varies
1414 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001415 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001416 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001417 verify(-1 not in c1)
1418 for i in range(10):
1419 verify(i in c1)
1420 verify(10 not in c1)
1421 # Test the default behavior for dynamic classes
1422 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001423 def __getitem__(self, i):
1424 if 0 <= i < 10: return i
1425 raise IndexError
1426 d1 = D()
1427 d2 = D()
1428 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001429 vereq(hash(d1), id(d1))
1430 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1431 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001432 verify(d1 != d2)
1433 verify(not d1 != d1)
1434 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001435 # Note that the module name appears in str/repr, and that varies
1436 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001437 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001438 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001439 verify(-1 not in d1)
1440 for i in range(10):
1441 verify(i in d1)
1442 verify(10 not in d1)
1443 # Test overridden behavior for static classes
1444 class Proxy(object):
1445 def __init__(self, x):
1446 self.x = x
1447 def __nonzero__(self):
1448 return not not self.x
1449 def __hash__(self):
1450 return hash(self.x)
1451 def __eq__(self, other):
1452 return self.x == other
1453 def __ne__(self, other):
1454 return self.x != other
1455 def __cmp__(self, other):
1456 return cmp(self.x, other.x)
1457 def __str__(self):
1458 return "Proxy:%s" % self.x
1459 def __repr__(self):
1460 return "Proxy(%r)" % self.x
1461 def __contains__(self, value):
1462 return value in self.x
1463 p0 = Proxy(0)
1464 p1 = Proxy(1)
1465 p_1 = Proxy(-1)
1466 verify(not p0)
1467 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001468 vereq(hash(p0), hash(0))
1469 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001470 verify(p0 != p1)
1471 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001472 vereq(not p0, p1)
1473 vereq(cmp(p0, p1), -1)
1474 vereq(cmp(p0, p0), 0)
1475 vereq(cmp(p0, p_1), 1)
1476 vereq(str(p0), "Proxy:0")
1477 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001478 p10 = Proxy(range(10))
1479 verify(-1 not in p10)
1480 for i in range(10):
1481 verify(i in p10)
1482 verify(10 not in p10)
1483 # Test overridden behavior for dynamic classes
1484 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001485 def __init__(self, x):
1486 self.x = x
1487 def __nonzero__(self):
1488 return not not self.x
1489 def __hash__(self):
1490 return hash(self.x)
1491 def __eq__(self, other):
1492 return self.x == other
1493 def __ne__(self, other):
1494 return self.x != other
1495 def __cmp__(self, other):
1496 return cmp(self.x, other.x)
1497 def __str__(self):
1498 return "DProxy:%s" % self.x
1499 def __repr__(self):
1500 return "DProxy(%r)" % self.x
1501 def __contains__(self, value):
1502 return value in self.x
1503 p0 = DProxy(0)
1504 p1 = DProxy(1)
1505 p_1 = DProxy(-1)
1506 verify(not p0)
1507 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001508 vereq(hash(p0), hash(0))
1509 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001510 verify(p0 != p1)
1511 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001512 vereq(not p0, p1)
1513 vereq(cmp(p0, p1), -1)
1514 vereq(cmp(p0, p0), 0)
1515 vereq(cmp(p0, p_1), 1)
1516 vereq(str(p0), "DProxy:0")
1517 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001518 p10 = DProxy(range(10))
1519 verify(-1 not in p10)
1520 for i in range(10):
1521 verify(i in p10)
1522 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001523 # Safety test for __cmp__
1524 def unsafecmp(a, b):
1525 try:
1526 a.__class__.__cmp__(a, b)
1527 except TypeError:
1528 pass
1529 else:
1530 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1531 a.__class__, a, b)
1532 unsafecmp(u"123", "123")
1533 unsafecmp("123", u"123")
1534 unsafecmp(1, 1.0)
1535 unsafecmp(1.0, 1)
1536 unsafecmp(1, 1L)
1537 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001538
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001539def weakrefs():
1540 if verbose: print "Testing weak references..."
1541 import weakref
1542 class C(object):
1543 pass
1544 c = C()
1545 r = weakref.ref(c)
1546 verify(r() is c)
1547 del c
1548 verify(r() is None)
1549 del r
1550 class NoWeak(object):
1551 __slots__ = ['foo']
1552 no = NoWeak()
1553 try:
1554 weakref.ref(no)
1555 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001556 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001557 else:
1558 verify(0, "weakref.ref(no) should be illegal")
1559 class Weak(object):
1560 __slots__ = ['foo', '__weakref__']
1561 yes = Weak()
1562 r = weakref.ref(yes)
1563 verify(r() is yes)
1564 del yes
1565 verify(r() is None)
1566 del r
1567
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001568def properties():
1569 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001570 class C(object):
1571 def getx(self):
1572 return self.__x
1573 def setx(self, value):
1574 self.__x = value
1575 def delx(self):
1576 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001577 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001578 a = C()
1579 verify(not hasattr(a, "x"))
1580 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001581 vereq(a._C__x, 42)
1582 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001583 del a.x
1584 verify(not hasattr(a, "x"))
1585 verify(not hasattr(a, "_C__x"))
1586 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001587 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001588## C.x.__set__(a)
1589## verify(not hasattr(a, "x"))
1590
Tim Peters66c1a522001-09-24 21:17:50 +00001591 raw = C.__dict__['x']
1592 verify(isinstance(raw, property))
1593
1594 attrs = dir(raw)
1595 verify("__doc__" in attrs)
1596 verify("fget" in attrs)
1597 verify("fset" in attrs)
1598 verify("fdel" in attrs)
1599
Guido van Rossum45704552001-10-08 16:35:45 +00001600 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001601 verify(raw.fget is C.__dict__['getx'])
1602 verify(raw.fset is C.__dict__['setx'])
1603 verify(raw.fdel is C.__dict__['delx'])
1604
1605 for attr in "__doc__", "fget", "fset", "fdel":
1606 try:
1607 setattr(raw, attr, 42)
1608 except TypeError, msg:
1609 if str(msg).find('readonly') < 0:
1610 raise TestFailed("when setting readonly attr %r on a "
1611 "property, got unexpected TypeError "
1612 "msg %r" % (attr, str(msg)))
1613 else:
1614 raise TestFailed("expected TypeError from trying to set "
1615 "readonly %r attr on a property" % attr)
1616
Guido van Rossumc4a18802001-08-24 16:55:27 +00001617def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001618 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001619
1620 class A(object):
1621 def meth(self, a):
1622 return "A(%r)" % a
1623
Guido van Rossum45704552001-10-08 16:35:45 +00001624 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001625
1626 class B(A):
1627 def __init__(self):
1628 self.__super = super(B, self)
1629 def meth(self, a):
1630 return "B(%r)" % a + self.__super.meth(a)
1631
Guido van Rossum45704552001-10-08 16:35:45 +00001632 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001633
1634 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001635 def meth(self, a):
1636 return "C(%r)" % a + self.__super.meth(a)
1637 C._C__super = super(C)
1638
Guido van Rossum45704552001-10-08 16:35:45 +00001639 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001640
1641 class D(C, B):
1642 def meth(self, a):
1643 return "D(%r)" % a + super(D, self).meth(a)
1644
Guido van Rossum5b443c62001-12-03 15:38:28 +00001645 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1646
1647 # Test for subclassing super
1648
1649 class mysuper(super):
1650 def __init__(self, *args):
1651 return super(mysuper, self).__init__(*args)
1652
1653 class E(D):
1654 def meth(self, a):
1655 return "E(%r)" % a + mysuper(E, self).meth(a)
1656
1657 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1658
1659 class F(E):
1660 def meth(self, a):
1661 s = self.__super
1662 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1663 F._F__super = mysuper(F)
1664
1665 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1666
1667 # Make sure certain errors are raised
1668
1669 try:
1670 super(D, 42)
1671 except TypeError:
1672 pass
1673 else:
1674 raise TestFailed, "shouldn't allow super(D, 42)"
1675
1676 try:
1677 super(D, C())
1678 except TypeError:
1679 pass
1680 else:
1681 raise TestFailed, "shouldn't allow super(D, C())"
1682
1683 try:
1684 super(D).__get__(12)
1685 except TypeError:
1686 pass
1687 else:
1688 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1689
1690 try:
1691 super(D).__get__(C())
1692 except TypeError:
1693 pass
1694 else:
1695 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001696
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001697def inherits():
1698 if verbose: print "Testing inheritance from basic types..."
1699
1700 class hexint(int):
1701 def __repr__(self):
1702 return hex(self)
1703 def __add__(self, other):
1704 return hexint(int.__add__(self, other))
1705 # (Note that overriding __radd__ doesn't work,
1706 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001707 vereq(repr(hexint(7) + 9), "0x10")
1708 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001709 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001710 vereq(a, 12345)
1711 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001712 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001713 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001714 verify((+a).__class__ is int)
1715 verify((a >> 0).__class__ is int)
1716 verify((a << 0).__class__ is int)
1717 verify((hexint(0) << 12).__class__ is int)
1718 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001719
1720 class octlong(long):
1721 __slots__ = []
1722 def __str__(self):
1723 s = oct(self)
1724 if s[-1] == 'L':
1725 s = s[:-1]
1726 return s
1727 def __add__(self, other):
1728 return self.__class__(super(octlong, self).__add__(other))
1729 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001730 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001731 # (Note that overriding __radd__ here only seems to work
1732 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001733 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001734 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001735 vereq(a, 12345L)
1736 vereq(long(a), 12345L)
1737 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001738 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001739 verify((+a).__class__ is long)
1740 verify((-a).__class__ is long)
1741 verify((-octlong(0)).__class__ is long)
1742 verify((a >> 0).__class__ is long)
1743 verify((a << 0).__class__ is long)
1744 verify((a - 0).__class__ is long)
1745 verify((a * 1).__class__ is long)
1746 verify((a ** 1).__class__ is long)
1747 verify((a // 1).__class__ is long)
1748 verify((1 * a).__class__ is long)
1749 verify((a | 0).__class__ is long)
1750 verify((a ^ 0).__class__ is long)
1751 verify((a & -1L).__class__ is long)
1752 verify((octlong(0) << 12).__class__ is long)
1753 verify((octlong(0) >> 12).__class__ is long)
1754 verify(abs(octlong(0)).__class__ is long)
1755
1756 # Because octlong overrides __add__, we can't check the absence of +0
1757 # optimizations using octlong.
1758 class longclone(long):
1759 pass
1760 a = longclone(1)
1761 verify((a + 0).__class__ is long)
1762 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001763
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001764 # Check that negative clones don't segfault
1765 a = longclone(-1)
1766 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001767 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001768
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001769 class precfloat(float):
1770 __slots__ = ['prec']
1771 def __init__(self, value=0.0, prec=12):
1772 self.prec = int(prec)
1773 float.__init__(value)
1774 def __repr__(self):
1775 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001776 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001777 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001778 vereq(a, 12345.0)
1779 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001780 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001782 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001783
Tim Peters2400fa42001-09-12 19:12:49 +00001784 class madcomplex(complex):
1785 def __repr__(self):
1786 return "%.17gj%+.17g" % (self.imag, self.real)
1787 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001788 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001789 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001790 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001791 vereq(a, base)
1792 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001793 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001794 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001795 vereq(repr(a), "4j-3")
1796 vereq(a, base)
1797 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001798 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001799 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001800 veris((+a).__class__, complex)
1801 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001802 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001803 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001804 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001805 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001806 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001807 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001808 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001809
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001810 class madtuple(tuple):
1811 _rev = None
1812 def rev(self):
1813 if self._rev is not None:
1814 return self._rev
1815 L = list(self)
1816 L.reverse()
1817 self._rev = self.__class__(L)
1818 return self._rev
1819 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001820 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1821 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1822 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001823 for i in range(512):
1824 t = madtuple(range(i))
1825 u = t.rev()
1826 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001827 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001828 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001829 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001830 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001831 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001832 verify(a[:].__class__ is tuple)
1833 verify((a * 1).__class__ is tuple)
1834 verify((a * 0).__class__ is tuple)
1835 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001836 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001837 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001838 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001839 verify((a + a).__class__ is tuple)
1840 verify((a * 0).__class__ is tuple)
1841 verify((a * 1).__class__ is tuple)
1842 verify((a * 2).__class__ is tuple)
1843 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001844
1845 class madstring(str):
1846 _rev = None
1847 def rev(self):
1848 if self._rev is not None:
1849 return self._rev
1850 L = list(self)
1851 L.reverse()
1852 self._rev = self.__class__("".join(L))
1853 return self._rev
1854 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001855 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1856 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1857 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001858 for i in range(256):
1859 s = madstring("".join(map(chr, range(i))))
1860 t = s.rev()
1861 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001862 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001863 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001864 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001865 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001866
Tim Peters8fa5dd02001-09-12 02:18:30 +00001867 base = "\x00" * 5
1868 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001869 vereq(s, base)
1870 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001871 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001872 vereq(hash(s), hash(base))
1873 vereq({s: 1}[base], 1)
1874 vereq({base: 1}[s], 1)
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).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001878 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001879 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001880 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001881 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001882 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001883 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001884 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001885 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001886 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001887 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001888 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001889 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001890 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001891 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001892 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001893 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001894 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001895 identitytab = ''.join([chr(i) for i in range(256)])
1896 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001897 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001898 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001899 vereq(s.translate(identitytab, "x"), base)
1900 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001901 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001902 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001903 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001904 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001905 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001906 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001907 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001908 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001909 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001911
Tim Peters111f6092001-09-12 07:54:51 +00001912 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001913 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001914 verify(intern(s).__class__ is str)
1915 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001916 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001917
1918 i = intern("y x")
1919 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001920 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001921 verify(intern(s).__class__ is str)
1922 verify(intern(s) is i)
1923
1924 s = madstring(i)
1925 verify(intern(s).__class__ is str)
1926 verify(intern(s) is i)
1927
Guido van Rossum91ee7982001-08-30 20:52:40 +00001928 class madunicode(unicode):
1929 _rev = None
1930 def rev(self):
1931 if self._rev is not None:
1932 return self._rev
1933 L = list(self)
1934 L.reverse()
1935 self._rev = self.__class__(u"".join(L))
1936 return self._rev
1937 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001938 vereq(u, u"ABCDEF")
1939 vereq(u.rev(), madunicode(u"FEDCBA"))
1940 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001941 base = u"12345"
1942 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001944 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001945 vereq(hash(u), hash(base))
1946 vereq({u: 1}[base], 1)
1947 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001948 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001949 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001950 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001951 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001952 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001953 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001954 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001955 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001956 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001957 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001958 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001959 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001960 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001961 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001962 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001963 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001964 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001965 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001966 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001967 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001968 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001969 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001970 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001971 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001972 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001973 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001974 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001975 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001976 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001977 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001978 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001979 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001980 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001981 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001982 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001983 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001984 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001985 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001986
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001987 class sublist(list):
1988 pass
1989 a = sublist(range(5))
1990 vereq(a, range(5))
1991 a.append("hello")
1992 vereq(a, range(5) + ["hello"])
1993 a[5] = 5
1994 vereq(a, range(6))
1995 a.extend(range(6, 20))
1996 vereq(a, range(20))
1997 a[-5:] = []
1998 vereq(a, range(15))
1999 del a[10:15]
2000 vereq(len(a), 10)
2001 vereq(a, range(10))
2002 vereq(list(a), range(10))
2003 vereq(a[0], 0)
2004 vereq(a[9], 9)
2005 vereq(a[-10], 0)
2006 vereq(a[-1], 9)
2007 vereq(a[:5], range(5))
2008
Tim Peters59c9a642001-09-13 05:38:56 +00002009 class CountedInput(file):
2010 """Counts lines read by self.readline().
2011
2012 self.lineno is the 0-based ordinal of the last line read, up to
2013 a maximum of one greater than the number of lines in the file.
2014
2015 self.ateof is true if and only if the final "" line has been read,
2016 at which point self.lineno stops incrementing, and further calls
2017 to readline() continue to return "".
2018 """
2019
2020 lineno = 0
2021 ateof = 0
2022 def readline(self):
2023 if self.ateof:
2024 return ""
2025 s = file.readline(self)
2026 # Next line works too.
2027 # s = super(CountedInput, self).readline()
2028 self.lineno += 1
2029 if s == "":
2030 self.ateof = 1
2031 return s
2032
Tim Peters561f8992001-09-13 19:36:36 +00002033 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002034 lines = ['a\n', 'b\n', 'c\n']
2035 try:
2036 f.writelines(lines)
2037 f.close()
2038 f = CountedInput(TESTFN)
2039 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2040 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002041 vereq(expected, got)
2042 vereq(f.lineno, i)
2043 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002044 f.close()
2045 finally:
2046 try:
2047 f.close()
2048 except:
2049 pass
2050 try:
2051 import os
2052 os.unlink(TESTFN)
2053 except:
2054 pass
2055
Tim Peters808b94e2001-09-13 19:33:07 +00002056def keywords():
2057 if verbose:
2058 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002059 vereq(int(x=1), 1)
2060 vereq(float(x=2), 2.0)
2061 vereq(long(x=3), 3L)
2062 vereq(complex(imag=42, real=666), complex(666, 42))
2063 vereq(str(object=500), '500')
2064 vereq(unicode(string='abc', errors='strict'), u'abc')
2065 vereq(tuple(sequence=range(3)), (0, 1, 2))
2066 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002067 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002068
2069 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002070 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002071 try:
2072 constructor(bogus_keyword_arg=1)
2073 except TypeError:
2074 pass
2075 else:
2076 raise TestFailed("expected TypeError from bogus keyword "
2077 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002078
Tim Peters8fa45672001-09-13 21:01:29 +00002079def restricted():
2080 import rexec
2081 if verbose:
2082 print "Testing interaction with restricted execution ..."
2083
2084 sandbox = rexec.RExec()
2085
2086 code1 = """f = open(%r, 'w')""" % TESTFN
2087 code2 = """f = file(%r, 'w')""" % TESTFN
2088 code3 = """\
2089f = open(%r)
2090t = type(f) # a sneaky way to get the file() constructor
2091f.close()
2092f = t(%r, 'w') # rexec can't catch this by itself
2093""" % (TESTFN, TESTFN)
2094
2095 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2096 f.close()
2097
2098 try:
2099 for code in code1, code2, code3:
2100 try:
2101 sandbox.r_exec(code)
2102 except IOError, msg:
2103 if str(msg).find("restricted") >= 0:
2104 outcome = "OK"
2105 else:
2106 outcome = "got an exception, but not an expected one"
2107 else:
2108 outcome = "expected a restricted-execution exception"
2109
2110 if outcome != "OK":
2111 raise TestFailed("%s, in %r" % (outcome, code))
2112
2113 finally:
2114 try:
2115 import os
2116 os.unlink(TESTFN)
2117 except:
2118 pass
2119
Tim Peters0ab085c2001-09-14 00:25:33 +00002120def str_subclass_as_dict_key():
2121 if verbose:
2122 print "Testing a str subclass used as dict key .."
2123
2124 class cistr(str):
2125 """Sublcass of str that computes __eq__ case-insensitively.
2126
2127 Also computes a hash code of the string in canonical form.
2128 """
2129
2130 def __init__(self, value):
2131 self.canonical = value.lower()
2132 self.hashcode = hash(self.canonical)
2133
2134 def __eq__(self, other):
2135 if not isinstance(other, cistr):
2136 other = cistr(other)
2137 return self.canonical == other.canonical
2138
2139 def __hash__(self):
2140 return self.hashcode
2141
Guido van Rossum45704552001-10-08 16:35:45 +00002142 vereq(cistr('ABC'), 'abc')
2143 vereq('aBc', cistr('ABC'))
2144 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002145
2146 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002147 vereq(d[cistr('one')], 1)
2148 vereq(d[cistr('tWo')], 2)
2149 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002150 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002151 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002152
Guido van Rossumab3b0342001-09-18 20:38:53 +00002153def classic_comparisons():
2154 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002155 class classic:
2156 pass
2157 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002158 if verbose: print " (base = %s)" % base
2159 class C(base):
2160 def __init__(self, value):
2161 self.value = int(value)
2162 def __cmp__(self, other):
2163 if isinstance(other, C):
2164 return cmp(self.value, other.value)
2165 if isinstance(other, int) or isinstance(other, long):
2166 return cmp(self.value, other)
2167 return NotImplemented
2168 c1 = C(1)
2169 c2 = C(2)
2170 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002171 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002172 c = {1: c1, 2: c2, 3: c3}
2173 for x in 1, 2, 3:
2174 for y in 1, 2, 3:
2175 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2176 for op in "<", "<=", "==", "!=", ">", ">=":
2177 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2178 "x=%d, y=%d" % (x, y))
2179 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2180 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2181
Guido van Rossum0639f592001-09-18 21:06:04 +00002182def rich_comparisons():
2183 if verbose:
2184 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002185 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002186 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002187 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002188 vereq(z, 1+0j)
2189 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002190 class ZZ(complex):
2191 def __eq__(self, other):
2192 try:
2193 return abs(self - other) <= 1e-6
2194 except:
2195 return NotImplemented
2196 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002197 vereq(zz, 1+0j)
2198 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002199
Guido van Rossum0639f592001-09-18 21:06:04 +00002200 class classic:
2201 pass
2202 for base in (classic, int, object, list):
2203 if verbose: print " (base = %s)" % base
2204 class C(base):
2205 def __init__(self, value):
2206 self.value = int(value)
2207 def __cmp__(self, other):
2208 raise TestFailed, "shouldn't call __cmp__"
2209 def __eq__(self, other):
2210 if isinstance(other, C):
2211 return self.value == other.value
2212 if isinstance(other, int) or isinstance(other, long):
2213 return self.value == other
2214 return NotImplemented
2215 def __ne__(self, other):
2216 if isinstance(other, C):
2217 return self.value != other.value
2218 if isinstance(other, int) or isinstance(other, long):
2219 return self.value != other
2220 return NotImplemented
2221 def __lt__(self, other):
2222 if isinstance(other, C):
2223 return self.value < other.value
2224 if isinstance(other, int) or isinstance(other, long):
2225 return self.value < other
2226 return NotImplemented
2227 def __le__(self, other):
2228 if isinstance(other, C):
2229 return self.value <= other.value
2230 if isinstance(other, int) or isinstance(other, long):
2231 return self.value <= other
2232 return NotImplemented
2233 def __gt__(self, other):
2234 if isinstance(other, C):
2235 return self.value > other.value
2236 if isinstance(other, int) or isinstance(other, long):
2237 return self.value > other
2238 return NotImplemented
2239 def __ge__(self, other):
2240 if isinstance(other, C):
2241 return self.value >= other.value
2242 if isinstance(other, int) or isinstance(other, long):
2243 return self.value >= other
2244 return NotImplemented
2245 c1 = C(1)
2246 c2 = C(2)
2247 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002249 c = {1: c1, 2: c2, 3: c3}
2250 for x in 1, 2, 3:
2251 for y in 1, 2, 3:
2252 for op in "<", "<=", "==", "!=", ">", ">=":
2253 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2254 "x=%d, y=%d" % (x, y))
2255 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2256 "x=%d, y=%d" % (x, y))
2257 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2258 "x=%d, y=%d" % (x, y))
2259
Guido van Rossum1952e382001-09-19 01:25:16 +00002260def coercions():
2261 if verbose: print "Testing coercions..."
2262 class I(int): pass
2263 coerce(I(0), 0)
2264 coerce(0, I(0))
2265 class L(long): pass
2266 coerce(L(0), 0)
2267 coerce(L(0), 0L)
2268 coerce(0, L(0))
2269 coerce(0L, L(0))
2270 class F(float): pass
2271 coerce(F(0), 0)
2272 coerce(F(0), 0L)
2273 coerce(F(0), 0.)
2274 coerce(0, F(0))
2275 coerce(0L, F(0))
2276 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002277 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002278 coerce(C(0), 0)
2279 coerce(C(0), 0L)
2280 coerce(C(0), 0.)
2281 coerce(C(0), 0j)
2282 coerce(0, C(0))
2283 coerce(0L, C(0))
2284 coerce(0., C(0))
2285 coerce(0j, C(0))
2286
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002287def descrdoc():
2288 if verbose: print "Testing descriptor doc strings..."
2289 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002291 check(file.closed, "flag set if the file is closed") # getset descriptor
2292 check(file.name, "file name") # member descriptor
2293
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002294def setclass():
2295 if verbose: print "Testing __class__ assignment..."
2296 class C(object): pass
2297 class D(object): pass
2298 class E(object): pass
2299 class F(D, E): pass
2300 for cls in C, D, E, F:
2301 for cls2 in C, D, E, F:
2302 x = cls()
2303 x.__class__ = cls2
2304 verify(x.__class__ is cls2)
2305 x.__class__ = cls
2306 verify(x.__class__ is cls)
2307 def cant(x, C):
2308 try:
2309 x.__class__ = C
2310 except TypeError:
2311 pass
2312 else:
2313 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2314 cant(C(), list)
2315 cant(list(), C)
2316 cant(C(), 1)
2317 cant(C(), object)
2318 cant(object(), list)
2319 cant(list(), object)
2320
Guido van Rossum6661be32001-10-26 04:26:12 +00002321def setdict():
2322 if verbose: print "Testing __dict__ assignment..."
2323 class C(object): pass
2324 a = C()
2325 a.__dict__ = {'b': 1}
2326 vereq(a.b, 1)
2327 def cant(x, dict):
2328 try:
2329 x.__dict__ = dict
2330 except TypeError:
2331 pass
2332 else:
2333 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2334 cant(a, None)
2335 cant(a, [])
2336 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002337 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002338 # Classes don't allow __dict__ assignment
2339 cant(C, {})
2340
Guido van Rossum3926a632001-09-25 16:25:58 +00002341def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002342 if verbose:
2343 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002344 import pickle, cPickle
2345
2346 def sorteditems(d):
2347 L = d.items()
2348 L.sort()
2349 return L
2350
2351 global C
2352 class C(object):
2353 def __init__(self, a, b):
2354 super(C, self).__init__()
2355 self.a = a
2356 self.b = b
2357 def __repr__(self):
2358 return "C(%r, %r)" % (self.a, self.b)
2359
2360 global C1
2361 class C1(list):
2362 def __new__(cls, a, b):
2363 return super(C1, cls).__new__(cls)
2364 def __init__(self, a, b):
2365 self.a = a
2366 self.b = b
2367 def __repr__(self):
2368 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2369
2370 global C2
2371 class C2(int):
2372 def __new__(cls, a, b, val=0):
2373 return super(C2, cls).__new__(cls, val)
2374 def __init__(self, a, b, val=0):
2375 self.a = a
2376 self.b = b
2377 def __repr__(self):
2378 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2379
Guido van Rossum90c45142001-11-24 21:07:01 +00002380 global C3
2381 class C3(object):
2382 def __init__(self, foo):
2383 self.foo = foo
2384 def __getstate__(self):
2385 return self.foo
2386 def __setstate__(self, foo):
2387 self.foo = foo
2388
2389 global C4classic, C4
2390 class C4classic: # classic
2391 pass
2392 class C4(C4classic, object): # mixed inheritance
2393 pass
2394
Guido van Rossum3926a632001-09-25 16:25:58 +00002395 for p in pickle, cPickle:
2396 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002397 if verbose:
2398 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002399
2400 for cls in C, C1, C2:
2401 s = p.dumps(cls, bin)
2402 cls2 = p.loads(s)
2403 verify(cls2 is cls)
2404
2405 a = C1(1, 2); a.append(42); a.append(24)
2406 b = C2("hello", "world", 42)
2407 s = p.dumps((a, b), bin)
2408 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002409 vereq(x.__class__, a.__class__)
2410 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2411 vereq(y.__class__, b.__class__)
2412 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2413 vereq(`x`, `a`)
2414 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002415 if verbose:
2416 print "a = x =", a
2417 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002418 # Test for __getstate__ and __setstate__ on new style class
2419 u = C3(42)
2420 s = p.dumps(u, bin)
2421 v = p.loads(s)
2422 veris(u.__class__, v.__class__)
2423 vereq(u.foo, v.foo)
2424 # Test for picklability of hybrid class
2425 u = C4()
2426 u.foo = 42
2427 s = p.dumps(u, bin)
2428 v = p.loads(s)
2429 veris(u.__class__, v.__class__)
2430 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002431
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002432 # Testing copy.deepcopy()
2433 if verbose:
2434 print "deepcopy"
2435 import copy
2436 for cls in C, C1, C2:
2437 cls2 = copy.deepcopy(cls)
2438 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002439
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002440 a = C1(1, 2); a.append(42); a.append(24)
2441 b = C2("hello", "world", 42)
2442 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002443 vereq(x.__class__, a.__class__)
2444 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2445 vereq(y.__class__, b.__class__)
2446 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2447 vereq(`x`, `a`)
2448 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002449 if verbose:
2450 print "a = x =", a
2451 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002452
2453def copies():
2454 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2455 import copy
2456 class C(object):
2457 pass
2458
2459 a = C()
2460 a.foo = 12
2461 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002462 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002463
2464 a.bar = [1,2,3]
2465 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002466 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002467 verify(c.bar is a.bar)
2468
2469 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002470 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002471 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002472 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002473
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002474def binopoverride():
2475 if verbose: print "Testing overrides of binary operations..."
2476 class I(int):
2477 def __repr__(self):
2478 return "I(%r)" % int(self)
2479 def __add__(self, other):
2480 return I(int(self) + int(other))
2481 __radd__ = __add__
2482 def __pow__(self, other, mod=None):
2483 if mod is None:
2484 return I(pow(int(self), int(other)))
2485 else:
2486 return I(pow(int(self), int(other), int(mod)))
2487 def __rpow__(self, other, mod=None):
2488 if mod is None:
2489 return I(pow(int(other), int(self), mod))
2490 else:
2491 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002492
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002493 vereq(`I(1) + I(2)`, "I(3)")
2494 vereq(`I(1) + 2`, "I(3)")
2495 vereq(`1 + I(2)`, "I(3)")
2496 vereq(`I(2) ** I(3)`, "I(8)")
2497 vereq(`2 ** I(3)`, "I(8)")
2498 vereq(`I(2) ** 3`, "I(8)")
2499 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2500 class S(str):
2501 def __eq__(self, other):
2502 return self.lower() == other.lower()
2503
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002504def subclasspropagation():
2505 if verbose: print "Testing propagation of slot functions to subclasses..."
2506 class A(object):
2507 pass
2508 class B(A):
2509 pass
2510 class C(A):
2511 pass
2512 class D(B, C):
2513 pass
2514 d = D()
2515 vereq(hash(d), id(d))
2516 A.__hash__ = lambda self: 42
2517 vereq(hash(d), 42)
2518 C.__hash__ = lambda self: 314
2519 vereq(hash(d), 314)
2520 B.__hash__ = lambda self: 144
2521 vereq(hash(d), 144)
2522 D.__hash__ = lambda self: 100
2523 vereq(hash(d), 100)
2524 del D.__hash__
2525 vereq(hash(d), 144)
2526 del B.__hash__
2527 vereq(hash(d), 314)
2528 del C.__hash__
2529 vereq(hash(d), 42)
2530 del A.__hash__
2531 vereq(hash(d), id(d))
2532 d.foo = 42
2533 d.bar = 42
2534 vereq(d.foo, 42)
2535 vereq(d.bar, 42)
2536 def __getattribute__(self, name):
2537 if name == "foo":
2538 return 24
2539 return object.__getattribute__(self, name)
2540 A.__getattribute__ = __getattribute__
2541 vereq(d.foo, 24)
2542 vereq(d.bar, 42)
2543 def __getattr__(self, name):
2544 if name in ("spam", "foo", "bar"):
2545 return "hello"
2546 raise AttributeError, name
2547 B.__getattr__ = __getattr__
2548 vereq(d.spam, "hello")
2549 vereq(d.foo, 24)
2550 vereq(d.bar, 42)
2551 del A.__getattribute__
2552 vereq(d.foo, 42)
2553 del d.foo
2554 vereq(d.foo, "hello")
2555 vereq(d.bar, 42)
2556 del B.__getattr__
2557 try:
2558 d.foo
2559 except AttributeError:
2560 pass
2561 else:
2562 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002563
2564def buffer_inherit():
2565 import binascii
2566 # SF bug [#470040] ParseTuple t# vs subclasses.
2567 if verbose:
2568 print "Testing that buffer interface is inherited ..."
2569
2570 class MyStr(str):
2571 pass
2572 base = 'abc'
2573 m = MyStr(base)
2574 # b2a_hex uses the buffer interface to get its argument's value, via
2575 # PyArg_ParseTuple 't#' code.
2576 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2577
2578 # It's not clear that unicode will continue to support the character
2579 # buffer interface, and this test will fail if that's taken away.
2580 class MyUni(unicode):
2581 pass
2582 base = u'abc'
2583 m = MyUni(base)
2584 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2585
2586 class MyInt(int):
2587 pass
2588 m = MyInt(42)
2589 try:
2590 binascii.b2a_hex(m)
2591 raise TestFailed('subclass of int should not have a buffer interface')
2592 except TypeError:
2593 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002594
Tim Petersc9933152001-10-16 20:18:24 +00002595def str_of_str_subclass():
2596 import binascii
2597 import cStringIO
2598
2599 if verbose:
2600 print "Testing __str__ defined in subclass of str ..."
2601
2602 class octetstring(str):
2603 def __str__(self):
2604 return binascii.b2a_hex(self)
2605 def __repr__(self):
2606 return self + " repr"
2607
2608 o = octetstring('A')
2609 vereq(type(o), octetstring)
2610 vereq(type(str(o)), str)
2611 vereq(type(repr(o)), str)
2612 vereq(ord(o), 0x41)
2613 vereq(str(o), '41')
2614 vereq(repr(o), 'A repr')
2615 vereq(o.__str__(), '41')
2616 vereq(o.__repr__(), 'A repr')
2617
2618 capture = cStringIO.StringIO()
2619 # Calling str() or not exercises different internal paths.
2620 print >> capture, o
2621 print >> capture, str(o)
2622 vereq(capture.getvalue(), '41\n41\n')
2623 capture.close()
2624
Guido van Rossumc8e56452001-10-22 00:43:43 +00002625def kwdargs():
2626 if verbose: print "Testing keyword arguments to __init__, __call__..."
2627 def f(a): return a
2628 vereq(f.__call__(a=42), 42)
2629 a = []
2630 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002631 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002632
Guido van Rossumed87ad82001-10-30 02:33:02 +00002633def delhook():
2634 if verbose: print "Testing __del__ hook..."
2635 log = []
2636 class C(object):
2637 def __del__(self):
2638 log.append(1)
2639 c = C()
2640 vereq(log, [])
2641 del c
2642 vereq(log, [1])
2643
Guido van Rossum29d26062001-12-11 04:37:34 +00002644 class D(object): pass
2645 d = D()
2646 try: del d[0]
2647 except TypeError: pass
2648 else: raise TestFailed, "invalid del() didn't raise TypeError"
2649
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002650def hashinherit():
2651 if verbose: print "Testing hash of mutable subclasses..."
2652
2653 class mydict(dict):
2654 pass
2655 d = mydict()
2656 try:
2657 hash(d)
2658 except TypeError:
2659 pass
2660 else:
2661 raise TestFailed, "hash() of dict subclass should fail"
2662
2663 class mylist(list):
2664 pass
2665 d = mylist()
2666 try:
2667 hash(d)
2668 except TypeError:
2669 pass
2670 else:
2671 raise TestFailed, "hash() of list subclass should fail"
2672
Guido van Rossum29d26062001-12-11 04:37:34 +00002673def strops():
2674 try: 'a' + 5
2675 except TypeError: pass
2676 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2677
2678 try: ''.split('')
2679 except ValueError: pass
2680 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2681
2682 try: ''.join([0])
2683 except TypeError: pass
2684 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2685
2686 try: ''.rindex('5')
2687 except ValueError: pass
2688 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2689
2690 try: ''.replace('', '')
2691 except ValueError: pass
2692 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2693
2694 try: '%(n)s' % None
2695 except TypeError: pass
2696 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2697
2698 try: '%(n' % {}
2699 except ValueError: pass
2700 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2701
2702 try: '%*s' % ('abc')
2703 except TypeError: pass
2704 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2705
2706 try: '%*.*s' % ('abc', 5)
2707 except TypeError: pass
2708 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2709
2710 try: '%s' % (1, 2)
2711 except TypeError: pass
2712 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2713
2714 try: '%' % None
2715 except ValueError: pass
2716 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2717
2718 vereq('534253'.isdigit(), 1)
2719 vereq('534253x'.isdigit(), 0)
2720 vereq('%c' % 5, '\x05')
2721 vereq('%c' % '5', '5')
2722
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002723def deepcopyrecursive():
2724 if verbose: print "Testing deepcopy of recursive objects..."
2725 class Node:
2726 pass
2727 a = Node()
2728 b = Node()
2729 a.b = b
2730 b.a = a
2731 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002732
2733
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002734def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002735 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002736 lists()
2737 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002738 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002739 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002740 ints()
2741 longs()
2742 floats()
2743 complexes()
2744 spamlists()
2745 spamdicts()
2746 pydicts()
2747 pylists()
2748 metaclass()
2749 pymods()
2750 multi()
2751 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002752 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002753 slots()
2754 dynamics()
2755 errors()
2756 classmethods()
2757 staticmethods()
2758 classic()
2759 compattr()
2760 newslot()
2761 altmro()
2762 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002763 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002764 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002765 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002766 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002767 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002768 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002769 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002770 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002771 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002772 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002773 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002774 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002775 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002776 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002777 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002778 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002779 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002780 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002781 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002782 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002783 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002784 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002785 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002786 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00002787 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002788 deepcopyrecursive()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002789 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002790
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002791if __name__ == "__main__":
2792 test_main()