blob: a0958df94e07a4818f4e8dcbc8f1549e82d32c09 [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
Tim Peters6d6c1a32001-08-02 04:15:00 +0000771def pymods():
772 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000773 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000774 import sys
775 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000776 class MM(MT):
777 def __init__(self):
778 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000779 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000780 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000781 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000782 def __setattr__(self, name, value):
783 log.append(("setattr", name, value))
784 MT.__setattr__(self, name, value)
785 def __delattr__(self, name):
786 log.append(("delattr", name))
787 MT.__delattr__(self, name)
788 a = MM()
789 a.foo = 12
790 x = a.foo
791 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000792 vereq(log, [("setattr", "foo", 12),
793 ("getattr", "foo"),
794 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795
796def multi():
797 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798 class C(object):
799 def __init__(self):
800 self.__state = 0
801 def getstate(self):
802 return self.__state
803 def setstate(self, state):
804 self.__state = state
805 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000806 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000808 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000809 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000810 def __init__(self):
811 type({}).__init__(self)
812 C.__init__(self)
813 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000814 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000815 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000816 vereq(d.items(), [("hello", "world")])
817 vereq(d["hello"], "world")
818 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000820 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000821 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000822
Guido van Rossume45763a2001-08-10 21:28:46 +0000823 # SF bug #442833
824 class Node(object):
825 def __int__(self):
826 return int(self.foo())
827 def foo(self):
828 return "23"
829 class Frag(Node, list):
830 def foo(self):
831 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000832 vereq(Node().__int__(), 23)
833 vereq(int(Node()), 23)
834 vereq(Frag().__int__(), 42)
835 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000836
Tim Petersa91e9642001-11-14 23:32:33 +0000837 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000838
839 class A:
840 x = 1
841
842 class B(A):
843 pass
844
845 class C(A):
846 x = 2
847
848 class D(B, C):
849 pass
850 vereq(D.x, 1)
851
852 # Classic MRO is preserved for a classic base class.
853 class E(D, object):
854 pass
855 vereq(E.__mro__, (E, D, B, A, C, object))
856 vereq(E.x, 1)
857
858 # But with a mix of classic bases, their MROs are combined using
859 # new-style MRO.
860 class F(B, C, object):
861 pass
862 vereq(F.__mro__, (F, B, C, A, object))
863 vereq(F.x, 2)
864
865 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000866 class C:
867 def cmethod(self):
868 return "C a"
869 def all_method(self):
870 return "C b"
871
872 class M1(C, object):
873 def m1method(self):
874 return "M1 a"
875 def all_method(self):
876 return "M1 b"
877
878 vereq(M1.__mro__, (M1, C, object))
879 m = M1()
880 vereq(m.cmethod(), "C a")
881 vereq(m.m1method(), "M1 a")
882 vereq(m.all_method(), "M1 b")
883
884 class D(C):
885 def dmethod(self):
886 return "D a"
887 def all_method(self):
888 return "D b"
889
890 class M2(object, D):
891 def m2method(self):
892 return "M2 a"
893 def all_method(self):
894 return "M2 b"
895
896 vereq(M2.__mro__, (M2, object, D, C))
897 m = M2()
898 vereq(m.cmethod(), "C a")
899 vereq(m.dmethod(), "D a")
900 vereq(m.m2method(), "M2 a")
901 vereq(m.all_method(), "M2 b")
902
903 class M3(M1, object, M2):
904 def m3method(self):
905 return "M3 a"
906 def all_method(self):
907 return "M3 b"
908 # XXX Expected this (the commented-out result):
909 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
910 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000911 m = M3()
912 vereq(m.cmethod(), "C a")
913 vereq(m.dmethod(), "D a")
914 vereq(m.m1method(), "M1 a")
915 vereq(m.m2method(), "M2 a")
916 vereq(m.m3method(), "M3 a")
917 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000918
Tim Peters6d6c1a32001-08-02 04:15:00 +0000919def diamond():
920 if verbose: print "Testing multiple inheritance special cases..."
921 class A(object):
922 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000923 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000924 class B(A):
925 def boo(self): return "B"
926 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000927 vereq(B().spam(), "B")
928 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000929 class C(A):
930 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000931 vereq(C().spam(), "A")
932 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000933 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000934 vereq(D().spam(), "B")
935 vereq(D().boo(), "B")
936 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000937 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000938 vereq(E().spam(), "B")
939 vereq(E().boo(), "C")
940 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000941 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000942 vereq(F().spam(), "B")
943 vereq(F().boo(), "B")
944 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000945 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000946 vereq(G().spam(), "B")
947 vereq(G().boo(), "C")
948 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949
Guido van Rossum37202612001-08-09 19:45:21 +0000950def objects():
951 if verbose: print "Testing object class..."
952 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000953 vereq(a.__class__, object)
954 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000955 b = object()
956 verify(a is not b)
957 verify(not hasattr(a, "foo"))
958 try:
959 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000960 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000961 pass
962 else:
963 verify(0, "object() should not allow setting a foo attribute")
964 verify(not hasattr(object(), "__dict__"))
965
966 class Cdict(object):
967 pass
968 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000969 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000970 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000971 vereq(x.foo, 1)
972 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000973
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974def slots():
975 if verbose: print "Testing __slots__..."
976 class C0(object):
977 __slots__ = []
978 x = C0()
979 verify(not hasattr(x, "__dict__"))
980 verify(not hasattr(x, "foo"))
981
982 class C1(object):
983 __slots__ = ['a']
984 x = C1()
985 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +0000986 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000988 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +0000989 x.a = None
990 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000991 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +0000992 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000993
994 class C3(object):
995 __slots__ = ['a', 'b', 'c']
996 x = C3()
997 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +0000998 verify(not hasattr(x, 'a'))
999 verify(not hasattr(x, 'b'))
1000 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001001 x.a = 1
1002 x.b = 2
1003 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001004 vereq(x.a, 1)
1005 vereq(x.b, 2)
1006 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001007
Guido van Rossum33bab012001-12-05 22:45:48 +00001008 # Test leaks
1009 class Counted(object):
1010 counter = 0 # counts the number of instances alive
1011 def __init__(self):
1012 Counted.counter += 1
1013 def __del__(self):
1014 Counted.counter -= 1
1015 class C(object):
1016 __slots__ = ['a', 'b', 'c']
1017 x = C()
1018 x.a = Counted()
1019 x.b = Counted()
1020 x.c = Counted()
1021 vereq(Counted.counter, 3)
1022 del x
1023 vereq(Counted.counter, 0)
1024 class D(C):
1025 pass
1026 x = D()
1027 x.a = Counted()
1028 x.z = Counted()
1029 vereq(Counted.counter, 2)
1030 del x
1031 vereq(Counted.counter, 0)
1032 class E(D):
1033 __slots__ = ['e']
1034 x = E()
1035 x.a = Counted()
1036 x.z = Counted()
1037 x.e = Counted()
1038 vereq(Counted.counter, 3)
1039 del x
1040 vereq(Counted.counter, 0)
1041
Tim Peters6d6c1a32001-08-02 04:15:00 +00001042def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001043 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001044 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001045 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001046 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001047 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001048 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001049 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001050 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001051 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001052 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001053 vereq(E.foo, 1)
1054 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001055 # Test dynamic instances
1056 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001057 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001058 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001059 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001060 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001061 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001062 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001063 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001064 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001065 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001066 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001067 vereq(int(a), 100)
1068 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001069 verify(not hasattr(a, "spam"))
1070 def mygetattr(self, name):
1071 if name == "spam":
1072 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001073 raise AttributeError
1074 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001075 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001076 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001077 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001078 def mysetattr(self, name, value):
1079 if name == "spam":
1080 raise AttributeError
1081 return object.__setattr__(self, name, value)
1082 C.__setattr__ = mysetattr
1083 try:
1084 a.spam = "not spam"
1085 except AttributeError:
1086 pass
1087 else:
1088 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001089 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001090 class D(C):
1091 pass
1092 d = D()
1093 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001094 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001095
Guido van Rossum7e35d572001-09-15 03:14:32 +00001096 # Test handling of int*seq and seq*int
1097 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001098 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001099 vereq("a"*I(2), "aa")
1100 vereq(I(2)*"a", "aa")
1101 vereq(2*I(3), 6)
1102 vereq(I(3)*2, 6)
1103 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001104
1105 # Test handling of long*seq and seq*long
1106 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001107 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001108 vereq("a"*L(2L), "aa")
1109 vereq(L(2L)*"a", "aa")
1110 vereq(2*L(3), 6)
1111 vereq(L(3)*2, 6)
1112 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001113
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001114 # Test comparison of classes with dynamic metaclasses
1115 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001116 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001117 class someclass:
1118 __metaclass__ = dynamicmetaclass
1119 verify(someclass != object)
1120
Tim Peters6d6c1a32001-08-02 04:15:00 +00001121def errors():
1122 if verbose: print "Testing errors..."
1123
1124 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001125 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001126 pass
1127 except TypeError:
1128 pass
1129 else:
1130 verify(0, "inheritance from both list and dict should be illegal")
1131
1132 try:
1133 class C(object, None):
1134 pass
1135 except TypeError:
1136 pass
1137 else:
1138 verify(0, "inheritance from non-type should be illegal")
1139 class Classic:
1140 pass
1141
1142 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001143 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001144 pass
1145 except TypeError:
1146 pass
1147 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001148 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001149
1150 try:
1151 class C(object):
1152 __slots__ = 1
1153 except TypeError:
1154 pass
1155 else:
1156 verify(0, "__slots__ = 1 should be illegal")
1157
1158 try:
1159 class C(object):
1160 __slots__ = [1]
1161 except TypeError:
1162 pass
1163 else:
1164 verify(0, "__slots__ = [1] should be illegal")
1165
1166def classmethods():
1167 if verbose: print "Testing class methods..."
1168 class C(object):
1169 def foo(*a): return a
1170 goo = classmethod(foo)
1171 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001172 vereq(C.goo(1), (C, 1))
1173 vereq(c.goo(1), (C, 1))
1174 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001175 class D(C):
1176 pass
1177 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001178 vereq(D.goo(1), (D, 1))
1179 vereq(d.goo(1), (D, 1))
1180 vereq(d.foo(1), (d, 1))
1181 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001182
1183def staticmethods():
1184 if verbose: print "Testing static methods..."
1185 class C(object):
1186 def foo(*a): return a
1187 goo = staticmethod(foo)
1188 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001189 vereq(C.goo(1), (1,))
1190 vereq(c.goo(1), (1,))
1191 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001192 class D(C):
1193 pass
1194 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001195 vereq(D.goo(1), (1,))
1196 vereq(d.goo(1), (1,))
1197 vereq(d.foo(1), (d, 1))
1198 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199
1200def classic():
1201 if verbose: print "Testing classic classes..."
1202 class C:
1203 def foo(*a): return a
1204 goo = classmethod(foo)
1205 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001206 vereq(C.goo(1), (C, 1))
1207 vereq(c.goo(1), (C, 1))
1208 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001209 class D(C):
1210 pass
1211 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001212 vereq(D.goo(1), (D, 1))
1213 vereq(d.goo(1), (D, 1))
1214 vereq(d.foo(1), (d, 1))
1215 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001216 class E: # *not* subclassing from C
1217 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001218 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001219 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001220
1221def compattr():
1222 if verbose: print "Testing computed attributes..."
1223 class C(object):
1224 class computed_attribute(object):
1225 def __init__(self, get, set=None):
1226 self.__get = get
1227 self.__set = set
1228 def __get__(self, obj, type=None):
1229 return self.__get(obj)
1230 def __set__(self, obj, value):
1231 return self.__set(obj, value)
1232 def __init__(self):
1233 self.__x = 0
1234 def __get_x(self):
1235 x = self.__x
1236 self.__x = x+1
1237 return x
1238 def __set_x(self, x):
1239 self.__x = x
1240 x = computed_attribute(__get_x, __set_x)
1241 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001242 vereq(a.x, 0)
1243 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001244 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001245 vereq(a.x, 10)
1246 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001247
1248def newslot():
1249 if verbose: print "Testing __new__ slot override..."
1250 class C(list):
1251 def __new__(cls):
1252 self = list.__new__(cls)
1253 self.foo = 1
1254 return self
1255 def __init__(self):
1256 self.foo = self.foo + 2
1257 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001258 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001259 verify(a.__class__ is C)
1260 class D(C):
1261 pass
1262 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001263 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001264 verify(b.__class__ is D)
1265
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266def altmro():
1267 if verbose: print "Testing mro() and overriding it..."
1268 class A(object):
1269 def f(self): return "A"
1270 class B(A):
1271 pass
1272 class C(A):
1273 def f(self): return "C"
1274 class D(B, C):
1275 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001276 vereq(D.mro(), [D, B, C, A, object])
1277 vereq(D.__mro__, (D, B, C, A, object))
1278 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001279 class PerverseMetaType(type):
1280 def mro(cls):
1281 L = type.mro(cls)
1282 L.reverse()
1283 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001284 class X(A,B,C,D):
1285 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001286 vereq(X.__mro__, (object, A, C, B, D, X))
1287 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001288
1289def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001290 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001291
1292 class B(object):
1293 "Intermediate class because object doesn't have a __setattr__"
1294
1295 class C(B):
1296
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001297 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001298 if name == "foo":
1299 return ("getattr", name)
1300 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001301 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001302 def __setattr__(self, name, value):
1303 if name == "foo":
1304 self.setattr = (name, value)
1305 else:
1306 return B.__setattr__(self, name, value)
1307 def __delattr__(self, name):
1308 if name == "foo":
1309 self.delattr = name
1310 else:
1311 return B.__delattr__(self, name)
1312
1313 def __getitem__(self, key):
1314 return ("getitem", key)
1315 def __setitem__(self, key, value):
1316 self.setitem = (key, value)
1317 def __delitem__(self, key):
1318 self.delitem = key
1319
1320 def __getslice__(self, i, j):
1321 return ("getslice", i, j)
1322 def __setslice__(self, i, j, value):
1323 self.setslice = (i, j, value)
1324 def __delslice__(self, i, j):
1325 self.delslice = (i, j)
1326
1327 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001328 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001329 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001330 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001331 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001332 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001333
Guido van Rossum45704552001-10-08 16:35:45 +00001334 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001335 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001336 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001337 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001338 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001339
Guido van Rossum45704552001-10-08 16:35:45 +00001340 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001342 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001343 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001344 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001345
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001346def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001347 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001348 class C(object):
1349 def __init__(self, x):
1350 self.x = x
1351 def foo(self):
1352 return self.x
1353 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001354 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001355 class D(C):
1356 boo = C.foo
1357 goo = c1.foo
1358 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(d2.foo(), 2)
1360 vereq(d2.boo(), 2)
1361 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001362 class E(object):
1363 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001364 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001365 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001366
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001367def specials():
1368 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001369 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001370 # Test the default behavior for static classes
1371 class C(object):
1372 def __getitem__(self, i):
1373 if 0 <= i < 10: return i
1374 raise IndexError
1375 c1 = C()
1376 c2 = C()
1377 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001378 vereq(hash(c1), id(c1))
1379 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1380 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001381 verify(c1 != c2)
1382 verify(not c1 != c1)
1383 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001384 # Note that the module name appears in str/repr, and that varies
1385 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001386 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001387 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001388 verify(-1 not in c1)
1389 for i in range(10):
1390 verify(i in c1)
1391 verify(10 not in c1)
1392 # Test the default behavior for dynamic classes
1393 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001394 def __getitem__(self, i):
1395 if 0 <= i < 10: return i
1396 raise IndexError
1397 d1 = D()
1398 d2 = D()
1399 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001400 vereq(hash(d1), id(d1))
1401 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1402 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001403 verify(d1 != d2)
1404 verify(not d1 != d1)
1405 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001406 # Note that the module name appears in str/repr, and that varies
1407 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001408 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001409 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001410 verify(-1 not in d1)
1411 for i in range(10):
1412 verify(i in d1)
1413 verify(10 not in d1)
1414 # Test overridden behavior for static classes
1415 class Proxy(object):
1416 def __init__(self, x):
1417 self.x = x
1418 def __nonzero__(self):
1419 return not not self.x
1420 def __hash__(self):
1421 return hash(self.x)
1422 def __eq__(self, other):
1423 return self.x == other
1424 def __ne__(self, other):
1425 return self.x != other
1426 def __cmp__(self, other):
1427 return cmp(self.x, other.x)
1428 def __str__(self):
1429 return "Proxy:%s" % self.x
1430 def __repr__(self):
1431 return "Proxy(%r)" % self.x
1432 def __contains__(self, value):
1433 return value in self.x
1434 p0 = Proxy(0)
1435 p1 = Proxy(1)
1436 p_1 = Proxy(-1)
1437 verify(not p0)
1438 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001439 vereq(hash(p0), hash(0))
1440 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001441 verify(p0 != p1)
1442 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001443 vereq(not p0, p1)
1444 vereq(cmp(p0, p1), -1)
1445 vereq(cmp(p0, p0), 0)
1446 vereq(cmp(p0, p_1), 1)
1447 vereq(str(p0), "Proxy:0")
1448 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001449 p10 = Proxy(range(10))
1450 verify(-1 not in p10)
1451 for i in range(10):
1452 verify(i in p10)
1453 verify(10 not in p10)
1454 # Test overridden behavior for dynamic classes
1455 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001456 def __init__(self, x):
1457 self.x = x
1458 def __nonzero__(self):
1459 return not not self.x
1460 def __hash__(self):
1461 return hash(self.x)
1462 def __eq__(self, other):
1463 return self.x == other
1464 def __ne__(self, other):
1465 return self.x != other
1466 def __cmp__(self, other):
1467 return cmp(self.x, other.x)
1468 def __str__(self):
1469 return "DProxy:%s" % self.x
1470 def __repr__(self):
1471 return "DProxy(%r)" % self.x
1472 def __contains__(self, value):
1473 return value in self.x
1474 p0 = DProxy(0)
1475 p1 = DProxy(1)
1476 p_1 = DProxy(-1)
1477 verify(not p0)
1478 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001479 vereq(hash(p0), hash(0))
1480 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001481 verify(p0 != p1)
1482 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001483 vereq(not p0, p1)
1484 vereq(cmp(p0, p1), -1)
1485 vereq(cmp(p0, p0), 0)
1486 vereq(cmp(p0, p_1), 1)
1487 vereq(str(p0), "DProxy:0")
1488 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001489 p10 = DProxy(range(10))
1490 verify(-1 not in p10)
1491 for i in range(10):
1492 verify(i in p10)
1493 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001494 # Safety test for __cmp__
1495 def unsafecmp(a, b):
1496 try:
1497 a.__class__.__cmp__(a, b)
1498 except TypeError:
1499 pass
1500 else:
1501 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1502 a.__class__, a, b)
1503 unsafecmp(u"123", "123")
1504 unsafecmp("123", u"123")
1505 unsafecmp(1, 1.0)
1506 unsafecmp(1.0, 1)
1507 unsafecmp(1, 1L)
1508 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001509
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001510def weakrefs():
1511 if verbose: print "Testing weak references..."
1512 import weakref
1513 class C(object):
1514 pass
1515 c = C()
1516 r = weakref.ref(c)
1517 verify(r() is c)
1518 del c
1519 verify(r() is None)
1520 del r
1521 class NoWeak(object):
1522 __slots__ = ['foo']
1523 no = NoWeak()
1524 try:
1525 weakref.ref(no)
1526 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001527 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001528 else:
1529 verify(0, "weakref.ref(no) should be illegal")
1530 class Weak(object):
1531 __slots__ = ['foo', '__weakref__']
1532 yes = Weak()
1533 r = weakref.ref(yes)
1534 verify(r() is yes)
1535 del yes
1536 verify(r() is None)
1537 del r
1538
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001539def properties():
1540 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001541 class C(object):
1542 def getx(self):
1543 return self.__x
1544 def setx(self, value):
1545 self.__x = value
1546 def delx(self):
1547 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001548 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001549 a = C()
1550 verify(not hasattr(a, "x"))
1551 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001552 vereq(a._C__x, 42)
1553 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001554 del a.x
1555 verify(not hasattr(a, "x"))
1556 verify(not hasattr(a, "_C__x"))
1557 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001558 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001559## C.x.__set__(a)
1560## verify(not hasattr(a, "x"))
1561
Tim Peters66c1a522001-09-24 21:17:50 +00001562 raw = C.__dict__['x']
1563 verify(isinstance(raw, property))
1564
1565 attrs = dir(raw)
1566 verify("__doc__" in attrs)
1567 verify("fget" in attrs)
1568 verify("fset" in attrs)
1569 verify("fdel" in attrs)
1570
Guido van Rossum45704552001-10-08 16:35:45 +00001571 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001572 verify(raw.fget is C.__dict__['getx'])
1573 verify(raw.fset is C.__dict__['setx'])
1574 verify(raw.fdel is C.__dict__['delx'])
1575
1576 for attr in "__doc__", "fget", "fset", "fdel":
1577 try:
1578 setattr(raw, attr, 42)
1579 except TypeError, msg:
1580 if str(msg).find('readonly') < 0:
1581 raise TestFailed("when setting readonly attr %r on a "
1582 "property, got unexpected TypeError "
1583 "msg %r" % (attr, str(msg)))
1584 else:
1585 raise TestFailed("expected TypeError from trying to set "
1586 "readonly %r attr on a property" % attr)
1587
Guido van Rossumc4a18802001-08-24 16:55:27 +00001588def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001589 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001590
1591 class A(object):
1592 def meth(self, a):
1593 return "A(%r)" % a
1594
Guido van Rossum45704552001-10-08 16:35:45 +00001595 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001596
1597 class B(A):
1598 def __init__(self):
1599 self.__super = super(B, self)
1600 def meth(self, a):
1601 return "B(%r)" % a + self.__super.meth(a)
1602
Guido van Rossum45704552001-10-08 16:35:45 +00001603 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001604
1605 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001606 def meth(self, a):
1607 return "C(%r)" % a + self.__super.meth(a)
1608 C._C__super = super(C)
1609
Guido van Rossum45704552001-10-08 16:35:45 +00001610 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001611
1612 class D(C, B):
1613 def meth(self, a):
1614 return "D(%r)" % a + super(D, self).meth(a)
1615
Guido van Rossum5b443c62001-12-03 15:38:28 +00001616 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1617
1618 # Test for subclassing super
1619
1620 class mysuper(super):
1621 def __init__(self, *args):
1622 return super(mysuper, self).__init__(*args)
1623
1624 class E(D):
1625 def meth(self, a):
1626 return "E(%r)" % a + mysuper(E, self).meth(a)
1627
1628 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1629
1630 class F(E):
1631 def meth(self, a):
1632 s = self.__super
1633 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1634 F._F__super = mysuper(F)
1635
1636 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1637
1638 # Make sure certain errors are raised
1639
1640 try:
1641 super(D, 42)
1642 except TypeError:
1643 pass
1644 else:
1645 raise TestFailed, "shouldn't allow super(D, 42)"
1646
1647 try:
1648 super(D, C())
1649 except TypeError:
1650 pass
1651 else:
1652 raise TestFailed, "shouldn't allow super(D, C())"
1653
1654 try:
1655 super(D).__get__(12)
1656 except TypeError:
1657 pass
1658 else:
1659 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1660
1661 try:
1662 super(D).__get__(C())
1663 except TypeError:
1664 pass
1665 else:
1666 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001667
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001668def inherits():
1669 if verbose: print "Testing inheritance from basic types..."
1670
1671 class hexint(int):
1672 def __repr__(self):
1673 return hex(self)
1674 def __add__(self, other):
1675 return hexint(int.__add__(self, other))
1676 # (Note that overriding __radd__ doesn't work,
1677 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001678 vereq(repr(hexint(7) + 9), "0x10")
1679 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001680 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(a, 12345)
1682 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001683 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001684 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001685 verify((+a).__class__ is int)
1686 verify((a >> 0).__class__ is int)
1687 verify((a << 0).__class__ is int)
1688 verify((hexint(0) << 12).__class__ is int)
1689 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001690
1691 class octlong(long):
1692 __slots__ = []
1693 def __str__(self):
1694 s = oct(self)
1695 if s[-1] == 'L':
1696 s = s[:-1]
1697 return s
1698 def __add__(self, other):
1699 return self.__class__(super(octlong, self).__add__(other))
1700 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001701 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001702 # (Note that overriding __radd__ here only seems to work
1703 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001704 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001705 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001706 vereq(a, 12345L)
1707 vereq(long(a), 12345L)
1708 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001709 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001710 verify((+a).__class__ is long)
1711 verify((-a).__class__ is long)
1712 verify((-octlong(0)).__class__ is long)
1713 verify((a >> 0).__class__ is long)
1714 verify((a << 0).__class__ is long)
1715 verify((a - 0).__class__ is long)
1716 verify((a * 1).__class__ is long)
1717 verify((a ** 1).__class__ is long)
1718 verify((a // 1).__class__ is long)
1719 verify((1 * a).__class__ is long)
1720 verify((a | 0).__class__ is long)
1721 verify((a ^ 0).__class__ is long)
1722 verify((a & -1L).__class__ is long)
1723 verify((octlong(0) << 12).__class__ is long)
1724 verify((octlong(0) >> 12).__class__ is long)
1725 verify(abs(octlong(0)).__class__ is long)
1726
1727 # Because octlong overrides __add__, we can't check the absence of +0
1728 # optimizations using octlong.
1729 class longclone(long):
1730 pass
1731 a = longclone(1)
1732 verify((a + 0).__class__ is long)
1733 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001734
1735 class precfloat(float):
1736 __slots__ = ['prec']
1737 def __init__(self, value=0.0, prec=12):
1738 self.prec = int(prec)
1739 float.__init__(value)
1740 def __repr__(self):
1741 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001742 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001743 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001744 vereq(a, 12345.0)
1745 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001746 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001747 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001748 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001749
Tim Peters2400fa42001-09-12 19:12:49 +00001750 class madcomplex(complex):
1751 def __repr__(self):
1752 return "%.17gj%+.17g" % (self.imag, self.real)
1753 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001754 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001755 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001756 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001757 vereq(a, base)
1758 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001759 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001760 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001761 vereq(repr(a), "4j-3")
1762 vereq(a, base)
1763 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001764 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001765 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001766 veris((+a).__class__, complex)
1767 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001769 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001770 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001771 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001772 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001773 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001774 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001775
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001776 class madtuple(tuple):
1777 _rev = None
1778 def rev(self):
1779 if self._rev is not None:
1780 return self._rev
1781 L = list(self)
1782 L.reverse()
1783 self._rev = self.__class__(L)
1784 return self._rev
1785 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001786 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1787 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1788 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001789 for i in range(512):
1790 t = madtuple(range(i))
1791 u = t.rev()
1792 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001793 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001794 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001795 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001796 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001797 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001798 verify(a[:].__class__ is tuple)
1799 verify((a * 1).__class__ is tuple)
1800 verify((a * 0).__class__ is tuple)
1801 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001802 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001803 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001804 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001805 verify((a + a).__class__ is tuple)
1806 verify((a * 0).__class__ is tuple)
1807 verify((a * 1).__class__ is tuple)
1808 verify((a * 2).__class__ is tuple)
1809 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001810
1811 class madstring(str):
1812 _rev = None
1813 def rev(self):
1814 if self._rev is not None:
1815 return self._rev
1816 L = list(self)
1817 L.reverse()
1818 self._rev = self.__class__("".join(L))
1819 return self._rev
1820 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001821 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1822 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1823 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001824 for i in range(256):
1825 s = madstring("".join(map(chr, range(i))))
1826 t = s.rev()
1827 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001828 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001829 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001830 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001831 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001832
Tim Peters8fa5dd02001-09-12 02:18:30 +00001833 base = "\x00" * 5
1834 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001835 vereq(s, base)
1836 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001837 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001838 vereq(hash(s), hash(base))
1839 vereq({s: 1}[base], 1)
1840 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001841 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001842 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001843 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001844 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001845 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001846 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001847 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001848 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001849 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001850 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001851 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001852 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001853 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001854 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001855 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001856 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001857 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001858 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001859 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001860 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001861 identitytab = ''.join([chr(i) for i in range(256)])
1862 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001863 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001864 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001865 vereq(s.translate(identitytab, "x"), base)
1866 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001867 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001868 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001869 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001870 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001871 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001872 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001873 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001874 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001875 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001876 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001877
Tim Peters111f6092001-09-12 07:54:51 +00001878 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001879 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001880 verify(intern(s).__class__ is str)
1881 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001882 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001883
1884 i = intern("y x")
1885 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001886 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001887 verify(intern(s).__class__ is str)
1888 verify(intern(s) is i)
1889
1890 s = madstring(i)
1891 verify(intern(s).__class__ is str)
1892 verify(intern(s) is i)
1893
Guido van Rossum91ee7982001-08-30 20:52:40 +00001894 class madunicode(unicode):
1895 _rev = None
1896 def rev(self):
1897 if self._rev is not None:
1898 return self._rev
1899 L = list(self)
1900 L.reverse()
1901 self._rev = self.__class__(u"".join(L))
1902 return self._rev
1903 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001904 vereq(u, u"ABCDEF")
1905 vereq(u.rev(), madunicode(u"FEDCBA"))
1906 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001907 base = u"12345"
1908 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001909 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001910 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001911 vereq(hash(u), hash(base))
1912 vereq({u: 1}[base], 1)
1913 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001914 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001915 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001916 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001917 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001918 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001919 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001920 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001921 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001922 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001923 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001924 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001925 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001926 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001927 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001928 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001929 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001930 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001931 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001932 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001933 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001934 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001936 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001937 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001938 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001939 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001940 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001941 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001942 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001944 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001945 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001946 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001947 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001948 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001949 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001950 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001951 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001952
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001953 class sublist(list):
1954 pass
1955 a = sublist(range(5))
1956 vereq(a, range(5))
1957 a.append("hello")
1958 vereq(a, range(5) + ["hello"])
1959 a[5] = 5
1960 vereq(a, range(6))
1961 a.extend(range(6, 20))
1962 vereq(a, range(20))
1963 a[-5:] = []
1964 vereq(a, range(15))
1965 del a[10:15]
1966 vereq(len(a), 10)
1967 vereq(a, range(10))
1968 vereq(list(a), range(10))
1969 vereq(a[0], 0)
1970 vereq(a[9], 9)
1971 vereq(a[-10], 0)
1972 vereq(a[-1], 9)
1973 vereq(a[:5], range(5))
1974
Tim Peters59c9a642001-09-13 05:38:56 +00001975 class CountedInput(file):
1976 """Counts lines read by self.readline().
1977
1978 self.lineno is the 0-based ordinal of the last line read, up to
1979 a maximum of one greater than the number of lines in the file.
1980
1981 self.ateof is true if and only if the final "" line has been read,
1982 at which point self.lineno stops incrementing, and further calls
1983 to readline() continue to return "".
1984 """
1985
1986 lineno = 0
1987 ateof = 0
1988 def readline(self):
1989 if self.ateof:
1990 return ""
1991 s = file.readline(self)
1992 # Next line works too.
1993 # s = super(CountedInput, self).readline()
1994 self.lineno += 1
1995 if s == "":
1996 self.ateof = 1
1997 return s
1998
Tim Peters561f8992001-09-13 19:36:36 +00001999 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002000 lines = ['a\n', 'b\n', 'c\n']
2001 try:
2002 f.writelines(lines)
2003 f.close()
2004 f = CountedInput(TESTFN)
2005 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2006 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002007 vereq(expected, got)
2008 vereq(f.lineno, i)
2009 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002010 f.close()
2011 finally:
2012 try:
2013 f.close()
2014 except:
2015 pass
2016 try:
2017 import os
2018 os.unlink(TESTFN)
2019 except:
2020 pass
2021
Tim Peters808b94e2001-09-13 19:33:07 +00002022def keywords():
2023 if verbose:
2024 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002025 vereq(int(x=1), 1)
2026 vereq(float(x=2), 2.0)
2027 vereq(long(x=3), 3L)
2028 vereq(complex(imag=42, real=666), complex(666, 42))
2029 vereq(str(object=500), '500')
2030 vereq(unicode(string='abc', errors='strict'), u'abc')
2031 vereq(tuple(sequence=range(3)), (0, 1, 2))
2032 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002033 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002034
2035 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002036 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002037 try:
2038 constructor(bogus_keyword_arg=1)
2039 except TypeError:
2040 pass
2041 else:
2042 raise TestFailed("expected TypeError from bogus keyword "
2043 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002044
Tim Peters8fa45672001-09-13 21:01:29 +00002045def restricted():
2046 import rexec
2047 if verbose:
2048 print "Testing interaction with restricted execution ..."
2049
2050 sandbox = rexec.RExec()
2051
2052 code1 = """f = open(%r, 'w')""" % TESTFN
2053 code2 = """f = file(%r, 'w')""" % TESTFN
2054 code3 = """\
2055f = open(%r)
2056t = type(f) # a sneaky way to get the file() constructor
2057f.close()
2058f = t(%r, 'w') # rexec can't catch this by itself
2059""" % (TESTFN, TESTFN)
2060
2061 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2062 f.close()
2063
2064 try:
2065 for code in code1, code2, code3:
2066 try:
2067 sandbox.r_exec(code)
2068 except IOError, msg:
2069 if str(msg).find("restricted") >= 0:
2070 outcome = "OK"
2071 else:
2072 outcome = "got an exception, but not an expected one"
2073 else:
2074 outcome = "expected a restricted-execution exception"
2075
2076 if outcome != "OK":
2077 raise TestFailed("%s, in %r" % (outcome, code))
2078
2079 finally:
2080 try:
2081 import os
2082 os.unlink(TESTFN)
2083 except:
2084 pass
2085
Tim Peters0ab085c2001-09-14 00:25:33 +00002086def str_subclass_as_dict_key():
2087 if verbose:
2088 print "Testing a str subclass used as dict key .."
2089
2090 class cistr(str):
2091 """Sublcass of str that computes __eq__ case-insensitively.
2092
2093 Also computes a hash code of the string in canonical form.
2094 """
2095
2096 def __init__(self, value):
2097 self.canonical = value.lower()
2098 self.hashcode = hash(self.canonical)
2099
2100 def __eq__(self, other):
2101 if not isinstance(other, cistr):
2102 other = cistr(other)
2103 return self.canonical == other.canonical
2104
2105 def __hash__(self):
2106 return self.hashcode
2107
Guido van Rossum45704552001-10-08 16:35:45 +00002108 vereq(cistr('ABC'), 'abc')
2109 vereq('aBc', cistr('ABC'))
2110 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002111
2112 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002113 vereq(d[cistr('one')], 1)
2114 vereq(d[cistr('tWo')], 2)
2115 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002116 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002117 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002118
Guido van Rossumab3b0342001-09-18 20:38:53 +00002119def classic_comparisons():
2120 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002121 class classic:
2122 pass
2123 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002124 if verbose: print " (base = %s)" % base
2125 class C(base):
2126 def __init__(self, value):
2127 self.value = int(value)
2128 def __cmp__(self, other):
2129 if isinstance(other, C):
2130 return cmp(self.value, other.value)
2131 if isinstance(other, int) or isinstance(other, long):
2132 return cmp(self.value, other)
2133 return NotImplemented
2134 c1 = C(1)
2135 c2 = C(2)
2136 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002137 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002138 c = {1: c1, 2: c2, 3: c3}
2139 for x in 1, 2, 3:
2140 for y in 1, 2, 3:
2141 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2142 for op in "<", "<=", "==", "!=", ">", ">=":
2143 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2144 "x=%d, y=%d" % (x, y))
2145 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2146 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2147
Guido van Rossum0639f592001-09-18 21:06:04 +00002148def rich_comparisons():
2149 if verbose:
2150 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002151 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002152 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002153 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002154 vereq(z, 1+0j)
2155 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002156 class ZZ(complex):
2157 def __eq__(self, other):
2158 try:
2159 return abs(self - other) <= 1e-6
2160 except:
2161 return NotImplemented
2162 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002163 vereq(zz, 1+0j)
2164 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002165
Guido van Rossum0639f592001-09-18 21:06:04 +00002166 class classic:
2167 pass
2168 for base in (classic, int, object, list):
2169 if verbose: print " (base = %s)" % base
2170 class C(base):
2171 def __init__(self, value):
2172 self.value = int(value)
2173 def __cmp__(self, other):
2174 raise TestFailed, "shouldn't call __cmp__"
2175 def __eq__(self, other):
2176 if isinstance(other, C):
2177 return self.value == other.value
2178 if isinstance(other, int) or isinstance(other, long):
2179 return self.value == other
2180 return NotImplemented
2181 def __ne__(self, other):
2182 if isinstance(other, C):
2183 return self.value != other.value
2184 if isinstance(other, int) or isinstance(other, long):
2185 return self.value != other
2186 return NotImplemented
2187 def __lt__(self, other):
2188 if isinstance(other, C):
2189 return self.value < other.value
2190 if isinstance(other, int) or isinstance(other, long):
2191 return self.value < other
2192 return NotImplemented
2193 def __le__(self, other):
2194 if isinstance(other, C):
2195 return self.value <= other.value
2196 if isinstance(other, int) or isinstance(other, long):
2197 return self.value <= other
2198 return NotImplemented
2199 def __gt__(self, other):
2200 if isinstance(other, C):
2201 return self.value > other.value
2202 if isinstance(other, int) or isinstance(other, long):
2203 return self.value > other
2204 return NotImplemented
2205 def __ge__(self, other):
2206 if isinstance(other, C):
2207 return self.value >= other.value
2208 if isinstance(other, int) or isinstance(other, long):
2209 return self.value >= other
2210 return NotImplemented
2211 c1 = C(1)
2212 c2 = C(2)
2213 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002215 c = {1: c1, 2: c2, 3: c3}
2216 for x in 1, 2, 3:
2217 for y in 1, 2, 3:
2218 for op in "<", "<=", "==", "!=", ">", ">=":
2219 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2220 "x=%d, y=%d" % (x, y))
2221 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2222 "x=%d, y=%d" % (x, y))
2223 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2224 "x=%d, y=%d" % (x, y))
2225
Guido van Rossum1952e382001-09-19 01:25:16 +00002226def coercions():
2227 if verbose: print "Testing coercions..."
2228 class I(int): pass
2229 coerce(I(0), 0)
2230 coerce(0, I(0))
2231 class L(long): pass
2232 coerce(L(0), 0)
2233 coerce(L(0), 0L)
2234 coerce(0, L(0))
2235 coerce(0L, L(0))
2236 class F(float): pass
2237 coerce(F(0), 0)
2238 coerce(F(0), 0L)
2239 coerce(F(0), 0.)
2240 coerce(0, F(0))
2241 coerce(0L, F(0))
2242 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002243 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002244 coerce(C(0), 0)
2245 coerce(C(0), 0L)
2246 coerce(C(0), 0.)
2247 coerce(C(0), 0j)
2248 coerce(0, C(0))
2249 coerce(0L, C(0))
2250 coerce(0., C(0))
2251 coerce(0j, C(0))
2252
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002253def descrdoc():
2254 if verbose: print "Testing descriptor doc strings..."
2255 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002257 check(file.closed, "flag set if the file is closed") # getset descriptor
2258 check(file.name, "file name") # member descriptor
2259
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002260def setclass():
2261 if verbose: print "Testing __class__ assignment..."
2262 class C(object): pass
2263 class D(object): pass
2264 class E(object): pass
2265 class F(D, E): pass
2266 for cls in C, D, E, F:
2267 for cls2 in C, D, E, F:
2268 x = cls()
2269 x.__class__ = cls2
2270 verify(x.__class__ is cls2)
2271 x.__class__ = cls
2272 verify(x.__class__ is cls)
2273 def cant(x, C):
2274 try:
2275 x.__class__ = C
2276 except TypeError:
2277 pass
2278 else:
2279 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2280 cant(C(), list)
2281 cant(list(), C)
2282 cant(C(), 1)
2283 cant(C(), object)
2284 cant(object(), list)
2285 cant(list(), object)
2286
Guido van Rossum6661be32001-10-26 04:26:12 +00002287def setdict():
2288 if verbose: print "Testing __dict__ assignment..."
2289 class C(object): pass
2290 a = C()
2291 a.__dict__ = {'b': 1}
2292 vereq(a.b, 1)
2293 def cant(x, dict):
2294 try:
2295 x.__dict__ = dict
2296 except TypeError:
2297 pass
2298 else:
2299 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2300 cant(a, None)
2301 cant(a, [])
2302 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002303 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002304 # Classes don't allow __dict__ assignment
2305 cant(C, {})
2306
Guido van Rossum3926a632001-09-25 16:25:58 +00002307def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002308 if verbose:
2309 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002310 import pickle, cPickle
2311
2312 def sorteditems(d):
2313 L = d.items()
2314 L.sort()
2315 return L
2316
2317 global C
2318 class C(object):
2319 def __init__(self, a, b):
2320 super(C, self).__init__()
2321 self.a = a
2322 self.b = b
2323 def __repr__(self):
2324 return "C(%r, %r)" % (self.a, self.b)
2325
2326 global C1
2327 class C1(list):
2328 def __new__(cls, a, b):
2329 return super(C1, cls).__new__(cls)
2330 def __init__(self, a, b):
2331 self.a = a
2332 self.b = b
2333 def __repr__(self):
2334 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2335
2336 global C2
2337 class C2(int):
2338 def __new__(cls, a, b, val=0):
2339 return super(C2, cls).__new__(cls, val)
2340 def __init__(self, a, b, val=0):
2341 self.a = a
2342 self.b = b
2343 def __repr__(self):
2344 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2345
Guido van Rossum90c45142001-11-24 21:07:01 +00002346 global C3
2347 class C3(object):
2348 def __init__(self, foo):
2349 self.foo = foo
2350 def __getstate__(self):
2351 return self.foo
2352 def __setstate__(self, foo):
2353 self.foo = foo
2354
2355 global C4classic, C4
2356 class C4classic: # classic
2357 pass
2358 class C4(C4classic, object): # mixed inheritance
2359 pass
2360
Guido van Rossum3926a632001-09-25 16:25:58 +00002361 for p in pickle, cPickle:
2362 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002363 if verbose:
2364 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002365
2366 for cls in C, C1, C2:
2367 s = p.dumps(cls, bin)
2368 cls2 = p.loads(s)
2369 verify(cls2 is cls)
2370
2371 a = C1(1, 2); a.append(42); a.append(24)
2372 b = C2("hello", "world", 42)
2373 s = p.dumps((a, b), bin)
2374 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002375 vereq(x.__class__, a.__class__)
2376 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2377 vereq(y.__class__, b.__class__)
2378 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2379 vereq(`x`, `a`)
2380 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002381 if verbose:
2382 print "a = x =", a
2383 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002384 # Test for __getstate__ and __setstate__ on new style class
2385 u = C3(42)
2386 s = p.dumps(u, bin)
2387 v = p.loads(s)
2388 veris(u.__class__, v.__class__)
2389 vereq(u.foo, v.foo)
2390 # Test for picklability of hybrid class
2391 u = C4()
2392 u.foo = 42
2393 s = p.dumps(u, bin)
2394 v = p.loads(s)
2395 veris(u.__class__, v.__class__)
2396 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002397
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002398 # Testing copy.deepcopy()
2399 if verbose:
2400 print "deepcopy"
2401 import copy
2402 for cls in C, C1, C2:
2403 cls2 = copy.deepcopy(cls)
2404 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002405
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002406 a = C1(1, 2); a.append(42); a.append(24)
2407 b = C2("hello", "world", 42)
2408 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002409 vereq(x.__class__, a.__class__)
2410 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2411 vereq(y.__class__, b.__class__)
2412 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2413 vereq(`x`, `a`)
2414 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002415 if verbose:
2416 print "a = x =", a
2417 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002418
2419def copies():
2420 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2421 import copy
2422 class C(object):
2423 pass
2424
2425 a = C()
2426 a.foo = 12
2427 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002428 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002429
2430 a.bar = [1,2,3]
2431 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002432 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002433 verify(c.bar is a.bar)
2434
2435 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002436 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002437 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002439
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002440def binopoverride():
2441 if verbose: print "Testing overrides of binary operations..."
2442 class I(int):
2443 def __repr__(self):
2444 return "I(%r)" % int(self)
2445 def __add__(self, other):
2446 return I(int(self) + int(other))
2447 __radd__ = __add__
2448 def __pow__(self, other, mod=None):
2449 if mod is None:
2450 return I(pow(int(self), int(other)))
2451 else:
2452 return I(pow(int(self), int(other), int(mod)))
2453 def __rpow__(self, other, mod=None):
2454 if mod is None:
2455 return I(pow(int(other), int(self), mod))
2456 else:
2457 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002458
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002459 vereq(`I(1) + I(2)`, "I(3)")
2460 vereq(`I(1) + 2`, "I(3)")
2461 vereq(`1 + I(2)`, "I(3)")
2462 vereq(`I(2) ** I(3)`, "I(8)")
2463 vereq(`2 ** I(3)`, "I(8)")
2464 vereq(`I(2) ** 3`, "I(8)")
2465 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2466 class S(str):
2467 def __eq__(self, other):
2468 return self.lower() == other.lower()
2469
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002470def subclasspropagation():
2471 if verbose: print "Testing propagation of slot functions to subclasses..."
2472 class A(object):
2473 pass
2474 class B(A):
2475 pass
2476 class C(A):
2477 pass
2478 class D(B, C):
2479 pass
2480 d = D()
2481 vereq(hash(d), id(d))
2482 A.__hash__ = lambda self: 42
2483 vereq(hash(d), 42)
2484 C.__hash__ = lambda self: 314
2485 vereq(hash(d), 314)
2486 B.__hash__ = lambda self: 144
2487 vereq(hash(d), 144)
2488 D.__hash__ = lambda self: 100
2489 vereq(hash(d), 100)
2490 del D.__hash__
2491 vereq(hash(d), 144)
2492 del B.__hash__
2493 vereq(hash(d), 314)
2494 del C.__hash__
2495 vereq(hash(d), 42)
2496 del A.__hash__
2497 vereq(hash(d), id(d))
2498 d.foo = 42
2499 d.bar = 42
2500 vereq(d.foo, 42)
2501 vereq(d.bar, 42)
2502 def __getattribute__(self, name):
2503 if name == "foo":
2504 return 24
2505 return object.__getattribute__(self, name)
2506 A.__getattribute__ = __getattribute__
2507 vereq(d.foo, 24)
2508 vereq(d.bar, 42)
2509 def __getattr__(self, name):
2510 if name in ("spam", "foo", "bar"):
2511 return "hello"
2512 raise AttributeError, name
2513 B.__getattr__ = __getattr__
2514 vereq(d.spam, "hello")
2515 vereq(d.foo, 24)
2516 vereq(d.bar, 42)
2517 del A.__getattribute__
2518 vereq(d.foo, 42)
2519 del d.foo
2520 vereq(d.foo, "hello")
2521 vereq(d.bar, 42)
2522 del B.__getattr__
2523 try:
2524 d.foo
2525 except AttributeError:
2526 pass
2527 else:
2528 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002529
2530def buffer_inherit():
2531 import binascii
2532 # SF bug [#470040] ParseTuple t# vs subclasses.
2533 if verbose:
2534 print "Testing that buffer interface is inherited ..."
2535
2536 class MyStr(str):
2537 pass
2538 base = 'abc'
2539 m = MyStr(base)
2540 # b2a_hex uses the buffer interface to get its argument's value, via
2541 # PyArg_ParseTuple 't#' code.
2542 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2543
2544 # It's not clear that unicode will continue to support the character
2545 # buffer interface, and this test will fail if that's taken away.
2546 class MyUni(unicode):
2547 pass
2548 base = u'abc'
2549 m = MyUni(base)
2550 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2551
2552 class MyInt(int):
2553 pass
2554 m = MyInt(42)
2555 try:
2556 binascii.b2a_hex(m)
2557 raise TestFailed('subclass of int should not have a buffer interface')
2558 except TypeError:
2559 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002560
Tim Petersc9933152001-10-16 20:18:24 +00002561def str_of_str_subclass():
2562 import binascii
2563 import cStringIO
2564
2565 if verbose:
2566 print "Testing __str__ defined in subclass of str ..."
2567
2568 class octetstring(str):
2569 def __str__(self):
2570 return binascii.b2a_hex(self)
2571 def __repr__(self):
2572 return self + " repr"
2573
2574 o = octetstring('A')
2575 vereq(type(o), octetstring)
2576 vereq(type(str(o)), str)
2577 vereq(type(repr(o)), str)
2578 vereq(ord(o), 0x41)
2579 vereq(str(o), '41')
2580 vereq(repr(o), 'A repr')
2581 vereq(o.__str__(), '41')
2582 vereq(o.__repr__(), 'A repr')
2583
2584 capture = cStringIO.StringIO()
2585 # Calling str() or not exercises different internal paths.
2586 print >> capture, o
2587 print >> capture, str(o)
2588 vereq(capture.getvalue(), '41\n41\n')
2589 capture.close()
2590
Guido van Rossumc8e56452001-10-22 00:43:43 +00002591def kwdargs():
2592 if verbose: print "Testing keyword arguments to __init__, __call__..."
2593 def f(a): return a
2594 vereq(f.__call__(a=42), 42)
2595 a = []
2596 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002597 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002598
Guido van Rossumed87ad82001-10-30 02:33:02 +00002599def delhook():
2600 if verbose: print "Testing __del__ hook..."
2601 log = []
2602 class C(object):
2603 def __del__(self):
2604 log.append(1)
2605 c = C()
2606 vereq(log, [])
2607 del c
2608 vereq(log, [1])
2609
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002610def hashinherit():
2611 if verbose: print "Testing hash of mutable subclasses..."
2612
2613 class mydict(dict):
2614 pass
2615 d = mydict()
2616 try:
2617 hash(d)
2618 except TypeError:
2619 pass
2620 else:
2621 raise TestFailed, "hash() of dict subclass should fail"
2622
2623 class mylist(list):
2624 pass
2625 d = mylist()
2626 try:
2627 hash(d)
2628 except TypeError:
2629 pass
2630 else:
2631 raise TestFailed, "hash() of list subclass should fail"
2632
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002633def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002634 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002635 lists()
2636 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002637 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002638 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002639 ints()
2640 longs()
2641 floats()
2642 complexes()
2643 spamlists()
2644 spamdicts()
2645 pydicts()
2646 pylists()
2647 metaclass()
2648 pymods()
2649 multi()
2650 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002651 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002652 slots()
2653 dynamics()
2654 errors()
2655 classmethods()
2656 staticmethods()
2657 classic()
2658 compattr()
2659 newslot()
2660 altmro()
2661 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002662 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002663 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002664 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002665 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002666 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002667 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002668 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002669 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002670 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002671 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002672 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002673 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002674 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002675 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002676 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002677 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002678 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002679 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002680 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002681 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002682 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002683 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002684 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002685 hashinherit()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002686 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002687
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002688if __name__ == "__main__":
2689 test_main()