blob: 41c03a079da4c02468319b0a1ceabd507abb8bba [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:
556 assert len(a) == 1
557 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):
563 assert 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
1575 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1576
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001577def inherits():
1578 if verbose: print "Testing inheritance from basic types..."
1579
1580 class hexint(int):
1581 def __repr__(self):
1582 return hex(self)
1583 def __add__(self, other):
1584 return hexint(int.__add__(self, other))
1585 # (Note that overriding __radd__ doesn't work,
1586 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001587 vereq(repr(hexint(7) + 9), "0x10")
1588 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001589 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001590 vereq(a, 12345)
1591 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001592 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001593 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001594 verify((+a).__class__ is int)
1595 verify((a >> 0).__class__ is int)
1596 verify((a << 0).__class__ is int)
1597 verify((hexint(0) << 12).__class__ is int)
1598 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001599
1600 class octlong(long):
1601 __slots__ = []
1602 def __str__(self):
1603 s = oct(self)
1604 if s[-1] == 'L':
1605 s = s[:-1]
1606 return s
1607 def __add__(self, other):
1608 return self.__class__(super(octlong, self).__add__(other))
1609 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001610 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001611 # (Note that overriding __radd__ here only seems to work
1612 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001613 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001614 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001615 vereq(a, 12345L)
1616 vereq(long(a), 12345L)
1617 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001618 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001619 verify((+a).__class__ is long)
1620 verify((-a).__class__ is long)
1621 verify((-octlong(0)).__class__ is long)
1622 verify((a >> 0).__class__ is long)
1623 verify((a << 0).__class__ is long)
1624 verify((a - 0).__class__ is long)
1625 verify((a * 1).__class__ is long)
1626 verify((a ** 1).__class__ is long)
1627 verify((a // 1).__class__ is long)
1628 verify((1 * a).__class__ is long)
1629 verify((a | 0).__class__ is long)
1630 verify((a ^ 0).__class__ is long)
1631 verify((a & -1L).__class__ is long)
1632 verify((octlong(0) << 12).__class__ is long)
1633 verify((octlong(0) >> 12).__class__ is long)
1634 verify(abs(octlong(0)).__class__ is long)
1635
1636 # Because octlong overrides __add__, we can't check the absence of +0
1637 # optimizations using octlong.
1638 class longclone(long):
1639 pass
1640 a = longclone(1)
1641 verify((a + 0).__class__ is long)
1642 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001643
1644 class precfloat(float):
1645 __slots__ = ['prec']
1646 def __init__(self, value=0.0, prec=12):
1647 self.prec = int(prec)
1648 float.__init__(value)
1649 def __repr__(self):
1650 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001651 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001652 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(a, 12345.0)
1654 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001655 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001656 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001657 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001658
Tim Peters2400fa42001-09-12 19:12:49 +00001659 class madcomplex(complex):
1660 def __repr__(self):
1661 return "%.17gj%+.17g" % (self.imag, self.real)
1662 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001663 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001664 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001665 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(a, base)
1667 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001668 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001669 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001670 vereq(repr(a), "4j-3")
1671 vereq(a, base)
1672 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001673 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001674 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001675 veris((+a).__class__, complex)
1676 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001677 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001678 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001679 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001680 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001682 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001684
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001685 class madtuple(tuple):
1686 _rev = None
1687 def rev(self):
1688 if self._rev is not None:
1689 return self._rev
1690 L = list(self)
1691 L.reverse()
1692 self._rev = self.__class__(L)
1693 return self._rev
1694 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001695 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1696 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1697 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001698 for i in range(512):
1699 t = madtuple(range(i))
1700 u = t.rev()
1701 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001702 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001703 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001704 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001705 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001706 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001707 verify(a[:].__class__ is tuple)
1708 verify((a * 1).__class__ is tuple)
1709 verify((a * 0).__class__ is tuple)
1710 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001711 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001712 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001713 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001714 verify((a + a).__class__ is tuple)
1715 verify((a * 0).__class__ is tuple)
1716 verify((a * 1).__class__ is tuple)
1717 verify((a * 2).__class__ is tuple)
1718 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001719
1720 class madstring(str):
1721 _rev = None
1722 def rev(self):
1723 if self._rev is not None:
1724 return self._rev
1725 L = list(self)
1726 L.reverse()
1727 self._rev = self.__class__("".join(L))
1728 return self._rev
1729 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001730 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1731 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1732 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001733 for i in range(256):
1734 s = madstring("".join(map(chr, range(i))))
1735 t = s.rev()
1736 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001737 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001738 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001739 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001740 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001741
Tim Peters8fa5dd02001-09-12 02:18:30 +00001742 base = "\x00" * 5
1743 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001744 vereq(s, base)
1745 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001746 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001747 vereq(hash(s), hash(base))
1748 vereq({s: 1}[base], 1)
1749 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001750 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001751 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001752 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001753 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001754 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001755 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001756 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001757 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001758 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001759 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001760 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001761 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001762 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001763 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001764 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001765 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001766 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001767 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001768 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001769 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001770 identitytab = ''.join([chr(i) for i in range(256)])
1771 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001772 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001773 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001774 vereq(s.translate(identitytab, "x"), base)
1775 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001776 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001777 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001778 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001779 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001780 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001782 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001783 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001784 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001785 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001786
Tim Peters111f6092001-09-12 07:54:51 +00001787 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001788 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001789 verify(intern(s).__class__ is str)
1790 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001791 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001792
1793 i = intern("y x")
1794 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001795 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001796 verify(intern(s).__class__ is str)
1797 verify(intern(s) is i)
1798
1799 s = madstring(i)
1800 verify(intern(s).__class__ is str)
1801 verify(intern(s) is i)
1802
Guido van Rossum91ee7982001-08-30 20:52:40 +00001803 class madunicode(unicode):
1804 _rev = None
1805 def rev(self):
1806 if self._rev is not None:
1807 return self._rev
1808 L = list(self)
1809 L.reverse()
1810 self._rev = self.__class__(u"".join(L))
1811 return self._rev
1812 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(u, u"ABCDEF")
1814 vereq(u.rev(), madunicode(u"FEDCBA"))
1815 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001816 base = u"12345"
1817 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001818 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001819 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001820 vereq(hash(u), hash(base))
1821 vereq({u: 1}[base], 1)
1822 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001823 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001824 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001825 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001826 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001827 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001828 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001829 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001830 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001831 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001832 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001833 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001834 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001835 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001836 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001837 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001838 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001839 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001840 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001841 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001842 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001843 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001844 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001845 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001846 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001847 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001848 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001849 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001850 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001851 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001852 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001853 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001854 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001855 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001856 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001857 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001858 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001859 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001860 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001861
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001862 class sublist(list):
1863 pass
1864 a = sublist(range(5))
1865 vereq(a, range(5))
1866 a.append("hello")
1867 vereq(a, range(5) + ["hello"])
1868 a[5] = 5
1869 vereq(a, range(6))
1870 a.extend(range(6, 20))
1871 vereq(a, range(20))
1872 a[-5:] = []
1873 vereq(a, range(15))
1874 del a[10:15]
1875 vereq(len(a), 10)
1876 vereq(a, range(10))
1877 vereq(list(a), range(10))
1878 vereq(a[0], 0)
1879 vereq(a[9], 9)
1880 vereq(a[-10], 0)
1881 vereq(a[-1], 9)
1882 vereq(a[:5], range(5))
1883
Tim Peters59c9a642001-09-13 05:38:56 +00001884 class CountedInput(file):
1885 """Counts lines read by self.readline().
1886
1887 self.lineno is the 0-based ordinal of the last line read, up to
1888 a maximum of one greater than the number of lines in the file.
1889
1890 self.ateof is true if and only if the final "" line has been read,
1891 at which point self.lineno stops incrementing, and further calls
1892 to readline() continue to return "".
1893 """
1894
1895 lineno = 0
1896 ateof = 0
1897 def readline(self):
1898 if self.ateof:
1899 return ""
1900 s = file.readline(self)
1901 # Next line works too.
1902 # s = super(CountedInput, self).readline()
1903 self.lineno += 1
1904 if s == "":
1905 self.ateof = 1
1906 return s
1907
Tim Peters561f8992001-09-13 19:36:36 +00001908 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001909 lines = ['a\n', 'b\n', 'c\n']
1910 try:
1911 f.writelines(lines)
1912 f.close()
1913 f = CountedInput(TESTFN)
1914 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1915 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00001916 vereq(expected, got)
1917 vereq(f.lineno, i)
1918 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00001919 f.close()
1920 finally:
1921 try:
1922 f.close()
1923 except:
1924 pass
1925 try:
1926 import os
1927 os.unlink(TESTFN)
1928 except:
1929 pass
1930
Tim Peters808b94e2001-09-13 19:33:07 +00001931def keywords():
1932 if verbose:
1933 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00001934 vereq(int(x=1), 1)
1935 vereq(float(x=2), 2.0)
1936 vereq(long(x=3), 3L)
1937 vereq(complex(imag=42, real=666), complex(666, 42))
1938 vereq(str(object=500), '500')
1939 vereq(unicode(string='abc', errors='strict'), u'abc')
1940 vereq(tuple(sequence=range(3)), (0, 1, 2))
1941 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00001942 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00001943
1944 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00001945 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00001946 try:
1947 constructor(bogus_keyword_arg=1)
1948 except TypeError:
1949 pass
1950 else:
1951 raise TestFailed("expected TypeError from bogus keyword "
1952 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001953
Tim Peters8fa45672001-09-13 21:01:29 +00001954def restricted():
1955 import rexec
1956 if verbose:
1957 print "Testing interaction with restricted execution ..."
1958
1959 sandbox = rexec.RExec()
1960
1961 code1 = """f = open(%r, 'w')""" % TESTFN
1962 code2 = """f = file(%r, 'w')""" % TESTFN
1963 code3 = """\
1964f = open(%r)
1965t = type(f) # a sneaky way to get the file() constructor
1966f.close()
1967f = t(%r, 'w') # rexec can't catch this by itself
1968""" % (TESTFN, TESTFN)
1969
1970 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1971 f.close()
1972
1973 try:
1974 for code in code1, code2, code3:
1975 try:
1976 sandbox.r_exec(code)
1977 except IOError, msg:
1978 if str(msg).find("restricted") >= 0:
1979 outcome = "OK"
1980 else:
1981 outcome = "got an exception, but not an expected one"
1982 else:
1983 outcome = "expected a restricted-execution exception"
1984
1985 if outcome != "OK":
1986 raise TestFailed("%s, in %r" % (outcome, code))
1987
1988 finally:
1989 try:
1990 import os
1991 os.unlink(TESTFN)
1992 except:
1993 pass
1994
Tim Peters0ab085c2001-09-14 00:25:33 +00001995def str_subclass_as_dict_key():
1996 if verbose:
1997 print "Testing a str subclass used as dict key .."
1998
1999 class cistr(str):
2000 """Sublcass of str that computes __eq__ case-insensitively.
2001
2002 Also computes a hash code of the string in canonical form.
2003 """
2004
2005 def __init__(self, value):
2006 self.canonical = value.lower()
2007 self.hashcode = hash(self.canonical)
2008
2009 def __eq__(self, other):
2010 if not isinstance(other, cistr):
2011 other = cistr(other)
2012 return self.canonical == other.canonical
2013
2014 def __hash__(self):
2015 return self.hashcode
2016
Guido van Rossum45704552001-10-08 16:35:45 +00002017 vereq(cistr('ABC'), 'abc')
2018 vereq('aBc', cistr('ABC'))
2019 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002020
2021 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002022 vereq(d[cistr('one')], 1)
2023 vereq(d[cistr('tWo')], 2)
2024 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002025 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002026 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002027
Guido van Rossumab3b0342001-09-18 20:38:53 +00002028def classic_comparisons():
2029 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002030 class classic:
2031 pass
2032 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002033 if verbose: print " (base = %s)" % base
2034 class C(base):
2035 def __init__(self, value):
2036 self.value = int(value)
2037 def __cmp__(self, other):
2038 if isinstance(other, C):
2039 return cmp(self.value, other.value)
2040 if isinstance(other, int) or isinstance(other, long):
2041 return cmp(self.value, other)
2042 return NotImplemented
2043 c1 = C(1)
2044 c2 = C(2)
2045 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002046 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002047 c = {1: c1, 2: c2, 3: c3}
2048 for x in 1, 2, 3:
2049 for y in 1, 2, 3:
2050 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2051 for op in "<", "<=", "==", "!=", ">", ">=":
2052 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2053 "x=%d, y=%d" % (x, y))
2054 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2055 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2056
Guido van Rossum0639f592001-09-18 21:06:04 +00002057def rich_comparisons():
2058 if verbose:
2059 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002060 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002061 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002062 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002063 vereq(z, 1+0j)
2064 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002065 class ZZ(complex):
2066 def __eq__(self, other):
2067 try:
2068 return abs(self - other) <= 1e-6
2069 except:
2070 return NotImplemented
2071 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002072 vereq(zz, 1+0j)
2073 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002074
Guido van Rossum0639f592001-09-18 21:06:04 +00002075 class classic:
2076 pass
2077 for base in (classic, int, object, list):
2078 if verbose: print " (base = %s)" % base
2079 class C(base):
2080 def __init__(self, value):
2081 self.value = int(value)
2082 def __cmp__(self, other):
2083 raise TestFailed, "shouldn't call __cmp__"
2084 def __eq__(self, other):
2085 if isinstance(other, C):
2086 return self.value == other.value
2087 if isinstance(other, int) or isinstance(other, long):
2088 return self.value == other
2089 return NotImplemented
2090 def __ne__(self, other):
2091 if isinstance(other, C):
2092 return self.value != other.value
2093 if isinstance(other, int) or isinstance(other, long):
2094 return self.value != other
2095 return NotImplemented
2096 def __lt__(self, other):
2097 if isinstance(other, C):
2098 return self.value < other.value
2099 if isinstance(other, int) or isinstance(other, long):
2100 return self.value < other
2101 return NotImplemented
2102 def __le__(self, other):
2103 if isinstance(other, C):
2104 return self.value <= other.value
2105 if isinstance(other, int) or isinstance(other, long):
2106 return self.value <= other
2107 return NotImplemented
2108 def __gt__(self, other):
2109 if isinstance(other, C):
2110 return self.value > other.value
2111 if isinstance(other, int) or isinstance(other, long):
2112 return self.value > other
2113 return NotImplemented
2114 def __ge__(self, other):
2115 if isinstance(other, C):
2116 return self.value >= other.value
2117 if isinstance(other, int) or isinstance(other, long):
2118 return self.value >= other
2119 return NotImplemented
2120 c1 = C(1)
2121 c2 = C(2)
2122 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002123 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002124 c = {1: c1, 2: c2, 3: c3}
2125 for x in 1, 2, 3:
2126 for y in 1, 2, 3:
2127 for op in "<", "<=", "==", "!=", ">", ">=":
2128 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2129 "x=%d, y=%d" % (x, y))
2130 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2131 "x=%d, y=%d" % (x, y))
2132 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2133 "x=%d, y=%d" % (x, y))
2134
Guido van Rossum1952e382001-09-19 01:25:16 +00002135def coercions():
2136 if verbose: print "Testing coercions..."
2137 class I(int): pass
2138 coerce(I(0), 0)
2139 coerce(0, I(0))
2140 class L(long): pass
2141 coerce(L(0), 0)
2142 coerce(L(0), 0L)
2143 coerce(0, L(0))
2144 coerce(0L, L(0))
2145 class F(float): pass
2146 coerce(F(0), 0)
2147 coerce(F(0), 0L)
2148 coerce(F(0), 0.)
2149 coerce(0, F(0))
2150 coerce(0L, F(0))
2151 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002152 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002153 coerce(C(0), 0)
2154 coerce(C(0), 0L)
2155 coerce(C(0), 0.)
2156 coerce(C(0), 0j)
2157 coerce(0, C(0))
2158 coerce(0L, C(0))
2159 coerce(0., C(0))
2160 coerce(0j, C(0))
2161
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002162def descrdoc():
2163 if verbose: print "Testing descriptor doc strings..."
2164 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002165 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002166 check(file.closed, "flag set if the file is closed") # getset descriptor
2167 check(file.name, "file name") # member descriptor
2168
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002169def setclass():
2170 if verbose: print "Testing __class__ assignment..."
2171 class C(object): pass
2172 class D(object): pass
2173 class E(object): pass
2174 class F(D, E): pass
2175 for cls in C, D, E, F:
2176 for cls2 in C, D, E, F:
2177 x = cls()
2178 x.__class__ = cls2
2179 verify(x.__class__ is cls2)
2180 x.__class__ = cls
2181 verify(x.__class__ is cls)
2182 def cant(x, C):
2183 try:
2184 x.__class__ = C
2185 except TypeError:
2186 pass
2187 else:
2188 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2189 cant(C(), list)
2190 cant(list(), C)
2191 cant(C(), 1)
2192 cant(C(), object)
2193 cant(object(), list)
2194 cant(list(), object)
2195
Guido van Rossum6661be32001-10-26 04:26:12 +00002196def setdict():
2197 if verbose: print "Testing __dict__ assignment..."
2198 class C(object): pass
2199 a = C()
2200 a.__dict__ = {'b': 1}
2201 vereq(a.b, 1)
2202 def cant(x, dict):
2203 try:
2204 x.__dict__ = dict
2205 except TypeError:
2206 pass
2207 else:
2208 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2209 cant(a, None)
2210 cant(a, [])
2211 cant(a, 1)
2212 try:
2213 del a.__dict__
2214 except TypeError:
2215 pass
2216 else:
2217 raise TestFailed, "shouldn't allow del %r.__dict__" % (a)
2218 # Classes don't allow __dict__ assignment
2219 cant(C, {})
2220
Guido van Rossum3926a632001-09-25 16:25:58 +00002221def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002222 if verbose:
2223 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002224 import pickle, cPickle
2225
2226 def sorteditems(d):
2227 L = d.items()
2228 L.sort()
2229 return L
2230
2231 global C
2232 class C(object):
2233 def __init__(self, a, b):
2234 super(C, self).__init__()
2235 self.a = a
2236 self.b = b
2237 def __repr__(self):
2238 return "C(%r, %r)" % (self.a, self.b)
2239
2240 global C1
2241 class C1(list):
2242 def __new__(cls, a, b):
2243 return super(C1, cls).__new__(cls)
2244 def __init__(self, a, b):
2245 self.a = a
2246 self.b = b
2247 def __repr__(self):
2248 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2249
2250 global C2
2251 class C2(int):
2252 def __new__(cls, a, b, val=0):
2253 return super(C2, cls).__new__(cls, val)
2254 def __init__(self, a, b, val=0):
2255 self.a = a
2256 self.b = b
2257 def __repr__(self):
2258 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2259
2260 for p in pickle, cPickle:
2261 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002262 if verbose:
2263 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002264
2265 for cls in C, C1, C2:
2266 s = p.dumps(cls, bin)
2267 cls2 = p.loads(s)
2268 verify(cls2 is cls)
2269
2270 a = C1(1, 2); a.append(42); a.append(24)
2271 b = C2("hello", "world", 42)
2272 s = p.dumps((a, b), bin)
2273 x, y = p.loads(s)
2274 assert x.__class__ == a.__class__
2275 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2276 assert y.__class__ == b.__class__
2277 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2278 assert `x` == `a`
2279 assert `y` == `b`
2280 if verbose:
2281 print "a = x =", a
2282 print "b = y =", b
2283
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002284 # Testing copy.deepcopy()
2285 if verbose:
2286 print "deepcopy"
2287 import copy
2288 for cls in C, C1, C2:
2289 cls2 = copy.deepcopy(cls)
2290 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002291
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002292 a = C1(1, 2); a.append(42); a.append(24)
2293 b = C2("hello", "world", 42)
2294 x, y = copy.deepcopy((a, b))
2295 assert x.__class__ == a.__class__
2296 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2297 assert y.__class__ == b.__class__
2298 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2299 assert `x` == `a`
2300 assert `y` == `b`
2301 if verbose:
2302 print "a = x =", a
2303 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002304
2305def copies():
2306 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2307 import copy
2308 class C(object):
2309 pass
2310
2311 a = C()
2312 a.foo = 12
2313 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002314 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002315
2316 a.bar = [1,2,3]
2317 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002318 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002319 verify(c.bar is a.bar)
2320
2321 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002322 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002323 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002324 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002325
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002326def binopoverride():
2327 if verbose: print "Testing overrides of binary operations..."
2328 class I(int):
2329 def __repr__(self):
2330 return "I(%r)" % int(self)
2331 def __add__(self, other):
2332 return I(int(self) + int(other))
2333 __radd__ = __add__
2334 def __pow__(self, other, mod=None):
2335 if mod is None:
2336 return I(pow(int(self), int(other)))
2337 else:
2338 return I(pow(int(self), int(other), int(mod)))
2339 def __rpow__(self, other, mod=None):
2340 if mod is None:
2341 return I(pow(int(other), int(self), mod))
2342 else:
2343 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002344
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002345 vereq(`I(1) + I(2)`, "I(3)")
2346 vereq(`I(1) + 2`, "I(3)")
2347 vereq(`1 + I(2)`, "I(3)")
2348 vereq(`I(2) ** I(3)`, "I(8)")
2349 vereq(`2 ** I(3)`, "I(8)")
2350 vereq(`I(2) ** 3`, "I(8)")
2351 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2352 class S(str):
2353 def __eq__(self, other):
2354 return self.lower() == other.lower()
2355
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002356def subclasspropagation():
2357 if verbose: print "Testing propagation of slot functions to subclasses..."
2358 class A(object):
2359 pass
2360 class B(A):
2361 pass
2362 class C(A):
2363 pass
2364 class D(B, C):
2365 pass
2366 d = D()
2367 vereq(hash(d), id(d))
2368 A.__hash__ = lambda self: 42
2369 vereq(hash(d), 42)
2370 C.__hash__ = lambda self: 314
2371 vereq(hash(d), 314)
2372 B.__hash__ = lambda self: 144
2373 vereq(hash(d), 144)
2374 D.__hash__ = lambda self: 100
2375 vereq(hash(d), 100)
2376 del D.__hash__
2377 vereq(hash(d), 144)
2378 del B.__hash__
2379 vereq(hash(d), 314)
2380 del C.__hash__
2381 vereq(hash(d), 42)
2382 del A.__hash__
2383 vereq(hash(d), id(d))
2384 d.foo = 42
2385 d.bar = 42
2386 vereq(d.foo, 42)
2387 vereq(d.bar, 42)
2388 def __getattribute__(self, name):
2389 if name == "foo":
2390 return 24
2391 return object.__getattribute__(self, name)
2392 A.__getattribute__ = __getattribute__
2393 vereq(d.foo, 24)
2394 vereq(d.bar, 42)
2395 def __getattr__(self, name):
2396 if name in ("spam", "foo", "bar"):
2397 return "hello"
2398 raise AttributeError, name
2399 B.__getattr__ = __getattr__
2400 vereq(d.spam, "hello")
2401 vereq(d.foo, 24)
2402 vereq(d.bar, 42)
2403 del A.__getattribute__
2404 vereq(d.foo, 42)
2405 del d.foo
2406 vereq(d.foo, "hello")
2407 vereq(d.bar, 42)
2408 del B.__getattr__
2409 try:
2410 d.foo
2411 except AttributeError:
2412 pass
2413 else:
2414 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002415
2416def buffer_inherit():
2417 import binascii
2418 # SF bug [#470040] ParseTuple t# vs subclasses.
2419 if verbose:
2420 print "Testing that buffer interface is inherited ..."
2421
2422 class MyStr(str):
2423 pass
2424 base = 'abc'
2425 m = MyStr(base)
2426 # b2a_hex uses the buffer interface to get its argument's value, via
2427 # PyArg_ParseTuple 't#' code.
2428 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2429
2430 # It's not clear that unicode will continue to support the character
2431 # buffer interface, and this test will fail if that's taken away.
2432 class MyUni(unicode):
2433 pass
2434 base = u'abc'
2435 m = MyUni(base)
2436 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2437
2438 class MyInt(int):
2439 pass
2440 m = MyInt(42)
2441 try:
2442 binascii.b2a_hex(m)
2443 raise TestFailed('subclass of int should not have a buffer interface')
2444 except TypeError:
2445 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002446
Tim Petersc9933152001-10-16 20:18:24 +00002447def str_of_str_subclass():
2448 import binascii
2449 import cStringIO
2450
2451 if verbose:
2452 print "Testing __str__ defined in subclass of str ..."
2453
2454 class octetstring(str):
2455 def __str__(self):
2456 return binascii.b2a_hex(self)
2457 def __repr__(self):
2458 return self + " repr"
2459
2460 o = octetstring('A')
2461 vereq(type(o), octetstring)
2462 vereq(type(str(o)), str)
2463 vereq(type(repr(o)), str)
2464 vereq(ord(o), 0x41)
2465 vereq(str(o), '41')
2466 vereq(repr(o), 'A repr')
2467 vereq(o.__str__(), '41')
2468 vereq(o.__repr__(), 'A repr')
2469
2470 capture = cStringIO.StringIO()
2471 # Calling str() or not exercises different internal paths.
2472 print >> capture, o
2473 print >> capture, str(o)
2474 vereq(capture.getvalue(), '41\n41\n')
2475 capture.close()
2476
Guido van Rossumc8e56452001-10-22 00:43:43 +00002477def kwdargs():
2478 if verbose: print "Testing keyword arguments to __init__, __call__..."
2479 def f(a): return a
2480 vereq(f.__call__(a=42), 42)
2481 a = []
2482 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002483 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002484
Guido van Rossumed87ad82001-10-30 02:33:02 +00002485def delhook():
2486 if verbose: print "Testing __del__ hook..."
2487 log = []
2488 class C(object):
2489 def __del__(self):
2490 log.append(1)
2491 c = C()
2492 vereq(log, [])
2493 del c
2494 vereq(log, [1])
2495
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002496def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002497 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002498 lists()
2499 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002500 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002501 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002502 ints()
2503 longs()
2504 floats()
2505 complexes()
2506 spamlists()
2507 spamdicts()
2508 pydicts()
2509 pylists()
2510 metaclass()
2511 pymods()
2512 multi()
2513 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002514 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002515 slots()
2516 dynamics()
2517 errors()
2518 classmethods()
2519 staticmethods()
2520 classic()
2521 compattr()
2522 newslot()
2523 altmro()
2524 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002525 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002526 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002527 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002528 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002529 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002530 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002531 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002532 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002533 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002534 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002535 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002536 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002537 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002538 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002539 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002540 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002541 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002542 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002543 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002544 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002545 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002546 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002547 delhook()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002548 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002549
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002550if __name__ == "__main__":
2551 test_main()