blob: de9bba163660a0d4890a268bd4d2d54493ce9bd0 [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__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001754 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001755
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001756 class precfloat(float):
1757 __slots__ = ['prec']
1758 def __init__(self, value=0.0, prec=12):
1759 self.prec = int(prec)
1760 float.__init__(value)
1761 def __repr__(self):
1762 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001763 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001764 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001765 vereq(a, 12345.0)
1766 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001767 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001769 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001770
Tim Peters2400fa42001-09-12 19:12:49 +00001771 class madcomplex(complex):
1772 def __repr__(self):
1773 return "%.17gj%+.17g" % (self.imag, self.real)
1774 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001775 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001776 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001777 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001778 vereq(a, base)
1779 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001780 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001781 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001782 vereq(repr(a), "4j-3")
1783 vereq(a, base)
1784 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001785 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001786 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001787 veris((+a).__class__, complex)
1788 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001789 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001790 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001791 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001792 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001793 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001794 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001795 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001796
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001797 class madtuple(tuple):
1798 _rev = None
1799 def rev(self):
1800 if self._rev is not None:
1801 return self._rev
1802 L = list(self)
1803 L.reverse()
1804 self._rev = self.__class__(L)
1805 return self._rev
1806 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001807 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1808 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1809 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001810 for i in range(512):
1811 t = madtuple(range(i))
1812 u = t.rev()
1813 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001814 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001815 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001816 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001817 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001818 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001819 verify(a[:].__class__ is tuple)
1820 verify((a * 1).__class__ is tuple)
1821 verify((a * 0).__class__ is tuple)
1822 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001823 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001824 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001825 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001826 verify((a + a).__class__ is tuple)
1827 verify((a * 0).__class__ is tuple)
1828 verify((a * 1).__class__ is tuple)
1829 verify((a * 2).__class__ is tuple)
1830 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001831
1832 class madstring(str):
1833 _rev = None
1834 def rev(self):
1835 if self._rev is not None:
1836 return self._rev
1837 L = list(self)
1838 L.reverse()
1839 self._rev = self.__class__("".join(L))
1840 return self._rev
1841 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001842 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1843 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1844 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001845 for i in range(256):
1846 s = madstring("".join(map(chr, range(i))))
1847 t = s.rev()
1848 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001849 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001850 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001851 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001852 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001853
Tim Peters8fa5dd02001-09-12 02:18:30 +00001854 base = "\x00" * 5
1855 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001856 vereq(s, base)
1857 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001858 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001859 vereq(hash(s), hash(base))
1860 vereq({s: 1}[base], 1)
1861 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001862 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001863 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001864 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001865 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001866 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001867 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001868 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001869 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001870 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001871 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001872 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001873 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001874 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001875 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001876 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001877 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001878 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001879 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001880 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001881 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001882 identitytab = ''.join([chr(i) for i in range(256)])
1883 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001884 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001885 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001886 vereq(s.translate(identitytab, "x"), base)
1887 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001888 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001889 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001890 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001891 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001892 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001893 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001894 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001895 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001896 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001897 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001898
Tim Peters111f6092001-09-12 07:54:51 +00001899 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001900 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001901 verify(intern(s).__class__ is str)
1902 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001903 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001904
1905 i = intern("y x")
1906 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001907 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001908 verify(intern(s).__class__ is str)
1909 verify(intern(s) is i)
1910
1911 s = madstring(i)
1912 verify(intern(s).__class__ is str)
1913 verify(intern(s) is i)
1914
Guido van Rossum91ee7982001-08-30 20:52:40 +00001915 class madunicode(unicode):
1916 _rev = None
1917 def rev(self):
1918 if self._rev is not None:
1919 return self._rev
1920 L = list(self)
1921 L.reverse()
1922 self._rev = self.__class__(u"".join(L))
1923 return self._rev
1924 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001925 vereq(u, u"ABCDEF")
1926 vereq(u.rev(), madunicode(u"FEDCBA"))
1927 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001928 base = u"12345"
1929 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001930 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001931 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001932 vereq(hash(u), hash(base))
1933 vereq({u: 1}[base], 1)
1934 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001935 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001936 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001937 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001938 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001939 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001940 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001941 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001942 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001943 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001944 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001945 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001946 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001947 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001948 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001949 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001950 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001951 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001952 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001953 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001954 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001955 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001956 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001957 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001958 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001959 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001960 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001961 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001962 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001963 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001964 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001965 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001966 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001967 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001968 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001969 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001970 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001971 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001972 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001973
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001974 class sublist(list):
1975 pass
1976 a = sublist(range(5))
1977 vereq(a, range(5))
1978 a.append("hello")
1979 vereq(a, range(5) + ["hello"])
1980 a[5] = 5
1981 vereq(a, range(6))
1982 a.extend(range(6, 20))
1983 vereq(a, range(20))
1984 a[-5:] = []
1985 vereq(a, range(15))
1986 del a[10:15]
1987 vereq(len(a), 10)
1988 vereq(a, range(10))
1989 vereq(list(a), range(10))
1990 vereq(a[0], 0)
1991 vereq(a[9], 9)
1992 vereq(a[-10], 0)
1993 vereq(a[-1], 9)
1994 vereq(a[:5], range(5))
1995
Tim Peters59c9a642001-09-13 05:38:56 +00001996 class CountedInput(file):
1997 """Counts lines read by self.readline().
1998
1999 self.lineno is the 0-based ordinal of the last line read, up to
2000 a maximum of one greater than the number of lines in the file.
2001
2002 self.ateof is true if and only if the final "" line has been read,
2003 at which point self.lineno stops incrementing, and further calls
2004 to readline() continue to return "".
2005 """
2006
2007 lineno = 0
2008 ateof = 0
2009 def readline(self):
2010 if self.ateof:
2011 return ""
2012 s = file.readline(self)
2013 # Next line works too.
2014 # s = super(CountedInput, self).readline()
2015 self.lineno += 1
2016 if s == "":
2017 self.ateof = 1
2018 return s
2019
Tim Peters561f8992001-09-13 19:36:36 +00002020 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002021 lines = ['a\n', 'b\n', 'c\n']
2022 try:
2023 f.writelines(lines)
2024 f.close()
2025 f = CountedInput(TESTFN)
2026 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2027 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002028 vereq(expected, got)
2029 vereq(f.lineno, i)
2030 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002031 f.close()
2032 finally:
2033 try:
2034 f.close()
2035 except:
2036 pass
2037 try:
2038 import os
2039 os.unlink(TESTFN)
2040 except:
2041 pass
2042
Tim Peters808b94e2001-09-13 19:33:07 +00002043def keywords():
2044 if verbose:
2045 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002046 vereq(int(x=1), 1)
2047 vereq(float(x=2), 2.0)
2048 vereq(long(x=3), 3L)
2049 vereq(complex(imag=42, real=666), complex(666, 42))
2050 vereq(str(object=500), '500')
2051 vereq(unicode(string='abc', errors='strict'), u'abc')
2052 vereq(tuple(sequence=range(3)), (0, 1, 2))
2053 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002054 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002055
2056 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002057 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002058 try:
2059 constructor(bogus_keyword_arg=1)
2060 except TypeError:
2061 pass
2062 else:
2063 raise TestFailed("expected TypeError from bogus keyword "
2064 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002065
Tim Peters8fa45672001-09-13 21:01:29 +00002066def restricted():
2067 import rexec
2068 if verbose:
2069 print "Testing interaction with restricted execution ..."
2070
2071 sandbox = rexec.RExec()
2072
2073 code1 = """f = open(%r, 'w')""" % TESTFN
2074 code2 = """f = file(%r, 'w')""" % TESTFN
2075 code3 = """\
2076f = open(%r)
2077t = type(f) # a sneaky way to get the file() constructor
2078f.close()
2079f = t(%r, 'w') # rexec can't catch this by itself
2080""" % (TESTFN, TESTFN)
2081
2082 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2083 f.close()
2084
2085 try:
2086 for code in code1, code2, code3:
2087 try:
2088 sandbox.r_exec(code)
2089 except IOError, msg:
2090 if str(msg).find("restricted") >= 0:
2091 outcome = "OK"
2092 else:
2093 outcome = "got an exception, but not an expected one"
2094 else:
2095 outcome = "expected a restricted-execution exception"
2096
2097 if outcome != "OK":
2098 raise TestFailed("%s, in %r" % (outcome, code))
2099
2100 finally:
2101 try:
2102 import os
2103 os.unlink(TESTFN)
2104 except:
2105 pass
2106
Tim Peters0ab085c2001-09-14 00:25:33 +00002107def str_subclass_as_dict_key():
2108 if verbose:
2109 print "Testing a str subclass used as dict key .."
2110
2111 class cistr(str):
2112 """Sublcass of str that computes __eq__ case-insensitively.
2113
2114 Also computes a hash code of the string in canonical form.
2115 """
2116
2117 def __init__(self, value):
2118 self.canonical = value.lower()
2119 self.hashcode = hash(self.canonical)
2120
2121 def __eq__(self, other):
2122 if not isinstance(other, cistr):
2123 other = cistr(other)
2124 return self.canonical == other.canonical
2125
2126 def __hash__(self):
2127 return self.hashcode
2128
Guido van Rossum45704552001-10-08 16:35:45 +00002129 vereq(cistr('ABC'), 'abc')
2130 vereq('aBc', cistr('ABC'))
2131 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002132
2133 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002134 vereq(d[cistr('one')], 1)
2135 vereq(d[cistr('tWo')], 2)
2136 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002137 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002138 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002139
Guido van Rossumab3b0342001-09-18 20:38:53 +00002140def classic_comparisons():
2141 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002142 class classic:
2143 pass
2144 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002145 if verbose: print " (base = %s)" % base
2146 class C(base):
2147 def __init__(self, value):
2148 self.value = int(value)
2149 def __cmp__(self, other):
2150 if isinstance(other, C):
2151 return cmp(self.value, other.value)
2152 if isinstance(other, int) or isinstance(other, long):
2153 return cmp(self.value, other)
2154 return NotImplemented
2155 c1 = C(1)
2156 c2 = C(2)
2157 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002158 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002159 c = {1: c1, 2: c2, 3: c3}
2160 for x in 1, 2, 3:
2161 for y in 1, 2, 3:
2162 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2163 for op in "<", "<=", "==", "!=", ">", ">=":
2164 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2165 "x=%d, y=%d" % (x, y))
2166 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2167 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2168
Guido van Rossum0639f592001-09-18 21:06:04 +00002169def rich_comparisons():
2170 if verbose:
2171 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002172 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002173 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002174 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(z, 1+0j)
2176 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002177 class ZZ(complex):
2178 def __eq__(self, other):
2179 try:
2180 return abs(self - other) <= 1e-6
2181 except:
2182 return NotImplemented
2183 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002184 vereq(zz, 1+0j)
2185 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002186
Guido van Rossum0639f592001-09-18 21:06:04 +00002187 class classic:
2188 pass
2189 for base in (classic, int, object, list):
2190 if verbose: print " (base = %s)" % base
2191 class C(base):
2192 def __init__(self, value):
2193 self.value = int(value)
2194 def __cmp__(self, other):
2195 raise TestFailed, "shouldn't call __cmp__"
2196 def __eq__(self, other):
2197 if isinstance(other, C):
2198 return self.value == other.value
2199 if isinstance(other, int) or isinstance(other, long):
2200 return self.value == other
2201 return NotImplemented
2202 def __ne__(self, other):
2203 if isinstance(other, C):
2204 return self.value != other.value
2205 if isinstance(other, int) or isinstance(other, long):
2206 return self.value != other
2207 return NotImplemented
2208 def __lt__(self, other):
2209 if isinstance(other, C):
2210 return self.value < other.value
2211 if isinstance(other, int) or isinstance(other, long):
2212 return self.value < other
2213 return NotImplemented
2214 def __le__(self, other):
2215 if isinstance(other, C):
2216 return self.value <= other.value
2217 if isinstance(other, int) or isinstance(other, long):
2218 return self.value <= other
2219 return NotImplemented
2220 def __gt__(self, other):
2221 if isinstance(other, C):
2222 return self.value > other.value
2223 if isinstance(other, int) or isinstance(other, long):
2224 return self.value > other
2225 return NotImplemented
2226 def __ge__(self, other):
2227 if isinstance(other, C):
2228 return self.value >= other.value
2229 if isinstance(other, int) or isinstance(other, long):
2230 return self.value >= other
2231 return NotImplemented
2232 c1 = C(1)
2233 c2 = C(2)
2234 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002235 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002236 c = {1: c1, 2: c2, 3: c3}
2237 for x in 1, 2, 3:
2238 for y in 1, 2, 3:
2239 for op in "<", "<=", "==", "!=", ">", ">=":
2240 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2241 "x=%d, y=%d" % (x, y))
2242 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2243 "x=%d, y=%d" % (x, y))
2244 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2245 "x=%d, y=%d" % (x, y))
2246
Guido van Rossum1952e382001-09-19 01:25:16 +00002247def coercions():
2248 if verbose: print "Testing coercions..."
2249 class I(int): pass
2250 coerce(I(0), 0)
2251 coerce(0, I(0))
2252 class L(long): pass
2253 coerce(L(0), 0)
2254 coerce(L(0), 0L)
2255 coerce(0, L(0))
2256 coerce(0L, L(0))
2257 class F(float): pass
2258 coerce(F(0), 0)
2259 coerce(F(0), 0L)
2260 coerce(F(0), 0.)
2261 coerce(0, F(0))
2262 coerce(0L, F(0))
2263 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002264 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002265 coerce(C(0), 0)
2266 coerce(C(0), 0L)
2267 coerce(C(0), 0.)
2268 coerce(C(0), 0j)
2269 coerce(0, C(0))
2270 coerce(0L, C(0))
2271 coerce(0., C(0))
2272 coerce(0j, C(0))
2273
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002274def descrdoc():
2275 if verbose: print "Testing descriptor doc strings..."
2276 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002277 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002278 check(file.closed, "flag set if the file is closed") # getset descriptor
2279 check(file.name, "file name") # member descriptor
2280
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002281def setclass():
2282 if verbose: print "Testing __class__ assignment..."
2283 class C(object): pass
2284 class D(object): pass
2285 class E(object): pass
2286 class F(D, E): pass
2287 for cls in C, D, E, F:
2288 for cls2 in C, D, E, F:
2289 x = cls()
2290 x.__class__ = cls2
2291 verify(x.__class__ is cls2)
2292 x.__class__ = cls
2293 verify(x.__class__ is cls)
2294 def cant(x, C):
2295 try:
2296 x.__class__ = C
2297 except TypeError:
2298 pass
2299 else:
2300 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2301 cant(C(), list)
2302 cant(list(), C)
2303 cant(C(), 1)
2304 cant(C(), object)
2305 cant(object(), list)
2306 cant(list(), object)
2307
Guido van Rossum6661be32001-10-26 04:26:12 +00002308def setdict():
2309 if verbose: print "Testing __dict__ assignment..."
2310 class C(object): pass
2311 a = C()
2312 a.__dict__ = {'b': 1}
2313 vereq(a.b, 1)
2314 def cant(x, dict):
2315 try:
2316 x.__dict__ = dict
2317 except TypeError:
2318 pass
2319 else:
2320 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2321 cant(a, None)
2322 cant(a, [])
2323 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002324 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002325 # Classes don't allow __dict__ assignment
2326 cant(C, {})
2327
Guido van Rossum3926a632001-09-25 16:25:58 +00002328def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002329 if verbose:
2330 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002331 import pickle, cPickle
2332
2333 def sorteditems(d):
2334 L = d.items()
2335 L.sort()
2336 return L
2337
2338 global C
2339 class C(object):
2340 def __init__(self, a, b):
2341 super(C, self).__init__()
2342 self.a = a
2343 self.b = b
2344 def __repr__(self):
2345 return "C(%r, %r)" % (self.a, self.b)
2346
2347 global C1
2348 class C1(list):
2349 def __new__(cls, a, b):
2350 return super(C1, cls).__new__(cls)
2351 def __init__(self, a, b):
2352 self.a = a
2353 self.b = b
2354 def __repr__(self):
2355 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2356
2357 global C2
2358 class C2(int):
2359 def __new__(cls, a, b, val=0):
2360 return super(C2, cls).__new__(cls, val)
2361 def __init__(self, a, b, val=0):
2362 self.a = a
2363 self.b = b
2364 def __repr__(self):
2365 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2366
Guido van Rossum90c45142001-11-24 21:07:01 +00002367 global C3
2368 class C3(object):
2369 def __init__(self, foo):
2370 self.foo = foo
2371 def __getstate__(self):
2372 return self.foo
2373 def __setstate__(self, foo):
2374 self.foo = foo
2375
2376 global C4classic, C4
2377 class C4classic: # classic
2378 pass
2379 class C4(C4classic, object): # mixed inheritance
2380 pass
2381
Guido van Rossum3926a632001-09-25 16:25:58 +00002382 for p in pickle, cPickle:
2383 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002384 if verbose:
2385 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002386
2387 for cls in C, C1, C2:
2388 s = p.dumps(cls, bin)
2389 cls2 = p.loads(s)
2390 verify(cls2 is cls)
2391
2392 a = C1(1, 2); a.append(42); a.append(24)
2393 b = C2("hello", "world", 42)
2394 s = p.dumps((a, b), bin)
2395 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002396 vereq(x.__class__, a.__class__)
2397 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2398 vereq(y.__class__, b.__class__)
2399 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2400 vereq(`x`, `a`)
2401 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002402 if verbose:
2403 print "a = x =", a
2404 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002405 # Test for __getstate__ and __setstate__ on new style class
2406 u = C3(42)
2407 s = p.dumps(u, bin)
2408 v = p.loads(s)
2409 veris(u.__class__, v.__class__)
2410 vereq(u.foo, v.foo)
2411 # Test for picklability of hybrid class
2412 u = C4()
2413 u.foo = 42
2414 s = p.dumps(u, bin)
2415 v = p.loads(s)
2416 veris(u.__class__, v.__class__)
2417 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002418
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002419 # Testing copy.deepcopy()
2420 if verbose:
2421 print "deepcopy"
2422 import copy
2423 for cls in C, C1, C2:
2424 cls2 = copy.deepcopy(cls)
2425 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002426
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002427 a = C1(1, 2); a.append(42); a.append(24)
2428 b = C2("hello", "world", 42)
2429 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002430 vereq(x.__class__, a.__class__)
2431 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2432 vereq(y.__class__, b.__class__)
2433 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2434 vereq(`x`, `a`)
2435 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002436 if verbose:
2437 print "a = x =", a
2438 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002439
2440def copies():
2441 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2442 import copy
2443 class C(object):
2444 pass
2445
2446 a = C()
2447 a.foo = 12
2448 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002449 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002450
2451 a.bar = [1,2,3]
2452 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002453 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002454 verify(c.bar is a.bar)
2455
2456 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002457 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002458 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002459 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002460
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002461def binopoverride():
2462 if verbose: print "Testing overrides of binary operations..."
2463 class I(int):
2464 def __repr__(self):
2465 return "I(%r)" % int(self)
2466 def __add__(self, other):
2467 return I(int(self) + int(other))
2468 __radd__ = __add__
2469 def __pow__(self, other, mod=None):
2470 if mod is None:
2471 return I(pow(int(self), int(other)))
2472 else:
2473 return I(pow(int(self), int(other), int(mod)))
2474 def __rpow__(self, other, mod=None):
2475 if mod is None:
2476 return I(pow(int(other), int(self), mod))
2477 else:
2478 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002479
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002480 vereq(`I(1) + I(2)`, "I(3)")
2481 vereq(`I(1) + 2`, "I(3)")
2482 vereq(`1 + I(2)`, "I(3)")
2483 vereq(`I(2) ** I(3)`, "I(8)")
2484 vereq(`2 ** I(3)`, "I(8)")
2485 vereq(`I(2) ** 3`, "I(8)")
2486 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2487 class S(str):
2488 def __eq__(self, other):
2489 return self.lower() == other.lower()
2490
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002491def subclasspropagation():
2492 if verbose: print "Testing propagation of slot functions to subclasses..."
2493 class A(object):
2494 pass
2495 class B(A):
2496 pass
2497 class C(A):
2498 pass
2499 class D(B, C):
2500 pass
2501 d = D()
2502 vereq(hash(d), id(d))
2503 A.__hash__ = lambda self: 42
2504 vereq(hash(d), 42)
2505 C.__hash__ = lambda self: 314
2506 vereq(hash(d), 314)
2507 B.__hash__ = lambda self: 144
2508 vereq(hash(d), 144)
2509 D.__hash__ = lambda self: 100
2510 vereq(hash(d), 100)
2511 del D.__hash__
2512 vereq(hash(d), 144)
2513 del B.__hash__
2514 vereq(hash(d), 314)
2515 del C.__hash__
2516 vereq(hash(d), 42)
2517 del A.__hash__
2518 vereq(hash(d), id(d))
2519 d.foo = 42
2520 d.bar = 42
2521 vereq(d.foo, 42)
2522 vereq(d.bar, 42)
2523 def __getattribute__(self, name):
2524 if name == "foo":
2525 return 24
2526 return object.__getattribute__(self, name)
2527 A.__getattribute__ = __getattribute__
2528 vereq(d.foo, 24)
2529 vereq(d.bar, 42)
2530 def __getattr__(self, name):
2531 if name in ("spam", "foo", "bar"):
2532 return "hello"
2533 raise AttributeError, name
2534 B.__getattr__ = __getattr__
2535 vereq(d.spam, "hello")
2536 vereq(d.foo, 24)
2537 vereq(d.bar, 42)
2538 del A.__getattribute__
2539 vereq(d.foo, 42)
2540 del d.foo
2541 vereq(d.foo, "hello")
2542 vereq(d.bar, 42)
2543 del B.__getattr__
2544 try:
2545 d.foo
2546 except AttributeError:
2547 pass
2548 else:
2549 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002550
2551def buffer_inherit():
2552 import binascii
2553 # SF bug [#470040] ParseTuple t# vs subclasses.
2554 if verbose:
2555 print "Testing that buffer interface is inherited ..."
2556
2557 class MyStr(str):
2558 pass
2559 base = 'abc'
2560 m = MyStr(base)
2561 # b2a_hex uses the buffer interface to get its argument's value, via
2562 # PyArg_ParseTuple 't#' code.
2563 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2564
2565 # It's not clear that unicode will continue to support the character
2566 # buffer interface, and this test will fail if that's taken away.
2567 class MyUni(unicode):
2568 pass
2569 base = u'abc'
2570 m = MyUni(base)
2571 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2572
2573 class MyInt(int):
2574 pass
2575 m = MyInt(42)
2576 try:
2577 binascii.b2a_hex(m)
2578 raise TestFailed('subclass of int should not have a buffer interface')
2579 except TypeError:
2580 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002581
Tim Petersc9933152001-10-16 20:18:24 +00002582def str_of_str_subclass():
2583 import binascii
2584 import cStringIO
2585
2586 if verbose:
2587 print "Testing __str__ defined in subclass of str ..."
2588
2589 class octetstring(str):
2590 def __str__(self):
2591 return binascii.b2a_hex(self)
2592 def __repr__(self):
2593 return self + " repr"
2594
2595 o = octetstring('A')
2596 vereq(type(o), octetstring)
2597 vereq(type(str(o)), str)
2598 vereq(type(repr(o)), str)
2599 vereq(ord(o), 0x41)
2600 vereq(str(o), '41')
2601 vereq(repr(o), 'A repr')
2602 vereq(o.__str__(), '41')
2603 vereq(o.__repr__(), 'A repr')
2604
2605 capture = cStringIO.StringIO()
2606 # Calling str() or not exercises different internal paths.
2607 print >> capture, o
2608 print >> capture, str(o)
2609 vereq(capture.getvalue(), '41\n41\n')
2610 capture.close()
2611
Guido van Rossumc8e56452001-10-22 00:43:43 +00002612def kwdargs():
2613 if verbose: print "Testing keyword arguments to __init__, __call__..."
2614 def f(a): return a
2615 vereq(f.__call__(a=42), 42)
2616 a = []
2617 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002618 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002619
Guido van Rossumed87ad82001-10-30 02:33:02 +00002620def delhook():
2621 if verbose: print "Testing __del__ hook..."
2622 log = []
2623 class C(object):
2624 def __del__(self):
2625 log.append(1)
2626 c = C()
2627 vereq(log, [])
2628 del c
2629 vereq(log, [1])
2630
Guido van Rossum29d26062001-12-11 04:37:34 +00002631 class D(object): pass
2632 d = D()
2633 try: del d[0]
2634 except TypeError: pass
2635 else: raise TestFailed, "invalid del() didn't raise TypeError"
2636
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002637def hashinherit():
2638 if verbose: print "Testing hash of mutable subclasses..."
2639
2640 class mydict(dict):
2641 pass
2642 d = mydict()
2643 try:
2644 hash(d)
2645 except TypeError:
2646 pass
2647 else:
2648 raise TestFailed, "hash() of dict subclass should fail"
2649
2650 class mylist(list):
2651 pass
2652 d = mylist()
2653 try:
2654 hash(d)
2655 except TypeError:
2656 pass
2657 else:
2658 raise TestFailed, "hash() of list subclass should fail"
2659
Guido van Rossum29d26062001-12-11 04:37:34 +00002660def strops():
2661 try: 'a' + 5
2662 except TypeError: pass
2663 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2664
2665 try: ''.split('')
2666 except ValueError: pass
2667 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2668
2669 try: ''.join([0])
2670 except TypeError: pass
2671 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2672
2673 try: ''.rindex('5')
2674 except ValueError: pass
2675 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2676
2677 try: ''.replace('', '')
2678 except ValueError: pass
2679 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2680
2681 try: '%(n)s' % None
2682 except TypeError: pass
2683 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2684
2685 try: '%(n' % {}
2686 except ValueError: pass
2687 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2688
2689 try: '%*s' % ('abc')
2690 except TypeError: pass
2691 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2692
2693 try: '%*.*s' % ('abc', 5)
2694 except TypeError: pass
2695 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2696
2697 try: '%s' % (1, 2)
2698 except TypeError: pass
2699 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2700
2701 try: '%' % None
2702 except ValueError: pass
2703 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2704
2705 vereq('534253'.isdigit(), 1)
2706 vereq('534253x'.isdigit(), 0)
2707 vereq('%c' % 5, '\x05')
2708 vereq('%c' % '5', '5')
2709
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002710def deepcopyrecursive():
2711 if verbose: print "Testing deepcopy of recursive objects..."
2712 class Node:
2713 pass
2714 a = Node()
2715 b = Node()
2716 a.b = b
2717 b.a = a
2718 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002719
2720
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002721def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002722 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002723 lists()
2724 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002725 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002726 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002727 ints()
2728 longs()
2729 floats()
2730 complexes()
2731 spamlists()
2732 spamdicts()
2733 pydicts()
2734 pylists()
2735 metaclass()
2736 pymods()
2737 multi()
2738 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002739 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002740 slots()
2741 dynamics()
2742 errors()
2743 classmethods()
2744 staticmethods()
2745 classic()
2746 compattr()
2747 newslot()
2748 altmro()
2749 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002750 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002751 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002752 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002753 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002754 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002755 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002756 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002757 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002758 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002759 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002760 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002761 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002762 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002763 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002764 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002765 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002766 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002767 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002768 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002769 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002770 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002771 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002772 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002773 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00002774 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002775 deepcopyrecursive()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002776 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002777
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002778if __name__ == "__main__":
2779 test_main()