blob: 4fd11a5c0cfe59530dc30629a9c92b6fcca9aa56 [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 Peters59c9a642001-09-13 05:38:56 +00003from test_support import verify, verbose, TestFailed, TESTFN
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
5
Guido van Rossum4bb1e362001-09-28 23:49:48 +00006def vereq(a, b):
Guido van Rossum45704552001-10-08 16:35:45 +00007 if not (a == b):
8 raise TestFailed, "%r == %r" % (a, b)
Guido van Rossum4bb1e362001-09-28 23:49:48 +00009
Guido van Rossum875eeaa2001-10-11 18:33:53 +000010def veris(a, b):
11 if a is not b:
12 raise TestFailed, "%r is %r" % (a, b)
13
Tim Peters6d6c1a32001-08-02 04:15:00 +000014def testunop(a, res, expr="len(a)", meth="__len__"):
15 if verbose: print "checking", expr
16 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000017 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000018 t = type(a)
19 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000020 while meth not in t.__dict__:
21 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000022 vereq(m, t.__dict__[meth])
23 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000024 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000025 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000026
27def testbinop(a, b, res, expr="a+b", meth="__add__"):
28 if verbose: print "checking", expr
29 dict = {'a': a, 'b': b}
Guido van Rossum45704552001-10-08 16:35:45 +000030 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000031 t = type(a)
32 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000033 while meth not in t.__dict__:
34 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000035 vereq(m, t.__dict__[meth])
36 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000038 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039
40def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
41 if verbose: print "checking", expr
42 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000043 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 t = type(a)
45 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000046 while meth not in t.__dict__:
47 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000048 vereq(m, t.__dict__[meth])
49 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000051 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052
53def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
54 if verbose: print "checking", stmt
55 dict = {'a': deepcopy(a), 'b': b}
56 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058 t = type(a)
59 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000060 while meth not in t.__dict__:
61 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000062 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000063 dict['a'] = deepcopy(a)
64 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000065 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066 dict['a'] = deepcopy(a)
67 bm = getattr(dict['a'], meth)
68 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000069 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000070
71def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
72 if verbose: print "checking", stmt
73 dict = {'a': deepcopy(a), 'b': b, 'c': c}
74 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076 t = type(a)
77 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000078 while meth not in t.__dict__:
79 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000080 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000081 dict['a'] = deepcopy(a)
82 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000083 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000084 dict['a'] = deepcopy(a)
85 bm = getattr(dict['a'], meth)
86 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000087 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000088
89def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
90 if verbose: print "checking", stmt
91 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
92 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000095 while meth not in t.__dict__:
96 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000097 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000098 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000099 dict['a'] = deepcopy(a)
100 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000101 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000102 dict['a'] = deepcopy(a)
103 bm = getattr(dict['a'], meth)
104 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000105 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106
Tim Peters2f93e282001-10-04 05:27:00 +0000107def class_docstrings():
108 class Classic:
109 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000110 vereq(Classic.__doc__, "A classic docstring.")
111 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000112
113 class Classic2:
114 pass
115 verify(Classic2.__doc__ is None)
116
Tim Peters4fb1fe82001-10-04 05:48:13 +0000117 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000118 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000119 vereq(NewStatic.__doc__, "Another docstring.")
120 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000121
Tim Peters4fb1fe82001-10-04 05:48:13 +0000122 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000123 pass
124 verify(NewStatic2.__doc__ is None)
125
Tim Peters4fb1fe82001-10-04 05:48:13 +0000126 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000127 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000128 vereq(NewDynamic.__doc__, "Another docstring.")
129 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000130
Tim Peters4fb1fe82001-10-04 05:48:13 +0000131 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000132 pass
133 verify(NewDynamic2.__doc__ is None)
134
Tim Peters6d6c1a32001-08-02 04:15:00 +0000135def lists():
136 if verbose: print "Testing list operations..."
137 testbinop([1], [2], [1,2], "a+b", "__add__")
138 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
139 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
140 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
141 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
142 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
143 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
144 testunop([1,2,3], 3, "len(a)", "__len__")
145 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
146 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
147 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
148 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
149
150def dicts():
151 if verbose: print "Testing dict operations..."
152 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
153 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
154 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
155 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
156 d = {1:2,3:4}
157 l1 = []
158 for i in d.keys(): l1.append(i)
159 l = []
160 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000161 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000162 l = []
163 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000164 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000165 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000166 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 d = {1:2, 3:4}
169 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(eval(repr(d), {}), d)
171 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000172 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
173
Tim Peters25786c02001-09-02 08:22:48 +0000174def dict_constructor():
175 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000176 print "Testing dict constructor ..."
177 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000178 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000179 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000180 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000181 d = dict(items={})
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 vereq(d, dict(d.items()))
186 vereq(d, dict(items=d.iteritems()))
Tim Peters25786c02001-09-02 08:22:48 +0000187 for badarg in 0, 0L, 0j, "0", [0], (0,):
188 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000189 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000190 except TypeError:
191 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000192 except ValueError:
193 if badarg == "0":
194 # It's a sequence, and its elements are also sequences (gotta
195 # love strings <wink>), but they aren't of length 2, so this
196 # one seemed better as a ValueError than a TypeError.
197 pass
198 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000199 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000200 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000201 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000202 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000203 dict(senseless={})
Tim Peters25786c02001-09-02 08:22:48 +0000204 except TypeError:
205 pass
206 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000207 raise TestFailed("no TypeError from dict(senseless={})")
Tim Peters25786c02001-09-02 08:22:48 +0000208
209 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000210 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000211 except TypeError:
212 pass
213 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000214 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000215
216 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000217 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000218 dict = {1:2, 3:4, 'a':1j}
219
Tim Peters25786c02001-09-02 08:22:48 +0000220 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000221 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000222 except TypeError:
223 pass
224 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000225 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000226
227 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000228 Mapping.__getitem__ = lambda self, i: self.dict[i]
Tim Petersa427a2b2001-10-29 22:25:45 +0000229 d = dict(items=Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000230 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000231
Tim Peters1fc240e2001-10-26 05:06:50 +0000232 # Init from sequence of iterable objects, each producing a 2-sequence.
233 class AddressBookEntry:
234 def __init__(self, first, last):
235 self.first = first
236 self.last = last
237 def __iter__(self):
238 return iter([self.first, self.last])
239
Tim Petersa427a2b2001-10-29 22:25:45 +0000240 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000241 AddressBookEntry('Barry', 'Peters'),
242 AddressBookEntry('Tim', 'Peters'),
243 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000244 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
245
Tim Petersa427a2b2001-10-29 22:25:45 +0000246 d = dict(zip(range(4), range(1, 5)))
247 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000248
249 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000250 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000251 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000252 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000253 except ValueError:
254 pass
255 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000256 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000257
Tim Peters5d2b77c2001-09-03 05:47:38 +0000258def test_dir():
259 if verbose:
260 print "Testing dir() ..."
261 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000262 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000263 del junk
264
265 # Just make sure these don't blow up!
266 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
267 dir(arg)
268
Tim Peters37a309d2001-09-04 01:20:04 +0000269 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000270 class C:
271 Cdata = 1
272 def Cmethod(self): pass
273
274 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000275 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000276 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000277
278 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000279 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000280
281 c.cdata = 2
282 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000284 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000285
286 class A(C):
287 Adata = 1
288 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000289
Tim Peters37a309d2001-09-04 01:20:04 +0000290 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000291 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000292 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000293 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000294 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000295 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000296 a.adata = 42
297 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000298 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000299
300 # The same, but with new-style classes. Since these have object as a
301 # base class, a lot more gets sucked in.
302 def interesting(strings):
303 return [s for s in strings if not s.startswith('_')]
304
Tim Peters5d2b77c2001-09-03 05:47:38 +0000305 class C(object):
306 Cdata = 1
307 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000308
309 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000310 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000311
312 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000313 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000314 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000315
316 c.cdata = 2
317 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000318 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000319 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000320
Tim Peters5d2b77c2001-09-03 05:47:38 +0000321 class A(C):
322 Adata = 1
323 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000324
325 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000326 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000327 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000328 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000329 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000330 a.adata = 42
331 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000332 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000333 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000334
Tim Peterscaaff8d2001-09-10 23:12:14 +0000335 # Try a module subclass.
336 import sys
337 class M(type(sys)):
338 pass
339 minstance = M()
340 minstance.b = 2
341 minstance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000342 vereq(dir(minstance), ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000343
344 class M2(M):
345 def getdict(self):
346 return "Not a dict!"
347 __dict__ = property(getdict)
348
349 m2instance = M2()
350 m2instance.b = 2
351 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000352 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000353 try:
354 dir(m2instance)
355 except TypeError:
356 pass
357
Tim Peters9e6a3992001-10-30 05:45:26 +0000358 # Two essentially featureless objects, just inheriting stuff from
359 # object.
360 vereq(dir(None), dir(Ellipsis))
361
Tim Peters6d6c1a32001-08-02 04:15:00 +0000362binops = {
363 'add': '+',
364 'sub': '-',
365 'mul': '*',
366 'div': '/',
367 'mod': '%',
368 'divmod': 'divmod',
369 'pow': '**',
370 'lshift': '<<',
371 'rshift': '>>',
372 'and': '&',
373 'xor': '^',
374 'or': '|',
375 'cmp': 'cmp',
376 'lt': '<',
377 'le': '<=',
378 'eq': '==',
379 'ne': '!=',
380 'gt': '>',
381 'ge': '>=',
382 }
383
384for name, expr in binops.items():
385 if expr.islower():
386 expr = expr + "(a, b)"
387 else:
388 expr = 'a %s b' % expr
389 binops[name] = expr
390
391unops = {
392 'pos': '+',
393 'neg': '-',
394 'abs': 'abs',
395 'invert': '~',
396 'int': 'int',
397 'long': 'long',
398 'float': 'float',
399 'oct': 'oct',
400 'hex': 'hex',
401 }
402
403for name, expr in unops.items():
404 if expr.islower():
405 expr = expr + "(a)"
406 else:
407 expr = '%s a' % expr
408 unops[name] = expr
409
410def numops(a, b, skip=[]):
411 dict = {'a': a, 'b': b}
412 for name, expr in binops.items():
413 if name not in skip:
414 name = "__%s__" % name
415 if hasattr(a, name):
416 res = eval(expr, dict)
417 testbinop(a, b, res, expr, name)
418 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000419 if name not in skip:
420 name = "__%s__" % name
421 if hasattr(a, name):
422 res = eval(expr, dict)
423 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000424
425def ints():
426 if verbose: print "Testing int operations..."
427 numops(100, 3)
428
429def longs():
430 if verbose: print "Testing long operations..."
431 numops(100L, 3L)
432
433def floats():
434 if verbose: print "Testing float operations..."
435 numops(100.0, 3.0)
436
437def complexes():
438 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000439 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000440 class Number(complex):
441 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000442 def __new__(cls, *args, **kwds):
443 result = complex.__new__(cls, *args)
444 result.prec = kwds.get('prec', 12)
445 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000446 def __repr__(self):
447 prec = self.prec
448 if self.imag == 0.0:
449 return "%.*g" % (prec, self.real)
450 if self.real == 0.0:
451 return "%.*gj" % (prec, self.imag)
452 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
453 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000454
Tim Peters6d6c1a32001-08-02 04:15:00 +0000455 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000456 vereq(`a`, "3.14")
457 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000458
Tim Peters3f996e72001-09-13 19:18:27 +0000459 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000460 vereq(`a`, "3.1")
461 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000462
463 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000464 vereq(`a`, "234.5")
465 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000466
Tim Peters6d6c1a32001-08-02 04:15:00 +0000467def spamlists():
468 if verbose: print "Testing spamlist operations..."
469 import copy, xxsubtype as spam
470 def spamlist(l, memo=None):
471 import xxsubtype as spam
472 return spam.spamlist(l)
473 # This is an ugly hack:
474 copy._deepcopy_dispatch[spam.spamlist] = spamlist
475
476 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
477 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
478 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
479 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
480 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
481 "a[b:c]", "__getslice__")
482 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
483 "a+=b", "__iadd__")
484 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
485 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
486 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
487 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
488 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
489 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
490 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
491 # Test subclassing
492 class C(spam.spamlist):
493 def foo(self): return 1
494 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000495 vereq(a, [])
496 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000497 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000498 vereq(a, [100])
499 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000500 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000501 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000502
503def spamdicts():
504 if verbose: print "Testing spamdict operations..."
505 import copy, xxsubtype as spam
506 def spamdict(d, memo=None):
507 import xxsubtype as spam
508 sd = spam.spamdict()
509 for k, v in d.items(): sd[k] = v
510 return sd
511 # This is an ugly hack:
512 copy._deepcopy_dispatch[spam.spamdict] = spamdict
513
514 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
515 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
516 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
517 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
518 d = spamdict({1:2,3:4})
519 l1 = []
520 for i in d.keys(): l1.append(i)
521 l = []
522 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000523 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000524 l = []
525 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000526 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000527 l = []
528 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000529 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000530 straightd = {1:2, 3:4}
531 spamd = spamdict(straightd)
532 testunop(spamd, 2, "len(a)", "__len__")
533 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
534 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
535 "a[b]=c", "__setitem__")
536 # Test subclassing
537 class C(spam.spamdict):
538 def foo(self): return 1
539 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000540 vereq(a.items(), [])
541 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000542 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000543 vereq(a.items(), [('foo', 'bar')])
544 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000545 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000546 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547
548def pydicts():
549 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000550 verify(issubclass(dict, dict))
551 verify(isinstance({}, dict))
552 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000553 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000554 verify(d.__class__ is dict)
555 verify(isinstance(d, dict))
556 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000557 state = -1
558 def __init__(self, *a, **kw):
559 if a:
560 assert len(a) == 1
561 self.state = a[0]
562 if kw:
563 for k, v in kw.items(): self[v] = k
564 def __getitem__(self, key):
565 return self.get(key, 0)
566 def __setitem__(self, key, value):
567 assert isinstance(key, type(0))
Tim Petersa427a2b2001-10-29 22:25:45 +0000568 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000569 def setstate(self, state):
570 self.state = state
571 def getstate(self):
572 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000573 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000575 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000576 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000577 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(a.state, -1)
580 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000581 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000582 vereq(a.state, 0)
583 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000584 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000585 vereq(a.state, 10)
586 vereq(a.getstate(), 10)
587 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000588 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000590 if verbose: print "pydict stress test ..."
591 N = 50
592 for i in range(N):
593 a[i] = C()
594 for j in range(N):
595 a[i][j] = i*j
596 for i in range(N):
597 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000598 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000599
600def pylists():
601 if verbose: print "Testing Python subclass of list..."
602 class C(list):
603 def __getitem__(self, i):
604 return list.__getitem__(self, i) + 100
605 def __getslice__(self, i, j):
606 return (i, j)
607 a = C()
608 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000609 vereq(a[0], 100)
610 vereq(a[1], 101)
611 vereq(a[2], 102)
612 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000613
614def metaclass():
615 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000616 class C:
617 __metaclass__ = type
618 def __init__(self):
619 self.__state = 0
620 def getstate(self):
621 return self.__state
622 def setstate(self, state):
623 self.__state = state
624 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000625 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000626 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000627 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 class D:
629 class __metaclass__(type):
630 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000631 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000632 d = D()
633 verify(d.__class__ is D)
634 class M1(type):
635 def __new__(cls, name, bases, dict):
636 dict['__spam__'] = 1
637 return type.__new__(cls, name, bases, dict)
638 class C:
639 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000640 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000641 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000642 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000643
Guido van Rossum309b5662001-08-17 11:43:17 +0000644 class _instance(object):
645 pass
646 class M2(object):
647 def __new__(cls, name, bases, dict):
648 self = object.__new__(cls)
649 self.name = name
650 self.bases = bases
651 self.dict = dict
652 return self
653 __new__ = staticmethod(__new__)
654 def __call__(self):
655 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000656 # Early binding of methods
657 for key in self.dict:
658 if key.startswith("__"):
659 continue
660 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000661 return it
662 class C:
663 __metaclass__ = M2
664 def spam(self):
665 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000666 vereq(C.name, 'C')
667 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000668 verify('spam' in C.dict)
669 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000670 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000671
Guido van Rossum91ee7982001-08-30 20:52:40 +0000672 # More metaclass examples
673
674 class autosuper(type):
675 # Automatically add __super to the class
676 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000677 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000678 cls = super(autosuper, metaclass).__new__(metaclass,
679 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000680 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 while name[:1] == "_":
682 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000683 if name:
684 name = "_%s__super" % name
685 else:
686 name = "__super"
687 setattr(cls, name, super(cls))
688 return cls
689 class A:
690 __metaclass__ = autosuper
691 def meth(self):
692 return "A"
693 class B(A):
694 def meth(self):
695 return "B" + self.__super.meth()
696 class C(A):
697 def meth(self):
698 return "C" + self.__super.meth()
699 class D(C, B):
700 def meth(self):
701 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000702 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000703 class E(B, C):
704 def meth(self):
705 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000706 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000707
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000708 class autoproperty(type):
709 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000710 # named _get_x and/or _set_x are found
711 def __new__(metaclass, name, bases, dict):
712 hits = {}
713 for key, val in dict.iteritems():
714 if key.startswith("_get_"):
715 key = key[5:]
716 get, set = hits.get(key, (None, None))
717 get = val
718 hits[key] = get, set
719 elif key.startswith("_set_"):
720 key = key[5:]
721 get, set = hits.get(key, (None, None))
722 set = val
723 hits[key] = get, set
724 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000725 dict[key] = property(get, set)
726 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000727 name, bases, dict)
728 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000729 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000730 def _get_x(self):
731 return -self.__x
732 def _set_x(self, x):
733 self.__x = -x
734 a = A()
735 verify(not hasattr(a, "x"))
736 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000737 vereq(a.x, 12)
738 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000739
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000740 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000741 # Merge of multiple cooperating metaclasses
742 pass
743 class A:
744 __metaclass__ = multimetaclass
745 def _get_x(self):
746 return "A"
747 class B(A):
748 def _get_x(self):
749 return "B" + self.__super._get_x()
750 class C(A):
751 def _get_x(self):
752 return "C" + self.__super._get_x()
753 class D(C, B):
754 def _get_x(self):
755 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000756 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000757
Guido van Rossumf76de622001-10-18 15:49:21 +0000758 # Make sure type(x) doesn't call x.__class__.__init__
759 class T(type):
760 counter = 0
761 def __init__(self, *args):
762 T.counter += 1
763 class C:
764 __metaclass__ = T
765 vereq(T.counter, 1)
766 a = C()
767 vereq(type(a), C)
768 vereq(T.counter, 1)
769
Tim Peters6d6c1a32001-08-02 04:15:00 +0000770def pymods():
771 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000772 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000773 import sys
774 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000775 class MM(MT):
776 def __init__(self):
777 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000778 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000779 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000780 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000781 def __setattr__(self, name, value):
782 log.append(("setattr", name, value))
783 MT.__setattr__(self, name, value)
784 def __delattr__(self, name):
785 log.append(("delattr", name))
786 MT.__delattr__(self, name)
787 a = MM()
788 a.foo = 12
789 x = a.foo
790 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000791 vereq(log, [("setattr", "foo", 12),
792 ("getattr", "foo"),
793 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000794
795def multi():
796 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000797 class C(object):
798 def __init__(self):
799 self.__state = 0
800 def getstate(self):
801 return self.__state
802 def setstate(self, state):
803 self.__state = state
804 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000805 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000806 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000807 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000808 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000809 def __init__(self):
810 type({}).__init__(self)
811 C.__init__(self)
812 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000813 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000815 vereq(d.items(), [("hello", "world")])
816 vereq(d["hello"], "world")
817 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000818 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000819 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000820 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000821
Guido van Rossume45763a2001-08-10 21:28:46 +0000822 # SF bug #442833
823 class Node(object):
824 def __int__(self):
825 return int(self.foo())
826 def foo(self):
827 return "23"
828 class Frag(Node, list):
829 def foo(self):
830 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000831 vereq(Node().__int__(), 23)
832 vereq(int(Node()), 23)
833 vereq(Frag().__int__(), 42)
834 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000835
Tim Peters6d6c1a32001-08-02 04:15:00 +0000836def diamond():
837 if verbose: print "Testing multiple inheritance special cases..."
838 class A(object):
839 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000840 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841 class B(A):
842 def boo(self): return "B"
843 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000844 vereq(B().spam(), "B")
845 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000846 class C(A):
847 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000848 vereq(C().spam(), "A")
849 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000851 vereq(D().spam(), "B")
852 vereq(D().boo(), "B")
853 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000855 vereq(E().spam(), "B")
856 vereq(E().boo(), "C")
857 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000858 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000859 vereq(F().spam(), "B")
860 vereq(F().boo(), "B")
861 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000863 vereq(G().spam(), "B")
864 vereq(G().boo(), "C")
865 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000866
Guido van Rossum37202612001-08-09 19:45:21 +0000867def objects():
868 if verbose: print "Testing object class..."
869 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000870 vereq(a.__class__, object)
871 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000872 b = object()
873 verify(a is not b)
874 verify(not hasattr(a, "foo"))
875 try:
876 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000877 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000878 pass
879 else:
880 verify(0, "object() should not allow setting a foo attribute")
881 verify(not hasattr(object(), "__dict__"))
882
883 class Cdict(object):
884 pass
885 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000886 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000887 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000888 vereq(x.foo, 1)
889 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000890
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891def slots():
892 if verbose: print "Testing __slots__..."
893 class C0(object):
894 __slots__ = []
895 x = C0()
896 verify(not hasattr(x, "__dict__"))
897 verify(not hasattr(x, "foo"))
898
899 class C1(object):
900 __slots__ = ['a']
901 x = C1()
902 verify(not hasattr(x, "__dict__"))
Guido van Rossum45704552001-10-08 16:35:45 +0000903 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000904 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000905 vereq(x.a, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000906 del x.a
Guido van Rossum45704552001-10-08 16:35:45 +0000907 vereq(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000908
909 class C3(object):
910 __slots__ = ['a', 'b', 'c']
911 x = C3()
912 verify(not hasattr(x, "__dict__"))
913 verify(x.a is None)
914 verify(x.b is None)
915 verify(x.c is None)
916 x.a = 1
917 x.b = 2
918 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +0000919 vereq(x.a, 1)
920 vereq(x.b, 2)
921 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000922
923def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000924 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000925 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000926 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000927 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000928 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000929 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000930 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000932 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000933 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +0000934 vereq(E.foo, 1)
935 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000936 # Test dynamic instances
937 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000938 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000939 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +0000940 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000941 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +0000942 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000943 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +0000944 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +0000945 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +0000946 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +0000947 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +0000948 vereq(int(a), 100)
949 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +0000950 verify(not hasattr(a, "spam"))
951 def mygetattr(self, name):
952 if name == "spam":
953 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +0000954 raise AttributeError
955 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +0000956 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +0000957 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000958 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +0000959 def mysetattr(self, name, value):
960 if name == "spam":
961 raise AttributeError
962 return object.__setattr__(self, name, value)
963 C.__setattr__ = mysetattr
964 try:
965 a.spam = "not spam"
966 except AttributeError:
967 pass
968 else:
969 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +0000970 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +0000971 class D(C):
972 pass
973 d = D()
974 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000975 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000976
Guido van Rossum7e35d572001-09-15 03:14:32 +0000977 # Test handling of int*seq and seq*int
978 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000979 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000980 vereq("a"*I(2), "aa")
981 vereq(I(2)*"a", "aa")
982 vereq(2*I(3), 6)
983 vereq(I(3)*2, 6)
984 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000985
986 # Test handling of long*seq and seq*long
987 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000988 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000989 vereq("a"*L(2L), "aa")
990 vereq(L(2L)*"a", "aa")
991 vereq(2*L(3), 6)
992 vereq(L(3)*2, 6)
993 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +0000994
Guido van Rossum3d45d8f2001-09-24 18:47:40 +0000995 # Test comparison of classes with dynamic metaclasses
996 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000997 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +0000998 class someclass:
999 __metaclass__ = dynamicmetaclass
1000 verify(someclass != object)
1001
Tim Peters6d6c1a32001-08-02 04:15:00 +00001002def errors():
1003 if verbose: print "Testing errors..."
1004
1005 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001006 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001007 pass
1008 except TypeError:
1009 pass
1010 else:
1011 verify(0, "inheritance from both list and dict should be illegal")
1012
1013 try:
1014 class C(object, None):
1015 pass
1016 except TypeError:
1017 pass
1018 else:
1019 verify(0, "inheritance from non-type should be illegal")
1020 class Classic:
1021 pass
1022
1023 try:
1024 class C(object, Classic):
1025 pass
1026 except TypeError:
1027 pass
1028 else:
1029 verify(0, "inheritance from object and Classic should be illegal")
1030
1031 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001032 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001033 pass
1034 except TypeError:
1035 pass
1036 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001037 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001038
1039 try:
1040 class C(object):
1041 __slots__ = 1
1042 except TypeError:
1043 pass
1044 else:
1045 verify(0, "__slots__ = 1 should be illegal")
1046
1047 try:
1048 class C(object):
1049 __slots__ = [1]
1050 except TypeError:
1051 pass
1052 else:
1053 verify(0, "__slots__ = [1] should be illegal")
1054
1055def classmethods():
1056 if verbose: print "Testing class methods..."
1057 class C(object):
1058 def foo(*a): return a
1059 goo = classmethod(foo)
1060 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001061 vereq(C.goo(1), (C, 1))
1062 vereq(c.goo(1), (C, 1))
1063 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001064 class D(C):
1065 pass
1066 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001067 vereq(D.goo(1), (D, 1))
1068 vereq(d.goo(1), (D, 1))
1069 vereq(d.foo(1), (d, 1))
1070 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071
1072def staticmethods():
1073 if verbose: print "Testing static methods..."
1074 class C(object):
1075 def foo(*a): return a
1076 goo = staticmethod(foo)
1077 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001078 vereq(C.goo(1), (1,))
1079 vereq(c.goo(1), (1,))
1080 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001081 class D(C):
1082 pass
1083 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001084 vereq(D.goo(1), (1,))
1085 vereq(d.goo(1), (1,))
1086 vereq(d.foo(1), (d, 1))
1087 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001088
1089def classic():
1090 if verbose: print "Testing classic classes..."
1091 class C:
1092 def foo(*a): return a
1093 goo = classmethod(foo)
1094 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001095 vereq(C.goo(1), (C, 1))
1096 vereq(c.goo(1), (C, 1))
1097 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001098 class D(C):
1099 pass
1100 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001101 vereq(D.goo(1), (D, 1))
1102 vereq(d.goo(1), (D, 1))
1103 vereq(d.foo(1), (d, 1))
1104 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001105 class E: # *not* subclassing from C
1106 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001107 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001108 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001109
1110def compattr():
1111 if verbose: print "Testing computed attributes..."
1112 class C(object):
1113 class computed_attribute(object):
1114 def __init__(self, get, set=None):
1115 self.__get = get
1116 self.__set = set
1117 def __get__(self, obj, type=None):
1118 return self.__get(obj)
1119 def __set__(self, obj, value):
1120 return self.__set(obj, value)
1121 def __init__(self):
1122 self.__x = 0
1123 def __get_x(self):
1124 x = self.__x
1125 self.__x = x+1
1126 return x
1127 def __set_x(self, x):
1128 self.__x = x
1129 x = computed_attribute(__get_x, __set_x)
1130 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001131 vereq(a.x, 0)
1132 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001133 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001134 vereq(a.x, 10)
1135 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001136
1137def newslot():
1138 if verbose: print "Testing __new__ slot override..."
1139 class C(list):
1140 def __new__(cls):
1141 self = list.__new__(cls)
1142 self.foo = 1
1143 return self
1144 def __init__(self):
1145 self.foo = self.foo + 2
1146 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001147 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001148 verify(a.__class__ is C)
1149 class D(C):
1150 pass
1151 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001152 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001153 verify(b.__class__ is D)
1154
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155def altmro():
1156 if verbose: print "Testing mro() and overriding it..."
1157 class A(object):
1158 def f(self): return "A"
1159 class B(A):
1160 pass
1161 class C(A):
1162 def f(self): return "C"
1163 class D(B, C):
1164 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001165 vereq(D.mro(), [D, B, C, A, object])
1166 vereq(D.__mro__, (D, B, C, A, object))
1167 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001168 class PerverseMetaType(type):
1169 def mro(cls):
1170 L = type.mro(cls)
1171 L.reverse()
1172 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001173 class X(A,B,C,D):
1174 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001175 vereq(X.__mro__, (object, A, C, B, D, X))
1176 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001177
1178def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001179 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001180
1181 class B(object):
1182 "Intermediate class because object doesn't have a __setattr__"
1183
1184 class C(B):
1185
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001186 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001187 if name == "foo":
1188 return ("getattr", name)
1189 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001190 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001191 def __setattr__(self, name, value):
1192 if name == "foo":
1193 self.setattr = (name, value)
1194 else:
1195 return B.__setattr__(self, name, value)
1196 def __delattr__(self, name):
1197 if name == "foo":
1198 self.delattr = name
1199 else:
1200 return B.__delattr__(self, name)
1201
1202 def __getitem__(self, key):
1203 return ("getitem", key)
1204 def __setitem__(self, key, value):
1205 self.setitem = (key, value)
1206 def __delitem__(self, key):
1207 self.delitem = key
1208
1209 def __getslice__(self, i, j):
1210 return ("getslice", i, j)
1211 def __setslice__(self, i, j, value):
1212 self.setslice = (i, j, value)
1213 def __delslice__(self, i, j):
1214 self.delslice = (i, j)
1215
1216 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001217 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001218 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001219 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001220 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001221 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001222
Guido van Rossum45704552001-10-08 16:35:45 +00001223 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001224 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001225 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001226 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001227 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001228
Guido van Rossum45704552001-10-08 16:35:45 +00001229 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001230 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001231 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001232 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001233 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001234
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001235def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001236 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001237 class C(object):
1238 def __init__(self, x):
1239 self.x = x
1240 def foo(self):
1241 return self.x
1242 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001243 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001244 class D(C):
1245 boo = C.foo
1246 goo = c1.foo
1247 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001248 vereq(d2.foo(), 2)
1249 vereq(d2.boo(), 2)
1250 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001251 class E(object):
1252 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001253 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001254 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001255
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001256def specials():
1257 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001258 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001259 # Test the default behavior for static classes
1260 class C(object):
1261 def __getitem__(self, i):
1262 if 0 <= i < 10: return i
1263 raise IndexError
1264 c1 = C()
1265 c2 = C()
1266 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001267 vereq(hash(c1), id(c1))
1268 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1269 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001270 verify(c1 != c2)
1271 verify(not c1 != c1)
1272 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001273 # Note that the module name appears in str/repr, and that varies
1274 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001275 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001276 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001277 verify(-1 not in c1)
1278 for i in range(10):
1279 verify(i in c1)
1280 verify(10 not in c1)
1281 # Test the default behavior for dynamic classes
1282 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001283 def __getitem__(self, i):
1284 if 0 <= i < 10: return i
1285 raise IndexError
1286 d1 = D()
1287 d2 = D()
1288 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001289 vereq(hash(d1), id(d1))
1290 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1291 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001292 verify(d1 != d2)
1293 verify(not d1 != d1)
1294 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001295 # Note that the module name appears in str/repr, and that varies
1296 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001297 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001298 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001299 verify(-1 not in d1)
1300 for i in range(10):
1301 verify(i in d1)
1302 verify(10 not in d1)
1303 # Test overridden behavior for static classes
1304 class Proxy(object):
1305 def __init__(self, x):
1306 self.x = x
1307 def __nonzero__(self):
1308 return not not self.x
1309 def __hash__(self):
1310 return hash(self.x)
1311 def __eq__(self, other):
1312 return self.x == other
1313 def __ne__(self, other):
1314 return self.x != other
1315 def __cmp__(self, other):
1316 return cmp(self.x, other.x)
1317 def __str__(self):
1318 return "Proxy:%s" % self.x
1319 def __repr__(self):
1320 return "Proxy(%r)" % self.x
1321 def __contains__(self, value):
1322 return value in self.x
1323 p0 = Proxy(0)
1324 p1 = Proxy(1)
1325 p_1 = Proxy(-1)
1326 verify(not p0)
1327 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001328 vereq(hash(p0), hash(0))
1329 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001330 verify(p0 != p1)
1331 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001332 vereq(not p0, p1)
1333 vereq(cmp(p0, p1), -1)
1334 vereq(cmp(p0, p0), 0)
1335 vereq(cmp(p0, p_1), 1)
1336 vereq(str(p0), "Proxy:0")
1337 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001338 p10 = Proxy(range(10))
1339 verify(-1 not in p10)
1340 for i in range(10):
1341 verify(i in p10)
1342 verify(10 not in p10)
1343 # Test overridden behavior for dynamic classes
1344 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001345 def __init__(self, x):
1346 self.x = x
1347 def __nonzero__(self):
1348 return not not self.x
1349 def __hash__(self):
1350 return hash(self.x)
1351 def __eq__(self, other):
1352 return self.x == other
1353 def __ne__(self, other):
1354 return self.x != other
1355 def __cmp__(self, other):
1356 return cmp(self.x, other.x)
1357 def __str__(self):
1358 return "DProxy:%s" % self.x
1359 def __repr__(self):
1360 return "DProxy(%r)" % self.x
1361 def __contains__(self, value):
1362 return value in self.x
1363 p0 = DProxy(0)
1364 p1 = DProxy(1)
1365 p_1 = DProxy(-1)
1366 verify(not p0)
1367 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001368 vereq(hash(p0), hash(0))
1369 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001370 verify(p0 != p1)
1371 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001372 vereq(not p0, p1)
1373 vereq(cmp(p0, p1), -1)
1374 vereq(cmp(p0, p0), 0)
1375 vereq(cmp(p0, p_1), 1)
1376 vereq(str(p0), "DProxy:0")
1377 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001378 p10 = DProxy(range(10))
1379 verify(-1 not in p10)
1380 for i in range(10):
1381 verify(i in p10)
1382 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001383 # Safety test for __cmp__
1384 def unsafecmp(a, b):
1385 try:
1386 a.__class__.__cmp__(a, b)
1387 except TypeError:
1388 pass
1389 else:
1390 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1391 a.__class__, a, b)
1392 unsafecmp(u"123", "123")
1393 unsafecmp("123", u"123")
1394 unsafecmp(1, 1.0)
1395 unsafecmp(1.0, 1)
1396 unsafecmp(1, 1L)
1397 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001398
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001399def weakrefs():
1400 if verbose: print "Testing weak references..."
1401 import weakref
1402 class C(object):
1403 pass
1404 c = C()
1405 r = weakref.ref(c)
1406 verify(r() is c)
1407 del c
1408 verify(r() is None)
1409 del r
1410 class NoWeak(object):
1411 __slots__ = ['foo']
1412 no = NoWeak()
1413 try:
1414 weakref.ref(no)
1415 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001416 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001417 else:
1418 verify(0, "weakref.ref(no) should be illegal")
1419 class Weak(object):
1420 __slots__ = ['foo', '__weakref__']
1421 yes = Weak()
1422 r = weakref.ref(yes)
1423 verify(r() is yes)
1424 del yes
1425 verify(r() is None)
1426 del r
1427
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001428def properties():
1429 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001430 class C(object):
1431 def getx(self):
1432 return self.__x
1433 def setx(self, value):
1434 self.__x = value
1435 def delx(self):
1436 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001437 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001438 a = C()
1439 verify(not hasattr(a, "x"))
1440 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001441 vereq(a._C__x, 42)
1442 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001443 del a.x
1444 verify(not hasattr(a, "x"))
1445 verify(not hasattr(a, "_C__x"))
1446 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001447 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001448## C.x.__set__(a)
1449## verify(not hasattr(a, "x"))
1450
Tim Peters66c1a522001-09-24 21:17:50 +00001451 raw = C.__dict__['x']
1452 verify(isinstance(raw, property))
1453
1454 attrs = dir(raw)
1455 verify("__doc__" in attrs)
1456 verify("fget" in attrs)
1457 verify("fset" in attrs)
1458 verify("fdel" in attrs)
1459
Guido van Rossum45704552001-10-08 16:35:45 +00001460 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001461 verify(raw.fget is C.__dict__['getx'])
1462 verify(raw.fset is C.__dict__['setx'])
1463 verify(raw.fdel is C.__dict__['delx'])
1464
1465 for attr in "__doc__", "fget", "fset", "fdel":
1466 try:
1467 setattr(raw, attr, 42)
1468 except TypeError, msg:
1469 if str(msg).find('readonly') < 0:
1470 raise TestFailed("when setting readonly attr %r on a "
1471 "property, got unexpected TypeError "
1472 "msg %r" % (attr, str(msg)))
1473 else:
1474 raise TestFailed("expected TypeError from trying to set "
1475 "readonly %r attr on a property" % attr)
1476
Guido van Rossumc4a18802001-08-24 16:55:27 +00001477def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001478 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001479
1480 class A(object):
1481 def meth(self, a):
1482 return "A(%r)" % a
1483
Guido van Rossum45704552001-10-08 16:35:45 +00001484 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001485
1486 class B(A):
1487 def __init__(self):
1488 self.__super = super(B, self)
1489 def meth(self, a):
1490 return "B(%r)" % a + self.__super.meth(a)
1491
Guido van Rossum45704552001-10-08 16:35:45 +00001492 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001493
1494 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001495 def meth(self, a):
1496 return "C(%r)" % a + self.__super.meth(a)
1497 C._C__super = super(C)
1498
Guido van Rossum45704552001-10-08 16:35:45 +00001499 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001500
1501 class D(C, B):
1502 def meth(self, a):
1503 return "D(%r)" % a + super(D, self).meth(a)
1504
1505 verify (D().meth(4) == "D(4)C(4)B(4)A(4)")
1506
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001507def inherits():
1508 if verbose: print "Testing inheritance from basic types..."
1509
1510 class hexint(int):
1511 def __repr__(self):
1512 return hex(self)
1513 def __add__(self, other):
1514 return hexint(int.__add__(self, other))
1515 # (Note that overriding __radd__ doesn't work,
1516 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001517 vereq(repr(hexint(7) + 9), "0x10")
1518 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001519 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001520 vereq(a, 12345)
1521 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001522 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001523 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001524 verify((+a).__class__ is int)
1525 verify((a >> 0).__class__ is int)
1526 verify((a << 0).__class__ is int)
1527 verify((hexint(0) << 12).__class__ is int)
1528 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001529
1530 class octlong(long):
1531 __slots__ = []
1532 def __str__(self):
1533 s = oct(self)
1534 if s[-1] == 'L':
1535 s = s[:-1]
1536 return s
1537 def __add__(self, other):
1538 return self.__class__(super(octlong, self).__add__(other))
1539 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001540 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001541 # (Note that overriding __radd__ here only seems to work
1542 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001543 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001544 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001545 vereq(a, 12345L)
1546 vereq(long(a), 12345L)
1547 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001548 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001549 verify((+a).__class__ is long)
1550 verify((-a).__class__ is long)
1551 verify((-octlong(0)).__class__ is long)
1552 verify((a >> 0).__class__ is long)
1553 verify((a << 0).__class__ is long)
1554 verify((a - 0).__class__ is long)
1555 verify((a * 1).__class__ is long)
1556 verify((a ** 1).__class__ is long)
1557 verify((a // 1).__class__ is long)
1558 verify((1 * a).__class__ is long)
1559 verify((a | 0).__class__ is long)
1560 verify((a ^ 0).__class__ is long)
1561 verify((a & -1L).__class__ is long)
1562 verify((octlong(0) << 12).__class__ is long)
1563 verify((octlong(0) >> 12).__class__ is long)
1564 verify(abs(octlong(0)).__class__ is long)
1565
1566 # Because octlong overrides __add__, we can't check the absence of +0
1567 # optimizations using octlong.
1568 class longclone(long):
1569 pass
1570 a = longclone(1)
1571 verify((a + 0).__class__ is long)
1572 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001573
1574 class precfloat(float):
1575 __slots__ = ['prec']
1576 def __init__(self, value=0.0, prec=12):
1577 self.prec = int(prec)
1578 float.__init__(value)
1579 def __repr__(self):
1580 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001581 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001582 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(a, 12345.0)
1584 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001585 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001586 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001587 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001588
Tim Peters2400fa42001-09-12 19:12:49 +00001589 class madcomplex(complex):
1590 def __repr__(self):
1591 return "%.17gj%+.17g" % (self.imag, self.real)
1592 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001593 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001594 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001595 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001596 vereq(a, base)
1597 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001598 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001599 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001600 vereq(repr(a), "4j-3")
1601 vereq(a, base)
1602 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001603 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001604 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001605 veris((+a).__class__, complex)
1606 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001607 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001608 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001609 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001610 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001611 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001612 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001613 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001614
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001615 class madtuple(tuple):
1616 _rev = None
1617 def rev(self):
1618 if self._rev is not None:
1619 return self._rev
1620 L = list(self)
1621 L.reverse()
1622 self._rev = self.__class__(L)
1623 return self._rev
1624 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001625 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1626 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1627 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001628 for i in range(512):
1629 t = madtuple(range(i))
1630 u = t.rev()
1631 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001632 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001633 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001634 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001635 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001636 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001637 verify(a[:].__class__ is tuple)
1638 verify((a * 1).__class__ is tuple)
1639 verify((a * 0).__class__ is tuple)
1640 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001641 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001642 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001643 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001644 verify((a + a).__class__ is tuple)
1645 verify((a * 0).__class__ is tuple)
1646 verify((a * 1).__class__ is tuple)
1647 verify((a * 2).__class__ is tuple)
1648 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001649
1650 class madstring(str):
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__("".join(L))
1658 return self._rev
1659 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1661 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1662 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001663 for i in range(256):
1664 s = madstring("".join(map(chr, range(i))))
1665 t = s.rev()
1666 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001668 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001669 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001670 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001671
Tim Peters8fa5dd02001-09-12 02:18:30 +00001672 base = "\x00" * 5
1673 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001674 vereq(s, base)
1675 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001676 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001677 vereq(hash(s), hash(base))
1678 vereq({s: 1}[base], 1)
1679 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001680 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001682 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001684 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001685 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001686 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001687 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001688 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001689 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001690 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001691 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001692 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001693 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001694 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001695 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001696 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001697 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001698 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001699 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001700 identitytab = ''.join([chr(i) for i in range(256)])
1701 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001702 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001703 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001704 vereq(s.translate(identitytab, "x"), base)
1705 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001706 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001707 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001708 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001709 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001710 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001711 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001712 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001713 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001714 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001715 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001716
Tim Peters111f6092001-09-12 07:54:51 +00001717 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001718 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001719 verify(intern(s).__class__ is str)
1720 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001721 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001722
1723 i = intern("y x")
1724 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001725 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001726 verify(intern(s).__class__ is str)
1727 verify(intern(s) is i)
1728
1729 s = madstring(i)
1730 verify(intern(s).__class__ is str)
1731 verify(intern(s) is i)
1732
Guido van Rossum91ee7982001-08-30 20:52:40 +00001733 class madunicode(unicode):
1734 _rev = None
1735 def rev(self):
1736 if self._rev is not None:
1737 return self._rev
1738 L = list(self)
1739 L.reverse()
1740 self._rev = self.__class__(u"".join(L))
1741 return self._rev
1742 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001743 vereq(u, u"ABCDEF")
1744 vereq(u.rev(), madunicode(u"FEDCBA"))
1745 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001746 base = u"12345"
1747 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001748 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001749 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001750 vereq(hash(u), hash(base))
1751 vereq({u: 1}[base], 1)
1752 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001753 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001754 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001755 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001756 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001757 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001758 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001759 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001760 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001761 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001762 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001763 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001764 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001765 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001766 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001767 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001769 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001770 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001771 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001772 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001773 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001774 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001775 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001776 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001777 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001778 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001779 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001780 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001781 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001782 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001783 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001784 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001785 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001786 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001787 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001788 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001789 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001790 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001791
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001792 class sublist(list):
1793 pass
1794 a = sublist(range(5))
1795 vereq(a, range(5))
1796 a.append("hello")
1797 vereq(a, range(5) + ["hello"])
1798 a[5] = 5
1799 vereq(a, range(6))
1800 a.extend(range(6, 20))
1801 vereq(a, range(20))
1802 a[-5:] = []
1803 vereq(a, range(15))
1804 del a[10:15]
1805 vereq(len(a), 10)
1806 vereq(a, range(10))
1807 vereq(list(a), range(10))
1808 vereq(a[0], 0)
1809 vereq(a[9], 9)
1810 vereq(a[-10], 0)
1811 vereq(a[-1], 9)
1812 vereq(a[:5], range(5))
1813
Tim Peters59c9a642001-09-13 05:38:56 +00001814 class CountedInput(file):
1815 """Counts lines read by self.readline().
1816
1817 self.lineno is the 0-based ordinal of the last line read, up to
1818 a maximum of one greater than the number of lines in the file.
1819
1820 self.ateof is true if and only if the final "" line has been read,
1821 at which point self.lineno stops incrementing, and further calls
1822 to readline() continue to return "".
1823 """
1824
1825 lineno = 0
1826 ateof = 0
1827 def readline(self):
1828 if self.ateof:
1829 return ""
1830 s = file.readline(self)
1831 # Next line works too.
1832 # s = super(CountedInput, self).readline()
1833 self.lineno += 1
1834 if s == "":
1835 self.ateof = 1
1836 return s
1837
Tim Peters561f8992001-09-13 19:36:36 +00001838 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00001839 lines = ['a\n', 'b\n', 'c\n']
1840 try:
1841 f.writelines(lines)
1842 f.close()
1843 f = CountedInput(TESTFN)
1844 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
1845 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00001846 vereq(expected, got)
1847 vereq(f.lineno, i)
1848 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00001849 f.close()
1850 finally:
1851 try:
1852 f.close()
1853 except:
1854 pass
1855 try:
1856 import os
1857 os.unlink(TESTFN)
1858 except:
1859 pass
1860
Tim Peters808b94e2001-09-13 19:33:07 +00001861def keywords():
1862 if verbose:
1863 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00001864 vereq(int(x=1), 1)
1865 vereq(float(x=2), 2.0)
1866 vereq(long(x=3), 3L)
1867 vereq(complex(imag=42, real=666), complex(666, 42))
1868 vereq(str(object=500), '500')
1869 vereq(unicode(string='abc', errors='strict'), u'abc')
1870 vereq(tuple(sequence=range(3)), (0, 1, 2))
1871 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00001872 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00001873
1874 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00001875 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00001876 try:
1877 constructor(bogus_keyword_arg=1)
1878 except TypeError:
1879 pass
1880 else:
1881 raise TestFailed("expected TypeError from bogus keyword "
1882 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00001883
Tim Peters8fa45672001-09-13 21:01:29 +00001884def restricted():
1885 import rexec
1886 if verbose:
1887 print "Testing interaction with restricted execution ..."
1888
1889 sandbox = rexec.RExec()
1890
1891 code1 = """f = open(%r, 'w')""" % TESTFN
1892 code2 = """f = file(%r, 'w')""" % TESTFN
1893 code3 = """\
1894f = open(%r)
1895t = type(f) # a sneaky way to get the file() constructor
1896f.close()
1897f = t(%r, 'w') # rexec can't catch this by itself
1898""" % (TESTFN, TESTFN)
1899
1900 f = open(TESTFN, 'w') # Create the file so code3 can find it.
1901 f.close()
1902
1903 try:
1904 for code in code1, code2, code3:
1905 try:
1906 sandbox.r_exec(code)
1907 except IOError, msg:
1908 if str(msg).find("restricted") >= 0:
1909 outcome = "OK"
1910 else:
1911 outcome = "got an exception, but not an expected one"
1912 else:
1913 outcome = "expected a restricted-execution exception"
1914
1915 if outcome != "OK":
1916 raise TestFailed("%s, in %r" % (outcome, code))
1917
1918 finally:
1919 try:
1920 import os
1921 os.unlink(TESTFN)
1922 except:
1923 pass
1924
Tim Peters0ab085c2001-09-14 00:25:33 +00001925def str_subclass_as_dict_key():
1926 if verbose:
1927 print "Testing a str subclass used as dict key .."
1928
1929 class cistr(str):
1930 """Sublcass of str that computes __eq__ case-insensitively.
1931
1932 Also computes a hash code of the string in canonical form.
1933 """
1934
1935 def __init__(self, value):
1936 self.canonical = value.lower()
1937 self.hashcode = hash(self.canonical)
1938
1939 def __eq__(self, other):
1940 if not isinstance(other, cistr):
1941 other = cistr(other)
1942 return self.canonical == other.canonical
1943
1944 def __hash__(self):
1945 return self.hashcode
1946
Guido van Rossum45704552001-10-08 16:35:45 +00001947 vereq(cistr('ABC'), 'abc')
1948 vereq('aBc', cistr('ABC'))
1949 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00001950
1951 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00001952 vereq(d[cistr('one')], 1)
1953 vereq(d[cistr('tWo')], 2)
1954 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001955 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00001956 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00001957
Guido van Rossumab3b0342001-09-18 20:38:53 +00001958def classic_comparisons():
1959 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00001960 class classic:
1961 pass
1962 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00001963 if verbose: print " (base = %s)" % base
1964 class C(base):
1965 def __init__(self, value):
1966 self.value = int(value)
1967 def __cmp__(self, other):
1968 if isinstance(other, C):
1969 return cmp(self.value, other.value)
1970 if isinstance(other, int) or isinstance(other, long):
1971 return cmp(self.value, other)
1972 return NotImplemented
1973 c1 = C(1)
1974 c2 = C(2)
1975 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00001976 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00001977 c = {1: c1, 2: c2, 3: c3}
1978 for x in 1, 2, 3:
1979 for y in 1, 2, 3:
1980 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1981 for op in "<", "<=", "==", "!=", ">", ">=":
1982 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
1983 "x=%d, y=%d" % (x, y))
1984 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
1985 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
1986
Guido van Rossum0639f592001-09-18 21:06:04 +00001987def rich_comparisons():
1988 if verbose:
1989 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00001990 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001991 pass
Guido van Rossum22056422001-09-24 17:52:04 +00001992 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001993 vereq(z, 1+0j)
1994 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00001995 class ZZ(complex):
1996 def __eq__(self, other):
1997 try:
1998 return abs(self - other) <= 1e-6
1999 except:
2000 return NotImplemented
2001 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002002 vereq(zz, 1+0j)
2003 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002004
Guido van Rossum0639f592001-09-18 21:06:04 +00002005 class classic:
2006 pass
2007 for base in (classic, int, object, list):
2008 if verbose: print " (base = %s)" % base
2009 class C(base):
2010 def __init__(self, value):
2011 self.value = int(value)
2012 def __cmp__(self, other):
2013 raise TestFailed, "shouldn't call __cmp__"
2014 def __eq__(self, other):
2015 if isinstance(other, C):
2016 return self.value == other.value
2017 if isinstance(other, int) or isinstance(other, long):
2018 return self.value == other
2019 return NotImplemented
2020 def __ne__(self, other):
2021 if isinstance(other, C):
2022 return self.value != other.value
2023 if isinstance(other, int) or isinstance(other, long):
2024 return self.value != other
2025 return NotImplemented
2026 def __lt__(self, other):
2027 if isinstance(other, C):
2028 return self.value < other.value
2029 if isinstance(other, int) or isinstance(other, long):
2030 return self.value < other
2031 return NotImplemented
2032 def __le__(self, other):
2033 if isinstance(other, C):
2034 return self.value <= other.value
2035 if isinstance(other, int) or isinstance(other, long):
2036 return self.value <= other
2037 return NotImplemented
2038 def __gt__(self, other):
2039 if isinstance(other, C):
2040 return self.value > other.value
2041 if isinstance(other, int) or isinstance(other, long):
2042 return self.value > other
2043 return NotImplemented
2044 def __ge__(self, other):
2045 if isinstance(other, C):
2046 return self.value >= other.value
2047 if isinstance(other, int) or isinstance(other, long):
2048 return self.value >= other
2049 return NotImplemented
2050 c1 = C(1)
2051 c2 = C(2)
2052 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002053 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002054 c = {1: c1, 2: c2, 3: c3}
2055 for x in 1, 2, 3:
2056 for y in 1, 2, 3:
2057 for op in "<", "<=", "==", "!=", ">", ">=":
2058 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2059 "x=%d, y=%d" % (x, y))
2060 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2061 "x=%d, y=%d" % (x, y))
2062 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2063 "x=%d, y=%d" % (x, y))
2064
Guido van Rossum1952e382001-09-19 01:25:16 +00002065def coercions():
2066 if verbose: print "Testing coercions..."
2067 class I(int): pass
2068 coerce(I(0), 0)
2069 coerce(0, I(0))
2070 class L(long): pass
2071 coerce(L(0), 0)
2072 coerce(L(0), 0L)
2073 coerce(0, L(0))
2074 coerce(0L, L(0))
2075 class F(float): pass
2076 coerce(F(0), 0)
2077 coerce(F(0), 0L)
2078 coerce(F(0), 0.)
2079 coerce(0, F(0))
2080 coerce(0L, F(0))
2081 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002082 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002083 coerce(C(0), 0)
2084 coerce(C(0), 0L)
2085 coerce(C(0), 0.)
2086 coerce(C(0), 0j)
2087 coerce(0, C(0))
2088 coerce(0L, C(0))
2089 coerce(0., C(0))
2090 coerce(0j, C(0))
2091
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002092def descrdoc():
2093 if verbose: print "Testing descriptor doc strings..."
2094 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002095 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002096 check(file.closed, "flag set if the file is closed") # getset descriptor
2097 check(file.name, "file name") # member descriptor
2098
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002099def setclass():
2100 if verbose: print "Testing __class__ assignment..."
2101 class C(object): pass
2102 class D(object): pass
2103 class E(object): pass
2104 class F(D, E): pass
2105 for cls in C, D, E, F:
2106 for cls2 in C, D, E, F:
2107 x = cls()
2108 x.__class__ = cls2
2109 verify(x.__class__ is cls2)
2110 x.__class__ = cls
2111 verify(x.__class__ is cls)
2112 def cant(x, C):
2113 try:
2114 x.__class__ = C
2115 except TypeError:
2116 pass
2117 else:
2118 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2119 cant(C(), list)
2120 cant(list(), C)
2121 cant(C(), 1)
2122 cant(C(), object)
2123 cant(object(), list)
2124 cant(list(), object)
2125
Guido van Rossum6661be32001-10-26 04:26:12 +00002126def setdict():
2127 if verbose: print "Testing __dict__ assignment..."
2128 class C(object): pass
2129 a = C()
2130 a.__dict__ = {'b': 1}
2131 vereq(a.b, 1)
2132 def cant(x, dict):
2133 try:
2134 x.__dict__ = dict
2135 except TypeError:
2136 pass
2137 else:
2138 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2139 cant(a, None)
2140 cant(a, [])
2141 cant(a, 1)
2142 try:
2143 del a.__dict__
2144 except TypeError:
2145 pass
2146 else:
2147 raise TestFailed, "shouldn't allow del %r.__dict__" % (a)
2148 # Classes don't allow __dict__ assignment
2149 cant(C, {})
2150
Guido van Rossum3926a632001-09-25 16:25:58 +00002151def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002152 if verbose:
2153 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002154 import pickle, cPickle
2155
2156 def sorteditems(d):
2157 L = d.items()
2158 L.sort()
2159 return L
2160
2161 global C
2162 class C(object):
2163 def __init__(self, a, b):
2164 super(C, self).__init__()
2165 self.a = a
2166 self.b = b
2167 def __repr__(self):
2168 return "C(%r, %r)" % (self.a, self.b)
2169
2170 global C1
2171 class C1(list):
2172 def __new__(cls, a, b):
2173 return super(C1, cls).__new__(cls)
2174 def __init__(self, a, b):
2175 self.a = a
2176 self.b = b
2177 def __repr__(self):
2178 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2179
2180 global C2
2181 class C2(int):
2182 def __new__(cls, a, b, val=0):
2183 return super(C2, cls).__new__(cls, val)
2184 def __init__(self, a, b, val=0):
2185 self.a = a
2186 self.b = b
2187 def __repr__(self):
2188 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2189
2190 for p in pickle, cPickle:
2191 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002192 if verbose:
2193 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002194
2195 for cls in C, C1, C2:
2196 s = p.dumps(cls, bin)
2197 cls2 = p.loads(s)
2198 verify(cls2 is cls)
2199
2200 a = C1(1, 2); a.append(42); a.append(24)
2201 b = C2("hello", "world", 42)
2202 s = p.dumps((a, b), bin)
2203 x, y = p.loads(s)
2204 assert x.__class__ == a.__class__
2205 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2206 assert y.__class__ == b.__class__
2207 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2208 assert `x` == `a`
2209 assert `y` == `b`
2210 if verbose:
2211 print "a = x =", a
2212 print "b = y =", b
2213
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002214 # Testing copy.deepcopy()
2215 if verbose:
2216 print "deepcopy"
2217 import copy
2218 for cls in C, C1, C2:
2219 cls2 = copy.deepcopy(cls)
2220 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002221
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002222 a = C1(1, 2); a.append(42); a.append(24)
2223 b = C2("hello", "world", 42)
2224 x, y = copy.deepcopy((a, b))
2225 assert x.__class__ == a.__class__
2226 assert sorteditems(x.__dict__) == sorteditems(a.__dict__)
2227 assert y.__class__ == b.__class__
2228 assert sorteditems(y.__dict__) == sorteditems(b.__dict__)
2229 assert `x` == `a`
2230 assert `y` == `b`
2231 if verbose:
2232 print "a = x =", a
2233 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002234
2235def copies():
2236 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2237 import copy
2238 class C(object):
2239 pass
2240
2241 a = C()
2242 a.foo = 12
2243 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002244 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002245
2246 a.bar = [1,2,3]
2247 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002249 verify(c.bar is a.bar)
2250
2251 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002252 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002253 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002254 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002255
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002256def binopoverride():
2257 if verbose: print "Testing overrides of binary operations..."
2258 class I(int):
2259 def __repr__(self):
2260 return "I(%r)" % int(self)
2261 def __add__(self, other):
2262 return I(int(self) + int(other))
2263 __radd__ = __add__
2264 def __pow__(self, other, mod=None):
2265 if mod is None:
2266 return I(pow(int(self), int(other)))
2267 else:
2268 return I(pow(int(self), int(other), int(mod)))
2269 def __rpow__(self, other, mod=None):
2270 if mod is None:
2271 return I(pow(int(other), int(self), mod))
2272 else:
2273 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002274
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002275 vereq(`I(1) + I(2)`, "I(3)")
2276 vereq(`I(1) + 2`, "I(3)")
2277 vereq(`1 + I(2)`, "I(3)")
2278 vereq(`I(2) ** I(3)`, "I(8)")
2279 vereq(`2 ** I(3)`, "I(8)")
2280 vereq(`I(2) ** 3`, "I(8)")
2281 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2282 class S(str):
2283 def __eq__(self, other):
2284 return self.lower() == other.lower()
2285
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002286def subclasspropagation():
2287 if verbose: print "Testing propagation of slot functions to subclasses..."
2288 class A(object):
2289 pass
2290 class B(A):
2291 pass
2292 class C(A):
2293 pass
2294 class D(B, C):
2295 pass
2296 d = D()
2297 vereq(hash(d), id(d))
2298 A.__hash__ = lambda self: 42
2299 vereq(hash(d), 42)
2300 C.__hash__ = lambda self: 314
2301 vereq(hash(d), 314)
2302 B.__hash__ = lambda self: 144
2303 vereq(hash(d), 144)
2304 D.__hash__ = lambda self: 100
2305 vereq(hash(d), 100)
2306 del D.__hash__
2307 vereq(hash(d), 144)
2308 del B.__hash__
2309 vereq(hash(d), 314)
2310 del C.__hash__
2311 vereq(hash(d), 42)
2312 del A.__hash__
2313 vereq(hash(d), id(d))
2314 d.foo = 42
2315 d.bar = 42
2316 vereq(d.foo, 42)
2317 vereq(d.bar, 42)
2318 def __getattribute__(self, name):
2319 if name == "foo":
2320 return 24
2321 return object.__getattribute__(self, name)
2322 A.__getattribute__ = __getattribute__
2323 vereq(d.foo, 24)
2324 vereq(d.bar, 42)
2325 def __getattr__(self, name):
2326 if name in ("spam", "foo", "bar"):
2327 return "hello"
2328 raise AttributeError, name
2329 B.__getattr__ = __getattr__
2330 vereq(d.spam, "hello")
2331 vereq(d.foo, 24)
2332 vereq(d.bar, 42)
2333 del A.__getattribute__
2334 vereq(d.foo, 42)
2335 del d.foo
2336 vereq(d.foo, "hello")
2337 vereq(d.bar, 42)
2338 del B.__getattr__
2339 try:
2340 d.foo
2341 except AttributeError:
2342 pass
2343 else:
2344 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002345
2346def buffer_inherit():
2347 import binascii
2348 # SF bug [#470040] ParseTuple t# vs subclasses.
2349 if verbose:
2350 print "Testing that buffer interface is inherited ..."
2351
2352 class MyStr(str):
2353 pass
2354 base = 'abc'
2355 m = MyStr(base)
2356 # b2a_hex uses the buffer interface to get its argument's value, via
2357 # PyArg_ParseTuple 't#' code.
2358 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2359
2360 # It's not clear that unicode will continue to support the character
2361 # buffer interface, and this test will fail if that's taken away.
2362 class MyUni(unicode):
2363 pass
2364 base = u'abc'
2365 m = MyUni(base)
2366 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2367
2368 class MyInt(int):
2369 pass
2370 m = MyInt(42)
2371 try:
2372 binascii.b2a_hex(m)
2373 raise TestFailed('subclass of int should not have a buffer interface')
2374 except TypeError:
2375 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002376
Tim Petersc9933152001-10-16 20:18:24 +00002377def str_of_str_subclass():
2378 import binascii
2379 import cStringIO
2380
2381 if verbose:
2382 print "Testing __str__ defined in subclass of str ..."
2383
2384 class octetstring(str):
2385 def __str__(self):
2386 return binascii.b2a_hex(self)
2387 def __repr__(self):
2388 return self + " repr"
2389
2390 o = octetstring('A')
2391 vereq(type(o), octetstring)
2392 vereq(type(str(o)), str)
2393 vereq(type(repr(o)), str)
2394 vereq(ord(o), 0x41)
2395 vereq(str(o), '41')
2396 vereq(repr(o), 'A repr')
2397 vereq(o.__str__(), '41')
2398 vereq(o.__repr__(), 'A repr')
2399
2400 capture = cStringIO.StringIO()
2401 # Calling str() or not exercises different internal paths.
2402 print >> capture, o
2403 print >> capture, str(o)
2404 vereq(capture.getvalue(), '41\n41\n')
2405 capture.close()
2406
Guido van Rossumc8e56452001-10-22 00:43:43 +00002407def kwdargs():
2408 if verbose: print "Testing keyword arguments to __init__, __call__..."
2409 def f(a): return a
2410 vereq(f.__call__(a=42), 42)
2411 a = []
2412 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002413 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002414
Guido van Rossumed87ad82001-10-30 02:33:02 +00002415def delhook():
2416 if verbose: print "Testing __del__ hook..."
2417 log = []
2418 class C(object):
2419 def __del__(self):
2420 log.append(1)
2421 c = C()
2422 vereq(log, [])
2423 del c
2424 vereq(log, [1])
2425
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002426def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002427 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002428 lists()
2429 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002430 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002431 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002432 ints()
2433 longs()
2434 floats()
2435 complexes()
2436 spamlists()
2437 spamdicts()
2438 pydicts()
2439 pylists()
2440 metaclass()
2441 pymods()
2442 multi()
2443 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002444 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002445 slots()
2446 dynamics()
2447 errors()
2448 classmethods()
2449 staticmethods()
2450 classic()
2451 compattr()
2452 newslot()
2453 altmro()
2454 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002455 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002456 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002457 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002458 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002459 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002460 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002461 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002462 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002463 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002464 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002465 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002466 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002467 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002468 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002469 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002470 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002471 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002472 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002473 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002474 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002475 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002476 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002477 delhook()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002478 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002479
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002480if __name__ == "__main__":
2481 test_main()