blob: f3b81ac57819cecd7ca43b879a80f0924e20b4f2 [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}
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027 t = type(a)
28 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000029 while meth not in t.__dict__:
30 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000031 vereq(m, t.__dict__[meth])
32 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000033 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000034 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000035
36def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
37 if verbose: print "checking", expr
38 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000039 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000040 t = type(a)
41 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000042 while meth not in t.__dict__:
43 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(m, t.__dict__[meth])
45 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000047 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000048
49def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
50 if verbose: print "checking", stmt
51 dict = {'a': deepcopy(a), 'b': b}
52 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000053 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054 t = type(a)
55 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000056 while meth not in t.__dict__:
57 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000058 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000059 dict['a'] = deepcopy(a)
60 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000061 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000062 dict['a'] = deepcopy(a)
63 bm = getattr(dict['a'], meth)
64 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000065 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066
67def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
68 if verbose: print "checking", stmt
69 dict = {'a': deepcopy(a), 'b': b, 'c': c}
70 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 t = type(a)
73 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000074 while meth not in t.__dict__:
75 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000076 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000077 dict['a'] = deepcopy(a)
78 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000079 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000080 dict['a'] = deepcopy(a)
81 bm = getattr(dict['a'], meth)
82 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000083 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000084
85def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
86 if verbose: print "checking", stmt
87 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
88 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000091 while meth not in t.__dict__:
92 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000093 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000094 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000095 dict['a'] = deepcopy(a)
96 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +000097 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000098 dict['a'] = deepcopy(a)
99 bm = getattr(dict['a'], meth)
100 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000101 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000102
Tim Peters2f93e282001-10-04 05:27:00 +0000103def class_docstrings():
104 class Classic:
105 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000106 vereq(Classic.__doc__, "A classic docstring.")
107 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000108
109 class Classic2:
110 pass
111 verify(Classic2.__doc__ is None)
112
Tim Peters4fb1fe82001-10-04 05:48:13 +0000113 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000114 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000115 vereq(NewStatic.__doc__, "Another docstring.")
116 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000117
Tim Peters4fb1fe82001-10-04 05:48:13 +0000118 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000119 pass
120 verify(NewStatic2.__doc__ is None)
121
Tim Peters4fb1fe82001-10-04 05:48:13 +0000122 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000123 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000124 vereq(NewDynamic.__doc__, "Another docstring.")
125 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000126
Tim Peters4fb1fe82001-10-04 05:48:13 +0000127 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000128 pass
129 verify(NewDynamic2.__doc__ is None)
130
Tim Peters6d6c1a32001-08-02 04:15:00 +0000131def lists():
132 if verbose: print "Testing list operations..."
133 testbinop([1], [2], [1,2], "a+b", "__add__")
134 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
135 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
136 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
137 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
138 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
139 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
140 testunop([1,2,3], 3, "len(a)", "__len__")
141 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
142 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
143 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
144 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
145
146def dicts():
147 if verbose: print "Testing dict operations..."
148 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
149 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
150 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
151 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
152 d = {1:2,3:4}
153 l1 = []
154 for i in d.keys(): l1.append(i)
155 l = []
156 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000157 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000158 l = []
159 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000160 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000161 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000162 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000163 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 d = {1:2, 3:4}
165 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000166 vereq(eval(repr(d), {}), d)
167 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
169
Tim Peters25786c02001-09-02 08:22:48 +0000170def dict_constructor():
171 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000172 print "Testing dict constructor ..."
173 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000174 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000175 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000177 d = dict(items={})
Guido van Rossum45704552001-10-08 16:35:45 +0000178 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000179 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000180 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000181 vereq(d, dict(d.items()))
182 vereq(d, dict(items=d.iteritems()))
Tim Peters25786c02001-09-02 08:22:48 +0000183 for badarg in 0, 0L, 0j, "0", [0], (0,):
184 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000186 except TypeError:
187 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000188 except ValueError:
189 if badarg == "0":
190 # It's a sequence, and its elements are also sequences (gotta
191 # love strings <wink>), but they aren't of length 2, so this
192 # one seemed better as a ValueError than a TypeError.
193 pass
194 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000195 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000196 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000197 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000198 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000199 dict(senseless={})
Tim Peters25786c02001-09-02 08:22:48 +0000200 except TypeError:
201 pass
202 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000203 raise TestFailed("no TypeError from dict(senseless={})")
Tim Peters25786c02001-09-02 08:22:48 +0000204
205 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000206 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000207 except TypeError:
208 pass
209 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000210 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000211
212 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000213 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000214 dict = {1:2, 3:4, 'a':1j}
215
Tim Peters25786c02001-09-02 08:22:48 +0000216 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000217 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000218 except TypeError:
219 pass
220 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000221 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000222
223 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000224 Mapping.__getitem__ = lambda self, i: self.dict[i]
Tim Petersa427a2b2001-10-29 22:25:45 +0000225 d = dict(items=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000226 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000227
Tim Peters1fc240e2001-10-26 05:06:50 +0000228 # Init from sequence of iterable objects, each producing a 2-sequence.
229 class AddressBookEntry:
230 def __init__(self, first, last):
231 self.first = first
232 self.last = last
233 def __iter__(self):
234 return iter([self.first, self.last])
235
Tim Petersa427a2b2001-10-29 22:25:45 +0000236 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000237 AddressBookEntry('Barry', 'Peters'),
238 AddressBookEntry('Tim', 'Peters'),
239 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000240 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
241
Tim Petersa427a2b2001-10-29 22:25:45 +0000242 d = dict(zip(range(4), range(1, 5)))
243 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000244
245 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000246 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000247 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000248 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000249 except ValueError:
250 pass
251 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000252 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000253
Tim Peters5d2b77c2001-09-03 05:47:38 +0000254def test_dir():
255 if verbose:
256 print "Testing dir() ..."
257 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000258 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000259 del junk
260
261 # Just make sure these don't blow up!
262 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
263 dir(arg)
264
Tim Peters37a309d2001-09-04 01:20:04 +0000265 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000266 class C:
267 Cdata = 1
268 def Cmethod(self): pass
269
270 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000271 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000272 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000273
274 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000275 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000276
277 c.cdata = 2
278 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000279 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000280 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000281
282 class A(C):
283 Adata = 1
284 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000285
Tim Peters37a309d2001-09-04 01:20:04 +0000286 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000287 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000288 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000289 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000290 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000291 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000292 a.adata = 42
293 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000294 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000295
296 # The same, but with new-style classes. Since these have object as a
297 # base class, a lot more gets sucked in.
298 def interesting(strings):
299 return [s for s in strings if not s.startswith('_')]
300
Tim Peters5d2b77c2001-09-03 05:47:38 +0000301 class C(object):
302 Cdata = 1
303 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000304
305 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000306 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000307
308 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000309 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000310 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000311
312 c.cdata = 2
313 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000314 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000315 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000316
Tim Peters5d2b77c2001-09-03 05:47:38 +0000317 class A(C):
318 Adata = 1
319 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000320
321 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000322 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000323 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000324 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000325 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000326 a.adata = 42
327 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000328 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000329 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000330
Tim Peterscaaff8d2001-09-10 23:12:14 +0000331 # Try a module subclass.
332 import sys
333 class M(type(sys)):
334 pass
335 minstance = M()
336 minstance.b = 2
337 minstance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000338 vereq(dir(minstance), ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000339
340 class M2(M):
341 def getdict(self):
342 return "Not a dict!"
343 __dict__ = property(getdict)
344
345 m2instance = M2()
346 m2instance.b = 2
347 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000348 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000349 try:
350 dir(m2instance)
351 except TypeError:
352 pass
353
Tim Peters9e6a3992001-10-30 05:45:26 +0000354 # Two essentially featureless objects, just inheriting stuff from
355 # object.
356 vereq(dir(None), dir(Ellipsis))
357
Tim Peters6d6c1a32001-08-02 04:15:00 +0000358binops = {
359 'add': '+',
360 'sub': '-',
361 'mul': '*',
362 'div': '/',
363 'mod': '%',
364 'divmod': 'divmod',
365 'pow': '**',
366 'lshift': '<<',
367 'rshift': '>>',
368 'and': '&',
369 'xor': '^',
370 'or': '|',
371 'cmp': 'cmp',
372 'lt': '<',
373 'le': '<=',
374 'eq': '==',
375 'ne': '!=',
376 'gt': '>',
377 'ge': '>=',
378 }
379
380for name, expr in binops.items():
381 if expr.islower():
382 expr = expr + "(a, b)"
383 else:
384 expr = 'a %s b' % expr
385 binops[name] = expr
386
387unops = {
388 'pos': '+',
389 'neg': '-',
390 'abs': 'abs',
391 'invert': '~',
392 'int': 'int',
393 'long': 'long',
394 'float': 'float',
395 'oct': 'oct',
396 'hex': 'hex',
397 }
398
399for name, expr in unops.items():
400 if expr.islower():
401 expr = expr + "(a)"
402 else:
403 expr = '%s a' % expr
404 unops[name] = expr
405
406def numops(a, b, skip=[]):
407 dict = {'a': a, 'b': b}
408 for name, expr in binops.items():
409 if name not in skip:
410 name = "__%s__" % name
411 if hasattr(a, name):
412 res = eval(expr, dict)
413 testbinop(a, b, res, expr, name)
414 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000415 if name not in skip:
416 name = "__%s__" % name
417 if hasattr(a, name):
418 res = eval(expr, dict)
419 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000420
421def ints():
422 if verbose: print "Testing int operations..."
423 numops(100, 3)
424
425def longs():
426 if verbose: print "Testing long operations..."
427 numops(100L, 3L)
428
429def floats():
430 if verbose: print "Testing float operations..."
431 numops(100.0, 3.0)
432
433def complexes():
434 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000435 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000436 class Number(complex):
437 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000438 def __new__(cls, *args, **kwds):
439 result = complex.__new__(cls, *args)
440 result.prec = kwds.get('prec', 12)
441 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000442 def __repr__(self):
443 prec = self.prec
444 if self.imag == 0.0:
445 return "%.*g" % (prec, self.real)
446 if self.real == 0.0:
447 return "%.*gj" % (prec, self.imag)
448 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
449 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000450
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000452 vereq(`a`, "3.14")
453 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000454
Tim Peters3f996e72001-09-13 19:18:27 +0000455 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000456 vereq(`a`, "3.1")
457 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000458
459 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000460 vereq(`a`, "234.5")
461 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000462
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463def spamlists():
464 if verbose: print "Testing spamlist operations..."
465 import copy, xxsubtype as spam
466 def spamlist(l, memo=None):
467 import xxsubtype as spam
468 return spam.spamlist(l)
469 # This is an ugly hack:
470 copy._deepcopy_dispatch[spam.spamlist] = spamlist
471
472 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
473 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
474 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
475 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
476 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
477 "a[b:c]", "__getslice__")
478 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
479 "a+=b", "__iadd__")
480 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
481 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
482 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
483 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
484 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
485 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
486 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
487 # Test subclassing
488 class C(spam.spamlist):
489 def foo(self): return 1
490 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000491 vereq(a, [])
492 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000494 vereq(a, [100])
495 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000496 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000497 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000498
499def spamdicts():
500 if verbose: print "Testing spamdict operations..."
501 import copy, xxsubtype as spam
502 def spamdict(d, memo=None):
503 import xxsubtype as spam
504 sd = spam.spamdict()
505 for k, v in d.items(): sd[k] = v
506 return sd
507 # This is an ugly hack:
508 copy._deepcopy_dispatch[spam.spamdict] = spamdict
509
510 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
511 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
512 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
513 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
514 d = spamdict({1:2,3:4})
515 l1 = []
516 for i in d.keys(): l1.append(i)
517 l = []
518 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000519 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000520 l = []
521 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000522 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000523 l = []
524 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000525 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000526 straightd = {1:2, 3:4}
527 spamd = spamdict(straightd)
528 testunop(spamd, 2, "len(a)", "__len__")
529 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
530 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
531 "a[b]=c", "__setitem__")
532 # Test subclassing
533 class C(spam.spamdict):
534 def foo(self): return 1
535 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000536 vereq(a.items(), [])
537 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000538 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000539 vereq(a.items(), [('foo', 'bar')])
540 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000541 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000542 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000543
544def pydicts():
545 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000546 verify(issubclass(dict, dict))
547 verify(isinstance({}, dict))
548 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000549 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000550 verify(d.__class__ is dict)
551 verify(isinstance(d, dict))
552 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000553 state = -1
554 def __init__(self, *a, **kw):
555 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000556 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000557 self.state = a[0]
558 if kw:
559 for k, v in kw.items(): self[v] = k
560 def __getitem__(self, key):
561 return self.get(key, 0)
562 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000563 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000564 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565 def setstate(self, state):
566 self.state = state
567 def getstate(self):
568 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000569 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000570 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000571 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000572 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000573 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000575 vereq(a.state, -1)
576 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000578 vereq(a.state, 0)
579 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000581 vereq(a.state, 10)
582 vereq(a.getstate(), 10)
583 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000584 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000585 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000586 if verbose: print "pydict stress test ..."
587 N = 50
588 for i in range(N):
589 a[i] = C()
590 for j in range(N):
591 a[i][j] = i*j
592 for i in range(N):
593 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000594 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595
596def pylists():
597 if verbose: print "Testing Python subclass of list..."
598 class C(list):
599 def __getitem__(self, i):
600 return list.__getitem__(self, i) + 100
601 def __getslice__(self, i, j):
602 return (i, j)
603 a = C()
604 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000605 vereq(a[0], 100)
606 vereq(a[1], 101)
607 vereq(a[2], 102)
608 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000609
610def metaclass():
611 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000612 class C:
613 __metaclass__ = type
614 def __init__(self):
615 self.__state = 0
616 def getstate(self):
617 return self.__state
618 def setstate(self, state):
619 self.__state = state
620 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000621 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000622 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000623 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624 class D:
625 class __metaclass__(type):
626 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000627 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000628 d = D()
629 verify(d.__class__ is D)
630 class M1(type):
631 def __new__(cls, name, bases, dict):
632 dict['__spam__'] = 1
633 return type.__new__(cls, name, bases, dict)
634 class C:
635 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000636 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000637 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000638 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000639
Guido van Rossum309b5662001-08-17 11:43:17 +0000640 class _instance(object):
641 pass
642 class M2(object):
643 def __new__(cls, name, bases, dict):
644 self = object.__new__(cls)
645 self.name = name
646 self.bases = bases
647 self.dict = dict
648 return self
649 __new__ = staticmethod(__new__)
650 def __call__(self):
651 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000652 # Early binding of methods
653 for key in self.dict:
654 if key.startswith("__"):
655 continue
656 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000657 return it
658 class C:
659 __metaclass__ = M2
660 def spam(self):
661 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000662 vereq(C.name, 'C')
663 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000664 verify('spam' in C.dict)
665 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000666 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000667
Guido van Rossum91ee7982001-08-30 20:52:40 +0000668 # More metaclass examples
669
670 class autosuper(type):
671 # Automatically add __super to the class
672 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000673 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000674 cls = super(autosuper, metaclass).__new__(metaclass,
675 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000676 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000677 while name[:1] == "_":
678 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000679 if name:
680 name = "_%s__super" % name
681 else:
682 name = "__super"
683 setattr(cls, name, super(cls))
684 return cls
685 class A:
686 __metaclass__ = autosuper
687 def meth(self):
688 return "A"
689 class B(A):
690 def meth(self):
691 return "B" + self.__super.meth()
692 class C(A):
693 def meth(self):
694 return "C" + self.__super.meth()
695 class D(C, B):
696 def meth(self):
697 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000698 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000699 class E(B, C):
700 def meth(self):
701 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000702 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000703
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000704 class autoproperty(type):
705 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000706 # named _get_x and/or _set_x are found
707 def __new__(metaclass, name, bases, dict):
708 hits = {}
709 for key, val in dict.iteritems():
710 if key.startswith("_get_"):
711 key = key[5:]
712 get, set = hits.get(key, (None, None))
713 get = val
714 hits[key] = get, set
715 elif key.startswith("_set_"):
716 key = key[5:]
717 get, set = hits.get(key, (None, None))
718 set = val
719 hits[key] = get, set
720 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000721 dict[key] = property(get, set)
722 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000723 name, bases, dict)
724 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000725 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000726 def _get_x(self):
727 return -self.__x
728 def _set_x(self, x):
729 self.__x = -x
730 a = A()
731 verify(not hasattr(a, "x"))
732 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000733 vereq(a.x, 12)
734 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000735
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000736 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000737 # Merge of multiple cooperating metaclasses
738 pass
739 class A:
740 __metaclass__ = multimetaclass
741 def _get_x(self):
742 return "A"
743 class B(A):
744 def _get_x(self):
745 return "B" + self.__super._get_x()
746 class C(A):
747 def _get_x(self):
748 return "C" + self.__super._get_x()
749 class D(C, B):
750 def _get_x(self):
751 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000752 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000753
Guido van Rossumf76de622001-10-18 15:49:21 +0000754 # Make sure type(x) doesn't call x.__class__.__init__
755 class T(type):
756 counter = 0
757 def __init__(self, *args):
758 T.counter += 1
759 class C:
760 __metaclass__ = T
761 vereq(T.counter, 1)
762 a = C()
763 vereq(type(a), C)
764 vereq(T.counter, 1)
765
Tim Peters6d6c1a32001-08-02 04:15:00 +0000766def pymods():
767 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000768 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000769 import sys
770 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000771 class MM(MT):
772 def __init__(self):
773 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000774 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000775 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000776 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000777 def __setattr__(self, name, value):
778 log.append(("setattr", name, value))
779 MT.__setattr__(self, name, value)
780 def __delattr__(self, name):
781 log.append(("delattr", name))
782 MT.__delattr__(self, name)
783 a = MM()
784 a.foo = 12
785 x = a.foo
786 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000787 vereq(log, [("setattr", "foo", 12),
788 ("getattr", "foo"),
789 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790
791def multi():
792 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000793 class C(object):
794 def __init__(self):
795 self.__state = 0
796 def getstate(self):
797 return self.__state
798 def setstate(self, state):
799 self.__state = state
800 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000801 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000803 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000804 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000805 def __init__(self):
806 type({}).__init__(self)
807 C.__init__(self)
808 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000809 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000810 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000811 vereq(d.items(), [("hello", "world")])
812 vereq(d["hello"], "world")
813 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000815 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000816 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817
Guido van Rossume45763a2001-08-10 21:28:46 +0000818 # SF bug #442833
819 class Node(object):
820 def __int__(self):
821 return int(self.foo())
822 def foo(self):
823 return "23"
824 class Frag(Node, list):
825 def foo(self):
826 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000827 vereq(Node().__int__(), 23)
828 vereq(int(Node()), 23)
829 vereq(Frag().__int__(), 42)
830 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000831
Tim Petersa91e9642001-11-14 23:32:33 +0000832 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000833
834 class A:
835 x = 1
836
837 class B(A):
838 pass
839
840 class C(A):
841 x = 2
842
843 class D(B, C):
844 pass
845 vereq(D.x, 1)
846
847 # Classic MRO is preserved for a classic base class.
848 class E(D, object):
849 pass
850 vereq(E.__mro__, (E, D, B, A, C, object))
851 vereq(E.x, 1)
852
853 # But with a mix of classic bases, their MROs are combined using
854 # new-style MRO.
855 class F(B, C, object):
856 pass
857 vereq(F.__mro__, (F, B, C, A, object))
858 vereq(F.x, 2)
859
860 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000861 class C:
862 def cmethod(self):
863 return "C a"
864 def all_method(self):
865 return "C b"
866
867 class M1(C, object):
868 def m1method(self):
869 return "M1 a"
870 def all_method(self):
871 return "M1 b"
872
873 vereq(M1.__mro__, (M1, C, object))
874 m = M1()
875 vereq(m.cmethod(), "C a")
876 vereq(m.m1method(), "M1 a")
877 vereq(m.all_method(), "M1 b")
878
879 class D(C):
880 def dmethod(self):
881 return "D a"
882 def all_method(self):
883 return "D b"
884
885 class M2(object, D):
886 def m2method(self):
887 return "M2 a"
888 def all_method(self):
889 return "M2 b"
890
891 vereq(M2.__mro__, (M2, object, D, C))
892 m = M2()
893 vereq(m.cmethod(), "C a")
894 vereq(m.dmethod(), "D a")
895 vereq(m.m2method(), "M2 a")
896 vereq(m.all_method(), "M2 b")
897
898 class M3(M1, object, M2):
899 def m3method(self):
900 return "M3 a"
901 def all_method(self):
902 return "M3 b"
903 # XXX Expected this (the commented-out result):
904 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
905 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000906 m = M3()
907 vereq(m.cmethod(), "C a")
908 vereq(m.dmethod(), "D a")
909 vereq(m.m1method(), "M1 a")
910 vereq(m.m2method(), "M2 a")
911 vereq(m.m3method(), "M3 a")
912 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000913
Tim Peters6d6c1a32001-08-02 04:15:00 +0000914def diamond():
915 if verbose: print "Testing multiple inheritance special cases..."
916 class A(object):
917 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000918 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000919 class B(A):
920 def boo(self): return "B"
921 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000922 vereq(B().spam(), "B")
923 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000924 class C(A):
925 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000926 vereq(C().spam(), "A")
927 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000928 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000929 vereq(D().spam(), "B")
930 vereq(D().boo(), "B")
931 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000932 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000933 vereq(E().spam(), "B")
934 vereq(E().boo(), "C")
935 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000936 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000937 vereq(F().spam(), "B")
938 vereq(F().boo(), "B")
939 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000940 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000941 vereq(G().spam(), "B")
942 vereq(G().boo(), "C")
943 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000944
Guido van Rossum37202612001-08-09 19:45:21 +0000945def objects():
946 if verbose: print "Testing object class..."
947 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000948 vereq(a.__class__, object)
949 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000950 b = object()
951 verify(a is not b)
952 verify(not hasattr(a, "foo"))
953 try:
954 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000955 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000956 pass
957 else:
958 verify(0, "object() should not allow setting a foo attribute")
959 verify(not hasattr(object(), "__dict__"))
960
961 class Cdict(object):
962 pass
963 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000964 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000965 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000966 vereq(x.foo, 1)
967 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000968
Tim Peters6d6c1a32001-08-02 04:15:00 +0000969def slots():
970 if verbose: print "Testing __slots__..."
971 class C0(object):
972 __slots__ = []
973 x = C0()
974 verify(not hasattr(x, "__dict__"))
975 verify(not hasattr(x, "foo"))
976
977 class C1(object):
978 __slots__ = ['a']
979 x = C1()
980 verify(not hasattr(x, "__dict__"))
Guido van Rossum45704552001-10-08 16:35:45 +0000981 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000982 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000983 vereq(x.a, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 del x.a
Guido van Rossum45704552001-10-08 16:35:45 +0000985 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000986
987 class C3(object):
988 __slots__ = ['a', 'b', 'c']
989 x = C3()
990 verify(not hasattr(x, "__dict__"))
991 verify(x.a is None)
992 verify(x.b is None)
993 verify(x.c is None)
994 x.a = 1
995 x.b = 2
996 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +0000997 vereq(x.a, 1)
998 vereq(x.b, 2)
999 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001000
1001def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001002 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001004 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001005 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001006 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001007 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001010 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001011 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001012 vereq(E.foo, 1)
1013 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001014 # Test dynamic instances
1015 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001016 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001017 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001018 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001019 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001020 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001021 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001022 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001023 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001024 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001025 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001026 vereq(int(a), 100)
1027 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001028 verify(not hasattr(a, "spam"))
1029 def mygetattr(self, name):
1030 if name == "spam":
1031 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001032 raise AttributeError
1033 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001034 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001035 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001036 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001037 def mysetattr(self, name, value):
1038 if name == "spam":
1039 raise AttributeError
1040 return object.__setattr__(self, name, value)
1041 C.__setattr__ = mysetattr
1042 try:
1043 a.spam = "not spam"
1044 except AttributeError:
1045 pass
1046 else:
1047 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001048 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001049 class D(C):
1050 pass
1051 d = D()
1052 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001053 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001054
Guido van Rossum7e35d572001-09-15 03:14:32 +00001055 # Test handling of int*seq and seq*int
1056 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001057 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001058 vereq("a"*I(2), "aa")
1059 vereq(I(2)*"a", "aa")
1060 vereq(2*I(3), 6)
1061 vereq(I(3)*2, 6)
1062 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001063
1064 # Test handling of long*seq and seq*long
1065 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001066 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001067 vereq("a"*L(2L), "aa")
1068 vereq(L(2L)*"a", "aa")
1069 vereq(2*L(3), 6)
1070 vereq(L(3)*2, 6)
1071 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001072
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001073 # Test comparison of classes with dynamic metaclasses
1074 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001075 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001076 class someclass:
1077 __metaclass__ = dynamicmetaclass
1078 verify(someclass != object)
1079
Tim Peters6d6c1a32001-08-02 04:15:00 +00001080def errors():
1081 if verbose: print "Testing errors..."
1082
1083 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001084 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001085 pass
1086 except TypeError:
1087 pass
1088 else:
1089 verify(0, "inheritance from both list and dict should be illegal")
1090
1091 try:
1092 class C(object, None):
1093 pass
1094 except TypeError:
1095 pass
1096 else:
1097 verify(0, "inheritance from non-type should be illegal")
1098 class Classic:
1099 pass
1100
1101 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001102 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001103 pass
1104 except TypeError:
1105 pass
1106 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001107 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001108
1109 try:
1110 class C(object):
1111 __slots__ = 1
1112 except TypeError:
1113 pass
1114 else:
1115 verify(0, "__slots__ = 1 should be illegal")
1116
1117 try:
1118 class C(object):
1119 __slots__ = [1]
1120 except TypeError:
1121 pass
1122 else:
1123 verify(0, "__slots__ = [1] should be illegal")
1124
1125def classmethods():
1126 if verbose: print "Testing class methods..."
1127 class C(object):
1128 def foo(*a): return a
1129 goo = classmethod(foo)
1130 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001131 vereq(C.goo(1), (C, 1))
1132 vereq(c.goo(1), (C, 1))
1133 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001134 class D(C):
1135 pass
1136 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001137 vereq(D.goo(1), (D, 1))
1138 vereq(d.goo(1), (D, 1))
1139 vereq(d.foo(1), (d, 1))
1140 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001141
1142def staticmethods():
1143 if verbose: print "Testing static methods..."
1144 class C(object):
1145 def foo(*a): return a
1146 goo = staticmethod(foo)
1147 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001148 vereq(C.goo(1), (1,))
1149 vereq(c.goo(1), (1,))
1150 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001151 class D(C):
1152 pass
1153 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001154 vereq(D.goo(1), (1,))
1155 vereq(d.goo(1), (1,))
1156 vereq(d.foo(1), (d, 1))
1157 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001158
1159def classic():
1160 if verbose: print "Testing classic classes..."
1161 class C:
1162 def foo(*a): return a
1163 goo = classmethod(foo)
1164 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001165 vereq(C.goo(1), (C, 1))
1166 vereq(c.goo(1), (C, 1))
1167 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001168 class D(C):
1169 pass
1170 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001171 vereq(D.goo(1), (D, 1))
1172 vereq(d.goo(1), (D, 1))
1173 vereq(d.foo(1), (d, 1))
1174 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001175 class E: # *not* subclassing from C
1176 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001177 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001178 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001179
1180def compattr():
1181 if verbose: print "Testing computed attributes..."
1182 class C(object):
1183 class computed_attribute(object):
1184 def __init__(self, get, set=None):
1185 self.__get = get
1186 self.__set = set
1187 def __get__(self, obj, type=None):
1188 return self.__get(obj)
1189 def __set__(self, obj, value):
1190 return self.__set(obj, value)
1191 def __init__(self):
1192 self.__x = 0
1193 def __get_x(self):
1194 x = self.__x
1195 self.__x = x+1
1196 return x
1197 def __set_x(self, x):
1198 self.__x = x
1199 x = computed_attribute(__get_x, __set_x)
1200 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001201 vereq(a.x, 0)
1202 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001203 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001204 vereq(a.x, 10)
1205 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001206
1207def newslot():
1208 if verbose: print "Testing __new__ slot override..."
1209 class C(list):
1210 def __new__(cls):
1211 self = list.__new__(cls)
1212 self.foo = 1
1213 return self
1214 def __init__(self):
1215 self.foo = self.foo + 2
1216 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001217 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001218 verify(a.__class__ is C)
1219 class D(C):
1220 pass
1221 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001222 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001223 verify(b.__class__ is D)
1224
Tim Peters6d6c1a32001-08-02 04:15:00 +00001225def altmro():
1226 if verbose: print "Testing mro() and overriding it..."
1227 class A(object):
1228 def f(self): return "A"
1229 class B(A):
1230 pass
1231 class C(A):
1232 def f(self): return "C"
1233 class D(B, C):
1234 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001235 vereq(D.mro(), [D, B, C, A, object])
1236 vereq(D.__mro__, (D, B, C, A, object))
1237 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001238 class PerverseMetaType(type):
1239 def mro(cls):
1240 L = type.mro(cls)
1241 L.reverse()
1242 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001243 class X(A,B,C,D):
1244 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001245 vereq(X.__mro__, (object, A, C, B, D, X))
1246 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001247
1248def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001249 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001250
1251 class B(object):
1252 "Intermediate class because object doesn't have a __setattr__"
1253
1254 class C(B):
1255
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001256 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257 if name == "foo":
1258 return ("getattr", name)
1259 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001260 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001261 def __setattr__(self, name, value):
1262 if name == "foo":
1263 self.setattr = (name, value)
1264 else:
1265 return B.__setattr__(self, name, value)
1266 def __delattr__(self, name):
1267 if name == "foo":
1268 self.delattr = name
1269 else:
1270 return B.__delattr__(self, name)
1271
1272 def __getitem__(self, key):
1273 return ("getitem", key)
1274 def __setitem__(self, key, value):
1275 self.setitem = (key, value)
1276 def __delitem__(self, key):
1277 self.delitem = key
1278
1279 def __getslice__(self, i, j):
1280 return ("getslice", i, j)
1281 def __setslice__(self, i, j, value):
1282 self.setslice = (i, j, value)
1283 def __delslice__(self, i, j):
1284 self.delslice = (i, j)
1285
1286 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001287 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001288 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001289 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001290 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001291 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001292
Guido van Rossum45704552001-10-08 16:35:45 +00001293 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001294 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001295 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001296 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001297 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001298
Guido van Rossum45704552001-10-08 16:35:45 +00001299 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001300 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001301 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001302 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001303 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001304
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001305def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001306 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001307 class C(object):
1308 def __init__(self, x):
1309 self.x = x
1310 def foo(self):
1311 return self.x
1312 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001313 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001314 class D(C):
1315 boo = C.foo
1316 goo = c1.foo
1317 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001318 vereq(d2.foo(), 2)
1319 vereq(d2.boo(), 2)
1320 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001321 class E(object):
1322 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001323 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001324 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001325
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001326def specials():
1327 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001328 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001329 # Test the default behavior for static classes
1330 class C(object):
1331 def __getitem__(self, i):
1332 if 0 <= i < 10: return i
1333 raise IndexError
1334 c1 = C()
1335 c2 = C()
1336 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001337 vereq(hash(c1), id(c1))
1338 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1339 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001340 verify(c1 != c2)
1341 verify(not c1 != c1)
1342 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001343 # Note that the module name appears in str/repr, and that varies
1344 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001345 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001346 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001347 verify(-1 not in c1)
1348 for i in range(10):
1349 verify(i in c1)
1350 verify(10 not in c1)
1351 # Test the default behavior for dynamic classes
1352 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001353 def __getitem__(self, i):
1354 if 0 <= i < 10: return i
1355 raise IndexError
1356 d1 = D()
1357 d2 = D()
1358 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(hash(d1), id(d1))
1360 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1361 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001362 verify(d1 != d2)
1363 verify(not d1 != d1)
1364 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001365 # Note that the module name appears in str/repr, and that varies
1366 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001367 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001368 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001369 verify(-1 not in d1)
1370 for i in range(10):
1371 verify(i in d1)
1372 verify(10 not in d1)
1373 # Test overridden behavior for static classes
1374 class Proxy(object):
1375 def __init__(self, x):
1376 self.x = x
1377 def __nonzero__(self):
1378 return not not self.x
1379 def __hash__(self):
1380 return hash(self.x)
1381 def __eq__(self, other):
1382 return self.x == other
1383 def __ne__(self, other):
1384 return self.x != other
1385 def __cmp__(self, other):
1386 return cmp(self.x, other.x)
1387 def __str__(self):
1388 return "Proxy:%s" % self.x
1389 def __repr__(self):
1390 return "Proxy(%r)" % self.x
1391 def __contains__(self, value):
1392 return value in self.x
1393 p0 = Proxy(0)
1394 p1 = Proxy(1)
1395 p_1 = Proxy(-1)
1396 verify(not p0)
1397 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001398 vereq(hash(p0), hash(0))
1399 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001400 verify(p0 != p1)
1401 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001402 vereq(not p0, p1)
1403 vereq(cmp(p0, p1), -1)
1404 vereq(cmp(p0, p0), 0)
1405 vereq(cmp(p0, p_1), 1)
1406 vereq(str(p0), "Proxy:0")
1407 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001408 p10 = Proxy(range(10))
1409 verify(-1 not in p10)
1410 for i in range(10):
1411 verify(i in p10)
1412 verify(10 not in p10)
1413 # Test overridden behavior for dynamic classes
1414 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001415 def __init__(self, x):
1416 self.x = x
1417 def __nonzero__(self):
1418 return not not self.x
1419 def __hash__(self):
1420 return hash(self.x)
1421 def __eq__(self, other):
1422 return self.x == other
1423 def __ne__(self, other):
1424 return self.x != other
1425 def __cmp__(self, other):
1426 return cmp(self.x, other.x)
1427 def __str__(self):
1428 return "DProxy:%s" % self.x
1429 def __repr__(self):
1430 return "DProxy(%r)" % self.x
1431 def __contains__(self, value):
1432 return value in self.x
1433 p0 = DProxy(0)
1434 p1 = DProxy(1)
1435 p_1 = DProxy(-1)
1436 verify(not p0)
1437 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001438 vereq(hash(p0), hash(0))
1439 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001440 verify(p0 != p1)
1441 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001442 vereq(not p0, p1)
1443 vereq(cmp(p0, p1), -1)
1444 vereq(cmp(p0, p0), 0)
1445 vereq(cmp(p0, p_1), 1)
1446 vereq(str(p0), "DProxy:0")
1447 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001448 p10 = DProxy(range(10))
1449 verify(-1 not in p10)
1450 for i in range(10):
1451 verify(i in p10)
1452 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001453 # Safety test for __cmp__
1454 def unsafecmp(a, b):
1455 try:
1456 a.__class__.__cmp__(a, b)
1457 except TypeError:
1458 pass
1459 else:
1460 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1461 a.__class__, a, b)
1462 unsafecmp(u"123", "123")
1463 unsafecmp("123", u"123")
1464 unsafecmp(1, 1.0)
1465 unsafecmp(1.0, 1)
1466 unsafecmp(1, 1L)
1467 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001468
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001469def weakrefs():
1470 if verbose: print "Testing weak references..."
1471 import weakref
1472 class C(object):
1473 pass
1474 c = C()
1475 r = weakref.ref(c)
1476 verify(r() is c)
1477 del c
1478 verify(r() is None)
1479 del r
1480 class NoWeak(object):
1481 __slots__ = ['foo']
1482 no = NoWeak()
1483 try:
1484 weakref.ref(no)
1485 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001486 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001487 else:
1488 verify(0, "weakref.ref(no) should be illegal")
1489 class Weak(object):
1490 __slots__ = ['foo', '__weakref__']
1491 yes = Weak()
1492 r = weakref.ref(yes)
1493 verify(r() is yes)
1494 del yes
1495 verify(r() is None)
1496 del r
1497
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001498def properties():
1499 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001500 class C(object):
1501 def getx(self):
1502 return self.__x
1503 def setx(self, value):
1504 self.__x = value
1505 def delx(self):
1506 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001507 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001508 a = C()
1509 verify(not hasattr(a, "x"))
1510 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001511 vereq(a._C__x, 42)
1512 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001513 del a.x
1514 verify(not hasattr(a, "x"))
1515 verify(not hasattr(a, "_C__x"))
1516 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001517 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001518## C.x.__set__(a)
1519## verify(not hasattr(a, "x"))
1520
Tim Peters66c1a522001-09-24 21:17:50 +00001521 raw = C.__dict__['x']
1522 verify(isinstance(raw, property))
1523
1524 attrs = dir(raw)
1525 verify("__doc__" in attrs)
1526 verify("fget" in attrs)
1527 verify("fset" in attrs)
1528 verify("fdel" in attrs)
1529
Guido van Rossum45704552001-10-08 16:35:45 +00001530 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001531 verify(raw.fget is C.__dict__['getx'])
1532 verify(raw.fset is C.__dict__['setx'])
1533 verify(raw.fdel is C.__dict__['delx'])
1534
1535 for attr in "__doc__", "fget", "fset", "fdel":
1536 try:
1537 setattr(raw, attr, 42)
1538 except TypeError, msg:
1539 if str(msg).find('readonly') < 0:
1540 raise TestFailed("when setting readonly attr %r on a "
1541 "property, got unexpected TypeError "
1542 "msg %r" % (attr, str(msg)))
1543 else:
1544 raise TestFailed("expected TypeError from trying to set "
1545 "readonly %r attr on a property" % attr)
1546
Guido van Rossumc4a18802001-08-24 16:55:27 +00001547def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001548 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001549
1550 class A(object):
1551 def meth(self, a):
1552 return "A(%r)" % a
1553
Guido van Rossum45704552001-10-08 16:35:45 +00001554 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001555
1556 class B(A):
1557 def __init__(self):
1558 self.__super = super(B, self)
1559 def meth(self, a):
1560 return "B(%r)" % a + self.__super.meth(a)
1561
Guido van Rossum45704552001-10-08 16:35:45 +00001562 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001563
1564 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001565 def meth(self, a):
1566 return "C(%r)" % a + self.__super.meth(a)
1567 C._C__super = super(C)
1568
Guido van Rossum45704552001-10-08 16:35:45 +00001569 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001570
1571 class D(C, B):
1572 def meth(self, a):
1573 return "D(%r)" % a + super(D, self).meth(a)
1574
Guido van Rossum5b443c62001-12-03 15:38:28 +00001575 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1576
1577 # Test for subclassing super
1578
1579 class mysuper(super):
1580 def __init__(self, *args):
1581 return super(mysuper, self).__init__(*args)
1582
1583 class E(D):
1584 def meth(self, a):
1585 return "E(%r)" % a + mysuper(E, self).meth(a)
1586
1587 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1588
1589 class F(E):
1590 def meth(self, a):
1591 s = self.__super
1592 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1593 F._F__super = mysuper(F)
1594
1595 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1596
1597 # Make sure certain errors are raised
1598
1599 try:
1600 super(D, 42)
1601 except TypeError:
1602 pass
1603 else:
1604 raise TestFailed, "shouldn't allow super(D, 42)"
1605
1606 try:
1607 super(D, C())
1608 except TypeError:
1609 pass
1610 else:
1611 raise TestFailed, "shouldn't allow super(D, C())"
1612
1613 try:
1614 super(D).__get__(12)
1615 except TypeError:
1616 pass
1617 else:
1618 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1619
1620 try:
1621 super(D).__get__(C())
1622 except TypeError:
1623 pass
1624 else:
1625 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001626
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001627def inherits():
1628 if verbose: print "Testing inheritance from basic types..."
1629
1630 class hexint(int):
1631 def __repr__(self):
1632 return hex(self)
1633 def __add__(self, other):
1634 return hexint(int.__add__(self, other))
1635 # (Note that overriding __radd__ doesn't work,
1636 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001637 vereq(repr(hexint(7) + 9), "0x10")
1638 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001639 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001640 vereq(a, 12345)
1641 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001642 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001643 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001644 verify((+a).__class__ is int)
1645 verify((a >> 0).__class__ is int)
1646 verify((a << 0).__class__ is int)
1647 verify((hexint(0) << 12).__class__ is int)
1648 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001649
1650 class octlong(long):
1651 __slots__ = []
1652 def __str__(self):
1653 s = oct(self)
1654 if s[-1] == 'L':
1655 s = s[:-1]
1656 return s
1657 def __add__(self, other):
1658 return self.__class__(super(octlong, self).__add__(other))
1659 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001661 # (Note that overriding __radd__ here only seems to work
1662 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001663 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001664 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001665 vereq(a, 12345L)
1666 vereq(long(a), 12345L)
1667 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001668 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001669 verify((+a).__class__ is long)
1670 verify((-a).__class__ is long)
1671 verify((-octlong(0)).__class__ is long)
1672 verify((a >> 0).__class__ is long)
1673 verify((a << 0).__class__ is long)
1674 verify((a - 0).__class__ is long)
1675 verify((a * 1).__class__ is long)
1676 verify((a ** 1).__class__ is long)
1677 verify((a // 1).__class__ is long)
1678 verify((1 * a).__class__ is long)
1679 verify((a | 0).__class__ is long)
1680 verify((a ^ 0).__class__ is long)
1681 verify((a & -1L).__class__ is long)
1682 verify((octlong(0) << 12).__class__ is long)
1683 verify((octlong(0) >> 12).__class__ is long)
1684 verify(abs(octlong(0)).__class__ is long)
1685
1686 # Because octlong overrides __add__, we can't check the absence of +0
1687 # optimizations using octlong.
1688 class longclone(long):
1689 pass
1690 a = longclone(1)
1691 verify((a + 0).__class__ is long)
1692 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001693
1694 class precfloat(float):
1695 __slots__ = ['prec']
1696 def __init__(self, value=0.0, prec=12):
1697 self.prec = int(prec)
1698 float.__init__(value)
1699 def __repr__(self):
1700 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001701 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001702 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001703 vereq(a, 12345.0)
1704 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001705 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001706 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001707 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001708
Tim Peters2400fa42001-09-12 19:12:49 +00001709 class madcomplex(complex):
1710 def __repr__(self):
1711 return "%.17gj%+.17g" % (self.imag, self.real)
1712 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001713 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001714 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001715 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001716 vereq(a, base)
1717 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001718 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001719 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001720 vereq(repr(a), "4j-3")
1721 vereq(a, base)
1722 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001723 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001724 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001725 veris((+a).__class__, complex)
1726 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001727 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001728 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001729 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001730 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001731 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001732 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001733 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001734
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001735 class madtuple(tuple):
1736 _rev = None
1737 def rev(self):
1738 if self._rev is not None:
1739 return self._rev
1740 L = list(self)
1741 L.reverse()
1742 self._rev = self.__class__(L)
1743 return self._rev
1744 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001745 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1746 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1747 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001748 for i in range(512):
1749 t = madtuple(range(i))
1750 u = t.rev()
1751 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001752 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001753 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001754 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001755 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001756 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001757 verify(a[:].__class__ is tuple)
1758 verify((a * 1).__class__ is tuple)
1759 verify((a * 0).__class__ is tuple)
1760 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001761 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001762 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001763 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001764 verify((a + a).__class__ is tuple)
1765 verify((a * 0).__class__ is tuple)
1766 verify((a * 1).__class__ is tuple)
1767 verify((a * 2).__class__ is tuple)
1768 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001769
1770 class madstring(str):
1771 _rev = None
1772 def rev(self):
1773 if self._rev is not None:
1774 return self._rev
1775 L = list(self)
1776 L.reverse()
1777 self._rev = self.__class__("".join(L))
1778 return self._rev
1779 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001780 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1781 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1782 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001783 for i in range(256):
1784 s = madstring("".join(map(chr, range(i))))
1785 t = s.rev()
1786 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001787 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001788 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001789 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001790 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001791
Tim Peters8fa5dd02001-09-12 02:18:30 +00001792 base = "\x00" * 5
1793 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001794 vereq(s, base)
1795 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001796 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001797 vereq(hash(s), hash(base))
1798 vereq({s: 1}[base], 1)
1799 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001800 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001801 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001802 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001803 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001804 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001805 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001806 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001807 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001808 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001809 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001810 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001812 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001814 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001815 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001816 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001817 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001818 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001819 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001820 identitytab = ''.join([chr(i) for i in range(256)])
1821 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001822 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001823 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001824 vereq(s.translate(identitytab, "x"), base)
1825 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001826 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001827 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001828 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001829 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001830 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001831 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001832 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001833 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001834 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001835 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001836
Tim Peters111f6092001-09-12 07:54:51 +00001837 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001838 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001839 verify(intern(s).__class__ is str)
1840 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001841 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001842
1843 i = intern("y x")
1844 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001845 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001846 verify(intern(s).__class__ is str)
1847 verify(intern(s) is i)
1848
1849 s = madstring(i)
1850 verify(intern(s).__class__ is str)
1851 verify(intern(s) is i)
1852
Guido van Rossum91ee7982001-08-30 20:52:40 +00001853 class madunicode(unicode):
1854 _rev = None
1855 def rev(self):
1856 if self._rev is not None:
1857 return self._rev
1858 L = list(self)
1859 L.reverse()
1860 self._rev = self.__class__(u"".join(L))
1861 return self._rev
1862 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001863 vereq(u, u"ABCDEF")
1864 vereq(u.rev(), madunicode(u"FEDCBA"))
1865 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001866 base = u"12345"
1867 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001868 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001869 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001870 vereq(hash(u), hash(base))
1871 vereq({u: 1}[base], 1)
1872 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001873 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001874 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001875 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001876 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001877 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001878 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001879 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001880 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001881 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001882 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001883 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001884 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001885 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001886 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001887 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001888 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001889 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001890 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001891 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001892 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001893 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001894 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001895 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001896 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001897 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001898 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001899 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001900 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001901 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001902 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001903 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001904 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001905 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001906 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001907 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001908 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001909 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001911
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001912 class sublist(list):
1913 pass
1914 a = sublist(range(5))
1915 vereq(a, range(5))
1916 a.append("hello")
1917 vereq(a, range(5) + ["hello"])
1918 a[5] = 5
1919 vereq(a, range(6))
1920 a.extend(range(6, 20))
1921 vereq(a, range(20))
1922 a[-5:] = []
1923 vereq(a, range(15))
1924 del a[10:15]
1925 vereq(len(a), 10)
1926 vereq(a, range(10))
1927 vereq(list(a), range(10))
1928 vereq(a[0], 0)
1929 vereq(a[9], 9)
1930 vereq(a[-10], 0)
1931 vereq(a[-1], 9)
1932 vereq(a[:5], range(5))
1933
Tim Peters59c9a642001-09-13 05:38:56 +00001934 class CountedInput(file):
1935 """Counts lines read by self.readline().
1936
1937 self.lineno is the 0-based ordinal of the last line read, up to
1938 a maximum of one greater than the number of lines in the file.
1939
1940 self.ateof is true if and only if the final "" line has been read,
1941 at which point self.lineno stops incrementing, and further calls
1942 to readline() continue to return "".
1943 """
1944
1945 lineno = 0
1946 ateof = 0
1947 def readline(self):
1948 if self.ateof:
1949 return ""
1950 s = file.readline(self)
1951 # Next line works too.
1952 # s = super(CountedInput, self).readline()
1953 self.lineno += 1
1954 if s == "":
1955 self.ateof = 1
1956 return s
1957
Tim Peters561f8992001-09-13 19:36:36 +00001958 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001959 lines = ['a\n', 'b\n', 'c\n']
1960 try:
1961 f.writelines(lines)
1962 f.close()
1963 f = CountedInput(TESTFN)
1964 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1965 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00001966 vereq(expected, got)
1967 vereq(f.lineno, i)
1968 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00001969 f.close()
1970 finally:
1971 try:
1972 f.close()
1973 except:
1974 pass
1975 try:
1976 import os
1977 os.unlink(TESTFN)
1978 except:
1979 pass
1980
Tim Peters808b94e2001-09-13 19:33:07 +00001981def keywords():
1982 if verbose:
1983 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00001984 vereq(int(x=1), 1)
1985 vereq(float(x=2), 2.0)
1986 vereq(long(x=3), 3L)
1987 vereq(complex(imag=42, real=666), complex(666, 42))
1988 vereq(str(object=500), '500')
1989 vereq(unicode(string='abc', errors='strict'), u'abc')
1990 vereq(tuple(sequence=range(3)), (0, 1, 2))
1991 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00001992 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00001993
1994 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00001995 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00001996 try:
1997 constructor(bogus_keyword_arg=1)
1998 except TypeError:
1999 pass
2000 else:
2001 raise TestFailed("expected TypeError from bogus keyword "
2002 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002003
Tim Peters8fa45672001-09-13 21:01:29 +00002004def restricted():
2005 import rexec
2006 if verbose:
2007 print "Testing interaction with restricted execution ..."
2008
2009 sandbox = rexec.RExec()
2010
2011 code1 = """f = open(%r, 'w')""" % TESTFN
2012 code2 = """f = file(%r, 'w')""" % TESTFN
2013 code3 = """\
2014f = open(%r)
2015t = type(f) # a sneaky way to get the file() constructor
2016f.close()
2017f = t(%r, 'w') # rexec can't catch this by itself
2018""" % (TESTFN, TESTFN)
2019
2020 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2021 f.close()
2022
2023 try:
2024 for code in code1, code2, code3:
2025 try:
2026 sandbox.r_exec(code)
2027 except IOError, msg:
2028 if str(msg).find("restricted") >= 0:
2029 outcome = "OK"
2030 else:
2031 outcome = "got an exception, but not an expected one"
2032 else:
2033 outcome = "expected a restricted-execution exception"
2034
2035 if outcome != "OK":
2036 raise TestFailed("%s, in %r" % (outcome, code))
2037
2038 finally:
2039 try:
2040 import os
2041 os.unlink(TESTFN)
2042 except:
2043 pass
2044
Tim Peters0ab085c2001-09-14 00:25:33 +00002045def str_subclass_as_dict_key():
2046 if verbose:
2047 print "Testing a str subclass used as dict key .."
2048
2049 class cistr(str):
2050 """Sublcass of str that computes __eq__ case-insensitively.
2051
2052 Also computes a hash code of the string in canonical form.
2053 """
2054
2055 def __init__(self, value):
2056 self.canonical = value.lower()
2057 self.hashcode = hash(self.canonical)
2058
2059 def __eq__(self, other):
2060 if not isinstance(other, cistr):
2061 other = cistr(other)
2062 return self.canonical == other.canonical
2063
2064 def __hash__(self):
2065 return self.hashcode
2066
Guido van Rossum45704552001-10-08 16:35:45 +00002067 vereq(cistr('ABC'), 'abc')
2068 vereq('aBc', cistr('ABC'))
2069 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002070
2071 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002072 vereq(d[cistr('one')], 1)
2073 vereq(d[cistr('tWo')], 2)
2074 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002075 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002076 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002077
Guido van Rossumab3b0342001-09-18 20:38:53 +00002078def classic_comparisons():
2079 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002080 class classic:
2081 pass
2082 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002083 if verbose: print " (base = %s)" % base
2084 class C(base):
2085 def __init__(self, value):
2086 self.value = int(value)
2087 def __cmp__(self, other):
2088 if isinstance(other, C):
2089 return cmp(self.value, other.value)
2090 if isinstance(other, int) or isinstance(other, long):
2091 return cmp(self.value, other)
2092 return NotImplemented
2093 c1 = C(1)
2094 c2 = C(2)
2095 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002096 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002097 c = {1: c1, 2: c2, 3: c3}
2098 for x in 1, 2, 3:
2099 for y in 1, 2, 3:
2100 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2101 for op in "<", "<=", "==", "!=", ">", ">=":
2102 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2103 "x=%d, y=%d" % (x, y))
2104 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2105 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2106
Guido van Rossum0639f592001-09-18 21:06:04 +00002107def rich_comparisons():
2108 if verbose:
2109 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002110 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002111 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002112 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002113 vereq(z, 1+0j)
2114 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002115 class ZZ(complex):
2116 def __eq__(self, other):
2117 try:
2118 return abs(self - other) <= 1e-6
2119 except:
2120 return NotImplemented
2121 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002122 vereq(zz, 1+0j)
2123 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002124
Guido van Rossum0639f592001-09-18 21:06:04 +00002125 class classic:
2126 pass
2127 for base in (classic, int, object, list):
2128 if verbose: print " (base = %s)" % base
2129 class C(base):
2130 def __init__(self, value):
2131 self.value = int(value)
2132 def __cmp__(self, other):
2133 raise TestFailed, "shouldn't call __cmp__"
2134 def __eq__(self, other):
2135 if isinstance(other, C):
2136 return self.value == other.value
2137 if isinstance(other, int) or isinstance(other, long):
2138 return self.value == other
2139 return NotImplemented
2140 def __ne__(self, other):
2141 if isinstance(other, C):
2142 return self.value != other.value
2143 if isinstance(other, int) or isinstance(other, long):
2144 return self.value != other
2145 return NotImplemented
2146 def __lt__(self, other):
2147 if isinstance(other, C):
2148 return self.value < other.value
2149 if isinstance(other, int) or isinstance(other, long):
2150 return self.value < other
2151 return NotImplemented
2152 def __le__(self, other):
2153 if isinstance(other, C):
2154 return self.value <= other.value
2155 if isinstance(other, int) or isinstance(other, long):
2156 return self.value <= other
2157 return NotImplemented
2158 def __gt__(self, other):
2159 if isinstance(other, C):
2160 return self.value > other.value
2161 if isinstance(other, int) or isinstance(other, long):
2162 return self.value > other
2163 return NotImplemented
2164 def __ge__(self, other):
2165 if isinstance(other, C):
2166 return self.value >= other.value
2167 if isinstance(other, int) or isinstance(other, long):
2168 return self.value >= other
2169 return NotImplemented
2170 c1 = C(1)
2171 c2 = C(2)
2172 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002173 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002174 c = {1: c1, 2: c2, 3: c3}
2175 for x in 1, 2, 3:
2176 for y in 1, 2, 3:
2177 for op in "<", "<=", "==", "!=", ">", ">=":
2178 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2179 "x=%d, y=%d" % (x, y))
2180 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2181 "x=%d, y=%d" % (x, y))
2182 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2183 "x=%d, y=%d" % (x, y))
2184
Guido van Rossum1952e382001-09-19 01:25:16 +00002185def coercions():
2186 if verbose: print "Testing coercions..."
2187 class I(int): pass
2188 coerce(I(0), 0)
2189 coerce(0, I(0))
2190 class L(long): pass
2191 coerce(L(0), 0)
2192 coerce(L(0), 0L)
2193 coerce(0, L(0))
2194 coerce(0L, L(0))
2195 class F(float): pass
2196 coerce(F(0), 0)
2197 coerce(F(0), 0L)
2198 coerce(F(0), 0.)
2199 coerce(0, F(0))
2200 coerce(0L, F(0))
2201 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002202 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002203 coerce(C(0), 0)
2204 coerce(C(0), 0L)
2205 coerce(C(0), 0.)
2206 coerce(C(0), 0j)
2207 coerce(0, C(0))
2208 coerce(0L, C(0))
2209 coerce(0., C(0))
2210 coerce(0j, C(0))
2211
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002212def descrdoc():
2213 if verbose: print "Testing descriptor doc strings..."
2214 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002215 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002216 check(file.closed, "flag set if the file is closed") # getset descriptor
2217 check(file.name, "file name") # member descriptor
2218
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002219def setclass():
2220 if verbose: print "Testing __class__ assignment..."
2221 class C(object): pass
2222 class D(object): pass
2223 class E(object): pass
2224 class F(D, E): pass
2225 for cls in C, D, E, F:
2226 for cls2 in C, D, E, F:
2227 x = cls()
2228 x.__class__ = cls2
2229 verify(x.__class__ is cls2)
2230 x.__class__ = cls
2231 verify(x.__class__ is cls)
2232 def cant(x, C):
2233 try:
2234 x.__class__ = C
2235 except TypeError:
2236 pass
2237 else:
2238 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2239 cant(C(), list)
2240 cant(list(), C)
2241 cant(C(), 1)
2242 cant(C(), object)
2243 cant(object(), list)
2244 cant(list(), object)
2245
Guido van Rossum6661be32001-10-26 04:26:12 +00002246def setdict():
2247 if verbose: print "Testing __dict__ assignment..."
2248 class C(object): pass
2249 a = C()
2250 a.__dict__ = {'b': 1}
2251 vereq(a.b, 1)
2252 def cant(x, dict):
2253 try:
2254 x.__dict__ = dict
2255 except TypeError:
2256 pass
2257 else:
2258 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2259 cant(a, None)
2260 cant(a, [])
2261 cant(a, 1)
2262 try:
2263 del a.__dict__
2264 except TypeError:
2265 pass
2266 else:
2267 raise TestFailed, "shouldn't allow del %r.__dict__" % (a)
2268 # Classes don't allow __dict__ assignment
2269 cant(C, {})
2270
Guido van Rossum3926a632001-09-25 16:25:58 +00002271def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002272 if verbose:
2273 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002274 import pickle, cPickle
2275
2276 def sorteditems(d):
2277 L = d.items()
2278 L.sort()
2279 return L
2280
2281 global C
2282 class C(object):
2283 def __init__(self, a, b):
2284 super(C, self).__init__()
2285 self.a = a
2286 self.b = b
2287 def __repr__(self):
2288 return "C(%r, %r)" % (self.a, self.b)
2289
2290 global C1
2291 class C1(list):
2292 def __new__(cls, a, b):
2293 return super(C1, cls).__new__(cls)
2294 def __init__(self, a, b):
2295 self.a = a
2296 self.b = b
2297 def __repr__(self):
2298 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2299
2300 global C2
2301 class C2(int):
2302 def __new__(cls, a, b, val=0):
2303 return super(C2, cls).__new__(cls, val)
2304 def __init__(self, a, b, val=0):
2305 self.a = a
2306 self.b = b
2307 def __repr__(self):
2308 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2309
Guido van Rossum90c45142001-11-24 21:07:01 +00002310 global C3
2311 class C3(object):
2312 def __init__(self, foo):
2313 self.foo = foo
2314 def __getstate__(self):
2315 return self.foo
2316 def __setstate__(self, foo):
2317 self.foo = foo
2318
2319 global C4classic, C4
2320 class C4classic: # classic
2321 pass
2322 class C4(C4classic, object): # mixed inheritance
2323 pass
2324
Guido van Rossum3926a632001-09-25 16:25:58 +00002325 for p in pickle, cPickle:
2326 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002327 if verbose:
2328 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002329
2330 for cls in C, C1, C2:
2331 s = p.dumps(cls, bin)
2332 cls2 = p.loads(s)
2333 verify(cls2 is cls)
2334
2335 a = C1(1, 2); a.append(42); a.append(24)
2336 b = C2("hello", "world", 42)
2337 s = p.dumps((a, b), bin)
2338 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002339 vereq(x.__class__, a.__class__)
2340 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2341 vereq(y.__class__, b.__class__)
2342 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2343 vereq(`x`, `a`)
2344 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002345 if verbose:
2346 print "a = x =", a
2347 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002348 # Test for __getstate__ and __setstate__ on new style class
2349 u = C3(42)
2350 s = p.dumps(u, bin)
2351 v = p.loads(s)
2352 veris(u.__class__, v.__class__)
2353 vereq(u.foo, v.foo)
2354 # Test for picklability of hybrid class
2355 u = C4()
2356 u.foo = 42
2357 s = p.dumps(u, bin)
2358 v = p.loads(s)
2359 veris(u.__class__, v.__class__)
2360 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002361
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002362 # Testing copy.deepcopy()
2363 if verbose:
2364 print "deepcopy"
2365 import copy
2366 for cls in C, C1, C2:
2367 cls2 = copy.deepcopy(cls)
2368 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002369
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002370 a = C1(1, 2); a.append(42); a.append(24)
2371 b = C2("hello", "world", 42)
2372 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002373 vereq(x.__class__, a.__class__)
2374 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2375 vereq(y.__class__, b.__class__)
2376 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2377 vereq(`x`, `a`)
2378 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002379 if verbose:
2380 print "a = x =", a
2381 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002382
2383def copies():
2384 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2385 import copy
2386 class C(object):
2387 pass
2388
2389 a = C()
2390 a.foo = 12
2391 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002392 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002393
2394 a.bar = [1,2,3]
2395 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002396 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002397 verify(c.bar is a.bar)
2398
2399 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002400 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002401 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002402 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002403
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002404def binopoverride():
2405 if verbose: print "Testing overrides of binary operations..."
2406 class I(int):
2407 def __repr__(self):
2408 return "I(%r)" % int(self)
2409 def __add__(self, other):
2410 return I(int(self) + int(other))
2411 __radd__ = __add__
2412 def __pow__(self, other, mod=None):
2413 if mod is None:
2414 return I(pow(int(self), int(other)))
2415 else:
2416 return I(pow(int(self), int(other), int(mod)))
2417 def __rpow__(self, other, mod=None):
2418 if mod is None:
2419 return I(pow(int(other), int(self), mod))
2420 else:
2421 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002422
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002423 vereq(`I(1) + I(2)`, "I(3)")
2424 vereq(`I(1) + 2`, "I(3)")
2425 vereq(`1 + I(2)`, "I(3)")
2426 vereq(`I(2) ** I(3)`, "I(8)")
2427 vereq(`2 ** I(3)`, "I(8)")
2428 vereq(`I(2) ** 3`, "I(8)")
2429 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2430 class S(str):
2431 def __eq__(self, other):
2432 return self.lower() == other.lower()
2433
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002434def subclasspropagation():
2435 if verbose: print "Testing propagation of slot functions to subclasses..."
2436 class A(object):
2437 pass
2438 class B(A):
2439 pass
2440 class C(A):
2441 pass
2442 class D(B, C):
2443 pass
2444 d = D()
2445 vereq(hash(d), id(d))
2446 A.__hash__ = lambda self: 42
2447 vereq(hash(d), 42)
2448 C.__hash__ = lambda self: 314
2449 vereq(hash(d), 314)
2450 B.__hash__ = lambda self: 144
2451 vereq(hash(d), 144)
2452 D.__hash__ = lambda self: 100
2453 vereq(hash(d), 100)
2454 del D.__hash__
2455 vereq(hash(d), 144)
2456 del B.__hash__
2457 vereq(hash(d), 314)
2458 del C.__hash__
2459 vereq(hash(d), 42)
2460 del A.__hash__
2461 vereq(hash(d), id(d))
2462 d.foo = 42
2463 d.bar = 42
2464 vereq(d.foo, 42)
2465 vereq(d.bar, 42)
2466 def __getattribute__(self, name):
2467 if name == "foo":
2468 return 24
2469 return object.__getattribute__(self, name)
2470 A.__getattribute__ = __getattribute__
2471 vereq(d.foo, 24)
2472 vereq(d.bar, 42)
2473 def __getattr__(self, name):
2474 if name in ("spam", "foo", "bar"):
2475 return "hello"
2476 raise AttributeError, name
2477 B.__getattr__ = __getattr__
2478 vereq(d.spam, "hello")
2479 vereq(d.foo, 24)
2480 vereq(d.bar, 42)
2481 del A.__getattribute__
2482 vereq(d.foo, 42)
2483 del d.foo
2484 vereq(d.foo, "hello")
2485 vereq(d.bar, 42)
2486 del B.__getattr__
2487 try:
2488 d.foo
2489 except AttributeError:
2490 pass
2491 else:
2492 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002493
2494def buffer_inherit():
2495 import binascii
2496 # SF bug [#470040] ParseTuple t# vs subclasses.
2497 if verbose:
2498 print "Testing that buffer interface is inherited ..."
2499
2500 class MyStr(str):
2501 pass
2502 base = 'abc'
2503 m = MyStr(base)
2504 # b2a_hex uses the buffer interface to get its argument's value, via
2505 # PyArg_ParseTuple 't#' code.
2506 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2507
2508 # It's not clear that unicode will continue to support the character
2509 # buffer interface, and this test will fail if that's taken away.
2510 class MyUni(unicode):
2511 pass
2512 base = u'abc'
2513 m = MyUni(base)
2514 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2515
2516 class MyInt(int):
2517 pass
2518 m = MyInt(42)
2519 try:
2520 binascii.b2a_hex(m)
2521 raise TestFailed('subclass of int should not have a buffer interface')
2522 except TypeError:
2523 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002524
Tim Petersc9933152001-10-16 20:18:24 +00002525def str_of_str_subclass():
2526 import binascii
2527 import cStringIO
2528
2529 if verbose:
2530 print "Testing __str__ defined in subclass of str ..."
2531
2532 class octetstring(str):
2533 def __str__(self):
2534 return binascii.b2a_hex(self)
2535 def __repr__(self):
2536 return self + " repr"
2537
2538 o = octetstring('A')
2539 vereq(type(o), octetstring)
2540 vereq(type(str(o)), str)
2541 vereq(type(repr(o)), str)
2542 vereq(ord(o), 0x41)
2543 vereq(str(o), '41')
2544 vereq(repr(o), 'A repr')
2545 vereq(o.__str__(), '41')
2546 vereq(o.__repr__(), 'A repr')
2547
2548 capture = cStringIO.StringIO()
2549 # Calling str() or not exercises different internal paths.
2550 print >> capture, o
2551 print >> capture, str(o)
2552 vereq(capture.getvalue(), '41\n41\n')
2553 capture.close()
2554
Guido van Rossumc8e56452001-10-22 00:43:43 +00002555def kwdargs():
2556 if verbose: print "Testing keyword arguments to __init__, __call__..."
2557 def f(a): return a
2558 vereq(f.__call__(a=42), 42)
2559 a = []
2560 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002561 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002562
Guido van Rossumed87ad82001-10-30 02:33:02 +00002563def delhook():
2564 if verbose: print "Testing __del__ hook..."
2565 log = []
2566 class C(object):
2567 def __del__(self):
2568 log.append(1)
2569 c = C()
2570 vereq(log, [])
2571 del c
2572 vereq(log, [1])
2573
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002574def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002575 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002576 lists()
2577 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002578 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002579 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002580 ints()
2581 longs()
2582 floats()
2583 complexes()
2584 spamlists()
2585 spamdicts()
2586 pydicts()
2587 pylists()
2588 metaclass()
2589 pymods()
2590 multi()
2591 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002592 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002593 slots()
2594 dynamics()
2595 errors()
2596 classmethods()
2597 staticmethods()
2598 classic()
2599 compattr()
2600 newslot()
2601 altmro()
2602 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002603 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002604 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002605 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002606 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002607 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002608 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002609 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002610 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002611 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002612 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002613 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002614 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002615 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002616 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002617 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002618 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002619 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002620 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002621 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002622 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002623 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002624 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002625 delhook()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002626 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002627
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002628if __name__ == "__main__":
2629 test_main()