blob: cf7ef2d64a55bdce2c473c5755e436bc67dfe73f [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.
833 class C:
834 def cmethod(self):
835 return "C a"
836 def all_method(self):
837 return "C b"
838
839 class M1(C, object):
840 def m1method(self):
841 return "M1 a"
842 def all_method(self):
843 return "M1 b"
844
845 vereq(M1.__mro__, (M1, C, object))
846 m = M1()
847 vereq(m.cmethod(), "C a")
848 vereq(m.m1method(), "M1 a")
849 vereq(m.all_method(), "M1 b")
850
851 class D(C):
852 def dmethod(self):
853 return "D a"
854 def all_method(self):
855 return "D b"
856
857 class M2(object, D):
858 def m2method(self):
859 return "M2 a"
860 def all_method(self):
861 return "M2 b"
862
863 vereq(M2.__mro__, (M2, object, D, C))
864 m = M2()
865 vereq(m.cmethod(), "C a")
866 vereq(m.dmethod(), "D a")
867 vereq(m.m2method(), "M2 a")
868 vereq(m.all_method(), "M2 b")
869
870 class M3(M1, object, M2):
871 def m3method(self):
872 return "M3 a"
873 def all_method(self):
874 return "M3 b"
875 # XXX Expected this (the commented-out result):
876 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
877 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
878
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879def diamond():
880 if verbose: print "Testing multiple inheritance special cases..."
881 class A(object):
882 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000883 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000884 class B(A):
885 def boo(self): return "B"
886 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000887 vereq(B().spam(), "B")
888 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000889 class C(A):
890 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000891 vereq(C().spam(), "A")
892 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000893 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000894 vereq(D().spam(), "B")
895 vereq(D().boo(), "B")
896 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000897 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000898 vereq(E().spam(), "B")
899 vereq(E().boo(), "C")
900 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000901 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000902 vereq(F().spam(), "B")
903 vereq(F().boo(), "B")
904 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000905 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000906 vereq(G().spam(), "B")
907 vereq(G().boo(), "C")
908 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000909
Guido van Rossum37202612001-08-09 19:45:21 +0000910def objects():
911 if verbose: print "Testing object class..."
912 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000913 vereq(a.__class__, object)
914 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000915 b = object()
916 verify(a is not b)
917 verify(not hasattr(a, "foo"))
918 try:
919 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000920 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000921 pass
922 else:
923 verify(0, "object() should not allow setting a foo attribute")
924 verify(not hasattr(object(), "__dict__"))
925
926 class Cdict(object):
927 pass
928 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000929 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000930 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000931 vereq(x.foo, 1)
932 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000933
Tim Peters6d6c1a32001-08-02 04:15:00 +0000934def slots():
935 if verbose: print "Testing __slots__..."
936 class C0(object):
937 __slots__ = []
938 x = C0()
939 verify(not hasattr(x, "__dict__"))
940 verify(not hasattr(x, "foo"))
941
942 class C1(object):
943 __slots__ = ['a']
944 x = C1()
945 verify(not hasattr(x, "__dict__"))
Guido van Rossum45704552001-10-08 16:35:45 +0000946 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000947 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000948 vereq(x.a, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949 del x.a
Guido van Rossum45704552001-10-08 16:35:45 +0000950 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000951
952 class C3(object):
953 __slots__ = ['a', 'b', 'c']
954 x = C3()
955 verify(not hasattr(x, "__dict__"))
956 verify(x.a is None)
957 verify(x.b is None)
958 verify(x.c is None)
959 x.a = 1
960 x.b = 2
961 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +0000962 vereq(x.a, 1)
963 vereq(x.b, 2)
964 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000965
966def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000967 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000968 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000969 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000970 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000971 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000972 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000973 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000975 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000976 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +0000977 vereq(E.foo, 1)
978 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000979 # Test dynamic instances
980 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000981 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000982 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000983 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000984 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +0000985 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000986 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +0000987 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000988 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +0000989 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000990 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +0000991 vereq(int(a), 100)
992 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +0000993 verify(not hasattr(a, "spam"))
994 def mygetattr(self, name):
995 if name == "spam":
996 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +0000997 raise AttributeError
998 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +0000999 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001000 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001001 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001002 def mysetattr(self, name, value):
1003 if name == "spam":
1004 raise AttributeError
1005 return object.__setattr__(self, name, value)
1006 C.__setattr__ = mysetattr
1007 try:
1008 a.spam = "not spam"
1009 except AttributeError:
1010 pass
1011 else:
1012 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001013 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001014 class D(C):
1015 pass
1016 d = D()
1017 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001018 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001019
Guido van Rossum7e35d572001-09-15 03:14:32 +00001020 # Test handling of int*seq and seq*int
1021 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001022 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001023 vereq("a"*I(2), "aa")
1024 vereq(I(2)*"a", "aa")
1025 vereq(2*I(3), 6)
1026 vereq(I(3)*2, 6)
1027 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001028
1029 # Test handling of long*seq and seq*long
1030 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001031 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001032 vereq("a"*L(2L), "aa")
1033 vereq(L(2L)*"a", "aa")
1034 vereq(2*L(3), 6)
1035 vereq(L(3)*2, 6)
1036 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001037
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001038 # Test comparison of classes with dynamic metaclasses
1039 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001040 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001041 class someclass:
1042 __metaclass__ = dynamicmetaclass
1043 verify(someclass != object)
1044
Tim Peters6d6c1a32001-08-02 04:15:00 +00001045def errors():
1046 if verbose: print "Testing errors..."
1047
1048 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001049 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001050 pass
1051 except TypeError:
1052 pass
1053 else:
1054 verify(0, "inheritance from both list and dict should be illegal")
1055
1056 try:
1057 class C(object, None):
1058 pass
1059 except TypeError:
1060 pass
1061 else:
1062 verify(0, "inheritance from non-type should be illegal")
1063 class Classic:
1064 pass
1065
1066 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001067 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001068 pass
1069 except TypeError:
1070 pass
1071 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001072 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001073
1074 try:
1075 class C(object):
1076 __slots__ = 1
1077 except TypeError:
1078 pass
1079 else:
1080 verify(0, "__slots__ = 1 should be illegal")
1081
1082 try:
1083 class C(object):
1084 __slots__ = [1]
1085 except TypeError:
1086 pass
1087 else:
1088 verify(0, "__slots__ = [1] should be illegal")
1089
1090def classmethods():
1091 if verbose: print "Testing class methods..."
1092 class C(object):
1093 def foo(*a): return a
1094 goo = classmethod(foo)
1095 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001096 vereq(C.goo(1), (C, 1))
1097 vereq(c.goo(1), (C, 1))
1098 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001099 class D(C):
1100 pass
1101 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001102 vereq(D.goo(1), (D, 1))
1103 vereq(d.goo(1), (D, 1))
1104 vereq(d.foo(1), (d, 1))
1105 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001106
1107def staticmethods():
1108 if verbose: print "Testing static methods..."
1109 class C(object):
1110 def foo(*a): return a
1111 goo = staticmethod(foo)
1112 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001113 vereq(C.goo(1), (1,))
1114 vereq(c.goo(1), (1,))
1115 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001116 class D(C):
1117 pass
1118 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001119 vereq(D.goo(1), (1,))
1120 vereq(d.goo(1), (1,))
1121 vereq(d.foo(1), (d, 1))
1122 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001123
1124def classic():
1125 if verbose: print "Testing classic classes..."
1126 class C:
1127 def foo(*a): return a
1128 goo = classmethod(foo)
1129 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001130 vereq(C.goo(1), (C, 1))
1131 vereq(c.goo(1), (C, 1))
1132 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001133 class D(C):
1134 pass
1135 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001136 vereq(D.goo(1), (D, 1))
1137 vereq(d.goo(1), (D, 1))
1138 vereq(d.foo(1), (d, 1))
1139 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001140 class E: # *not* subclassing from C
1141 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001142 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001143 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001144
1145def compattr():
1146 if verbose: print "Testing computed attributes..."
1147 class C(object):
1148 class computed_attribute(object):
1149 def __init__(self, get, set=None):
1150 self.__get = get
1151 self.__set = set
1152 def __get__(self, obj, type=None):
1153 return self.__get(obj)
1154 def __set__(self, obj, value):
1155 return self.__set(obj, value)
1156 def __init__(self):
1157 self.__x = 0
1158 def __get_x(self):
1159 x = self.__x
1160 self.__x = x+1
1161 return x
1162 def __set_x(self, x):
1163 self.__x = x
1164 x = computed_attribute(__get_x, __set_x)
1165 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001166 vereq(a.x, 0)
1167 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001168 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001169 vereq(a.x, 10)
1170 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001171
1172def newslot():
1173 if verbose: print "Testing __new__ slot override..."
1174 class C(list):
1175 def __new__(cls):
1176 self = list.__new__(cls)
1177 self.foo = 1
1178 return self
1179 def __init__(self):
1180 self.foo = self.foo + 2
1181 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001182 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001183 verify(a.__class__ is C)
1184 class D(C):
1185 pass
1186 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001187 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001188 verify(b.__class__ is D)
1189
Tim Peters6d6c1a32001-08-02 04:15:00 +00001190def altmro():
1191 if verbose: print "Testing mro() and overriding it..."
1192 class A(object):
1193 def f(self): return "A"
1194 class B(A):
1195 pass
1196 class C(A):
1197 def f(self): return "C"
1198 class D(B, C):
1199 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001200 vereq(D.mro(), [D, B, C, A, object])
1201 vereq(D.__mro__, (D, B, C, A, object))
1202 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001203 class PerverseMetaType(type):
1204 def mro(cls):
1205 L = type.mro(cls)
1206 L.reverse()
1207 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001208 class X(A,B,C,D):
1209 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001210 vereq(X.__mro__, (object, A, C, B, D, X))
1211 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001212
1213def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001214 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001215
1216 class B(object):
1217 "Intermediate class because object doesn't have a __setattr__"
1218
1219 class C(B):
1220
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001221 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001222 if name == "foo":
1223 return ("getattr", name)
1224 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001225 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001226 def __setattr__(self, name, value):
1227 if name == "foo":
1228 self.setattr = (name, value)
1229 else:
1230 return B.__setattr__(self, name, value)
1231 def __delattr__(self, name):
1232 if name == "foo":
1233 self.delattr = name
1234 else:
1235 return B.__delattr__(self, name)
1236
1237 def __getitem__(self, key):
1238 return ("getitem", key)
1239 def __setitem__(self, key, value):
1240 self.setitem = (key, value)
1241 def __delitem__(self, key):
1242 self.delitem = key
1243
1244 def __getslice__(self, i, j):
1245 return ("getslice", i, j)
1246 def __setslice__(self, i, j, value):
1247 self.setslice = (i, j, value)
1248 def __delslice__(self, i, j):
1249 self.delslice = (i, j)
1250
1251 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001252 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001253 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001254 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001255 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001256 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257
Guido van Rossum45704552001-10-08 16:35:45 +00001258 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001259 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001260 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001261 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001262 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001263
Guido van Rossum45704552001-10-08 16:35:45 +00001264 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001265 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001266 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001267 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001268 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001269
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001270def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001271 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001272 class C(object):
1273 def __init__(self, x):
1274 self.x = x
1275 def foo(self):
1276 return self.x
1277 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001278 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001279 class D(C):
1280 boo = C.foo
1281 goo = c1.foo
1282 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001283 vereq(d2.foo(), 2)
1284 vereq(d2.boo(), 2)
1285 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001286 class E(object):
1287 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001288 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001289 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001290
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001291def specials():
1292 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001293 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001294 # Test the default behavior for static classes
1295 class C(object):
1296 def __getitem__(self, i):
1297 if 0 <= i < 10: return i
1298 raise IndexError
1299 c1 = C()
1300 c2 = C()
1301 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001302 vereq(hash(c1), id(c1))
1303 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1304 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001305 verify(c1 != c2)
1306 verify(not c1 != c1)
1307 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001308 # Note that the module name appears in str/repr, and that varies
1309 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001310 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001311 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001312 verify(-1 not in c1)
1313 for i in range(10):
1314 verify(i in c1)
1315 verify(10 not in c1)
1316 # Test the default behavior for dynamic classes
1317 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001318 def __getitem__(self, i):
1319 if 0 <= i < 10: return i
1320 raise IndexError
1321 d1 = D()
1322 d2 = D()
1323 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001324 vereq(hash(d1), id(d1))
1325 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1326 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001327 verify(d1 != d2)
1328 verify(not d1 != d1)
1329 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001330 # Note that the module name appears in str/repr, and that varies
1331 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001332 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001333 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001334 verify(-1 not in d1)
1335 for i in range(10):
1336 verify(i in d1)
1337 verify(10 not in d1)
1338 # Test overridden behavior for static classes
1339 class Proxy(object):
1340 def __init__(self, x):
1341 self.x = x
1342 def __nonzero__(self):
1343 return not not self.x
1344 def __hash__(self):
1345 return hash(self.x)
1346 def __eq__(self, other):
1347 return self.x == other
1348 def __ne__(self, other):
1349 return self.x != other
1350 def __cmp__(self, other):
1351 return cmp(self.x, other.x)
1352 def __str__(self):
1353 return "Proxy:%s" % self.x
1354 def __repr__(self):
1355 return "Proxy(%r)" % self.x
1356 def __contains__(self, value):
1357 return value in self.x
1358 p0 = Proxy(0)
1359 p1 = Proxy(1)
1360 p_1 = Proxy(-1)
1361 verify(not p0)
1362 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001363 vereq(hash(p0), hash(0))
1364 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001365 verify(p0 != p1)
1366 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001367 vereq(not p0, p1)
1368 vereq(cmp(p0, p1), -1)
1369 vereq(cmp(p0, p0), 0)
1370 vereq(cmp(p0, p_1), 1)
1371 vereq(str(p0), "Proxy:0")
1372 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001373 p10 = Proxy(range(10))
1374 verify(-1 not in p10)
1375 for i in range(10):
1376 verify(i in p10)
1377 verify(10 not in p10)
1378 # Test overridden behavior for dynamic classes
1379 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001380 def __init__(self, x):
1381 self.x = x
1382 def __nonzero__(self):
1383 return not not self.x
1384 def __hash__(self):
1385 return hash(self.x)
1386 def __eq__(self, other):
1387 return self.x == other
1388 def __ne__(self, other):
1389 return self.x != other
1390 def __cmp__(self, other):
1391 return cmp(self.x, other.x)
1392 def __str__(self):
1393 return "DProxy:%s" % self.x
1394 def __repr__(self):
1395 return "DProxy(%r)" % self.x
1396 def __contains__(self, value):
1397 return value in self.x
1398 p0 = DProxy(0)
1399 p1 = DProxy(1)
1400 p_1 = DProxy(-1)
1401 verify(not p0)
1402 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001403 vereq(hash(p0), hash(0))
1404 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001405 verify(p0 != p1)
1406 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001407 vereq(not p0, p1)
1408 vereq(cmp(p0, p1), -1)
1409 vereq(cmp(p0, p0), 0)
1410 vereq(cmp(p0, p_1), 1)
1411 vereq(str(p0), "DProxy:0")
1412 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001413 p10 = DProxy(range(10))
1414 verify(-1 not in p10)
1415 for i in range(10):
1416 verify(i in p10)
1417 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001418 # Safety test for __cmp__
1419 def unsafecmp(a, b):
1420 try:
1421 a.__class__.__cmp__(a, b)
1422 except TypeError:
1423 pass
1424 else:
1425 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1426 a.__class__, a, b)
1427 unsafecmp(u"123", "123")
1428 unsafecmp("123", u"123")
1429 unsafecmp(1, 1.0)
1430 unsafecmp(1.0, 1)
1431 unsafecmp(1, 1L)
1432 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001433
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001434def weakrefs():
1435 if verbose: print "Testing weak references..."
1436 import weakref
1437 class C(object):
1438 pass
1439 c = C()
1440 r = weakref.ref(c)
1441 verify(r() is c)
1442 del c
1443 verify(r() is None)
1444 del r
1445 class NoWeak(object):
1446 __slots__ = ['foo']
1447 no = NoWeak()
1448 try:
1449 weakref.ref(no)
1450 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001451 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001452 else:
1453 verify(0, "weakref.ref(no) should be illegal")
1454 class Weak(object):
1455 __slots__ = ['foo', '__weakref__']
1456 yes = Weak()
1457 r = weakref.ref(yes)
1458 verify(r() is yes)
1459 del yes
1460 verify(r() is None)
1461 del r
1462
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001463def properties():
1464 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001465 class C(object):
1466 def getx(self):
1467 return self.__x
1468 def setx(self, value):
1469 self.__x = value
1470 def delx(self):
1471 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001472 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001473 a = C()
1474 verify(not hasattr(a, "x"))
1475 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001476 vereq(a._C__x, 42)
1477 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001478 del a.x
1479 verify(not hasattr(a, "x"))
1480 verify(not hasattr(a, "_C__x"))
1481 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001482 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001483## C.x.__set__(a)
1484## verify(not hasattr(a, "x"))
1485
Tim Peters66c1a522001-09-24 21:17:50 +00001486 raw = C.__dict__['x']
1487 verify(isinstance(raw, property))
1488
1489 attrs = dir(raw)
1490 verify("__doc__" in attrs)
1491 verify("fget" in attrs)
1492 verify("fset" in attrs)
1493 verify("fdel" in attrs)
1494
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001496 verify(raw.fget is C.__dict__['getx'])
1497 verify(raw.fset is C.__dict__['setx'])
1498 verify(raw.fdel is C.__dict__['delx'])
1499
1500 for attr in "__doc__", "fget", "fset", "fdel":
1501 try:
1502 setattr(raw, attr, 42)
1503 except TypeError, msg:
1504 if str(msg).find('readonly') < 0:
1505 raise TestFailed("when setting readonly attr %r on a "
1506 "property, got unexpected TypeError "
1507 "msg %r" % (attr, str(msg)))
1508 else:
1509 raise TestFailed("expected TypeError from trying to set "
1510 "readonly %r attr on a property" % attr)
1511
Guido van Rossumc4a18802001-08-24 16:55:27 +00001512def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001513 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001514
1515 class A(object):
1516 def meth(self, a):
1517 return "A(%r)" % a
1518
Guido van Rossum45704552001-10-08 16:35:45 +00001519 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001520
1521 class B(A):
1522 def __init__(self):
1523 self.__super = super(B, self)
1524 def meth(self, a):
1525 return "B(%r)" % a + self.__super.meth(a)
1526
Guido van Rossum45704552001-10-08 16:35:45 +00001527 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001528
1529 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001530 def meth(self, a):
1531 return "C(%r)" % a + self.__super.meth(a)
1532 C._C__super = super(C)
1533
Guido van Rossum45704552001-10-08 16:35:45 +00001534 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001535
1536 class D(C, B):
1537 def meth(self, a):
1538 return "D(%r)" % a + super(D, self).meth(a)
1539
1540 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1541
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001542def inherits():
1543 if verbose: print "Testing inheritance from basic types..."
1544
1545 class hexint(int):
1546 def __repr__(self):
1547 return hex(self)
1548 def __add__(self, other):
1549 return hexint(int.__add__(self, other))
1550 # (Note that overriding __radd__ doesn't work,
1551 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001552 vereq(repr(hexint(7) + 9), "0x10")
1553 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001554 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001555 vereq(a, 12345)
1556 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001557 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001558 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001559 verify((+a).__class__ is int)
1560 verify((a >> 0).__class__ is int)
1561 verify((a << 0).__class__ is int)
1562 verify((hexint(0) << 12).__class__ is int)
1563 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001564
1565 class octlong(long):
1566 __slots__ = []
1567 def __str__(self):
1568 s = oct(self)
1569 if s[-1] == 'L':
1570 s = s[:-1]
1571 return s
1572 def __add__(self, other):
1573 return self.__class__(super(octlong, self).__add__(other))
1574 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001575 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001576 # (Note that overriding __radd__ here only seems to work
1577 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001578 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001579 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001580 vereq(a, 12345L)
1581 vereq(long(a), 12345L)
1582 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001583 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001584 verify((+a).__class__ is long)
1585 verify((-a).__class__ is long)
1586 verify((-octlong(0)).__class__ is long)
1587 verify((a >> 0).__class__ is long)
1588 verify((a << 0).__class__ is long)
1589 verify((a - 0).__class__ is long)
1590 verify((a * 1).__class__ is long)
1591 verify((a ** 1).__class__ is long)
1592 verify((a // 1).__class__ is long)
1593 verify((1 * a).__class__ is long)
1594 verify((a | 0).__class__ is long)
1595 verify((a ^ 0).__class__ is long)
1596 verify((a & -1L).__class__ is long)
1597 verify((octlong(0) << 12).__class__ is long)
1598 verify((octlong(0) >> 12).__class__ is long)
1599 verify(abs(octlong(0)).__class__ is long)
1600
1601 # Because octlong overrides __add__, we can't check the absence of +0
1602 # optimizations using octlong.
1603 class longclone(long):
1604 pass
1605 a = longclone(1)
1606 verify((a + 0).__class__ is long)
1607 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001608
1609 class precfloat(float):
1610 __slots__ = ['prec']
1611 def __init__(self, value=0.0, prec=12):
1612 self.prec = int(prec)
1613 float.__init__(value)
1614 def __repr__(self):
1615 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001616 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001617 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001618 vereq(a, 12345.0)
1619 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001620 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001621 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001622 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001623
Tim Peters2400fa42001-09-12 19:12:49 +00001624 class madcomplex(complex):
1625 def __repr__(self):
1626 return "%.17gj%+.17g" % (self.imag, self.real)
1627 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001628 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001629 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001630 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001631 vereq(a, base)
1632 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001633 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001634 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001635 vereq(repr(a), "4j-3")
1636 vereq(a, base)
1637 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001638 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001639 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001640 veris((+a).__class__, complex)
1641 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001642 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001643 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001645 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001646 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001647 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001648 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001649
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001650 class madtuple(tuple):
1651 _rev = None
1652 def rev(self):
1653 if self._rev is not None:
1654 return self._rev
1655 L = list(self)
1656 L.reverse()
1657 self._rev = self.__class__(L)
1658 return self._rev
1659 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1661 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1662 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001663 for i in range(512):
1664 t = madtuple(range(i))
1665 u = t.rev()
1666 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001668 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001669 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001670 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001671 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001672 verify(a[:].__class__ is tuple)
1673 verify((a * 1).__class__ is tuple)
1674 verify((a * 0).__class__ is tuple)
1675 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001676 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001677 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001678 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001679 verify((a + a).__class__ is tuple)
1680 verify((a * 0).__class__ is tuple)
1681 verify((a * 1).__class__ is tuple)
1682 verify((a * 2).__class__ is tuple)
1683 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001684
1685 class madstring(str):
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__("".join(L))
1693 return self._rev
1694 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001695 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1696 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1697 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001698 for i in range(256):
1699 s = madstring("".join(map(chr, range(i))))
1700 t = s.rev()
1701 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001702 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001703 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001704 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001705 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001706
Tim Peters8fa5dd02001-09-12 02:18:30 +00001707 base = "\x00" * 5
1708 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001709 vereq(s, base)
1710 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001711 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001712 vereq(hash(s), hash(base))
1713 vereq({s: 1}[base], 1)
1714 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001715 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001716 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001717 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001718 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001719 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001720 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001721 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001722 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001723 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001724 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001725 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001726 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001727 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001728 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001729 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001730 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001731 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001732 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001733 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001734 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001735 identitytab = ''.join([chr(i) for i in range(256)])
1736 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001737 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001738 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001739 vereq(s.translate(identitytab, "x"), base)
1740 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001741 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001742 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001743 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001744 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001745 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001746 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001747 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001748 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001749 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001750 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001751
Tim Peters111f6092001-09-12 07:54:51 +00001752 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001753 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001754 verify(intern(s).__class__ is str)
1755 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001756 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001757
1758 i = intern("y x")
1759 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001760 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001761 verify(intern(s).__class__ is str)
1762 verify(intern(s) is i)
1763
1764 s = madstring(i)
1765 verify(intern(s).__class__ is str)
1766 verify(intern(s) is i)
1767
Guido van Rossum91ee7982001-08-30 20:52:40 +00001768 class madunicode(unicode):
1769 _rev = None
1770 def rev(self):
1771 if self._rev is not None:
1772 return self._rev
1773 L = list(self)
1774 L.reverse()
1775 self._rev = self.__class__(u"".join(L))
1776 return self._rev
1777 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001778 vereq(u, u"ABCDEF")
1779 vereq(u.rev(), madunicode(u"FEDCBA"))
1780 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001781 base = u"12345"
1782 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001783 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001784 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001785 vereq(hash(u), hash(base))
1786 vereq({u: 1}[base], 1)
1787 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001788 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001789 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001790 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001791 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001792 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001793 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001794 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001795 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001796 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001797 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001798 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001799 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001800 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001801 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001802 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001803 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001804 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001805 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001806 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001807 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001808 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001809 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001810 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001812 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001814 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001815 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001816 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001817 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001818 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001819 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001820 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001821 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001822 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001823 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001824 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001825 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001826
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001827 class sublist(list):
1828 pass
1829 a = sublist(range(5))
1830 vereq(a, range(5))
1831 a.append("hello")
1832 vereq(a, range(5) + ["hello"])
1833 a[5] = 5
1834 vereq(a, range(6))
1835 a.extend(range(6, 20))
1836 vereq(a, range(20))
1837 a[-5:] = []
1838 vereq(a, range(15))
1839 del a[10:15]
1840 vereq(len(a), 10)
1841 vereq(a, range(10))
1842 vereq(list(a), range(10))
1843 vereq(a[0], 0)
1844 vereq(a[9], 9)
1845 vereq(a[-10], 0)
1846 vereq(a[-1], 9)
1847 vereq(a[:5], range(5))
1848
Tim Peters59c9a642001-09-13 05:38:56 +00001849 class CountedInput(file):
1850 """Counts lines read by self.readline().
1851
1852 self.lineno is the 0-based ordinal of the last line read, up to
1853 a maximum of one greater than the number of lines in the file.
1854
1855 self.ateof is true if and only if the final "" line has been read,
1856 at which point self.lineno stops incrementing, and further calls
1857 to readline() continue to return "".
1858 """
1859
1860 lineno = 0
1861 ateof = 0
1862 def readline(self):
1863 if self.ateof:
1864 return ""
1865 s = file.readline(self)
1866 # Next line works too.
1867 # s = super(CountedInput, self).readline()
1868 self.lineno += 1
1869 if s == "":
1870 self.ateof = 1
1871 return s
1872
Tim Peters561f8992001-09-13 19:36:36 +00001873 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001874 lines = ['a\n', 'b\n', 'c\n']
1875 try:
1876 f.writelines(lines)
1877 f.close()
1878 f = CountedInput(TESTFN)
1879 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1880 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00001881 vereq(expected, got)
1882 vereq(f.lineno, i)
1883 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00001884 f.close()
1885 finally:
1886 try:
1887 f.close()
1888 except:
1889 pass
1890 try:
1891 import os
1892 os.unlink(TESTFN)
1893 except:
1894 pass
1895
Tim Peters808b94e2001-09-13 19:33:07 +00001896def keywords():
1897 if verbose:
1898 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00001899 vereq(int(x=1), 1)
1900 vereq(float(x=2), 2.0)
1901 vereq(long(x=3), 3L)
1902 vereq(complex(imag=42, real=666), complex(666, 42))
1903 vereq(str(object=500), '500')
1904 vereq(unicode(string='abc', errors='strict'), u'abc')
1905 vereq(tuple(sequence=range(3)), (0, 1, 2))
1906 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00001907 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00001908
1909 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00001910 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00001911 try:
1912 constructor(bogus_keyword_arg=1)
1913 except TypeError:
1914 pass
1915 else:
1916 raise TestFailed("expected TypeError from bogus keyword "
1917 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001918
Tim Peters8fa45672001-09-13 21:01:29 +00001919def restricted():
1920 import rexec
1921 if verbose:
1922 print "Testing interaction with restricted execution ..."
1923
1924 sandbox = rexec.RExec()
1925
1926 code1 = """f = open(%r, 'w')""" % TESTFN
1927 code2 = """f = file(%r, 'w')""" % TESTFN
1928 code3 = """\
1929f = open(%r)
1930t = type(f) # a sneaky way to get the file() constructor
1931f.close()
1932f = t(%r, 'w') # rexec can't catch this by itself
1933""" % (TESTFN, TESTFN)
1934
1935 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1936 f.close()
1937
1938 try:
1939 for code in code1, code2, code3:
1940 try:
1941 sandbox.r_exec(code)
1942 except IOError, msg:
1943 if str(msg).find("restricted") >= 0:
1944 outcome = "OK"
1945 else:
1946 outcome = "got an exception, but not an expected one"
1947 else:
1948 outcome = "expected a restricted-execution exception"
1949
1950 if outcome != "OK":
1951 raise TestFailed("%s, in %r" % (outcome, code))
1952
1953 finally:
1954 try:
1955 import os
1956 os.unlink(TESTFN)
1957 except:
1958 pass
1959
Tim Peters0ab085c2001-09-14 00:25:33 +00001960def str_subclass_as_dict_key():
1961 if verbose:
1962 print "Testing a str subclass used as dict key .."
1963
1964 class cistr(str):
1965 """Sublcass of str that computes __eq__ case-insensitively.
1966
1967 Also computes a hash code of the string in canonical form.
1968 """
1969
1970 def __init__(self, value):
1971 self.canonical = value.lower()
1972 self.hashcode = hash(self.canonical)
1973
1974 def __eq__(self, other):
1975 if not isinstance(other, cistr):
1976 other = cistr(other)
1977 return self.canonical == other.canonical
1978
1979 def __hash__(self):
1980 return self.hashcode
1981
Guido van Rossum45704552001-10-08 16:35:45 +00001982 vereq(cistr('ABC'), 'abc')
1983 vereq('aBc', cistr('ABC'))
1984 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00001985
1986 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00001987 vereq(d[cistr('one')], 1)
1988 vereq(d[cistr('tWo')], 2)
1989 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001990 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00001991 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001992
Guido van Rossumab3b0342001-09-18 20:38:53 +00001993def classic_comparisons():
1994 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00001995 class classic:
1996 pass
1997 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00001998 if verbose: print " (base = %s)" % base
1999 class C(base):
2000 def __init__(self, value):
2001 self.value = int(value)
2002 def __cmp__(self, other):
2003 if isinstance(other, C):
2004 return cmp(self.value, other.value)
2005 if isinstance(other, int) or isinstance(other, long):
2006 return cmp(self.value, other)
2007 return NotImplemented
2008 c1 = C(1)
2009 c2 = C(2)
2010 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002011 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002012 c = {1: c1, 2: c2, 3: c3}
2013 for x in 1, 2, 3:
2014 for y in 1, 2, 3:
2015 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2016 for op in "<", "<=", "==", "!=", ">", ">=":
2017 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2018 "x=%d, y=%d" % (x, y))
2019 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2020 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2021
Guido van Rossum0639f592001-09-18 21:06:04 +00002022def rich_comparisons():
2023 if verbose:
2024 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002025 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002026 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002027 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002028 vereq(z, 1+0j)
2029 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002030 class ZZ(complex):
2031 def __eq__(self, other):
2032 try:
2033 return abs(self - other) <= 1e-6
2034 except:
2035 return NotImplemented
2036 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002037 vereq(zz, 1+0j)
2038 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002039
Guido van Rossum0639f592001-09-18 21:06:04 +00002040 class classic:
2041 pass
2042 for base in (classic, int, object, list):
2043 if verbose: print " (base = %s)" % base
2044 class C(base):
2045 def __init__(self, value):
2046 self.value = int(value)
2047 def __cmp__(self, other):
2048 raise TestFailed, "shouldn't call __cmp__"
2049 def __eq__(self, other):
2050 if isinstance(other, C):
2051 return self.value == other.value
2052 if isinstance(other, int) or isinstance(other, long):
2053 return self.value == other
2054 return NotImplemented
2055 def __ne__(self, other):
2056 if isinstance(other, C):
2057 return self.value != other.value
2058 if isinstance(other, int) or isinstance(other, long):
2059 return self.value != other
2060 return NotImplemented
2061 def __lt__(self, other):
2062 if isinstance(other, C):
2063 return self.value < other.value
2064 if isinstance(other, int) or isinstance(other, long):
2065 return self.value < other
2066 return NotImplemented
2067 def __le__(self, other):
2068 if isinstance(other, C):
2069 return self.value <= other.value
2070 if isinstance(other, int) or isinstance(other, long):
2071 return self.value <= other
2072 return NotImplemented
2073 def __gt__(self, other):
2074 if isinstance(other, C):
2075 return self.value > other.value
2076 if isinstance(other, int) or isinstance(other, long):
2077 return self.value > other
2078 return NotImplemented
2079 def __ge__(self, other):
2080 if isinstance(other, C):
2081 return self.value >= other.value
2082 if isinstance(other, int) or isinstance(other, long):
2083 return self.value >= other
2084 return NotImplemented
2085 c1 = C(1)
2086 c2 = C(2)
2087 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002088 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002089 c = {1: c1, 2: c2, 3: c3}
2090 for x in 1, 2, 3:
2091 for y in 1, 2, 3:
2092 for op in "<", "<=", "==", "!=", ">", ">=":
2093 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2094 "x=%d, y=%d" % (x, y))
2095 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2096 "x=%d, y=%d" % (x, y))
2097 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2098 "x=%d, y=%d" % (x, y))
2099
Guido van Rossum1952e382001-09-19 01:25:16 +00002100def coercions():
2101 if verbose: print "Testing coercions..."
2102 class I(int): pass
2103 coerce(I(0), 0)
2104 coerce(0, I(0))
2105 class L(long): pass
2106 coerce(L(0), 0)
2107 coerce(L(0), 0L)
2108 coerce(0, L(0))
2109 coerce(0L, L(0))
2110 class F(float): pass
2111 coerce(F(0), 0)
2112 coerce(F(0), 0L)
2113 coerce(F(0), 0.)
2114 coerce(0, F(0))
2115 coerce(0L, F(0))
2116 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002117 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002118 coerce(C(0), 0)
2119 coerce(C(0), 0L)
2120 coerce(C(0), 0.)
2121 coerce(C(0), 0j)
2122 coerce(0, C(0))
2123 coerce(0L, C(0))
2124 coerce(0., C(0))
2125 coerce(0j, C(0))
2126
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002127def descrdoc():
2128 if verbose: print "Testing descriptor doc strings..."
2129 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002130 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002131 check(file.closed, "flag set if the file is closed") # getset descriptor
2132 check(file.name, "file name") # member descriptor
2133
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002134def setclass():
2135 if verbose: print "Testing __class__ assignment..."
2136 class C(object): pass
2137 class D(object): pass
2138 class E(object): pass
2139 class F(D, E): pass
2140 for cls in C, D, E, F:
2141 for cls2 in C, D, E, F:
2142 x = cls()
2143 x.__class__ = cls2
2144 verify(x.__class__ is cls2)
2145 x.__class__ = cls
2146 verify(x.__class__ is cls)
2147 def cant(x, C):
2148 try:
2149 x.__class__ = C
2150 except TypeError:
2151 pass
2152 else:
2153 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2154 cant(C(), list)
2155 cant(list(), C)
2156 cant(C(), 1)
2157 cant(C(), object)
2158 cant(object(), list)
2159 cant(list(), object)
2160
Guido van Rossum6661be32001-10-26 04:26:12 +00002161def setdict():
2162 if verbose: print "Testing __dict__ assignment..."
2163 class C(object): pass
2164 a = C()
2165 a.__dict__ = {'b': 1}
2166 vereq(a.b, 1)
2167 def cant(x, dict):
2168 try:
2169 x.__dict__ = dict
2170 except TypeError:
2171 pass
2172 else:
2173 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2174 cant(a, None)
2175 cant(a, [])
2176 cant(a, 1)
2177 try:
2178 del a.__dict__
2179 except TypeError:
2180 pass
2181 else:
2182 raise TestFailed, "shouldn't allow del %r.__dict__" % (a)
2183 # Classes don't allow __dict__ assignment
2184 cant(C, {})
2185
Guido van Rossum3926a632001-09-25 16:25:58 +00002186def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002187 if verbose:
2188 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002189 import pickle, cPickle
2190
2191 def sorteditems(d):
2192 L = d.items()
2193 L.sort()
2194 return L
2195
2196 global C
2197 class C(object):
2198 def __init__(self, a, b):
2199 super(C, self).__init__()
2200 self.a = a
2201 self.b = b
2202 def __repr__(self):
2203 return "C(%r, %r)" % (self.a, self.b)
2204
2205 global C1
2206 class C1(list):
2207 def __new__(cls, a, b):
2208 return super(C1, cls).__new__(cls)
2209 def __init__(self, a, b):
2210 self.a = a
2211 self.b = b
2212 def __repr__(self):
2213 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2214
2215 global C2
2216 class C2(int):
2217 def __new__(cls, a, b, val=0):
2218 return super(C2, cls).__new__(cls, val)
2219 def __init__(self, a, b, val=0):
2220 self.a = a
2221 self.b = b
2222 def __repr__(self):
2223 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2224
2225 for p in pickle, cPickle:
2226 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002227 if verbose:
2228 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002229
2230 for cls in C, C1, C2:
2231 s = p.dumps(cls, bin)
2232 cls2 = p.loads(s)
2233 verify(cls2 is cls)
2234
2235 a = C1(1, 2); a.append(42); a.append(24)
2236 b = C2("hello", "world", 42)
2237 s = p.dumps((a, b), bin)
2238 x, y = p.loads(s)
2239 assert x.__class__ == a.__class__
2240 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2241 assert y.__class__ == b.__class__
2242 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2243 assert `x` == `a`
2244 assert `y` == `b`
2245 if verbose:
2246 print "a = x =", a
2247 print "b = y =", b
2248
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002249 # Testing copy.deepcopy()
2250 if verbose:
2251 print "deepcopy"
2252 import copy
2253 for cls in C, C1, C2:
2254 cls2 = copy.deepcopy(cls)
2255 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002256
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002257 a = C1(1, 2); a.append(42); a.append(24)
2258 b = C2("hello", "world", 42)
2259 x, y = copy.deepcopy((a, b))
2260 assert x.__class__ == a.__class__
2261 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2262 assert y.__class__ == b.__class__
2263 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2264 assert `x` == `a`
2265 assert `y` == `b`
2266 if verbose:
2267 print "a = x =", a
2268 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002269
2270def copies():
2271 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2272 import copy
2273 class C(object):
2274 pass
2275
2276 a = C()
2277 a.foo = 12
2278 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002279 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002280
2281 a.bar = [1,2,3]
2282 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002284 verify(c.bar is a.bar)
2285
2286 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002288 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002290
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002291def binopoverride():
2292 if verbose: print "Testing overrides of binary operations..."
2293 class I(int):
2294 def __repr__(self):
2295 return "I(%r)" % int(self)
2296 def __add__(self, other):
2297 return I(int(self) + int(other))
2298 __radd__ = __add__
2299 def __pow__(self, other, mod=None):
2300 if mod is None:
2301 return I(pow(int(self), int(other)))
2302 else:
2303 return I(pow(int(self), int(other), int(mod)))
2304 def __rpow__(self, other, mod=None):
2305 if mod is None:
2306 return I(pow(int(other), int(self), mod))
2307 else:
2308 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002309
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002310 vereq(`I(1) + I(2)`, "I(3)")
2311 vereq(`I(1) + 2`, "I(3)")
2312 vereq(`1 + I(2)`, "I(3)")
2313 vereq(`I(2) ** I(3)`, "I(8)")
2314 vereq(`2 ** I(3)`, "I(8)")
2315 vereq(`I(2) ** 3`, "I(8)")
2316 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2317 class S(str):
2318 def __eq__(self, other):
2319 return self.lower() == other.lower()
2320
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002321def subclasspropagation():
2322 if verbose: print "Testing propagation of slot functions to subclasses..."
2323 class A(object):
2324 pass
2325 class B(A):
2326 pass
2327 class C(A):
2328 pass
2329 class D(B, C):
2330 pass
2331 d = D()
2332 vereq(hash(d), id(d))
2333 A.__hash__ = lambda self: 42
2334 vereq(hash(d), 42)
2335 C.__hash__ = lambda self: 314
2336 vereq(hash(d), 314)
2337 B.__hash__ = lambda self: 144
2338 vereq(hash(d), 144)
2339 D.__hash__ = lambda self: 100
2340 vereq(hash(d), 100)
2341 del D.__hash__
2342 vereq(hash(d), 144)
2343 del B.__hash__
2344 vereq(hash(d), 314)
2345 del C.__hash__
2346 vereq(hash(d), 42)
2347 del A.__hash__
2348 vereq(hash(d), id(d))
2349 d.foo = 42
2350 d.bar = 42
2351 vereq(d.foo, 42)
2352 vereq(d.bar, 42)
2353 def __getattribute__(self, name):
2354 if name == "foo":
2355 return 24
2356 return object.__getattribute__(self, name)
2357 A.__getattribute__ = __getattribute__
2358 vereq(d.foo, 24)
2359 vereq(d.bar, 42)
2360 def __getattr__(self, name):
2361 if name in ("spam", "foo", "bar"):
2362 return "hello"
2363 raise AttributeError, name
2364 B.__getattr__ = __getattr__
2365 vereq(d.spam, "hello")
2366 vereq(d.foo, 24)
2367 vereq(d.bar, 42)
2368 del A.__getattribute__
2369 vereq(d.foo, 42)
2370 del d.foo
2371 vereq(d.foo, "hello")
2372 vereq(d.bar, 42)
2373 del B.__getattr__
2374 try:
2375 d.foo
2376 except AttributeError:
2377 pass
2378 else:
2379 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002380
2381def buffer_inherit():
2382 import binascii
2383 # SF bug [#470040] ParseTuple t# vs subclasses.
2384 if verbose:
2385 print "Testing that buffer interface is inherited ..."
2386
2387 class MyStr(str):
2388 pass
2389 base = 'abc'
2390 m = MyStr(base)
2391 # b2a_hex uses the buffer interface to get its argument's value, via
2392 # PyArg_ParseTuple 't#' code.
2393 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2394
2395 # It's not clear that unicode will continue to support the character
2396 # buffer interface, and this test will fail if that's taken away.
2397 class MyUni(unicode):
2398 pass
2399 base = u'abc'
2400 m = MyUni(base)
2401 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2402
2403 class MyInt(int):
2404 pass
2405 m = MyInt(42)
2406 try:
2407 binascii.b2a_hex(m)
2408 raise TestFailed('subclass of int should not have a buffer interface')
2409 except TypeError:
2410 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002411
Tim Petersc9933152001-10-16 20:18:24 +00002412def str_of_str_subclass():
2413 import binascii
2414 import cStringIO
2415
2416 if verbose:
2417 print "Testing __str__ defined in subclass of str ..."
2418
2419 class octetstring(str):
2420 def __str__(self):
2421 return binascii.b2a_hex(self)
2422 def __repr__(self):
2423 return self + " repr"
2424
2425 o = octetstring('A')
2426 vereq(type(o), octetstring)
2427 vereq(type(str(o)), str)
2428 vereq(type(repr(o)), str)
2429 vereq(ord(o), 0x41)
2430 vereq(str(o), '41')
2431 vereq(repr(o), 'A repr')
2432 vereq(o.__str__(), '41')
2433 vereq(o.__repr__(), 'A repr')
2434
2435 capture = cStringIO.StringIO()
2436 # Calling str() or not exercises different internal paths.
2437 print >> capture, o
2438 print >> capture, str(o)
2439 vereq(capture.getvalue(), '41\n41\n')
2440 capture.close()
2441
Guido van Rossumc8e56452001-10-22 00:43:43 +00002442def kwdargs():
2443 if verbose: print "Testing keyword arguments to __init__, __call__..."
2444 def f(a): return a
2445 vereq(f.__call__(a=42), 42)
2446 a = []
2447 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002448 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002449
Guido van Rossumed87ad82001-10-30 02:33:02 +00002450def delhook():
2451 if verbose: print "Testing __del__ hook..."
2452 log = []
2453 class C(object):
2454 def __del__(self):
2455 log.append(1)
2456 c = C()
2457 vereq(log, [])
2458 del c
2459 vereq(log, [1])
2460
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002461def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002462 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002463 lists()
2464 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002465 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002466 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002467 ints()
2468 longs()
2469 floats()
2470 complexes()
2471 spamlists()
2472 spamdicts()
2473 pydicts()
2474 pylists()
2475 metaclass()
2476 pymods()
2477 multi()
2478 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002479 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002480 slots()
2481 dynamics()
2482 errors()
2483 classmethods()
2484 staticmethods()
2485 classic()
2486 compattr()
2487 newslot()
2488 altmro()
2489 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002490 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002491 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002492 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002493 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002494 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002495 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002496 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002497 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002498 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002499 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002500 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002501 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002502 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002503 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002504 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002505 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002506 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002507 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002508 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002509 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002510 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002511 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002512 delhook()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002513 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002514
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002515if __name__ == "__main__":
2516 test_main()