blob: e667efb18af72c6f4e8bb75a5e9e2d84e14a0228 [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)
429
430def longs():
431 if verbose: print "Testing long operations..."
432 numops(100L, 3L)
433
434def floats():
435 if verbose: print "Testing float operations..."
436 numops(100.0, 3.0)
437
438def complexes():
439 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000440 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000441 class Number(complex):
442 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000443 def __new__(cls, *args, **kwds):
444 result = complex.__new__(cls, *args)
445 result.prec = kwds.get('prec', 12)
446 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000447 def __repr__(self):
448 prec = self.prec
449 if self.imag == 0.0:
450 return "%.*g" % (prec, self.real)
451 if self.real == 0.0:
452 return "%.*gj" % (prec, self.imag)
453 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
454 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000455
Tim Peters6d6c1a32001-08-02 04:15:00 +0000456 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000457 vereq(`a`, "3.14")
458 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000459
Tim Peters3f996e72001-09-13 19:18:27 +0000460 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000461 vereq(`a`, "3.1")
462 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000463
464 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000465 vereq(`a`, "234.5")
466 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000467
Tim Peters6d6c1a32001-08-02 04:15:00 +0000468def spamlists():
469 if verbose: print "Testing spamlist operations..."
470 import copy, xxsubtype as spam
471 def spamlist(l, memo=None):
472 import xxsubtype as spam
473 return spam.spamlist(l)
474 # This is an ugly hack:
475 copy._deepcopy_dispatch[spam.spamlist] = spamlist
476
477 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
478 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
479 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
480 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
481 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
482 "a[b:c]", "__getslice__")
483 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
484 "a+=b", "__iadd__")
485 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
486 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
487 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
488 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
489 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
490 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
491 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
492 # Test subclassing
493 class C(spam.spamlist):
494 def foo(self): return 1
495 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000496 vereq(a, [])
497 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000498 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(a, [100])
500 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000502 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000503
504def spamdicts():
505 if verbose: print "Testing spamdict operations..."
506 import copy, xxsubtype as spam
507 def spamdict(d, memo=None):
508 import xxsubtype as spam
509 sd = spam.spamdict()
510 for k, v in d.items(): sd[k] = v
511 return sd
512 # This is an ugly hack:
513 copy._deepcopy_dispatch[spam.spamdict] = spamdict
514
515 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
516 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
517 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
518 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
519 d = spamdict({1:2,3:4})
520 l1 = []
521 for i in d.keys(): l1.append(i)
522 l = []
523 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000524 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000525 l = []
526 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000527 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000528 l = []
529 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 straightd = {1:2, 3:4}
532 spamd = spamdict(straightd)
533 testunop(spamd, 2, "len(a)", "__len__")
534 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
535 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
536 "a[b]=c", "__setitem__")
537 # Test subclassing
538 class C(spam.spamdict):
539 def foo(self): return 1
540 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000541 vereq(a.items(), [])
542 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000543 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000544 vereq(a.items(), [('foo', 'bar')])
545 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000547 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000548
549def pydicts():
550 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000551 verify(issubclass(dict, dict))
552 verify(isinstance({}, dict))
553 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000554 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000555 verify(d.__class__ is dict)
556 verify(isinstance(d, dict))
557 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000558 state = -1
559 def __init__(self, *a, **kw):
560 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000561 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562 self.state = a[0]
563 if kw:
564 for k, v in kw.items(): self[v] = k
565 def __getitem__(self, key):
566 return self.get(key, 0)
567 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000568 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000569 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000570 def setstate(self, state):
571 self.state = state
572 def getstate(self):
573 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000574 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000576 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000578 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000579 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a.state, -1)
581 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.state, 0)
584 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.state, 10)
587 vereq(a.getstate(), 10)
588 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000591 if verbose: print "pydict stress test ..."
592 N = 50
593 for i in range(N):
594 a[i] = C()
595 for j in range(N):
596 a[i][j] = i*j
597 for i in range(N):
598 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000599 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000600
601def pylists():
602 if verbose: print "Testing Python subclass of list..."
603 class C(list):
604 def __getitem__(self, i):
605 return list.__getitem__(self, i) + 100
606 def __getslice__(self, i, j):
607 return (i, j)
608 a = C()
609 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000610 vereq(a[0], 100)
611 vereq(a[1], 101)
612 vereq(a[2], 102)
613 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614
615def metaclass():
616 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617 class C:
618 __metaclass__ = type
619 def __init__(self):
620 self.__state = 0
621 def getstate(self):
622 return self.__state
623 def setstate(self, state):
624 self.__state = state
625 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000626 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000628 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629 class D:
630 class __metaclass__(type):
631 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000632 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000633 d = D()
634 verify(d.__class__ is D)
635 class M1(type):
636 def __new__(cls, name, bases, dict):
637 dict['__spam__'] = 1
638 return type.__new__(cls, name, bases, dict)
639 class C:
640 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000641 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000642 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000643 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000644
Guido van Rossum309b5662001-08-17 11:43:17 +0000645 class _instance(object):
646 pass
647 class M2(object):
648 def __new__(cls, name, bases, dict):
649 self = object.__new__(cls)
650 self.name = name
651 self.bases = bases
652 self.dict = dict
653 return self
654 __new__ = staticmethod(__new__)
655 def __call__(self):
656 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000657 # Early binding of methods
658 for key in self.dict:
659 if key.startswith("__"):
660 continue
661 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000662 return it
663 class C:
664 __metaclass__ = M2
665 def spam(self):
666 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000667 vereq(C.name, 'C')
668 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000669 verify('spam' in C.dict)
670 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000671 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000672
Guido van Rossum91ee7982001-08-30 20:52:40 +0000673 # More metaclass examples
674
675 class autosuper(type):
676 # Automatically add __super to the class
677 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000678 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000679 cls = super(autosuper, metaclass).__new__(metaclass,
680 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000681 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 while name[:1] == "_":
683 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000684 if name:
685 name = "_%s__super" % name
686 else:
687 name = "__super"
688 setattr(cls, name, super(cls))
689 return cls
690 class A:
691 __metaclass__ = autosuper
692 def meth(self):
693 return "A"
694 class B(A):
695 def meth(self):
696 return "B" + self.__super.meth()
697 class C(A):
698 def meth(self):
699 return "C" + self.__super.meth()
700 class D(C, B):
701 def meth(self):
702 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000703 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000704 class E(B, C):
705 def meth(self):
706 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000707 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000708
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000709 class autoproperty(type):
710 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000711 # named _get_x and/or _set_x are found
712 def __new__(metaclass, name, bases, dict):
713 hits = {}
714 for key, val in dict.iteritems():
715 if key.startswith("_get_"):
716 key = key[5:]
717 get, set = hits.get(key, (None, None))
718 get = val
719 hits[key] = get, set
720 elif key.startswith("_set_"):
721 key = key[5:]
722 get, set = hits.get(key, (None, None))
723 set = val
724 hits[key] = get, set
725 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000726 dict[key] = property(get, set)
727 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000728 name, bases, dict)
729 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000730 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 def _get_x(self):
732 return -self.__x
733 def _set_x(self, x):
734 self.__x = -x
735 a = A()
736 verify(not hasattr(a, "x"))
737 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000738 vereq(a.x, 12)
739 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000740
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000741 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000742 # Merge of multiple cooperating metaclasses
743 pass
744 class A:
745 __metaclass__ = multimetaclass
746 def _get_x(self):
747 return "A"
748 class B(A):
749 def _get_x(self):
750 return "B" + self.__super._get_x()
751 class C(A):
752 def _get_x(self):
753 return "C" + self.__super._get_x()
754 class D(C, B):
755 def _get_x(self):
756 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000757 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000758
Guido van Rossumf76de622001-10-18 15:49:21 +0000759 # Make sure type(x) doesn't call x.__class__.__init__
760 class T(type):
761 counter = 0
762 def __init__(self, *args):
763 T.counter += 1
764 class C:
765 __metaclass__ = T
766 vereq(T.counter, 1)
767 a = C()
768 vereq(type(a), C)
769 vereq(T.counter, 1)
770
Guido van Rossum29d26062001-12-11 04:37:34 +0000771 class C(object): pass
772 c = C()
773 try: c()
774 except TypeError: pass
775 else: raise TestError, "calling object w/o call method should raise TypeError"
776
Tim Peters6d6c1a32001-08-02 04:15:00 +0000777def pymods():
778 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000779 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000780 import sys
781 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000782 class MM(MT):
783 def __init__(self):
784 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000785 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000786 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000787 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000788 def __setattr__(self, name, value):
789 log.append(("setattr", name, value))
790 MT.__setattr__(self, name, value)
791 def __delattr__(self, name):
792 log.append(("delattr", name))
793 MT.__delattr__(self, name)
794 a = MM()
795 a.foo = 12
796 x = a.foo
797 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000798 vereq(log, [("setattr", "foo", 12),
799 ("getattr", "foo"),
800 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801
802def multi():
803 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804 class C(object):
805 def __init__(self):
806 self.__state = 0
807 def getstate(self):
808 return self.__state
809 def setstate(self, state):
810 self.__state = state
811 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000812 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000813 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000814 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000815 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816 def __init__(self):
817 type({}).__init__(self)
818 C.__init__(self)
819 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000820 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000821 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000822 vereq(d.items(), [("hello", "world")])
823 vereq(d["hello"], "world")
824 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000826 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000827 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828
Guido van Rossume45763a2001-08-10 21:28:46 +0000829 # SF bug #442833
830 class Node(object):
831 def __int__(self):
832 return int(self.foo())
833 def foo(self):
834 return "23"
835 class Frag(Node, list):
836 def foo(self):
837 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000838 vereq(Node().__int__(), 23)
839 vereq(int(Node()), 23)
840 vereq(Frag().__int__(), 42)
841 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000842
Tim Petersa91e9642001-11-14 23:32:33 +0000843 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000844
845 class A:
846 x = 1
847
848 class B(A):
849 pass
850
851 class C(A):
852 x = 2
853
854 class D(B, C):
855 pass
856 vereq(D.x, 1)
857
858 # Classic MRO is preserved for a classic base class.
859 class E(D, object):
860 pass
861 vereq(E.__mro__, (E, D, B, A, C, object))
862 vereq(E.x, 1)
863
864 # But with a mix of classic bases, their MROs are combined using
865 # new-style MRO.
866 class F(B, C, object):
867 pass
868 vereq(F.__mro__, (F, B, C, A, object))
869 vereq(F.x, 2)
870
871 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000872 class C:
873 def cmethod(self):
874 return "C a"
875 def all_method(self):
876 return "C b"
877
878 class M1(C, object):
879 def m1method(self):
880 return "M1 a"
881 def all_method(self):
882 return "M1 b"
883
884 vereq(M1.__mro__, (M1, C, object))
885 m = M1()
886 vereq(m.cmethod(), "C a")
887 vereq(m.m1method(), "M1 a")
888 vereq(m.all_method(), "M1 b")
889
890 class D(C):
891 def dmethod(self):
892 return "D a"
893 def all_method(self):
894 return "D b"
895
896 class M2(object, D):
897 def m2method(self):
898 return "M2 a"
899 def all_method(self):
900 return "M2 b"
901
902 vereq(M2.__mro__, (M2, object, D, C))
903 m = M2()
904 vereq(m.cmethod(), "C a")
905 vereq(m.dmethod(), "D a")
906 vereq(m.m2method(), "M2 a")
907 vereq(m.all_method(), "M2 b")
908
909 class M3(M1, object, M2):
910 def m3method(self):
911 return "M3 a"
912 def all_method(self):
913 return "M3 b"
914 # XXX Expected this (the commented-out result):
915 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
916 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000917 m = M3()
918 vereq(m.cmethod(), "C a")
919 vereq(m.dmethod(), "D a")
920 vereq(m.m1method(), "M1 a")
921 vereq(m.m2method(), "M2 a")
922 vereq(m.m3method(), "M3 a")
923 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000924
Guido van Rossume54616c2001-12-14 04:19:56 +0000925 class Classic:
926 pass
927 try:
928 class New(Classic):
929 __metaclass__ = type
930 except TypeError:
931 pass
932 else:
933 raise TestFailed, "new class with only classic bases - shouldn't be"
934
Tim Peters6d6c1a32001-08-02 04:15:00 +0000935def diamond():
936 if verbose: print "Testing multiple inheritance special cases..."
937 class A(object):
938 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000939 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000940 class B(A):
941 def boo(self): return "B"
942 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000943 vereq(B().spam(), "B")
944 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000945 class C(A):
946 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000947 vereq(C().spam(), "A")
948 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000950 vereq(D().spam(), "B")
951 vereq(D().boo(), "B")
952 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000953 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000954 vereq(E().spam(), "B")
955 vereq(E().boo(), "C")
956 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000958 vereq(F().spam(), "B")
959 vereq(F().boo(), "B")
960 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000961 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000962 vereq(G().spam(), "B")
963 vereq(G().boo(), "C")
964 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000965
Guido van Rossum37202612001-08-09 19:45:21 +0000966def objects():
967 if verbose: print "Testing object class..."
968 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000969 vereq(a.__class__, object)
970 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000971 b = object()
972 verify(a is not b)
973 verify(not hasattr(a, "foo"))
974 try:
975 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000976 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000977 pass
978 else:
979 verify(0, "object() should not allow setting a foo attribute")
980 verify(not hasattr(object(), "__dict__"))
981
982 class Cdict(object):
983 pass
984 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000985 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000986 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000987 vereq(x.foo, 1)
988 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000989
Tim Peters6d6c1a32001-08-02 04:15:00 +0000990def slots():
991 if verbose: print "Testing __slots__..."
992 class C0(object):
993 __slots__ = []
994 x = C0()
995 verify(not hasattr(x, "__dict__"))
996 verify(not hasattr(x, "foo"))
997
998 class C1(object):
999 __slots__ = ['a']
1000 x = C1()
1001 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001002 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001004 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001005 x.a = None
1006 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001007 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001008 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009
1010 class C3(object):
1011 __slots__ = ['a', 'b', 'c']
1012 x = C3()
1013 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001014 verify(not hasattr(x, 'a'))
1015 verify(not hasattr(x, 'b'))
1016 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 x.a = 1
1018 x.b = 2
1019 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001020 vereq(x.a, 1)
1021 vereq(x.b, 2)
1022 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001023
Guido van Rossum33bab012001-12-05 22:45:48 +00001024 # Test leaks
1025 class Counted(object):
1026 counter = 0 # counts the number of instances alive
1027 def __init__(self):
1028 Counted.counter += 1
1029 def __del__(self):
1030 Counted.counter -= 1
1031 class C(object):
1032 __slots__ = ['a', 'b', 'c']
1033 x = C()
1034 x.a = Counted()
1035 x.b = Counted()
1036 x.c = Counted()
1037 vereq(Counted.counter, 3)
1038 del x
1039 vereq(Counted.counter, 0)
1040 class D(C):
1041 pass
1042 x = D()
1043 x.a = Counted()
1044 x.z = Counted()
1045 vereq(Counted.counter, 2)
1046 del x
1047 vereq(Counted.counter, 0)
1048 class E(D):
1049 __slots__ = ['e']
1050 x = E()
1051 x.a = Counted()
1052 x.z = Counted()
1053 x.e = Counted()
1054 vereq(Counted.counter, 3)
1055 del x
1056 vereq(Counted.counter, 0)
1057
Tim Peters6d6c1a32001-08-02 04:15:00 +00001058def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001059 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001060 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001061 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001062 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001063 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001064 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001065 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001066 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001067 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001068 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001069 vereq(E.foo, 1)
1070 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001071 # Test dynamic instances
1072 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001073 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001074 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001075 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001076 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001077 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001078 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001079 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001080 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001081 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001082 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001083 vereq(int(a), 100)
1084 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001085 verify(not hasattr(a, "spam"))
1086 def mygetattr(self, name):
1087 if name == "spam":
1088 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001089 raise AttributeError
1090 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001091 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001092 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001093 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001094 def mysetattr(self, name, value):
1095 if name == "spam":
1096 raise AttributeError
1097 return object.__setattr__(self, name, value)
1098 C.__setattr__ = mysetattr
1099 try:
1100 a.spam = "not spam"
1101 except AttributeError:
1102 pass
1103 else:
1104 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001105 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001106 class D(C):
1107 pass
1108 d = D()
1109 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001110 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001111
Guido van Rossum7e35d572001-09-15 03:14:32 +00001112 # Test handling of int*seq and seq*int
1113 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001114 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001115 vereq("a"*I(2), "aa")
1116 vereq(I(2)*"a", "aa")
1117 vereq(2*I(3), 6)
1118 vereq(I(3)*2, 6)
1119 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001120
1121 # Test handling of long*seq and seq*long
1122 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001123 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001124 vereq("a"*L(2L), "aa")
1125 vereq(L(2L)*"a", "aa")
1126 vereq(2*L(3), 6)
1127 vereq(L(3)*2, 6)
1128 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001129
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001130 # Test comparison of classes with dynamic metaclasses
1131 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001132 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001133 class someclass:
1134 __metaclass__ = dynamicmetaclass
1135 verify(someclass != object)
1136
Tim Peters6d6c1a32001-08-02 04:15:00 +00001137def errors():
1138 if verbose: print "Testing errors..."
1139
1140 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001141 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001142 pass
1143 except TypeError:
1144 pass
1145 else:
1146 verify(0, "inheritance from both list and dict should be illegal")
1147
1148 try:
1149 class C(object, None):
1150 pass
1151 except TypeError:
1152 pass
1153 else:
1154 verify(0, "inheritance from non-type should be illegal")
1155 class Classic:
1156 pass
1157
1158 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001159 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001160 pass
1161 except TypeError:
1162 pass
1163 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001164 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001165
1166 try:
1167 class C(object):
1168 __slots__ = 1
1169 except TypeError:
1170 pass
1171 else:
1172 verify(0, "__slots__ = 1 should be illegal")
1173
1174 try:
1175 class C(object):
1176 __slots__ = [1]
1177 except TypeError:
1178 pass
1179 else:
1180 verify(0, "__slots__ = [1] should be illegal")
1181
1182def classmethods():
1183 if verbose: print "Testing class methods..."
1184 class C(object):
1185 def foo(*a): return a
1186 goo = classmethod(foo)
1187 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001188 vereq(C.goo(1), (C, 1))
1189 vereq(c.goo(1), (C, 1))
1190 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001191 class D(C):
1192 pass
1193 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001194 vereq(D.goo(1), (D, 1))
1195 vereq(d.goo(1), (D, 1))
1196 vereq(d.foo(1), (d, 1))
1197 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001198
1199def staticmethods():
1200 if verbose: print "Testing static methods..."
1201 class C(object):
1202 def foo(*a): return a
1203 goo = staticmethod(foo)
1204 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001205 vereq(C.goo(1), (1,))
1206 vereq(c.goo(1), (1,))
1207 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001208 class D(C):
1209 pass
1210 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001211 vereq(D.goo(1), (1,))
1212 vereq(d.goo(1), (1,))
1213 vereq(d.foo(1), (d, 1))
1214 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001215
1216def classic():
1217 if verbose: print "Testing classic classes..."
1218 class C:
1219 def foo(*a): return a
1220 goo = classmethod(foo)
1221 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001222 vereq(C.goo(1), (C, 1))
1223 vereq(c.goo(1), (C, 1))
1224 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001225 class D(C):
1226 pass
1227 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001228 vereq(D.goo(1), (D, 1))
1229 vereq(d.goo(1), (D, 1))
1230 vereq(d.foo(1), (d, 1))
1231 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001232 class E: # *not* subclassing from C
1233 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001234 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001235 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001236
1237def compattr():
1238 if verbose: print "Testing computed attributes..."
1239 class C(object):
1240 class computed_attribute(object):
1241 def __init__(self, get, set=None):
1242 self.__get = get
1243 self.__set = set
1244 def __get__(self, obj, type=None):
1245 return self.__get(obj)
1246 def __set__(self, obj, value):
1247 return self.__set(obj, value)
1248 def __init__(self):
1249 self.__x = 0
1250 def __get_x(self):
1251 x = self.__x
1252 self.__x = x+1
1253 return x
1254 def __set_x(self, x):
1255 self.__x = x
1256 x = computed_attribute(__get_x, __set_x)
1257 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001258 vereq(a.x, 0)
1259 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001260 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001261 vereq(a.x, 10)
1262 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001263
1264def newslot():
1265 if verbose: print "Testing __new__ slot override..."
1266 class C(list):
1267 def __new__(cls):
1268 self = list.__new__(cls)
1269 self.foo = 1
1270 return self
1271 def __init__(self):
1272 self.foo = self.foo + 2
1273 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001274 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001275 verify(a.__class__ is C)
1276 class D(C):
1277 pass
1278 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001279 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280 verify(b.__class__ is D)
1281
Tim Peters6d6c1a32001-08-02 04:15:00 +00001282def altmro():
1283 if verbose: print "Testing mro() and overriding it..."
1284 class A(object):
1285 def f(self): return "A"
1286 class B(A):
1287 pass
1288 class C(A):
1289 def f(self): return "C"
1290 class D(B, C):
1291 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001292 vereq(D.mro(), [D, B, C, A, object])
1293 vereq(D.__mro__, (D, B, C, A, object))
1294 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001295 class PerverseMetaType(type):
1296 def mro(cls):
1297 L = type.mro(cls)
1298 L.reverse()
1299 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001300 class X(A,B,C,D):
1301 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001302 vereq(X.__mro__, (object, A, C, B, D, X))
1303 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001304
1305def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001306 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001307
1308 class B(object):
1309 "Intermediate class because object doesn't have a __setattr__"
1310
1311 class C(B):
1312
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001313 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001314 if name == "foo":
1315 return ("getattr", name)
1316 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001317 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001318 def __setattr__(self, name, value):
1319 if name == "foo":
1320 self.setattr = (name, value)
1321 else:
1322 return B.__setattr__(self, name, value)
1323 def __delattr__(self, name):
1324 if name == "foo":
1325 self.delattr = name
1326 else:
1327 return B.__delattr__(self, name)
1328
1329 def __getitem__(self, key):
1330 return ("getitem", key)
1331 def __setitem__(self, key, value):
1332 self.setitem = (key, value)
1333 def __delitem__(self, key):
1334 self.delitem = key
1335
1336 def __getslice__(self, i, j):
1337 return ("getslice", i, j)
1338 def __setslice__(self, i, j, value):
1339 self.setslice = (i, j, value)
1340 def __delslice__(self, i, j):
1341 self.delslice = (i, j)
1342
1343 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001344 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001345 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001346 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001347 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001348 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001349
Guido van Rossum45704552001-10-08 16:35:45 +00001350 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001351 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001352 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001353 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001354 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001355
Guido van Rossum45704552001-10-08 16:35:45 +00001356 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001357 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001358 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001359 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001360 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001361
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001362def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001363 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001364 class C(object):
1365 def __init__(self, x):
1366 self.x = x
1367 def foo(self):
1368 return self.x
1369 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001370 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001371 class D(C):
1372 boo = C.foo
1373 goo = c1.foo
1374 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001375 vereq(d2.foo(), 2)
1376 vereq(d2.boo(), 2)
1377 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001378 class E(object):
1379 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001380 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001381 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001382
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001383def specials():
1384 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001385 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001386 # Test the default behavior for static classes
1387 class C(object):
1388 def __getitem__(self, i):
1389 if 0 <= i < 10: return i
1390 raise IndexError
1391 c1 = C()
1392 c2 = C()
1393 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001394 vereq(hash(c1), id(c1))
1395 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1396 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001397 verify(c1 != c2)
1398 verify(not c1 != c1)
1399 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001400 # Note that the module name appears in str/repr, and that varies
1401 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001402 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001403 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001404 verify(-1 not in c1)
1405 for i in range(10):
1406 verify(i in c1)
1407 verify(10 not in c1)
1408 # Test the default behavior for dynamic classes
1409 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001410 def __getitem__(self, i):
1411 if 0 <= i < 10: return i
1412 raise IndexError
1413 d1 = D()
1414 d2 = D()
1415 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001416 vereq(hash(d1), id(d1))
1417 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1418 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001419 verify(d1 != d2)
1420 verify(not d1 != d1)
1421 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001422 # Note that the module name appears in str/repr, and that varies
1423 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001424 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001425 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001426 verify(-1 not in d1)
1427 for i in range(10):
1428 verify(i in d1)
1429 verify(10 not in d1)
1430 # Test overridden behavior for static classes
1431 class Proxy(object):
1432 def __init__(self, x):
1433 self.x = x
1434 def __nonzero__(self):
1435 return not not self.x
1436 def __hash__(self):
1437 return hash(self.x)
1438 def __eq__(self, other):
1439 return self.x == other
1440 def __ne__(self, other):
1441 return self.x != other
1442 def __cmp__(self, other):
1443 return cmp(self.x, other.x)
1444 def __str__(self):
1445 return "Proxy:%s" % self.x
1446 def __repr__(self):
1447 return "Proxy(%r)" % self.x
1448 def __contains__(self, value):
1449 return value in self.x
1450 p0 = Proxy(0)
1451 p1 = Proxy(1)
1452 p_1 = Proxy(-1)
1453 verify(not p0)
1454 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001455 vereq(hash(p0), hash(0))
1456 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001457 verify(p0 != p1)
1458 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001459 vereq(not p0, p1)
1460 vereq(cmp(p0, p1), -1)
1461 vereq(cmp(p0, p0), 0)
1462 vereq(cmp(p0, p_1), 1)
1463 vereq(str(p0), "Proxy:0")
1464 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001465 p10 = Proxy(range(10))
1466 verify(-1 not in p10)
1467 for i in range(10):
1468 verify(i in p10)
1469 verify(10 not in p10)
1470 # Test overridden behavior for dynamic classes
1471 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001472 def __init__(self, x):
1473 self.x = x
1474 def __nonzero__(self):
1475 return not not self.x
1476 def __hash__(self):
1477 return hash(self.x)
1478 def __eq__(self, other):
1479 return self.x == other
1480 def __ne__(self, other):
1481 return self.x != other
1482 def __cmp__(self, other):
1483 return cmp(self.x, other.x)
1484 def __str__(self):
1485 return "DProxy:%s" % self.x
1486 def __repr__(self):
1487 return "DProxy(%r)" % self.x
1488 def __contains__(self, value):
1489 return value in self.x
1490 p0 = DProxy(0)
1491 p1 = DProxy(1)
1492 p_1 = DProxy(-1)
1493 verify(not p0)
1494 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(hash(p0), hash(0))
1496 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001497 verify(p0 != p1)
1498 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001499 vereq(not p0, p1)
1500 vereq(cmp(p0, p1), -1)
1501 vereq(cmp(p0, p0), 0)
1502 vereq(cmp(p0, p_1), 1)
1503 vereq(str(p0), "DProxy:0")
1504 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001505 p10 = DProxy(range(10))
1506 verify(-1 not in p10)
1507 for i in range(10):
1508 verify(i in p10)
1509 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001510 # Safety test for __cmp__
1511 def unsafecmp(a, b):
1512 try:
1513 a.__class__.__cmp__(a, b)
1514 except TypeError:
1515 pass
1516 else:
1517 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1518 a.__class__, a, b)
1519 unsafecmp(u"123", "123")
1520 unsafecmp("123", u"123")
1521 unsafecmp(1, 1.0)
1522 unsafecmp(1.0, 1)
1523 unsafecmp(1, 1L)
1524 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001525
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001526def weakrefs():
1527 if verbose: print "Testing weak references..."
1528 import weakref
1529 class C(object):
1530 pass
1531 c = C()
1532 r = weakref.ref(c)
1533 verify(r() is c)
1534 del c
1535 verify(r() is None)
1536 del r
1537 class NoWeak(object):
1538 __slots__ = ['foo']
1539 no = NoWeak()
1540 try:
1541 weakref.ref(no)
1542 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001543 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001544 else:
1545 verify(0, "weakref.ref(no) should be illegal")
1546 class Weak(object):
1547 __slots__ = ['foo', '__weakref__']
1548 yes = Weak()
1549 r = weakref.ref(yes)
1550 verify(r() is yes)
1551 del yes
1552 verify(r() is None)
1553 del r
1554
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001555def properties():
1556 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001557 class C(object):
1558 def getx(self):
1559 return self.__x
1560 def setx(self, value):
1561 self.__x = value
1562 def delx(self):
1563 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001564 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001565 a = C()
1566 verify(not hasattr(a, "x"))
1567 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001568 vereq(a._C__x, 42)
1569 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001570 del a.x
1571 verify(not hasattr(a, "x"))
1572 verify(not hasattr(a, "_C__x"))
1573 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001574 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001575## C.x.__set__(a)
1576## verify(not hasattr(a, "x"))
1577
Tim Peters66c1a522001-09-24 21:17:50 +00001578 raw = C.__dict__['x']
1579 verify(isinstance(raw, property))
1580
1581 attrs = dir(raw)
1582 verify("__doc__" in attrs)
1583 verify("fget" in attrs)
1584 verify("fset" in attrs)
1585 verify("fdel" in attrs)
1586
Guido van Rossum45704552001-10-08 16:35:45 +00001587 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001588 verify(raw.fget is C.__dict__['getx'])
1589 verify(raw.fset is C.__dict__['setx'])
1590 verify(raw.fdel is C.__dict__['delx'])
1591
1592 for attr in "__doc__", "fget", "fset", "fdel":
1593 try:
1594 setattr(raw, attr, 42)
1595 except TypeError, msg:
1596 if str(msg).find('readonly') < 0:
1597 raise TestFailed("when setting readonly attr %r on a "
1598 "property, got unexpected TypeError "
1599 "msg %r" % (attr, str(msg)))
1600 else:
1601 raise TestFailed("expected TypeError from trying to set "
1602 "readonly %r attr on a property" % attr)
1603
Guido van Rossumc4a18802001-08-24 16:55:27 +00001604def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001605 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001606
1607 class A(object):
1608 def meth(self, a):
1609 return "A(%r)" % a
1610
Guido van Rossum45704552001-10-08 16:35:45 +00001611 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001612
1613 class B(A):
1614 def __init__(self):
1615 self.__super = super(B, self)
1616 def meth(self, a):
1617 return "B(%r)" % a + self.__super.meth(a)
1618
Guido van Rossum45704552001-10-08 16:35:45 +00001619 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001620
1621 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001622 def meth(self, a):
1623 return "C(%r)" % a + self.__super.meth(a)
1624 C._C__super = super(C)
1625
Guido van Rossum45704552001-10-08 16:35:45 +00001626 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001627
1628 class D(C, B):
1629 def meth(self, a):
1630 return "D(%r)" % a + super(D, self).meth(a)
1631
Guido van Rossum5b443c62001-12-03 15:38:28 +00001632 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1633
1634 # Test for subclassing super
1635
1636 class mysuper(super):
1637 def __init__(self, *args):
1638 return super(mysuper, self).__init__(*args)
1639
1640 class E(D):
1641 def meth(self, a):
1642 return "E(%r)" % a + mysuper(E, self).meth(a)
1643
1644 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1645
1646 class F(E):
1647 def meth(self, a):
1648 s = self.__super
1649 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1650 F._F__super = mysuper(F)
1651
1652 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1653
1654 # Make sure certain errors are raised
1655
1656 try:
1657 super(D, 42)
1658 except TypeError:
1659 pass
1660 else:
1661 raise TestFailed, "shouldn't allow super(D, 42)"
1662
1663 try:
1664 super(D, C())
1665 except TypeError:
1666 pass
1667 else:
1668 raise TestFailed, "shouldn't allow super(D, C())"
1669
1670 try:
1671 super(D).__get__(12)
1672 except TypeError:
1673 pass
1674 else:
1675 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1676
1677 try:
1678 super(D).__get__(C())
1679 except TypeError:
1680 pass
1681 else:
1682 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001683
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001684def inherits():
1685 if verbose: print "Testing inheritance from basic types..."
1686
1687 class hexint(int):
1688 def __repr__(self):
1689 return hex(self)
1690 def __add__(self, other):
1691 return hexint(int.__add__(self, other))
1692 # (Note that overriding __radd__ doesn't work,
1693 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001694 vereq(repr(hexint(7) + 9), "0x10")
1695 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001696 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001697 vereq(a, 12345)
1698 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001699 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001700 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001701 verify((+a).__class__ is int)
1702 verify((a >> 0).__class__ is int)
1703 verify((a << 0).__class__ is int)
1704 verify((hexint(0) << 12).__class__ is int)
1705 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001706
1707 class octlong(long):
1708 __slots__ = []
1709 def __str__(self):
1710 s = oct(self)
1711 if s[-1] == 'L':
1712 s = s[:-1]
1713 return s
1714 def __add__(self, other):
1715 return self.__class__(super(octlong, self).__add__(other))
1716 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001717 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001718 # (Note that overriding __radd__ here only seems to work
1719 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001720 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001721 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001722 vereq(a, 12345L)
1723 vereq(long(a), 12345L)
1724 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001725 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001726 verify((+a).__class__ is long)
1727 verify((-a).__class__ is long)
1728 verify((-octlong(0)).__class__ is long)
1729 verify((a >> 0).__class__ is long)
1730 verify((a << 0).__class__ is long)
1731 verify((a - 0).__class__ is long)
1732 verify((a * 1).__class__ is long)
1733 verify((a ** 1).__class__ is long)
1734 verify((a // 1).__class__ is long)
1735 verify((1 * a).__class__ is long)
1736 verify((a | 0).__class__ is long)
1737 verify((a ^ 0).__class__ is long)
1738 verify((a & -1L).__class__ is long)
1739 verify((octlong(0) << 12).__class__ is long)
1740 verify((octlong(0) >> 12).__class__ is long)
1741 verify(abs(octlong(0)).__class__ is long)
1742
1743 # Because octlong overrides __add__, we can't check the absence of +0
1744 # optimizations using octlong.
1745 class longclone(long):
1746 pass
1747 a = longclone(1)
1748 verify((a + 0).__class__ is long)
1749 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001750
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001751 # Check that negative clones don't segfault
1752 a = longclone(-1)
1753 vereq(a.__dict__, {})
1754
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001755 class precfloat(float):
1756 __slots__ = ['prec']
1757 def __init__(self, value=0.0, prec=12):
1758 self.prec = int(prec)
1759 float.__init__(value)
1760 def __repr__(self):
1761 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001762 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001763 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001764 vereq(a, 12345.0)
1765 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001766 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001767 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001768 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001769
Tim Peters2400fa42001-09-12 19:12:49 +00001770 class madcomplex(complex):
1771 def __repr__(self):
1772 return "%.17gj%+.17g" % (self.imag, self.real)
1773 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001774 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001775 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001776 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001777 vereq(a, base)
1778 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001779 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001780 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(repr(a), "4j-3")
1782 vereq(a, base)
1783 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001784 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001785 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001786 veris((+a).__class__, complex)
1787 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001788 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001789 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001790 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001791 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001792 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001793 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001794 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001795
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001796 class madtuple(tuple):
1797 _rev = None
1798 def rev(self):
1799 if self._rev is not None:
1800 return self._rev
1801 L = list(self)
1802 L.reverse()
1803 self._rev = self.__class__(L)
1804 return self._rev
1805 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001806 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1807 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1808 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001809 for i in range(512):
1810 t = madtuple(range(i))
1811 u = t.rev()
1812 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001814 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001815 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001816 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001817 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001818 verify(a[:].__class__ is tuple)
1819 verify((a * 1).__class__ is tuple)
1820 verify((a * 0).__class__ is tuple)
1821 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001822 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001823 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001824 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001825 verify((a + a).__class__ is tuple)
1826 verify((a * 0).__class__ is tuple)
1827 verify((a * 1).__class__ is tuple)
1828 verify((a * 2).__class__ is tuple)
1829 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001830
1831 class madstring(str):
1832 _rev = None
1833 def rev(self):
1834 if self._rev is not None:
1835 return self._rev
1836 L = list(self)
1837 L.reverse()
1838 self._rev = self.__class__("".join(L))
1839 return self._rev
1840 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001841 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1842 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1843 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001844 for i in range(256):
1845 s = madstring("".join(map(chr, range(i))))
1846 t = s.rev()
1847 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001848 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001849 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001850 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001851 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001852
Tim Peters8fa5dd02001-09-12 02:18:30 +00001853 base = "\x00" * 5
1854 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001855 vereq(s, base)
1856 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001857 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001858 vereq(hash(s), hash(base))
1859 vereq({s: 1}[base], 1)
1860 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001861 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001862 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001863 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001864 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001865 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001866 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001867 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001868 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001869 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001870 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001871 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001872 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001873 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001874 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001875 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001876 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001877 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001878 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001879 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001880 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001881 identitytab = ''.join([chr(i) for i in range(256)])
1882 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001883 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001884 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001885 vereq(s.translate(identitytab, "x"), base)
1886 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001887 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001888 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001889 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001890 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001891 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001892 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001893 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001894 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001895 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001896 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001897
Tim Peters111f6092001-09-12 07:54:51 +00001898 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001899 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001900 verify(intern(s).__class__ is str)
1901 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001902 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001903
1904 i = intern("y x")
1905 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001906 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001907 verify(intern(s).__class__ is str)
1908 verify(intern(s) is i)
1909
1910 s = madstring(i)
1911 verify(intern(s).__class__ is str)
1912 verify(intern(s) is i)
1913
Guido van Rossum91ee7982001-08-30 20:52:40 +00001914 class madunicode(unicode):
1915 _rev = None
1916 def rev(self):
1917 if self._rev is not None:
1918 return self._rev
1919 L = list(self)
1920 L.reverse()
1921 self._rev = self.__class__(u"".join(L))
1922 return self._rev
1923 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001924 vereq(u, u"ABCDEF")
1925 vereq(u.rev(), madunicode(u"FEDCBA"))
1926 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001927 base = u"12345"
1928 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001929 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001930 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001931 vereq(hash(u), hash(base))
1932 vereq({u: 1}[base], 1)
1933 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001934 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001936 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001937 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001938 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001939 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001940 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001941 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001942 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001944 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001945 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001946 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001947 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001948 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001949 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001950 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001951 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001952 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001953 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001954 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001955 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001956 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001957 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001958 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001959 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001960 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001961 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001962 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001963 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001964 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001965 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001966 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001967 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001968 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001969 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001970 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001971 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001972
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001973 class sublist(list):
1974 pass
1975 a = sublist(range(5))
1976 vereq(a, range(5))
1977 a.append("hello")
1978 vereq(a, range(5) + ["hello"])
1979 a[5] = 5
1980 vereq(a, range(6))
1981 a.extend(range(6, 20))
1982 vereq(a, range(20))
1983 a[-5:] = []
1984 vereq(a, range(15))
1985 del a[10:15]
1986 vereq(len(a), 10)
1987 vereq(a, range(10))
1988 vereq(list(a), range(10))
1989 vereq(a[0], 0)
1990 vereq(a[9], 9)
1991 vereq(a[-10], 0)
1992 vereq(a[-1], 9)
1993 vereq(a[:5], range(5))
1994
Tim Peters59c9a642001-09-13 05:38:56 +00001995 class CountedInput(file):
1996 """Counts lines read by self.readline().
1997
1998 self.lineno is the 0-based ordinal of the last line read, up to
1999 a maximum of one greater than the number of lines in the file.
2000
2001 self.ateof is true if and only if the final "" line has been read,
2002 at which point self.lineno stops incrementing, and further calls
2003 to readline() continue to return "".
2004 """
2005
2006 lineno = 0
2007 ateof = 0
2008 def readline(self):
2009 if self.ateof:
2010 return ""
2011 s = file.readline(self)
2012 # Next line works too.
2013 # s = super(CountedInput, self).readline()
2014 self.lineno += 1
2015 if s == "":
2016 self.ateof = 1
2017 return s
2018
Tim Peters561f8992001-09-13 19:36:36 +00002019 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002020 lines = ['a\n', 'b\n', 'c\n']
2021 try:
2022 f.writelines(lines)
2023 f.close()
2024 f = CountedInput(TESTFN)
2025 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2026 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002027 vereq(expected, got)
2028 vereq(f.lineno, i)
2029 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002030 f.close()
2031 finally:
2032 try:
2033 f.close()
2034 except:
2035 pass
2036 try:
2037 import os
2038 os.unlink(TESTFN)
2039 except:
2040 pass
2041
Tim Peters808b94e2001-09-13 19:33:07 +00002042def keywords():
2043 if verbose:
2044 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002045 vereq(int(x=1), 1)
2046 vereq(float(x=2), 2.0)
2047 vereq(long(x=3), 3L)
2048 vereq(complex(imag=42, real=666), complex(666, 42))
2049 vereq(str(object=500), '500')
2050 vereq(unicode(string='abc', errors='strict'), u'abc')
2051 vereq(tuple(sequence=range(3)), (0, 1, 2))
2052 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002053 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002054
2055 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002056 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002057 try:
2058 constructor(bogus_keyword_arg=1)
2059 except TypeError:
2060 pass
2061 else:
2062 raise TestFailed("expected TypeError from bogus keyword "
2063 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002064
Tim Peters8fa45672001-09-13 21:01:29 +00002065def restricted():
2066 import rexec
2067 if verbose:
2068 print "Testing interaction with restricted execution ..."
2069
2070 sandbox = rexec.RExec()
2071
2072 code1 = """f = open(%r, 'w')""" % TESTFN
2073 code2 = """f = file(%r, 'w')""" % TESTFN
2074 code3 = """\
2075f = open(%r)
2076t = type(f) # a sneaky way to get the file() constructor
2077f.close()
2078f = t(%r, 'w') # rexec can't catch this by itself
2079""" % (TESTFN, TESTFN)
2080
2081 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2082 f.close()
2083
2084 try:
2085 for code in code1, code2, code3:
2086 try:
2087 sandbox.r_exec(code)
2088 except IOError, msg:
2089 if str(msg).find("restricted") >= 0:
2090 outcome = "OK"
2091 else:
2092 outcome = "got an exception, but not an expected one"
2093 else:
2094 outcome = "expected a restricted-execution exception"
2095
2096 if outcome != "OK":
2097 raise TestFailed("%s, in %r" % (outcome, code))
2098
2099 finally:
2100 try:
2101 import os
2102 os.unlink(TESTFN)
2103 except:
2104 pass
2105
Tim Peters0ab085c2001-09-14 00:25:33 +00002106def str_subclass_as_dict_key():
2107 if verbose:
2108 print "Testing a str subclass used as dict key .."
2109
2110 class cistr(str):
2111 """Sublcass of str that computes __eq__ case-insensitively.
2112
2113 Also computes a hash code of the string in canonical form.
2114 """
2115
2116 def __init__(self, value):
2117 self.canonical = value.lower()
2118 self.hashcode = hash(self.canonical)
2119
2120 def __eq__(self, other):
2121 if not isinstance(other, cistr):
2122 other = cistr(other)
2123 return self.canonical == other.canonical
2124
2125 def __hash__(self):
2126 return self.hashcode
2127
Guido van Rossum45704552001-10-08 16:35:45 +00002128 vereq(cistr('ABC'), 'abc')
2129 vereq('aBc', cistr('ABC'))
2130 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002131
2132 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002133 vereq(d[cistr('one')], 1)
2134 vereq(d[cistr('tWo')], 2)
2135 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002136 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002137 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002138
Guido van Rossumab3b0342001-09-18 20:38:53 +00002139def classic_comparisons():
2140 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002141 class classic:
2142 pass
2143 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002144 if verbose: print " (base = %s)" % base
2145 class C(base):
2146 def __init__(self, value):
2147 self.value = int(value)
2148 def __cmp__(self, other):
2149 if isinstance(other, C):
2150 return cmp(self.value, other.value)
2151 if isinstance(other, int) or isinstance(other, long):
2152 return cmp(self.value, other)
2153 return NotImplemented
2154 c1 = C(1)
2155 c2 = C(2)
2156 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002157 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002158 c = {1: c1, 2: c2, 3: c3}
2159 for x in 1, 2, 3:
2160 for y in 1, 2, 3:
2161 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2162 for op in "<", "<=", "==", "!=", ">", ">=":
2163 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2164 "x=%d, y=%d" % (x, y))
2165 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2166 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2167
Guido van Rossum0639f592001-09-18 21:06:04 +00002168def rich_comparisons():
2169 if verbose:
2170 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002171 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002172 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002173 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002174 vereq(z, 1+0j)
2175 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002176 class ZZ(complex):
2177 def __eq__(self, other):
2178 try:
2179 return abs(self - other) <= 1e-6
2180 except:
2181 return NotImplemented
2182 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(zz, 1+0j)
2184 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002185
Guido van Rossum0639f592001-09-18 21:06:04 +00002186 class classic:
2187 pass
2188 for base in (classic, int, object, list):
2189 if verbose: print " (base = %s)" % base
2190 class C(base):
2191 def __init__(self, value):
2192 self.value = int(value)
2193 def __cmp__(self, other):
2194 raise TestFailed, "shouldn't call __cmp__"
2195 def __eq__(self, other):
2196 if isinstance(other, C):
2197 return self.value == other.value
2198 if isinstance(other, int) or isinstance(other, long):
2199 return self.value == other
2200 return NotImplemented
2201 def __ne__(self, other):
2202 if isinstance(other, C):
2203 return self.value != other.value
2204 if isinstance(other, int) or isinstance(other, long):
2205 return self.value != other
2206 return NotImplemented
2207 def __lt__(self, other):
2208 if isinstance(other, C):
2209 return self.value < other.value
2210 if isinstance(other, int) or isinstance(other, long):
2211 return self.value < other
2212 return NotImplemented
2213 def __le__(self, other):
2214 if isinstance(other, C):
2215 return self.value <= other.value
2216 if isinstance(other, int) or isinstance(other, long):
2217 return self.value <= other
2218 return NotImplemented
2219 def __gt__(self, other):
2220 if isinstance(other, C):
2221 return self.value > other.value
2222 if isinstance(other, int) or isinstance(other, long):
2223 return self.value > other
2224 return NotImplemented
2225 def __ge__(self, other):
2226 if isinstance(other, C):
2227 return self.value >= other.value
2228 if isinstance(other, int) or isinstance(other, long):
2229 return self.value >= other
2230 return NotImplemented
2231 c1 = C(1)
2232 c2 = C(2)
2233 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002235 c = {1: c1, 2: c2, 3: c3}
2236 for x in 1, 2, 3:
2237 for y in 1, 2, 3:
2238 for op in "<", "<=", "==", "!=", ">", ">=":
2239 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2240 "x=%d, y=%d" % (x, y))
2241 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2242 "x=%d, y=%d" % (x, y))
2243 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2244 "x=%d, y=%d" % (x, y))
2245
Guido van Rossum1952e382001-09-19 01:25:16 +00002246def coercions():
2247 if verbose: print "Testing coercions..."
2248 class I(int): pass
2249 coerce(I(0), 0)
2250 coerce(0, I(0))
2251 class L(long): pass
2252 coerce(L(0), 0)
2253 coerce(L(0), 0L)
2254 coerce(0, L(0))
2255 coerce(0L, L(0))
2256 class F(float): pass
2257 coerce(F(0), 0)
2258 coerce(F(0), 0L)
2259 coerce(F(0), 0.)
2260 coerce(0, F(0))
2261 coerce(0L, F(0))
2262 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002263 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002264 coerce(C(0), 0)
2265 coerce(C(0), 0L)
2266 coerce(C(0), 0.)
2267 coerce(C(0), 0j)
2268 coerce(0, C(0))
2269 coerce(0L, C(0))
2270 coerce(0., C(0))
2271 coerce(0j, C(0))
2272
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002273def descrdoc():
2274 if verbose: print "Testing descriptor doc strings..."
2275 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002277 check(file.closed, "flag set if the file is closed") # getset descriptor
2278 check(file.name, "file name") # member descriptor
2279
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002280def setclass():
2281 if verbose: print "Testing __class__ assignment..."
2282 class C(object): pass
2283 class D(object): pass
2284 class E(object): pass
2285 class F(D, E): pass
2286 for cls in C, D, E, F:
2287 for cls2 in C, D, E, F:
2288 x = cls()
2289 x.__class__ = cls2
2290 verify(x.__class__ is cls2)
2291 x.__class__ = cls
2292 verify(x.__class__ is cls)
2293 def cant(x, C):
2294 try:
2295 x.__class__ = C
2296 except TypeError:
2297 pass
2298 else:
2299 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2300 cant(C(), list)
2301 cant(list(), C)
2302 cant(C(), 1)
2303 cant(C(), object)
2304 cant(object(), list)
2305 cant(list(), object)
2306
Guido van Rossum6661be32001-10-26 04:26:12 +00002307def setdict():
2308 if verbose: print "Testing __dict__ assignment..."
2309 class C(object): pass
2310 a = C()
2311 a.__dict__ = {'b': 1}
2312 vereq(a.b, 1)
2313 def cant(x, dict):
2314 try:
2315 x.__dict__ = dict
2316 except TypeError:
2317 pass
2318 else:
2319 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2320 cant(a, None)
2321 cant(a, [])
2322 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002323 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002324 # Classes don't allow __dict__ assignment
2325 cant(C, {})
2326
Guido van Rossum3926a632001-09-25 16:25:58 +00002327def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002328 if verbose:
2329 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002330 import pickle, cPickle
2331
2332 def sorteditems(d):
2333 L = d.items()
2334 L.sort()
2335 return L
2336
2337 global C
2338 class C(object):
2339 def __init__(self, a, b):
2340 super(C, self).__init__()
2341 self.a = a
2342 self.b = b
2343 def __repr__(self):
2344 return "C(%r, %r)" % (self.a, self.b)
2345
2346 global C1
2347 class C1(list):
2348 def __new__(cls, a, b):
2349 return super(C1, cls).__new__(cls)
2350 def __init__(self, a, b):
2351 self.a = a
2352 self.b = b
2353 def __repr__(self):
2354 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2355
2356 global C2
2357 class C2(int):
2358 def __new__(cls, a, b, val=0):
2359 return super(C2, cls).__new__(cls, val)
2360 def __init__(self, a, b, val=0):
2361 self.a = a
2362 self.b = b
2363 def __repr__(self):
2364 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2365
Guido van Rossum90c45142001-11-24 21:07:01 +00002366 global C3
2367 class C3(object):
2368 def __init__(self, foo):
2369 self.foo = foo
2370 def __getstate__(self):
2371 return self.foo
2372 def __setstate__(self, foo):
2373 self.foo = foo
2374
2375 global C4classic, C4
2376 class C4classic: # classic
2377 pass
2378 class C4(C4classic, object): # mixed inheritance
2379 pass
2380
Guido van Rossum3926a632001-09-25 16:25:58 +00002381 for p in pickle, cPickle:
2382 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002383 if verbose:
2384 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002385
2386 for cls in C, C1, C2:
2387 s = p.dumps(cls, bin)
2388 cls2 = p.loads(s)
2389 verify(cls2 is cls)
2390
2391 a = C1(1, 2); a.append(42); a.append(24)
2392 b = C2("hello", "world", 42)
2393 s = p.dumps((a, b), bin)
2394 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002395 vereq(x.__class__, a.__class__)
2396 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2397 vereq(y.__class__, b.__class__)
2398 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2399 vereq(`x`, `a`)
2400 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002401 if verbose:
2402 print "a = x =", a
2403 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002404 # Test for __getstate__ and __setstate__ on new style class
2405 u = C3(42)
2406 s = p.dumps(u, bin)
2407 v = p.loads(s)
2408 veris(u.__class__, v.__class__)
2409 vereq(u.foo, v.foo)
2410 # Test for picklability of hybrid class
2411 u = C4()
2412 u.foo = 42
2413 s = p.dumps(u, bin)
2414 v = p.loads(s)
2415 veris(u.__class__, v.__class__)
2416 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002417
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002418 # Testing copy.deepcopy()
2419 if verbose:
2420 print "deepcopy"
2421 import copy
2422 for cls in C, C1, C2:
2423 cls2 = copy.deepcopy(cls)
2424 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002425
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002426 a = C1(1, 2); a.append(42); a.append(24)
2427 b = C2("hello", "world", 42)
2428 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002429 vereq(x.__class__, a.__class__)
2430 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2431 vereq(y.__class__, b.__class__)
2432 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2433 vereq(`x`, `a`)
2434 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002435 if verbose:
2436 print "a = x =", a
2437 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002438
2439def copies():
2440 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2441 import copy
2442 class C(object):
2443 pass
2444
2445 a = C()
2446 a.foo = 12
2447 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002448 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002449
2450 a.bar = [1,2,3]
2451 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002452 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002453 verify(c.bar is a.bar)
2454
2455 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002456 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002457 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002458 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002459
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002460def binopoverride():
2461 if verbose: print "Testing overrides of binary operations..."
2462 class I(int):
2463 def __repr__(self):
2464 return "I(%r)" % int(self)
2465 def __add__(self, other):
2466 return I(int(self) + int(other))
2467 __radd__ = __add__
2468 def __pow__(self, other, mod=None):
2469 if mod is None:
2470 return I(pow(int(self), int(other)))
2471 else:
2472 return I(pow(int(self), int(other), int(mod)))
2473 def __rpow__(self, other, mod=None):
2474 if mod is None:
2475 return I(pow(int(other), int(self), mod))
2476 else:
2477 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002478
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002479 vereq(`I(1) + I(2)`, "I(3)")
2480 vereq(`I(1) + 2`, "I(3)")
2481 vereq(`1 + I(2)`, "I(3)")
2482 vereq(`I(2) ** I(3)`, "I(8)")
2483 vereq(`2 ** I(3)`, "I(8)")
2484 vereq(`I(2) ** 3`, "I(8)")
2485 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2486 class S(str):
2487 def __eq__(self, other):
2488 return self.lower() == other.lower()
2489
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002490def subclasspropagation():
2491 if verbose: print "Testing propagation of slot functions to subclasses..."
2492 class A(object):
2493 pass
2494 class B(A):
2495 pass
2496 class C(A):
2497 pass
2498 class D(B, C):
2499 pass
2500 d = D()
2501 vereq(hash(d), id(d))
2502 A.__hash__ = lambda self: 42
2503 vereq(hash(d), 42)
2504 C.__hash__ = lambda self: 314
2505 vereq(hash(d), 314)
2506 B.__hash__ = lambda self: 144
2507 vereq(hash(d), 144)
2508 D.__hash__ = lambda self: 100
2509 vereq(hash(d), 100)
2510 del D.__hash__
2511 vereq(hash(d), 144)
2512 del B.__hash__
2513 vereq(hash(d), 314)
2514 del C.__hash__
2515 vereq(hash(d), 42)
2516 del A.__hash__
2517 vereq(hash(d), id(d))
2518 d.foo = 42
2519 d.bar = 42
2520 vereq(d.foo, 42)
2521 vereq(d.bar, 42)
2522 def __getattribute__(self, name):
2523 if name == "foo":
2524 return 24
2525 return object.__getattribute__(self, name)
2526 A.__getattribute__ = __getattribute__
2527 vereq(d.foo, 24)
2528 vereq(d.bar, 42)
2529 def __getattr__(self, name):
2530 if name in ("spam", "foo", "bar"):
2531 return "hello"
2532 raise AttributeError, name
2533 B.__getattr__ = __getattr__
2534 vereq(d.spam, "hello")
2535 vereq(d.foo, 24)
2536 vereq(d.bar, 42)
2537 del A.__getattribute__
2538 vereq(d.foo, 42)
2539 del d.foo
2540 vereq(d.foo, "hello")
2541 vereq(d.bar, 42)
2542 del B.__getattr__
2543 try:
2544 d.foo
2545 except AttributeError:
2546 pass
2547 else:
2548 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002549
2550def buffer_inherit():
2551 import binascii
2552 # SF bug [#470040] ParseTuple t# vs subclasses.
2553 if verbose:
2554 print "Testing that buffer interface is inherited ..."
2555
2556 class MyStr(str):
2557 pass
2558 base = 'abc'
2559 m = MyStr(base)
2560 # b2a_hex uses the buffer interface to get its argument's value, via
2561 # PyArg_ParseTuple 't#' code.
2562 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2563
2564 # It's not clear that unicode will continue to support the character
2565 # buffer interface, and this test will fail if that's taken away.
2566 class MyUni(unicode):
2567 pass
2568 base = u'abc'
2569 m = MyUni(base)
2570 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2571
2572 class MyInt(int):
2573 pass
2574 m = MyInt(42)
2575 try:
2576 binascii.b2a_hex(m)
2577 raise TestFailed('subclass of int should not have a buffer interface')
2578 except TypeError:
2579 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002580
Tim Petersc9933152001-10-16 20:18:24 +00002581def str_of_str_subclass():
2582 import binascii
2583 import cStringIO
2584
2585 if verbose:
2586 print "Testing __str__ defined in subclass of str ..."
2587
2588 class octetstring(str):
2589 def __str__(self):
2590 return binascii.b2a_hex(self)
2591 def __repr__(self):
2592 return self + " repr"
2593
2594 o = octetstring('A')
2595 vereq(type(o), octetstring)
2596 vereq(type(str(o)), str)
2597 vereq(type(repr(o)), str)
2598 vereq(ord(o), 0x41)
2599 vereq(str(o), '41')
2600 vereq(repr(o), 'A repr')
2601 vereq(o.__str__(), '41')
2602 vereq(o.__repr__(), 'A repr')
2603
2604 capture = cStringIO.StringIO()
2605 # Calling str() or not exercises different internal paths.
2606 print >> capture, o
2607 print >> capture, str(o)
2608 vereq(capture.getvalue(), '41\n41\n')
2609 capture.close()
2610
Guido van Rossumc8e56452001-10-22 00:43:43 +00002611def kwdargs():
2612 if verbose: print "Testing keyword arguments to __init__, __call__..."
2613 def f(a): return a
2614 vereq(f.__call__(a=42), 42)
2615 a = []
2616 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002617 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002618
Guido van Rossumed87ad82001-10-30 02:33:02 +00002619def delhook():
2620 if verbose: print "Testing __del__ hook..."
2621 log = []
2622 class C(object):
2623 def __del__(self):
2624 log.append(1)
2625 c = C()
2626 vereq(log, [])
2627 del c
2628 vereq(log, [1])
2629
Guido van Rossum29d26062001-12-11 04:37:34 +00002630 class D(object): pass
2631 d = D()
2632 try: del d[0]
2633 except TypeError: pass
2634 else: raise TestFailed, "invalid del() didn't raise TypeError"
2635
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002636def hashinherit():
2637 if verbose: print "Testing hash of mutable subclasses..."
2638
2639 class mydict(dict):
2640 pass
2641 d = mydict()
2642 try:
2643 hash(d)
2644 except TypeError:
2645 pass
2646 else:
2647 raise TestFailed, "hash() of dict subclass should fail"
2648
2649 class mylist(list):
2650 pass
2651 d = mylist()
2652 try:
2653 hash(d)
2654 except TypeError:
2655 pass
2656 else:
2657 raise TestFailed, "hash() of list subclass should fail"
2658
Guido van Rossum29d26062001-12-11 04:37:34 +00002659def strops():
2660 try: 'a' + 5
2661 except TypeError: pass
2662 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2663
2664 try: ''.split('')
2665 except ValueError: pass
2666 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2667
2668 try: ''.join([0])
2669 except TypeError: pass
2670 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2671
2672 try: ''.rindex('5')
2673 except ValueError: pass
2674 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2675
2676 try: ''.replace('', '')
2677 except ValueError: pass
2678 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2679
2680 try: '%(n)s' % None
2681 except TypeError: pass
2682 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2683
2684 try: '%(n' % {}
2685 except ValueError: pass
2686 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2687
2688 try: '%*s' % ('abc')
2689 except TypeError: pass
2690 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2691
2692 try: '%*.*s' % ('abc', 5)
2693 except TypeError: pass
2694 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2695
2696 try: '%s' % (1, 2)
2697 except TypeError: pass
2698 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2699
2700 try: '%' % None
2701 except ValueError: pass
2702 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2703
2704 vereq('534253'.isdigit(), 1)
2705 vereq('534253x'.isdigit(), 0)
2706 vereq('%c' % 5, '\x05')
2707 vereq('%c' % '5', '5')
2708
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002709def deepcopyrecursive():
2710 if verbose: print "Testing deepcopy of recursive objects..."
2711 class Node:
2712 pass
2713 a = Node()
2714 b = Node()
2715 a.b = b
2716 b.a = a
2717 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002718
2719
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002720def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002721 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002722 lists()
2723 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002724 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002725 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002726 ints()
2727 longs()
2728 floats()
2729 complexes()
2730 spamlists()
2731 spamdicts()
2732 pydicts()
2733 pylists()
2734 metaclass()
2735 pymods()
2736 multi()
2737 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002738 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002739 slots()
2740 dynamics()
2741 errors()
2742 classmethods()
2743 staticmethods()
2744 classic()
2745 compattr()
2746 newslot()
2747 altmro()
2748 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002749 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002750 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002751 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002752 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002753 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002754 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002755 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002756 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002757 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002758 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002759 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002760 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002761 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002762 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002763 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002764 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002765 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002766 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002767 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002768 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002769 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002770 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002771 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002772 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00002773 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002774 deepcopyrecursive()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002775 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002776
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002777if __name__ == "__main__":
2778 test_main()