blob: 946a529221eef4af1cd74fa3717e5b08df6430ac [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
Neal Norwitz1a997502003-01-13 20:13:12 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
16 if verbose: print "checking", expr
17 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
29 if verbose: print "checking", expr
30 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
32 # XXX Hack so this passes before 2.3 when -Qnew is specified.
33 if meth == "__div__" and 1/2 == 0.5:
34 meth = "__truediv__"
35
Guido van Rossum45704552001-10-08 16:35:45 +000036 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 t = type(a)
38 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000039 while meth not in t.__dict__:
40 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000041 vereq(m, t.__dict__[meth])
42 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045
46def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
47 if verbose: print "checking", expr
48 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000049 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 t = type(a)
51 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000052 while meth not in t.__dict__:
53 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000054 vereq(m, t.__dict__[meth])
55 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000056 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058
59def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
60 if verbose: print "checking", stmt
61 dict = {'a': deepcopy(a), 'b': b}
62 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 t = type(a)
65 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000066 while meth not in t.__dict__:
67 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000068 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000069 dict['a'] = deepcopy(a)
70 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict['a'] = deepcopy(a)
73 bm = getattr(dict['a'], meth)
74 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076
77def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
78 if verbose: print "checking", stmt
79 dict = {'a': deepcopy(a), 'b': b, 'c': c}
80 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000081 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 t = type(a)
83 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000084 while meth not in t.__dict__:
85 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 dict['a'] = deepcopy(a)
88 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict['a'] = deepcopy(a)
91 bm = getattr(dict['a'], meth)
92 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094
95def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
96 if verbose: print "checking", stmt
97 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
98 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000099 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000101 while meth not in t.__dict__:
102 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105 dict['a'] = deepcopy(a)
106 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108 dict['a'] = deepcopy(a)
109 bm = getattr(dict['a'], meth)
110 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000111 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000112
Tim Peters2f93e282001-10-04 05:27:00 +0000113def class_docstrings():
114 class Classic:
115 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000116 vereq(Classic.__doc__, "A classic docstring.")
117 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000118
119 class Classic2:
120 pass
121 verify(Classic2.__doc__ is None)
122
Tim Peters4fb1fe82001-10-04 05:48:13 +0000123 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000124 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000125 vereq(NewStatic.__doc__, "Another docstring.")
126 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 pass
130 verify(NewStatic2.__doc__ is None)
131
Tim Peters4fb1fe82001-10-04 05:48:13 +0000132 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000133 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000134 vereq(NewDynamic.__doc__, "Another docstring.")
135 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000136
Tim Peters4fb1fe82001-10-04 05:48:13 +0000137 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000138 pass
139 verify(NewDynamic2.__doc__ is None)
140
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141def lists():
142 if verbose: print "Testing list operations..."
143 testbinop([1], [2], [1,2], "a+b", "__add__")
144 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
145 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
146 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
147 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
148 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
149 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
150 testunop([1,2,3], 3, "len(a)", "__len__")
151 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
152 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
153 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
154 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
155
156def dicts():
157 if verbose: print "Testing dict operations..."
158 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
159 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
160 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
161 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
162 d = {1:2,3:4}
163 l1 = []
164 for i in d.keys(): l1.append(i)
165 l = []
166 for i in 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 l = []
169 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000171 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000172 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000173 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 d = {1:2, 3:4}
175 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(eval(repr(d), {}), d)
177 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
179
Tim Peters25786c02001-09-02 08:22:48 +0000180def dict_constructor():
181 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 print "Testing dict constructor ..."
183 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000186 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000187 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000188 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000189 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000190 vereq(d, dict(d.iteritems()))
191 d = dict({'one':1, 'two':2})
192 vereq(d, dict(one=1, two=2))
193 vereq(d, dict(**d))
194 vereq(d, dict({"one": 1}, two=2))
195 vereq(d, dict([("two", 2)], one=1))
196 vereq(d, dict([("one", 100), ("two", 200)], **d))
197 verify(d is not dict(**d))
Tim Peters25786c02001-09-02 08:22:48 +0000198 for badarg in 0, 0L, 0j, "0", [0], (0,):
199 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000200 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000201 except TypeError:
202 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000203 except ValueError:
204 if badarg == "0":
205 # It's a sequence, and its elements are also sequences (gotta
206 # love strings <wink>), but they aren't of length 2, so this
207 # one seemed better as a ValueError than a TypeError.
208 pass
209 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000210 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000211 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000212 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000213
214 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000216 except TypeError:
217 pass
218 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000219 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000220
221 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000222 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000223 dict = {1:2, 3:4, 'a':1j}
224
Tim Peters25786c02001-09-02 08:22:48 +0000225 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000226 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000227 except TypeError:
228 pass
229 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000230 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000231
232 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000233 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000234 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000235 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000236
Tim Peters1fc240e2001-10-26 05:06:50 +0000237 # Init from sequence of iterable objects, each producing a 2-sequence.
238 class AddressBookEntry:
239 def __init__(self, first, last):
240 self.first = first
241 self.last = last
242 def __iter__(self):
243 return iter([self.first, self.last])
244
Tim Petersa427a2b2001-10-29 22:25:45 +0000245 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000246 AddressBookEntry('Barry', 'Peters'),
247 AddressBookEntry('Tim', 'Peters'),
248 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000249 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
250
Tim Petersa427a2b2001-10-29 22:25:45 +0000251 d = dict(zip(range(4), range(1, 5)))
252 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000253
254 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000255 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000256 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000257 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000258 except ValueError:
259 pass
260 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000261 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000262
Tim Peters5d2b77c2001-09-03 05:47:38 +0000263def test_dir():
264 if verbose:
265 print "Testing dir() ..."
266 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000267 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000268 del junk
269
270 # Just make sure these don't blow up!
271 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
272 dir(arg)
273
Tim Peters37a309d2001-09-04 01:20:04 +0000274 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275 class C:
276 Cdata = 1
277 def Cmethod(self): pass
278
279 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000281 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000282
283 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000284 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000285
286 c.cdata = 2
287 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000288 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000289 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000290
291 class A(C):
292 Adata = 1
293 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000294
Tim Peters37a309d2001-09-04 01:20:04 +0000295 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000296 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000297 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000298 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000300 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000301 a.adata = 42
302 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000303 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000304
305 # The same, but with new-style classes. Since these have object as a
306 # base class, a lot more gets sucked in.
307 def interesting(strings):
308 return [s for s in strings if not s.startswith('_')]
309
Tim Peters5d2b77c2001-09-03 05:47:38 +0000310 class C(object):
311 Cdata = 1
312 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000313
314 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000315 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000316
317 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000318 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000319 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000320
321 c.cdata = 2
322 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000323 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000324 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000325
Tim Peters5d2b77c2001-09-03 05:47:38 +0000326 class A(C):
327 Adata = 1
328 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000329
330 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000331 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000332 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000333 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000334 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000335 a.adata = 42
336 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000337 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000338 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000339
Tim Peterscaaff8d2001-09-10 23:12:14 +0000340 # Try a module subclass.
341 import sys
342 class M(type(sys)):
343 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000344 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000345 minstance.b = 2
346 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000347 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
348 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000349
350 class M2(M):
351 def getdict(self):
352 return "Not a dict!"
353 __dict__ = property(getdict)
354
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000355 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000356 m2instance.b = 2
357 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000358 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000359 try:
360 dir(m2instance)
361 except TypeError:
362 pass
363
Tim Peters9e6a3992001-10-30 05:45:26 +0000364 # Two essentially featureless objects, just inheriting stuff from
365 # object.
366 vereq(dir(None), dir(Ellipsis))
367
Guido van Rossum44022412002-05-13 18:29:46 +0000368 # Nasty test case for proxied objects
369 class Wrapper(object):
370 def __init__(self, obj):
371 self.__obj = obj
372 def __repr__(self):
373 return "Wrapper(%s)" % repr(self.__obj)
374 def __getitem__(self, key):
375 return Wrapper(self.__obj[key])
376 def __len__(self):
377 return len(self.__obj)
378 def __getattr__(self, name):
379 return Wrapper(getattr(self.__obj, name))
380
381 class C(object):
382 def __getclass(self):
383 return Wrapper(type(self))
384 __class__ = property(__getclass)
385
386 dir(C()) # This used to segfault
387
Tim Peters6d6c1a32001-08-02 04:15:00 +0000388binops = {
389 'add': '+',
390 'sub': '-',
391 'mul': '*',
392 'div': '/',
393 'mod': '%',
394 'divmod': 'divmod',
395 'pow': '**',
396 'lshift': '<<',
397 'rshift': '>>',
398 'and': '&',
399 'xor': '^',
400 'or': '|',
401 'cmp': 'cmp',
402 'lt': '<',
403 'le': '<=',
404 'eq': '==',
405 'ne': '!=',
406 'gt': '>',
407 'ge': '>=',
408 }
409
410for name, expr in binops.items():
411 if expr.islower():
412 expr = expr + "(a, b)"
413 else:
414 expr = 'a %s b' % expr
415 binops[name] = expr
416
417unops = {
418 'pos': '+',
419 'neg': '-',
420 'abs': 'abs',
421 'invert': '~',
422 'int': 'int',
423 'long': 'long',
424 'float': 'float',
425 'oct': 'oct',
426 'hex': 'hex',
427 }
428
429for name, expr in unops.items():
430 if expr.islower():
431 expr = expr + "(a)"
432 else:
433 expr = '%s a' % expr
434 unops[name] = expr
435
436def numops(a, b, skip=[]):
437 dict = {'a': a, 'b': b}
438 for name, expr in binops.items():
439 if name not in skip:
440 name = "__%s__" % name
441 if hasattr(a, name):
442 res = eval(expr, dict)
443 testbinop(a, b, res, expr, name)
444 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000445 if name not in skip:
446 name = "__%s__" % name
447 if hasattr(a, name):
448 res = eval(expr, dict)
449 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450
451def ints():
452 if verbose: print "Testing int operations..."
453 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000454 # The following crashes in Python 2.2
455 vereq((1).__nonzero__(), 1)
456 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000457 # This returns 'NotImplemented' in Python 2.2
458 class C(int):
459 def __add__(self, other):
460 return NotImplemented
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000461 vereq(C(5L), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000462 try:
463 C() + ""
464 except TypeError:
465 pass
466 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000467 raise TestFailed, "NotImplemented should have caused TypeError"
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000468 import sys
469 try:
470 C(sys.maxint+1)
471 except OverflowError:
472 pass
473 else:
474 raise TestFailed, "should have raised OverflowError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475
476def longs():
477 if verbose: print "Testing long operations..."
478 numops(100L, 3L)
479
480def floats():
481 if verbose: print "Testing float operations..."
482 numops(100.0, 3.0)
483
484def complexes():
485 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000486 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000487 class Number(complex):
488 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000489 def __new__(cls, *args, **kwds):
490 result = complex.__new__(cls, *args)
491 result.prec = kwds.get('prec', 12)
492 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493 def __repr__(self):
494 prec = self.prec
495 if self.imag == 0.0:
496 return "%.*g" % (prec, self.real)
497 if self.real == 0.0:
498 return "%.*gj" % (prec, self.imag)
499 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
500 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000501
Tim Peters6d6c1a32001-08-02 04:15:00 +0000502 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000503 vereq(`a`, "3.14")
504 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000505
Tim Peters3f996e72001-09-13 19:18:27 +0000506 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000507 vereq(`a`, "3.1")
508 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000509
510 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000511 vereq(`a`, "234.5")
512 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000513
Tim Peters6d6c1a32001-08-02 04:15:00 +0000514def spamlists():
515 if verbose: print "Testing spamlist operations..."
516 import copy, xxsubtype as spam
517 def spamlist(l, memo=None):
518 import xxsubtype as spam
519 return spam.spamlist(l)
520 # This is an ugly hack:
521 copy._deepcopy_dispatch[spam.spamlist] = spamlist
522
523 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
524 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
525 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
526 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
527 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
528 "a[b:c]", "__getslice__")
529 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
530 "a+=b", "__iadd__")
531 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
532 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
533 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
534 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
535 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
536 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
537 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
538 # Test subclassing
539 class C(spam.spamlist):
540 def foo(self): return 1
541 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000542 vereq(a, [])
543 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000544 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000545 vereq(a, [100])
546 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000548 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549
550def spamdicts():
551 if verbose: print "Testing spamdict operations..."
552 import copy, xxsubtype as spam
553 def spamdict(d, memo=None):
554 import xxsubtype as spam
555 sd = spam.spamdict()
556 for k, v in d.items(): sd[k] = v
557 return sd
558 # This is an ugly hack:
559 copy._deepcopy_dispatch[spam.spamdict] = spamdict
560
561 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
562 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
563 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
564 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
565 d = spamdict({1:2,3:4})
566 l1 = []
567 for i in d.keys(): l1.append(i)
568 l = []
569 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000570 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000571 l = []
572 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000573 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 l = []
575 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000576 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 straightd = {1:2, 3:4}
578 spamd = spamdict(straightd)
579 testunop(spamd, 2, "len(a)", "__len__")
580 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
581 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
582 "a[b]=c", "__setitem__")
583 # Test subclassing
584 class C(spam.spamdict):
585 def foo(self): return 1
586 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000587 vereq(a.items(), [])
588 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a.items(), [('foo', 'bar')])
591 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000594
595def pydicts():
596 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000597 verify(issubclass(dict, dict))
598 verify(isinstance({}, dict))
599 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000600 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000601 verify(d.__class__ is dict)
602 verify(isinstance(d, dict))
603 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604 state = -1
605 def __init__(self, *a, **kw):
606 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000607 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000608 self.state = a[0]
609 if kw:
610 for k, v in kw.items(): self[v] = k
611 def __getitem__(self, key):
612 return self.get(key, 0)
613 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000614 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000615 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000616 def setstate(self, state):
617 self.state = state
618 def getstate(self):
619 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000620 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000622 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000624 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000625 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000626 vereq(a.state, -1)
627 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a.state, 0)
630 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000631 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000632 vereq(a.state, 10)
633 vereq(a.getstate(), 10)
634 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000635 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000636 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637 if verbose: print "pydict stress test ..."
638 N = 50
639 for i in range(N):
640 a[i] = C()
641 for j in range(N):
642 a[i][j] = i*j
643 for i in range(N):
644 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000645 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000646
647def pylists():
648 if verbose: print "Testing Python subclass of list..."
649 class C(list):
650 def __getitem__(self, i):
651 return list.__getitem__(self, i) + 100
652 def __getslice__(self, i, j):
653 return (i, j)
654 a = C()
655 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000656 vereq(a[0], 100)
657 vereq(a[1], 101)
658 vereq(a[2], 102)
659 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000660
661def metaclass():
662 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000663 class C:
664 __metaclass__ = type
665 def __init__(self):
666 self.__state = 0
667 def getstate(self):
668 return self.__state
669 def setstate(self, state):
670 self.__state = state
671 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000672 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 class D:
676 class __metaclass__(type):
677 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000678 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000679 d = D()
680 verify(d.__class__ is D)
681 class M1(type):
682 def __new__(cls, name, bases, dict):
683 dict['__spam__'] = 1
684 return type.__new__(cls, name, bases, dict)
685 class C:
686 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000687 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000688 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000689 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000690
Guido van Rossum309b5662001-08-17 11:43:17 +0000691 class _instance(object):
692 pass
693 class M2(object):
694 def __new__(cls, name, bases, dict):
695 self = object.__new__(cls)
696 self.name = name
697 self.bases = bases
698 self.dict = dict
699 return self
700 __new__ = staticmethod(__new__)
701 def __call__(self):
702 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000703 # Early binding of methods
704 for key in self.dict:
705 if key.startswith("__"):
706 continue
707 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000708 return it
709 class C:
710 __metaclass__ = M2
711 def spam(self):
712 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000713 vereq(C.name, 'C')
714 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000715 verify('spam' in C.dict)
716 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000717 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000718
Guido van Rossum91ee7982001-08-30 20:52:40 +0000719 # More metaclass examples
720
721 class autosuper(type):
722 # Automatically add __super to the class
723 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000724 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000725 cls = super(autosuper, metaclass).__new__(metaclass,
726 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000727 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000728 while name[:1] == "_":
729 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000730 if name:
731 name = "_%s__super" % name
732 else:
733 name = "__super"
734 setattr(cls, name, super(cls))
735 return cls
736 class A:
737 __metaclass__ = autosuper
738 def meth(self):
739 return "A"
740 class B(A):
741 def meth(self):
742 return "B" + self.__super.meth()
743 class C(A):
744 def meth(self):
745 return "C" + self.__super.meth()
746 class D(C, B):
747 def meth(self):
748 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000749 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000750 class E(B, C):
751 def meth(self):
752 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000753 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000754
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000755 class autoproperty(type):
756 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000757 # named _get_x and/or _set_x are found
758 def __new__(metaclass, name, bases, dict):
759 hits = {}
760 for key, val in dict.iteritems():
761 if key.startswith("_get_"):
762 key = key[5:]
763 get, set = hits.get(key, (None, None))
764 get = val
765 hits[key] = get, set
766 elif key.startswith("_set_"):
767 key = key[5:]
768 get, set = hits.get(key, (None, None))
769 set = val
770 hits[key] = get, set
771 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000772 dict[key] = property(get, set)
773 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000774 name, bases, dict)
775 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000776 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000777 def _get_x(self):
778 return -self.__x
779 def _set_x(self, x):
780 self.__x = -x
781 a = A()
782 verify(not hasattr(a, "x"))
783 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000784 vereq(a.x, 12)
785 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000786
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000787 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000788 # Merge of multiple cooperating metaclasses
789 pass
790 class A:
791 __metaclass__ = multimetaclass
792 def _get_x(self):
793 return "A"
794 class B(A):
795 def _get_x(self):
796 return "B" + self.__super._get_x()
797 class C(A):
798 def _get_x(self):
799 return "C" + self.__super._get_x()
800 class D(C, B):
801 def _get_x(self):
802 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000803 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000804
Guido van Rossumf76de622001-10-18 15:49:21 +0000805 # Make sure type(x) doesn't call x.__class__.__init__
806 class T(type):
807 counter = 0
808 def __init__(self, *args):
809 T.counter += 1
810 class C:
811 __metaclass__ = T
812 vereq(T.counter, 1)
813 a = C()
814 vereq(type(a), C)
815 vereq(T.counter, 1)
816
Guido van Rossum29d26062001-12-11 04:37:34 +0000817 class C(object): pass
818 c = C()
819 try: c()
820 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000821 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000822
Tim Peters6d6c1a32001-08-02 04:15:00 +0000823def pymods():
824 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000826 import sys
827 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000829 def __init__(self, name):
830 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000831 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000832 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000833 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 def __setattr__(self, name, value):
835 log.append(("setattr", name, value))
836 MT.__setattr__(self, name, value)
837 def __delattr__(self, name):
838 log.append(("delattr", name))
839 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000840 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841 a.foo = 12
842 x = a.foo
843 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000844 vereq(log, [("setattr", "foo", 12),
845 ("getattr", "foo"),
846 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847
848def multi():
849 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 class C(object):
851 def __init__(self):
852 self.__state = 0
853 def getstate(self):
854 return self.__state
855 def setstate(self, state):
856 self.__state = state
857 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000858 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000860 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000861 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862 def __init__(self):
863 type({}).__init__(self)
864 C.__init__(self)
865 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000866 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000868 vereq(d.items(), [("hello", "world")])
869 vereq(d["hello"], "world")
870 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000871 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000872 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000873 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874
Guido van Rossume45763a2001-08-10 21:28:46 +0000875 # SF bug #442833
876 class Node(object):
877 def __int__(self):
878 return int(self.foo())
879 def foo(self):
880 return "23"
881 class Frag(Node, list):
882 def foo(self):
883 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000884 vereq(Node().__int__(), 23)
885 vereq(int(Node()), 23)
886 vereq(Frag().__int__(), 42)
887 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000888
Tim Petersa91e9642001-11-14 23:32:33 +0000889 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000890
891 class A:
892 x = 1
893
894 class B(A):
895 pass
896
897 class C(A):
898 x = 2
899
900 class D(B, C):
901 pass
902 vereq(D.x, 1)
903
904 # Classic MRO is preserved for a classic base class.
905 class E(D, object):
906 pass
907 vereq(E.__mro__, (E, D, B, A, C, object))
908 vereq(E.x, 1)
909
910 # But with a mix of classic bases, their MROs are combined using
911 # new-style MRO.
912 class F(B, C, object):
913 pass
914 vereq(F.__mro__, (F, B, C, A, object))
915 vereq(F.x, 2)
916
917 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000918 class C:
919 def cmethod(self):
920 return "C a"
921 def all_method(self):
922 return "C b"
923
924 class M1(C, object):
925 def m1method(self):
926 return "M1 a"
927 def all_method(self):
928 return "M1 b"
929
930 vereq(M1.__mro__, (M1, C, object))
931 m = M1()
932 vereq(m.cmethod(), "C a")
933 vereq(m.m1method(), "M1 a")
934 vereq(m.all_method(), "M1 b")
935
936 class D(C):
937 def dmethod(self):
938 return "D a"
939 def all_method(self):
940 return "D b"
941
Guido van Rossum9a818922002-11-14 19:50:14 +0000942 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000943 def m2method(self):
944 return "M2 a"
945 def all_method(self):
946 return "M2 b"
947
Guido van Rossum9a818922002-11-14 19:50:14 +0000948 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000949 m = M2()
950 vereq(m.cmethod(), "C a")
951 vereq(m.dmethod(), "D a")
952 vereq(m.m2method(), "M2 a")
953 vereq(m.all_method(), "M2 b")
954
Guido van Rossum9a818922002-11-14 19:50:14 +0000955 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000956 def m3method(self):
957 return "M3 a"
958 def all_method(self):
959 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000960 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000961 m = M3()
962 vereq(m.cmethod(), "C a")
963 vereq(m.dmethod(), "D a")
964 vereq(m.m1method(), "M1 a")
965 vereq(m.m2method(), "M2 a")
966 vereq(m.m3method(), "M3 a")
967 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000968
Guido van Rossume54616c2001-12-14 04:19:56 +0000969 class Classic:
970 pass
971 try:
972 class New(Classic):
973 __metaclass__ = type
974 except TypeError:
975 pass
976 else:
977 raise TestFailed, "new class with only classic bases - shouldn't be"
978
Tim Peters6d6c1a32001-08-02 04:15:00 +0000979def diamond():
980 if verbose: print "Testing multiple inheritance special cases..."
981 class A(object):
982 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000983 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 class B(A):
985 def boo(self): return "B"
986 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000987 vereq(B().spam(), "B")
988 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989 class C(A):
990 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000991 vereq(C().spam(), "A")
992 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000993 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000994 vereq(D().spam(), "B")
995 vereq(D().boo(), "B")
996 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000998 vereq(E().spam(), "B")
999 vereq(E().boo(), "C")
1000 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +00001001 # MRO order disagreement
1002 try:
1003 class F(D, E): pass
1004 except TypeError:
1005 pass
1006 else:
1007 raise TestFailed, "expected MRO order disagreement (F)"
1008 try:
1009 class G(E, D): pass
1010 except TypeError:
1011 pass
1012 else:
1013 raise TestFailed, "expected MRO order disagreement (G)"
1014
1015
1016# see thread python-dev/2002-October/029035.html
1017def ex5():
1018 if verbose: print "Testing ex5 from C3 switch discussion..."
1019 class A(object): pass
1020 class B(object): pass
1021 class C(object): pass
1022 class X(A): pass
1023 class Y(A): pass
1024 class Z(X,B,Y,C): pass
1025 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1026
1027# see "A Monotonic Superclass Linearization for Dylan",
1028# by Kim Barrett et al. (OOPSLA 1996)
1029def monotonicity():
1030 if verbose: print "Testing MRO monotonicity..."
1031 class Boat(object): pass
1032 class DayBoat(Boat): pass
1033 class WheelBoat(Boat): pass
1034 class EngineLess(DayBoat): pass
1035 class SmallMultihull(DayBoat): pass
1036 class PedalWheelBoat(EngineLess,WheelBoat): pass
1037 class SmallCatamaran(SmallMultihull): pass
1038 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1039
1040 vereq(PedalWheelBoat.__mro__,
1041 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1042 object))
1043 vereq(SmallCatamaran.__mro__,
1044 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1045
1046 vereq(Pedalo.__mro__,
1047 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1048 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1049
1050# see "A Monotonic Superclass Linearization for Dylan",
1051# by Kim Barrett et al. (OOPSLA 1996)
1052def consistency_with_epg():
1053 if verbose: print "Testing consistentcy with EPG..."
1054 class Pane(object): pass
1055 class ScrollingMixin(object): pass
1056 class EditingMixin(object): pass
1057 class ScrollablePane(Pane,ScrollingMixin): pass
1058 class EditablePane(Pane,EditingMixin): pass
1059 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1060
1061 vereq(EditableScrollablePane.__mro__,
1062 (EditableScrollablePane, ScrollablePane, EditablePane,
1063 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001064
Guido van Rossumd32047f2002-11-25 21:38:52 +00001065def mro_disagreement():
1066 if verbose: print "Testing error messages for MRO disagreement..."
1067 def raises(exc, expected, callable, *args):
1068 try:
1069 callable(*args)
1070 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001071 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001072 raise TestFailed, "Message %r, expected %r" % (str(msg),
1073 expected)
1074 else:
1075 raise TestFailed, "Expected %s" % exc
1076 class A(object): pass
1077 class B(A): pass
1078 class C(object): pass
1079 # Test some very simple errors
1080 raises(TypeError, "duplicate base class A",
1081 type, "X", (A, A), {})
Guido van Rossuma01fa262002-11-27 04:00:59 +00001082 raises(TypeError, "MRO conflict among bases ",
Guido van Rossumd32047f2002-11-25 21:38:52 +00001083 type, "X", (A, B), {})
Guido van Rossuma01fa262002-11-27 04:00:59 +00001084 raises(TypeError, "MRO conflict among bases ",
Guido van Rossumd32047f2002-11-25 21:38:52 +00001085 type, "X", (A, C, B), {})
1086 # Test a slightly more complex error
1087 class GridLayout(object): pass
1088 class HorizontalGrid(GridLayout): pass
1089 class VerticalGrid(GridLayout): pass
1090 class HVGrid(HorizontalGrid, VerticalGrid): pass
1091 class VHGrid(VerticalGrid, HorizontalGrid): pass
Guido van Rossuma01fa262002-11-27 04:00:59 +00001092 raises(TypeError, "MRO conflict among bases ",
Guido van Rossumd32047f2002-11-25 21:38:52 +00001093 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1094
Guido van Rossum37202612001-08-09 19:45:21 +00001095def objects():
1096 if verbose: print "Testing object class..."
1097 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001098 vereq(a.__class__, object)
1099 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001100 b = object()
1101 verify(a is not b)
1102 verify(not hasattr(a, "foo"))
1103 try:
1104 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001105 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001106 pass
1107 else:
1108 verify(0, "object() should not allow setting a foo attribute")
1109 verify(not hasattr(object(), "__dict__"))
1110
1111 class Cdict(object):
1112 pass
1113 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001114 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001115 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001116 vereq(x.foo, 1)
1117 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001118
Tim Peters6d6c1a32001-08-02 04:15:00 +00001119def slots():
1120 if verbose: print "Testing __slots__..."
1121 class C0(object):
1122 __slots__ = []
1123 x = C0()
1124 verify(not hasattr(x, "__dict__"))
1125 verify(not hasattr(x, "foo"))
1126
1127 class C1(object):
1128 __slots__ = ['a']
1129 x = C1()
1130 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001131 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001132 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001133 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001134 x.a = None
1135 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001136 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001137 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001138
1139 class C3(object):
1140 __slots__ = ['a', 'b', 'c']
1141 x = C3()
1142 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001143 verify(not hasattr(x, 'a'))
1144 verify(not hasattr(x, 'b'))
1145 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001146 x.a = 1
1147 x.b = 2
1148 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001149 vereq(x.a, 1)
1150 vereq(x.b, 2)
1151 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001152
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001153 class C4(object):
1154 """Validate name mangling"""
1155 __slots__ = ['__a']
1156 def __init__(self, value):
1157 self.__a = value
1158 def get(self):
1159 return self.__a
1160 x = C4(5)
1161 verify(not hasattr(x, '__dict__'))
1162 verify(not hasattr(x, '__a'))
1163 vereq(x.get(), 5)
1164 try:
1165 x.__a = 6
1166 except AttributeError:
1167 pass
1168 else:
1169 raise TestFailed, "Double underscored names not mangled"
1170
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001171 # Make sure slot names are proper identifiers
1172 try:
1173 class C(object):
1174 __slots__ = [None]
1175 except TypeError:
1176 pass
1177 else:
1178 raise TestFailed, "[None] slots not caught"
1179 try:
1180 class C(object):
1181 __slots__ = ["foo bar"]
1182 except TypeError:
1183 pass
1184 else:
1185 raise TestFailed, "['foo bar'] slots not caught"
1186 try:
1187 class C(object):
1188 __slots__ = ["foo\0bar"]
1189 except TypeError:
1190 pass
1191 else:
1192 raise TestFailed, "['foo\\0bar'] slots not caught"
1193 try:
1194 class C(object):
1195 __slots__ = ["1"]
1196 except TypeError:
1197 pass
1198 else:
1199 raise TestFailed, "['1'] slots not caught"
1200 try:
1201 class C(object):
1202 __slots__ = [""]
1203 except TypeError:
1204 pass
1205 else:
1206 raise TestFailed, "[''] slots not caught"
1207 class C(object):
1208 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1209
Guido van Rossum33bab012001-12-05 22:45:48 +00001210 # Test leaks
1211 class Counted(object):
1212 counter = 0 # counts the number of instances alive
1213 def __init__(self):
1214 Counted.counter += 1
1215 def __del__(self):
1216 Counted.counter -= 1
1217 class C(object):
1218 __slots__ = ['a', 'b', 'c']
1219 x = C()
1220 x.a = Counted()
1221 x.b = Counted()
1222 x.c = Counted()
1223 vereq(Counted.counter, 3)
1224 del x
1225 vereq(Counted.counter, 0)
1226 class D(C):
1227 pass
1228 x = D()
1229 x.a = Counted()
1230 x.z = Counted()
1231 vereq(Counted.counter, 2)
1232 del x
1233 vereq(Counted.counter, 0)
1234 class E(D):
1235 __slots__ = ['e']
1236 x = E()
1237 x.a = Counted()
1238 x.z = Counted()
1239 x.e = Counted()
1240 vereq(Counted.counter, 3)
1241 del x
1242 vereq(Counted.counter, 0)
1243
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001244 # Test cyclical leaks [SF bug 519621]
1245 class F(object):
1246 __slots__ = ['a', 'b']
1247 log = []
1248 s = F()
1249 s.a = [Counted(), s]
1250 vereq(Counted.counter, 1)
1251 s = None
1252 import gc
1253 gc.collect()
1254 vereq(Counted.counter, 0)
1255
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001256 # Test lookup leaks [SF bug 572567]
1257 import sys,gc
1258 class G(object):
1259 def __cmp__(self, other):
1260 return 0
1261 g = G()
1262 orig_objects = len(gc.get_objects())
1263 for i in xrange(10):
1264 g==g
1265 new_objects = len(gc.get_objects())
1266 vereq(orig_objects, new_objects)
1267
Guido van Rossum8b056da2002-08-13 18:26:26 +00001268def slotspecials():
1269 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1270
1271 class D(object):
1272 __slots__ = ["__dict__"]
1273 a = D()
1274 verify(hasattr(a, "__dict__"))
1275 verify(not hasattr(a, "__weakref__"))
1276 a.foo = 42
1277 vereq(a.__dict__, {"foo": 42})
1278
1279 class W(object):
1280 __slots__ = ["__weakref__"]
1281 a = W()
1282 verify(hasattr(a, "__weakref__"))
1283 verify(not hasattr(a, "__dict__"))
1284 try:
1285 a.foo = 42
1286 except AttributeError:
1287 pass
1288 else:
1289 raise TestFailed, "shouldn't be allowed to set a.foo"
1290
1291 class C1(W, D):
1292 __slots__ = []
1293 a = C1()
1294 verify(hasattr(a, "__dict__"))
1295 verify(hasattr(a, "__weakref__"))
1296 a.foo = 42
1297 vereq(a.__dict__, {"foo": 42})
1298
1299 class C2(D, W):
1300 __slots__ = []
1301 a = C2()
1302 verify(hasattr(a, "__dict__"))
1303 verify(hasattr(a, "__weakref__"))
1304 a.foo = 42
1305 vereq(a.__dict__, {"foo": 42})
1306
Guido van Rossum9a818922002-11-14 19:50:14 +00001307# MRO order disagreement
1308#
1309# class C3(C1, C2):
1310# __slots__ = []
1311#
1312# class C4(C2, C1):
1313# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001314
Tim Peters6d6c1a32001-08-02 04:15:00 +00001315def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001316 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001317 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001318 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001319 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001320 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001321 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001322 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001323 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001324 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001325 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001326 vereq(E.foo, 1)
1327 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001328 # Test dynamic instances
1329 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001330 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001331 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001332 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001333 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001334 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001335 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001336 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001337 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001338 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001339 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001340 vereq(int(a), 100)
1341 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001342 verify(not hasattr(a, "spam"))
1343 def mygetattr(self, name):
1344 if name == "spam":
1345 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001346 raise AttributeError
1347 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001348 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001349 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001350 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001351 def mysetattr(self, name, value):
1352 if name == "spam":
1353 raise AttributeError
1354 return object.__setattr__(self, name, value)
1355 C.__setattr__ = mysetattr
1356 try:
1357 a.spam = "not spam"
1358 except AttributeError:
1359 pass
1360 else:
1361 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001362 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001363 class D(C):
1364 pass
1365 d = D()
1366 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001367 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001368
Guido van Rossum7e35d572001-09-15 03:14:32 +00001369 # Test handling of int*seq and seq*int
1370 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001371 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001372 vereq("a"*I(2), "aa")
1373 vereq(I(2)*"a", "aa")
1374 vereq(2*I(3), 6)
1375 vereq(I(3)*2, 6)
1376 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001377
1378 # Test handling of long*seq and seq*long
1379 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001380 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001381 vereq("a"*L(2L), "aa")
1382 vereq(L(2L)*"a", "aa")
1383 vereq(2*L(3), 6)
1384 vereq(L(3)*2, 6)
1385 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001386
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001387 # Test comparison of classes with dynamic metaclasses
1388 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001389 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001390 class someclass:
1391 __metaclass__ = dynamicmetaclass
1392 verify(someclass != object)
1393
Tim Peters6d6c1a32001-08-02 04:15:00 +00001394def errors():
1395 if verbose: print "Testing errors..."
1396
1397 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001398 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001399 pass
1400 except TypeError:
1401 pass
1402 else:
1403 verify(0, "inheritance from both list and dict should be illegal")
1404
1405 try:
1406 class C(object, None):
1407 pass
1408 except TypeError:
1409 pass
1410 else:
1411 verify(0, "inheritance from non-type should be illegal")
1412 class Classic:
1413 pass
1414
1415 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001416 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001417 pass
1418 except TypeError:
1419 pass
1420 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001421 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001422
1423 try:
1424 class C(object):
1425 __slots__ = 1
1426 except TypeError:
1427 pass
1428 else:
1429 verify(0, "__slots__ = 1 should be illegal")
1430
1431 try:
1432 class C(object):
1433 __slots__ = [1]
1434 except TypeError:
1435 pass
1436 else:
1437 verify(0, "__slots__ = [1] should be illegal")
1438
1439def classmethods():
1440 if verbose: print "Testing class methods..."
1441 class C(object):
1442 def foo(*a): return a
1443 goo = classmethod(foo)
1444 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001445 vereq(C.goo(1), (C, 1))
1446 vereq(c.goo(1), (C, 1))
1447 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001448 class D(C):
1449 pass
1450 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001451 vereq(D.goo(1), (D, 1))
1452 vereq(d.goo(1), (D, 1))
1453 vereq(d.foo(1), (d, 1))
1454 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001455 # Test for a specific crash (SF bug 528132)
1456 def f(cls, arg): return (cls, arg)
1457 ff = classmethod(f)
1458 vereq(ff.__get__(0, int)(42), (int, 42))
1459 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001460
Guido van Rossum155db9a2002-04-02 17:53:47 +00001461 # Test super() with classmethods (SF bug 535444)
1462 veris(C.goo.im_self, C)
1463 veris(D.goo.im_self, D)
1464 veris(super(D,D).goo.im_self, D)
1465 veris(super(D,d).goo.im_self, D)
1466 vereq(super(D,D).goo(), (D,))
1467 vereq(super(D,d).goo(), (D,))
1468
Fred Drakef841aa62002-03-28 15:49:54 +00001469def classmethods_in_c():
1470 if verbose: print "Testing C-based class methods..."
1471 import xxsubtype as spam
1472 a = (1, 2, 3)
1473 d = {'abc': 123}
1474 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001475 veris(x, spam.spamlist)
1476 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001477 vereq(d, d1)
1478 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001479 veris(x, spam.spamlist)
1480 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001481 vereq(d, d1)
1482
Tim Peters6d6c1a32001-08-02 04:15:00 +00001483def staticmethods():
1484 if verbose: print "Testing static methods..."
1485 class C(object):
1486 def foo(*a): return a
1487 goo = staticmethod(foo)
1488 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001489 vereq(C.goo(1), (1,))
1490 vereq(c.goo(1), (1,))
1491 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001492 class D(C):
1493 pass
1494 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(D.goo(1), (1,))
1496 vereq(d.goo(1), (1,))
1497 vereq(d.foo(1), (d, 1))
1498 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001499
Fred Drakef841aa62002-03-28 15:49:54 +00001500def staticmethods_in_c():
1501 if verbose: print "Testing C-based static methods..."
1502 import xxsubtype as spam
1503 a = (1, 2, 3)
1504 d = {"abc": 123}
1505 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1506 veris(x, None)
1507 vereq(a, a1)
1508 vereq(d, d1)
1509 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1510 veris(x, None)
1511 vereq(a, a1)
1512 vereq(d, d1)
1513
Tim Peters6d6c1a32001-08-02 04:15:00 +00001514def classic():
1515 if verbose: print "Testing classic classes..."
1516 class C:
1517 def foo(*a): return a
1518 goo = classmethod(foo)
1519 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001520 vereq(C.goo(1), (C, 1))
1521 vereq(c.goo(1), (C, 1))
1522 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001523 class D(C):
1524 pass
1525 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001526 vereq(D.goo(1), (D, 1))
1527 vereq(d.goo(1), (D, 1))
1528 vereq(d.foo(1), (d, 1))
1529 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001530 class E: # *not* subclassing from C
1531 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001532 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001533 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001534
1535def compattr():
1536 if verbose: print "Testing computed attributes..."
1537 class C(object):
1538 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001539 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001540 self.__get = get
1541 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001542 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001543 def __get__(self, obj, type=None):
1544 return self.__get(obj)
1545 def __set__(self, obj, value):
1546 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001547 def __delete__(self, obj):
1548 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001549 def __init__(self):
1550 self.__x = 0
1551 def __get_x(self):
1552 x = self.__x
1553 self.__x = x+1
1554 return x
1555 def __set_x(self, x):
1556 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001557 def __delete_x(self):
1558 del self.__x
1559 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001560 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001561 vereq(a.x, 0)
1562 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001563 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001564 vereq(a.x, 10)
1565 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001566 del a.x
1567 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001568
1569def newslot():
1570 if verbose: print "Testing __new__ slot override..."
1571 class C(list):
1572 def __new__(cls):
1573 self = list.__new__(cls)
1574 self.foo = 1
1575 return self
1576 def __init__(self):
1577 self.foo = self.foo + 2
1578 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001579 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001580 verify(a.__class__ is C)
1581 class D(C):
1582 pass
1583 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001584 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001585 verify(b.__class__ is D)
1586
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587def altmro():
1588 if verbose: print "Testing mro() and overriding it..."
1589 class A(object):
1590 def f(self): return "A"
1591 class B(A):
1592 pass
1593 class C(A):
1594 def f(self): return "C"
1595 class D(B, C):
1596 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001597 vereq(D.mro(), [D, B, C, A, object])
1598 vereq(D.__mro__, (D, B, C, A, object))
1599 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001600
Guido van Rossumd3077402001-08-12 05:24:18 +00001601 class PerverseMetaType(type):
1602 def mro(cls):
1603 L = type.mro(cls)
1604 L.reverse()
1605 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001606 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001607 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001608 vereq(X.__mro__, (object, A, C, B, D, X))
1609 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001610
1611def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001612 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001613
1614 class B(object):
1615 "Intermediate class because object doesn't have a __setattr__"
1616
1617 class C(B):
1618
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001619 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001620 if name == "foo":
1621 return ("getattr", name)
1622 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001623 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001624 def __setattr__(self, name, value):
1625 if name == "foo":
1626 self.setattr = (name, value)
1627 else:
1628 return B.__setattr__(self, name, value)
1629 def __delattr__(self, name):
1630 if name == "foo":
1631 self.delattr = name
1632 else:
1633 return B.__delattr__(self, name)
1634
1635 def __getitem__(self, key):
1636 return ("getitem", key)
1637 def __setitem__(self, key, value):
1638 self.setitem = (key, value)
1639 def __delitem__(self, key):
1640 self.delitem = key
1641
1642 def __getslice__(self, i, j):
1643 return ("getslice", i, j)
1644 def __setslice__(self, i, j, value):
1645 self.setslice = (i, j, value)
1646 def __delslice__(self, i, j):
1647 self.delslice = (i, j)
1648
1649 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001650 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001651 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001652 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001653 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001654 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001655
Guido van Rossum45704552001-10-08 16:35:45 +00001656 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001657 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001658 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001659 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001661
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001663 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001664 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001668def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001669 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001670 class C(object):
1671 def __init__(self, x):
1672 self.x = x
1673 def foo(self):
1674 return self.x
1675 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001676 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001677 class D(C):
1678 boo = C.foo
1679 goo = c1.foo
1680 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(d2.foo(), 2)
1682 vereq(d2.boo(), 2)
1683 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001684 class E(object):
1685 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001686 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001687 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001688
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001689def specials():
1690 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001691 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001692 # Test the default behavior for static classes
1693 class C(object):
1694 def __getitem__(self, i):
1695 if 0 <= i < 10: return i
1696 raise IndexError
1697 c1 = C()
1698 c2 = C()
1699 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001700 vereq(hash(c1), id(c1))
1701 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1702 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001703 verify(c1 != c2)
1704 verify(not c1 != c1)
1705 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001706 # Note that the module name appears in str/repr, and that varies
1707 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001708 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001709 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001710 verify(-1 not in c1)
1711 for i in range(10):
1712 verify(i in c1)
1713 verify(10 not in c1)
1714 # Test the default behavior for dynamic classes
1715 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001716 def __getitem__(self, i):
1717 if 0 <= i < 10: return i
1718 raise IndexError
1719 d1 = D()
1720 d2 = D()
1721 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001722 vereq(hash(d1), id(d1))
1723 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1724 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001725 verify(d1 != d2)
1726 verify(not d1 != d1)
1727 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001728 # Note that the module name appears in str/repr, and that varies
1729 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001730 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001731 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001732 verify(-1 not in d1)
1733 for i in range(10):
1734 verify(i in d1)
1735 verify(10 not in d1)
1736 # Test overridden behavior for static classes
1737 class Proxy(object):
1738 def __init__(self, x):
1739 self.x = x
1740 def __nonzero__(self):
1741 return not not self.x
1742 def __hash__(self):
1743 return hash(self.x)
1744 def __eq__(self, other):
1745 return self.x == other
1746 def __ne__(self, other):
1747 return self.x != other
1748 def __cmp__(self, other):
1749 return cmp(self.x, other.x)
1750 def __str__(self):
1751 return "Proxy:%s" % self.x
1752 def __repr__(self):
1753 return "Proxy(%r)" % self.x
1754 def __contains__(self, value):
1755 return value in self.x
1756 p0 = Proxy(0)
1757 p1 = Proxy(1)
1758 p_1 = Proxy(-1)
1759 verify(not p0)
1760 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001761 vereq(hash(p0), hash(0))
1762 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001763 verify(p0 != p1)
1764 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001765 vereq(not p0, p1)
1766 vereq(cmp(p0, p1), -1)
1767 vereq(cmp(p0, p0), 0)
1768 vereq(cmp(p0, p_1), 1)
1769 vereq(str(p0), "Proxy:0")
1770 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001771 p10 = Proxy(range(10))
1772 verify(-1 not in p10)
1773 for i in range(10):
1774 verify(i in p10)
1775 verify(10 not in p10)
1776 # Test overridden behavior for dynamic classes
1777 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001778 def __init__(self, x):
1779 self.x = x
1780 def __nonzero__(self):
1781 return not not self.x
1782 def __hash__(self):
1783 return hash(self.x)
1784 def __eq__(self, other):
1785 return self.x == other
1786 def __ne__(self, other):
1787 return self.x != other
1788 def __cmp__(self, other):
1789 return cmp(self.x, other.x)
1790 def __str__(self):
1791 return "DProxy:%s" % self.x
1792 def __repr__(self):
1793 return "DProxy(%r)" % self.x
1794 def __contains__(self, value):
1795 return value in self.x
1796 p0 = DProxy(0)
1797 p1 = DProxy(1)
1798 p_1 = DProxy(-1)
1799 verify(not p0)
1800 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001801 vereq(hash(p0), hash(0))
1802 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001803 verify(p0 != p1)
1804 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001805 vereq(not p0, p1)
1806 vereq(cmp(p0, p1), -1)
1807 vereq(cmp(p0, p0), 0)
1808 vereq(cmp(p0, p_1), 1)
1809 vereq(str(p0), "DProxy:0")
1810 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001811 p10 = DProxy(range(10))
1812 verify(-1 not in p10)
1813 for i in range(10):
1814 verify(i in p10)
1815 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001816 # Safety test for __cmp__
1817 def unsafecmp(a, b):
1818 try:
1819 a.__class__.__cmp__(a, b)
1820 except TypeError:
1821 pass
1822 else:
1823 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1824 a.__class__, a, b)
1825 unsafecmp(u"123", "123")
1826 unsafecmp("123", u"123")
1827 unsafecmp(1, 1.0)
1828 unsafecmp(1.0, 1)
1829 unsafecmp(1, 1L)
1830 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001831
Neal Norwitz1a997502003-01-13 20:13:12 +00001832 class Letter(str):
1833 def __new__(cls, letter):
1834 if letter == 'EPS':
1835 return str.__new__(cls)
1836 return str.__new__(cls, letter)
1837 def __str__(self):
1838 if not self:
1839 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001840 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001841
1842 # sys.stdout needs to be the original to trigger the recursion bug
1843 import sys
1844 test_stdout = sys.stdout
1845 sys.stdout = get_original_stdout()
1846 try:
1847 # nothing should actually be printed, this should raise an exception
1848 print Letter('w')
1849 except RuntimeError:
1850 pass
1851 else:
1852 raise TestFailed, "expected a RuntimeError for print recursion"
1853 sys.stdout = test_stdout
1854
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001855def weakrefs():
1856 if verbose: print "Testing weak references..."
1857 import weakref
1858 class C(object):
1859 pass
1860 c = C()
1861 r = weakref.ref(c)
1862 verify(r() is c)
1863 del c
1864 verify(r() is None)
1865 del r
1866 class NoWeak(object):
1867 __slots__ = ['foo']
1868 no = NoWeak()
1869 try:
1870 weakref.ref(no)
1871 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001872 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001873 else:
1874 verify(0, "weakref.ref(no) should be illegal")
1875 class Weak(object):
1876 __slots__ = ['foo', '__weakref__']
1877 yes = Weak()
1878 r = weakref.ref(yes)
1879 verify(r() is yes)
1880 del yes
1881 verify(r() is None)
1882 del r
1883
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001884def properties():
1885 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001886 class C(object):
1887 def getx(self):
1888 return self.__x
1889 def setx(self, value):
1890 self.__x = value
1891 def delx(self):
1892 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001893 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001894 a = C()
1895 verify(not hasattr(a, "x"))
1896 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001897 vereq(a._C__x, 42)
1898 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001899 del a.x
1900 verify(not hasattr(a, "x"))
1901 verify(not hasattr(a, "_C__x"))
1902 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001903 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001904 C.x.__delete__(a)
1905 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001906
Tim Peters66c1a522001-09-24 21:17:50 +00001907 raw = C.__dict__['x']
1908 verify(isinstance(raw, property))
1909
1910 attrs = dir(raw)
1911 verify("__doc__" in attrs)
1912 verify("fget" in attrs)
1913 verify("fset" in attrs)
1914 verify("fdel" in attrs)
1915
Guido van Rossum45704552001-10-08 16:35:45 +00001916 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001917 verify(raw.fget is C.__dict__['getx'])
1918 verify(raw.fset is C.__dict__['setx'])
1919 verify(raw.fdel is C.__dict__['delx'])
1920
1921 for attr in "__doc__", "fget", "fset", "fdel":
1922 try:
1923 setattr(raw, attr, 42)
1924 except TypeError, msg:
1925 if str(msg).find('readonly') < 0:
1926 raise TestFailed("when setting readonly attr %r on a "
1927 "property, got unexpected TypeError "
1928 "msg %r" % (attr, str(msg)))
1929 else:
1930 raise TestFailed("expected TypeError from trying to set "
1931 "readonly %r attr on a property" % attr)
1932
Neal Norwitz673cd822002-10-18 16:33:13 +00001933 class D(object):
1934 __getitem__ = property(lambda s: 1/0)
1935
1936 d = D()
1937 try:
1938 for i in d:
1939 str(i)
1940 except ZeroDivisionError:
1941 pass
1942 else:
1943 raise TestFailed, "expected ZeroDivisionError from bad property"
1944
Guido van Rossumc4a18802001-08-24 16:55:27 +00001945def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001946 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001947
1948 class A(object):
1949 def meth(self, a):
1950 return "A(%r)" % a
1951
Guido van Rossum45704552001-10-08 16:35:45 +00001952 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001953
1954 class B(A):
1955 def __init__(self):
1956 self.__super = super(B, self)
1957 def meth(self, a):
1958 return "B(%r)" % a + self.__super.meth(a)
1959
Guido van Rossum45704552001-10-08 16:35:45 +00001960 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001961
1962 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001963 def meth(self, a):
1964 return "C(%r)" % a + self.__super.meth(a)
1965 C._C__super = super(C)
1966
Guido van Rossum45704552001-10-08 16:35:45 +00001967 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001968
1969 class D(C, B):
1970 def meth(self, a):
1971 return "D(%r)" % a + super(D, self).meth(a)
1972
Guido van Rossum5b443c62001-12-03 15:38:28 +00001973 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1974
1975 # Test for subclassing super
1976
1977 class mysuper(super):
1978 def __init__(self, *args):
1979 return super(mysuper, self).__init__(*args)
1980
1981 class E(D):
1982 def meth(self, a):
1983 return "E(%r)" % a + mysuper(E, self).meth(a)
1984
1985 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1986
1987 class F(E):
1988 def meth(self, a):
1989 s = self.__super
1990 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1991 F._F__super = mysuper(F)
1992
1993 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1994
1995 # Make sure certain errors are raised
1996
1997 try:
1998 super(D, 42)
1999 except TypeError:
2000 pass
2001 else:
2002 raise TestFailed, "shouldn't allow super(D, 42)"
2003
2004 try:
2005 super(D, C())
2006 except TypeError:
2007 pass
2008 else:
2009 raise TestFailed, "shouldn't allow super(D, C())"
2010
2011 try:
2012 super(D).__get__(12)
2013 except TypeError:
2014 pass
2015 else:
2016 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2017
2018 try:
2019 super(D).__get__(C())
2020 except TypeError:
2021 pass
2022 else:
2023 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002024
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002025def inherits():
2026 if verbose: print "Testing inheritance from basic types..."
2027
2028 class hexint(int):
2029 def __repr__(self):
2030 return hex(self)
2031 def __add__(self, other):
2032 return hexint(int.__add__(self, other))
2033 # (Note that overriding __radd__ doesn't work,
2034 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002035 vereq(repr(hexint(7) + 9), "0x10")
2036 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002037 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002038 vereq(a, 12345)
2039 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002040 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002041 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002042 verify((+a).__class__ is int)
2043 verify((a >> 0).__class__ is int)
2044 verify((a << 0).__class__ is int)
2045 verify((hexint(0) << 12).__class__ is int)
2046 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002047
2048 class octlong(long):
2049 __slots__ = []
2050 def __str__(self):
2051 s = oct(self)
2052 if s[-1] == 'L':
2053 s = s[:-1]
2054 return s
2055 def __add__(self, other):
2056 return self.__class__(super(octlong, self).__add__(other))
2057 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002058 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002059 # (Note that overriding __radd__ here only seems to work
2060 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002061 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002062 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002063 vereq(a, 12345L)
2064 vereq(long(a), 12345L)
2065 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002066 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002067 verify((+a).__class__ is long)
2068 verify((-a).__class__ is long)
2069 verify((-octlong(0)).__class__ is long)
2070 verify((a >> 0).__class__ is long)
2071 verify((a << 0).__class__ is long)
2072 verify((a - 0).__class__ is long)
2073 verify((a * 1).__class__ is long)
2074 verify((a ** 1).__class__ is long)
2075 verify((a // 1).__class__ is long)
2076 verify((1 * a).__class__ is long)
2077 verify((a | 0).__class__ is long)
2078 verify((a ^ 0).__class__ is long)
2079 verify((a & -1L).__class__ is long)
2080 verify((octlong(0) << 12).__class__ is long)
2081 verify((octlong(0) >> 12).__class__ is long)
2082 verify(abs(octlong(0)).__class__ is long)
2083
2084 # Because octlong overrides __add__, we can't check the absence of +0
2085 # optimizations using octlong.
2086 class longclone(long):
2087 pass
2088 a = longclone(1)
2089 verify((a + 0).__class__ is long)
2090 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002091
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002092 # Check that negative clones don't segfault
2093 a = longclone(-1)
2094 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002095 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002096
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002097 class precfloat(float):
2098 __slots__ = ['prec']
2099 def __init__(self, value=0.0, prec=12):
2100 self.prec = int(prec)
2101 float.__init__(value)
2102 def __repr__(self):
2103 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002104 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002105 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002106 vereq(a, 12345.0)
2107 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002108 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002109 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002110 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002111
Tim Peters2400fa42001-09-12 19:12:49 +00002112 class madcomplex(complex):
2113 def __repr__(self):
2114 return "%.17gj%+.17g" % (self.imag, self.real)
2115 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002116 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002117 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002118 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002119 vereq(a, base)
2120 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002121 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002122 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002123 vereq(repr(a), "4j-3")
2124 vereq(a, base)
2125 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002126 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002127 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002128 veris((+a).__class__, complex)
2129 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002130 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002131 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002132 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002133 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002134 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002135 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002136 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002137
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002138 class madtuple(tuple):
2139 _rev = None
2140 def rev(self):
2141 if self._rev is not None:
2142 return self._rev
2143 L = list(self)
2144 L.reverse()
2145 self._rev = self.__class__(L)
2146 return self._rev
2147 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002148 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2149 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2150 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002151 for i in range(512):
2152 t = madtuple(range(i))
2153 u = t.rev()
2154 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002155 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002156 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002157 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002158 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002159 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002160 verify(a[:].__class__ is tuple)
2161 verify((a * 1).__class__ is tuple)
2162 verify((a * 0).__class__ is tuple)
2163 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002164 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002165 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002166 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002167 verify((a + a).__class__ is tuple)
2168 verify((a * 0).__class__ is tuple)
2169 verify((a * 1).__class__ is tuple)
2170 verify((a * 2).__class__ is tuple)
2171 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002172
2173 class madstring(str):
2174 _rev = None
2175 def rev(self):
2176 if self._rev is not None:
2177 return self._rev
2178 L = list(self)
2179 L.reverse()
2180 self._rev = self.__class__("".join(L))
2181 return self._rev
2182 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2184 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2185 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002186 for i in range(256):
2187 s = madstring("".join(map(chr, range(i))))
2188 t = s.rev()
2189 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002190 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002191 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002192 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002193 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002194
Tim Peters8fa5dd02001-09-12 02:18:30 +00002195 base = "\x00" * 5
2196 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002197 vereq(s, base)
2198 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002199 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq(hash(s), hash(base))
2201 vereq({s: 1}[base], 1)
2202 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002203 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002204 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002205 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002206 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002207 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002208 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002209 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002210 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002211 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002212 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002213 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002215 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002216 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002217 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002218 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002219 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002220 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002221 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002222 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002223 identitytab = ''.join([chr(i) for i in range(256)])
2224 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002225 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002226 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002227 vereq(s.translate(identitytab, "x"), base)
2228 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002229 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002230 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002231 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002232 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002233 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002235 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002236 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002237 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002238 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002239
Tim Peters111f6092001-09-12 07:54:51 +00002240 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002241 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002242 verify(intern(s).__class__ is str)
2243 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002244 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002245
2246 i = intern("y x")
2247 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002249 verify(intern(s).__class__ is str)
2250 verify(intern(s) is i)
2251
2252 s = madstring(i)
2253 verify(intern(s).__class__ is str)
2254 verify(intern(s) is i)
2255
Guido van Rossum91ee7982001-08-30 20:52:40 +00002256 class madunicode(unicode):
2257 _rev = None
2258 def rev(self):
2259 if self._rev is not None:
2260 return self._rev
2261 L = list(self)
2262 L.reverse()
2263 self._rev = self.__class__(u"".join(L))
2264 return self._rev
2265 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(u, u"ABCDEF")
2267 vereq(u.rev(), madunicode(u"FEDCBA"))
2268 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002269 base = u"12345"
2270 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002272 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002273 vereq(hash(u), hash(base))
2274 vereq({u: 1}[base], 1)
2275 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002276 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002277 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002278 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002279 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002280 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002282 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002284 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002285 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002286 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002288 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002290 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002291 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002292 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002293 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002294 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002295 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002296 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002297 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002298 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002299 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002300 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002301 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002302 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002303 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002304 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002305 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002306 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002307 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002308 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002309 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002310 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002311 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002312 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002313 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002314
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002315 class sublist(list):
2316 pass
2317 a = sublist(range(5))
2318 vereq(a, range(5))
2319 a.append("hello")
2320 vereq(a, range(5) + ["hello"])
2321 a[5] = 5
2322 vereq(a, range(6))
2323 a.extend(range(6, 20))
2324 vereq(a, range(20))
2325 a[-5:] = []
2326 vereq(a, range(15))
2327 del a[10:15]
2328 vereq(len(a), 10)
2329 vereq(a, range(10))
2330 vereq(list(a), range(10))
2331 vereq(a[0], 0)
2332 vereq(a[9], 9)
2333 vereq(a[-10], 0)
2334 vereq(a[-1], 9)
2335 vereq(a[:5], range(5))
2336
Tim Peters59c9a642001-09-13 05:38:56 +00002337 class CountedInput(file):
2338 """Counts lines read by self.readline().
2339
2340 self.lineno is the 0-based ordinal of the last line read, up to
2341 a maximum of one greater than the number of lines in the file.
2342
2343 self.ateof is true if and only if the final "" line has been read,
2344 at which point self.lineno stops incrementing, and further calls
2345 to readline() continue to return "".
2346 """
2347
2348 lineno = 0
2349 ateof = 0
2350 def readline(self):
2351 if self.ateof:
2352 return ""
2353 s = file.readline(self)
2354 # Next line works too.
2355 # s = super(CountedInput, self).readline()
2356 self.lineno += 1
2357 if s == "":
2358 self.ateof = 1
2359 return s
2360
Tim Peters561f8992001-09-13 19:36:36 +00002361 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002362 lines = ['a\n', 'b\n', 'c\n']
2363 try:
2364 f.writelines(lines)
2365 f.close()
2366 f = CountedInput(TESTFN)
2367 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2368 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002369 vereq(expected, got)
2370 vereq(f.lineno, i)
2371 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002372 f.close()
2373 finally:
2374 try:
2375 f.close()
2376 except:
2377 pass
2378 try:
2379 import os
2380 os.unlink(TESTFN)
2381 except:
2382 pass
2383
Tim Peters808b94e2001-09-13 19:33:07 +00002384def keywords():
2385 if verbose:
2386 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002387 vereq(int(x=1), 1)
2388 vereq(float(x=2), 2.0)
2389 vereq(long(x=3), 3L)
2390 vereq(complex(imag=42, real=666), complex(666, 42))
2391 vereq(str(object=500), '500')
2392 vereq(unicode(string='abc', errors='strict'), u'abc')
2393 vereq(tuple(sequence=range(3)), (0, 1, 2))
2394 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002395 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002396
2397 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002398 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002399 try:
2400 constructor(bogus_keyword_arg=1)
2401 except TypeError:
2402 pass
2403 else:
2404 raise TestFailed("expected TypeError from bogus keyword "
2405 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002406
Tim Peters8fa45672001-09-13 21:01:29 +00002407def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002408 # XXX This test is disabled because rexec is not deemed safe
2409 return
Tim Peters8fa45672001-09-13 21:01:29 +00002410 import rexec
2411 if verbose:
2412 print "Testing interaction with restricted execution ..."
2413
2414 sandbox = rexec.RExec()
2415
2416 code1 = """f = open(%r, 'w')""" % TESTFN
2417 code2 = """f = file(%r, 'w')""" % TESTFN
2418 code3 = """\
2419f = open(%r)
2420t = type(f) # a sneaky way to get the file() constructor
2421f.close()
2422f = t(%r, 'w') # rexec can't catch this by itself
2423""" % (TESTFN, TESTFN)
2424
2425 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2426 f.close()
2427
2428 try:
2429 for code in code1, code2, code3:
2430 try:
2431 sandbox.r_exec(code)
2432 except IOError, msg:
2433 if str(msg).find("restricted") >= 0:
2434 outcome = "OK"
2435 else:
2436 outcome = "got an exception, but not an expected one"
2437 else:
2438 outcome = "expected a restricted-execution exception"
2439
2440 if outcome != "OK":
2441 raise TestFailed("%s, in %r" % (outcome, code))
2442
2443 finally:
2444 try:
2445 import os
2446 os.unlink(TESTFN)
2447 except:
2448 pass
2449
Tim Peters0ab085c2001-09-14 00:25:33 +00002450def str_subclass_as_dict_key():
2451 if verbose:
2452 print "Testing a str subclass used as dict key .."
2453
2454 class cistr(str):
2455 """Sublcass of str that computes __eq__ case-insensitively.
2456
2457 Also computes a hash code of the string in canonical form.
2458 """
2459
2460 def __init__(self, value):
2461 self.canonical = value.lower()
2462 self.hashcode = hash(self.canonical)
2463
2464 def __eq__(self, other):
2465 if not isinstance(other, cistr):
2466 other = cistr(other)
2467 return self.canonical == other.canonical
2468
2469 def __hash__(self):
2470 return self.hashcode
2471
Guido van Rossum45704552001-10-08 16:35:45 +00002472 vereq(cistr('ABC'), 'abc')
2473 vereq('aBc', cistr('ABC'))
2474 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002475
2476 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002477 vereq(d[cistr('one')], 1)
2478 vereq(d[cistr('tWo')], 2)
2479 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002480 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002481 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002482
Guido van Rossumab3b0342001-09-18 20:38:53 +00002483def classic_comparisons():
2484 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002485 class classic:
2486 pass
2487 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002488 if verbose: print " (base = %s)" % base
2489 class C(base):
2490 def __init__(self, value):
2491 self.value = int(value)
2492 def __cmp__(self, other):
2493 if isinstance(other, C):
2494 return cmp(self.value, other.value)
2495 if isinstance(other, int) or isinstance(other, long):
2496 return cmp(self.value, other)
2497 return NotImplemented
2498 c1 = C(1)
2499 c2 = C(2)
2500 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002501 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002502 c = {1: c1, 2: c2, 3: c3}
2503 for x in 1, 2, 3:
2504 for y in 1, 2, 3:
2505 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2506 for op in "<", "<=", "==", "!=", ">", ">=":
2507 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2508 "x=%d, y=%d" % (x, y))
2509 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2510 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2511
Guido van Rossum0639f592001-09-18 21:06:04 +00002512def rich_comparisons():
2513 if verbose:
2514 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002515 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002516 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002517 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002518 vereq(z, 1+0j)
2519 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002520 class ZZ(complex):
2521 def __eq__(self, other):
2522 try:
2523 return abs(self - other) <= 1e-6
2524 except:
2525 return NotImplemented
2526 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002527 vereq(zz, 1+0j)
2528 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002529
Guido van Rossum0639f592001-09-18 21:06:04 +00002530 class classic:
2531 pass
2532 for base in (classic, int, object, list):
2533 if verbose: print " (base = %s)" % base
2534 class C(base):
2535 def __init__(self, value):
2536 self.value = int(value)
2537 def __cmp__(self, other):
2538 raise TestFailed, "shouldn't call __cmp__"
2539 def __eq__(self, other):
2540 if isinstance(other, C):
2541 return self.value == other.value
2542 if isinstance(other, int) or isinstance(other, long):
2543 return self.value == other
2544 return NotImplemented
2545 def __ne__(self, other):
2546 if isinstance(other, C):
2547 return self.value != other.value
2548 if isinstance(other, int) or isinstance(other, long):
2549 return self.value != other
2550 return NotImplemented
2551 def __lt__(self, other):
2552 if isinstance(other, C):
2553 return self.value < other.value
2554 if isinstance(other, int) or isinstance(other, long):
2555 return self.value < other
2556 return NotImplemented
2557 def __le__(self, other):
2558 if isinstance(other, C):
2559 return self.value <= other.value
2560 if isinstance(other, int) or isinstance(other, long):
2561 return self.value <= other
2562 return NotImplemented
2563 def __gt__(self, other):
2564 if isinstance(other, C):
2565 return self.value > other.value
2566 if isinstance(other, int) or isinstance(other, long):
2567 return self.value > other
2568 return NotImplemented
2569 def __ge__(self, other):
2570 if isinstance(other, C):
2571 return self.value >= other.value
2572 if isinstance(other, int) or isinstance(other, long):
2573 return self.value >= other
2574 return NotImplemented
2575 c1 = C(1)
2576 c2 = C(2)
2577 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002578 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002579 c = {1: c1, 2: c2, 3: c3}
2580 for x in 1, 2, 3:
2581 for y in 1, 2, 3:
2582 for op in "<", "<=", "==", "!=", ">", ">=":
2583 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2584 "x=%d, y=%d" % (x, y))
2585 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2586 "x=%d, y=%d" % (x, y))
2587 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2588 "x=%d, y=%d" % (x, y))
2589
Guido van Rossum1952e382001-09-19 01:25:16 +00002590def coercions():
2591 if verbose: print "Testing coercions..."
2592 class I(int): pass
2593 coerce(I(0), 0)
2594 coerce(0, I(0))
2595 class L(long): pass
2596 coerce(L(0), 0)
2597 coerce(L(0), 0L)
2598 coerce(0, L(0))
2599 coerce(0L, L(0))
2600 class F(float): pass
2601 coerce(F(0), 0)
2602 coerce(F(0), 0L)
2603 coerce(F(0), 0.)
2604 coerce(0, F(0))
2605 coerce(0L, F(0))
2606 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002607 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002608 coerce(C(0), 0)
2609 coerce(C(0), 0L)
2610 coerce(C(0), 0.)
2611 coerce(C(0), 0j)
2612 coerce(0, C(0))
2613 coerce(0L, C(0))
2614 coerce(0., C(0))
2615 coerce(0j, C(0))
2616
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002617def descrdoc():
2618 if verbose: print "Testing descriptor doc strings..."
2619 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002620 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002621 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002622 check(file.name, "file name") # member descriptor
2623
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002624def setclass():
2625 if verbose: print "Testing __class__ assignment..."
2626 class C(object): pass
2627 class D(object): pass
2628 class E(object): pass
2629 class F(D, E): pass
2630 for cls in C, D, E, F:
2631 for cls2 in C, D, E, F:
2632 x = cls()
2633 x.__class__ = cls2
2634 verify(x.__class__ is cls2)
2635 x.__class__ = cls
2636 verify(x.__class__ is cls)
2637 def cant(x, C):
2638 try:
2639 x.__class__ = C
2640 except TypeError:
2641 pass
2642 else:
2643 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002644 try:
2645 delattr(x, "__class__")
2646 except TypeError:
2647 pass
2648 else:
2649 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002650 cant(C(), list)
2651 cant(list(), C)
2652 cant(C(), 1)
2653 cant(C(), object)
2654 cant(object(), list)
2655 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002656 class Int(int): __slots__ = []
2657 cant(2, Int)
2658 cant(Int(), int)
2659 cant(True, int)
2660 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002661 o = object()
2662 cant(o, type(1))
2663 cant(o, type(None))
2664 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002665
Guido van Rossum6661be32001-10-26 04:26:12 +00002666def setdict():
2667 if verbose: print "Testing __dict__ assignment..."
2668 class C(object): pass
2669 a = C()
2670 a.__dict__ = {'b': 1}
2671 vereq(a.b, 1)
2672 def cant(x, dict):
2673 try:
2674 x.__dict__ = dict
2675 except TypeError:
2676 pass
2677 else:
2678 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2679 cant(a, None)
2680 cant(a, [])
2681 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002682 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002683 # Classes don't allow __dict__ assignment
2684 cant(C, {})
2685
Guido van Rossum3926a632001-09-25 16:25:58 +00002686def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002687 if verbose:
2688 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002689 import pickle, cPickle
2690
2691 def sorteditems(d):
2692 L = d.items()
2693 L.sort()
2694 return L
2695
2696 global C
2697 class C(object):
2698 def __init__(self, a, b):
2699 super(C, self).__init__()
2700 self.a = a
2701 self.b = b
2702 def __repr__(self):
2703 return "C(%r, %r)" % (self.a, self.b)
2704
2705 global C1
2706 class C1(list):
2707 def __new__(cls, a, b):
2708 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002709 def __getnewargs__(self):
2710 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002711 def __init__(self, a, b):
2712 self.a = a
2713 self.b = b
2714 def __repr__(self):
2715 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2716
2717 global C2
2718 class C2(int):
2719 def __new__(cls, a, b, val=0):
2720 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002721 def __getnewargs__(self):
2722 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002723 def __init__(self, a, b, val=0):
2724 self.a = a
2725 self.b = b
2726 def __repr__(self):
2727 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2728
Guido van Rossum90c45142001-11-24 21:07:01 +00002729 global C3
2730 class C3(object):
2731 def __init__(self, foo):
2732 self.foo = foo
2733 def __getstate__(self):
2734 return self.foo
2735 def __setstate__(self, foo):
2736 self.foo = foo
2737
2738 global C4classic, C4
2739 class C4classic: # classic
2740 pass
2741 class C4(C4classic, object): # mixed inheritance
2742 pass
2743
Guido van Rossum3926a632001-09-25 16:25:58 +00002744 for p in pickle, cPickle:
2745 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002746 if verbose:
2747 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002748
2749 for cls in C, C1, C2:
2750 s = p.dumps(cls, bin)
2751 cls2 = p.loads(s)
2752 verify(cls2 is cls)
2753
2754 a = C1(1, 2); a.append(42); a.append(24)
2755 b = C2("hello", "world", 42)
2756 s = p.dumps((a, b), bin)
2757 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002758 vereq(x.__class__, a.__class__)
2759 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2760 vereq(y.__class__, b.__class__)
2761 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2762 vereq(`x`, `a`)
2763 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002764 if verbose:
2765 print "a = x =", a
2766 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002767 # Test for __getstate__ and __setstate__ on new style class
2768 u = C3(42)
2769 s = p.dumps(u, bin)
2770 v = p.loads(s)
2771 veris(u.__class__, v.__class__)
2772 vereq(u.foo, v.foo)
2773 # Test for picklability of hybrid class
2774 u = C4()
2775 u.foo = 42
2776 s = p.dumps(u, bin)
2777 v = p.loads(s)
2778 veris(u.__class__, v.__class__)
2779 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002780
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002781 # Testing copy.deepcopy()
2782 if verbose:
2783 print "deepcopy"
2784 import copy
2785 for cls in C, C1, C2:
2786 cls2 = copy.deepcopy(cls)
2787 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002788
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002789 a = C1(1, 2); a.append(42); a.append(24)
2790 b = C2("hello", "world", 42)
2791 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002792 vereq(x.__class__, a.__class__)
2793 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2794 vereq(y.__class__, b.__class__)
2795 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2796 vereq(`x`, `a`)
2797 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002798 if verbose:
2799 print "a = x =", a
2800 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002801
Guido van Rossum8c842552002-03-14 23:05:54 +00002802def pickleslots():
2803 if verbose: print "Testing pickling of classes with __slots__ ..."
2804 import pickle, cPickle
2805 # Pickling of classes with __slots__ but without __getstate__ should fail
2806 global B, C, D, E
2807 class B(object):
2808 pass
2809 for base in [object, B]:
2810 class C(base):
2811 __slots__ = ['a']
2812 class D(C):
2813 pass
2814 try:
2815 pickle.dumps(C())
2816 except TypeError:
2817 pass
2818 else:
2819 raise TestFailed, "should fail: pickle C instance - %s" % base
2820 try:
2821 cPickle.dumps(C())
2822 except TypeError:
2823 pass
2824 else:
2825 raise TestFailed, "should fail: cPickle C instance - %s" % base
2826 try:
2827 pickle.dumps(C())
2828 except TypeError:
2829 pass
2830 else:
2831 raise TestFailed, "should fail: pickle D instance - %s" % base
2832 try:
2833 cPickle.dumps(D())
2834 except TypeError:
2835 pass
2836 else:
2837 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002838 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002839 class C(base):
2840 __slots__ = ['a']
2841 def __getstate__(self):
2842 try:
2843 d = self.__dict__.copy()
2844 except AttributeError:
2845 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002846 for cls in self.__class__.__mro__:
2847 for sn in cls.__dict__.get('__slots__', ()):
2848 try:
2849 d[sn] = getattr(self, sn)
2850 except AttributeError:
2851 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002852 return d
2853 def __setstate__(self, d):
2854 for k, v in d.items():
2855 setattr(self, k, v)
2856 class D(C):
2857 pass
2858 # Now it should work
2859 x = C()
2860 y = pickle.loads(pickle.dumps(x))
2861 vereq(hasattr(y, 'a'), 0)
2862 y = cPickle.loads(cPickle.dumps(x))
2863 vereq(hasattr(y, 'a'), 0)
2864 x.a = 42
2865 y = pickle.loads(pickle.dumps(x))
2866 vereq(y.a, 42)
2867 y = cPickle.loads(cPickle.dumps(x))
2868 vereq(y.a, 42)
2869 x = D()
2870 x.a = 42
2871 x.b = 100
2872 y = pickle.loads(pickle.dumps(x))
2873 vereq(y.a + y.b, 142)
2874 y = cPickle.loads(cPickle.dumps(x))
2875 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002876 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002877 class E(C):
2878 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002879 x = E()
2880 x.a = 42
2881 x.b = "foo"
2882 y = pickle.loads(pickle.dumps(x))
2883 vereq(y.a, x.a)
2884 vereq(y.b, x.b)
2885 y = cPickle.loads(cPickle.dumps(x))
2886 vereq(y.a, x.a)
2887 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002888
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002889def copies():
2890 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2891 import copy
2892 class C(object):
2893 pass
2894
2895 a = C()
2896 a.foo = 12
2897 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002898 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002899
2900 a.bar = [1,2,3]
2901 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002902 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002903 verify(c.bar is a.bar)
2904
2905 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002906 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002907 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002908 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002909
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002910def binopoverride():
2911 if verbose: print "Testing overrides of binary operations..."
2912 class I(int):
2913 def __repr__(self):
2914 return "I(%r)" % int(self)
2915 def __add__(self, other):
2916 return I(int(self) + int(other))
2917 __radd__ = __add__
2918 def __pow__(self, other, mod=None):
2919 if mod is None:
2920 return I(pow(int(self), int(other)))
2921 else:
2922 return I(pow(int(self), int(other), int(mod)))
2923 def __rpow__(self, other, mod=None):
2924 if mod is None:
2925 return I(pow(int(other), int(self), mod))
2926 else:
2927 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002928
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002929 vereq(`I(1) + I(2)`, "I(3)")
2930 vereq(`I(1) + 2`, "I(3)")
2931 vereq(`1 + I(2)`, "I(3)")
2932 vereq(`I(2) ** I(3)`, "I(8)")
2933 vereq(`2 ** I(3)`, "I(8)")
2934 vereq(`I(2) ** 3`, "I(8)")
2935 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2936 class S(str):
2937 def __eq__(self, other):
2938 return self.lower() == other.lower()
2939
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002940def subclasspropagation():
2941 if verbose: print "Testing propagation of slot functions to subclasses..."
2942 class A(object):
2943 pass
2944 class B(A):
2945 pass
2946 class C(A):
2947 pass
2948 class D(B, C):
2949 pass
2950 d = D()
2951 vereq(hash(d), id(d))
2952 A.__hash__ = lambda self: 42
2953 vereq(hash(d), 42)
2954 C.__hash__ = lambda self: 314
2955 vereq(hash(d), 314)
2956 B.__hash__ = lambda self: 144
2957 vereq(hash(d), 144)
2958 D.__hash__ = lambda self: 100
2959 vereq(hash(d), 100)
2960 del D.__hash__
2961 vereq(hash(d), 144)
2962 del B.__hash__
2963 vereq(hash(d), 314)
2964 del C.__hash__
2965 vereq(hash(d), 42)
2966 del A.__hash__
2967 vereq(hash(d), id(d))
2968 d.foo = 42
2969 d.bar = 42
2970 vereq(d.foo, 42)
2971 vereq(d.bar, 42)
2972 def __getattribute__(self, name):
2973 if name == "foo":
2974 return 24
2975 return object.__getattribute__(self, name)
2976 A.__getattribute__ = __getattribute__
2977 vereq(d.foo, 24)
2978 vereq(d.bar, 42)
2979 def __getattr__(self, name):
2980 if name in ("spam", "foo", "bar"):
2981 return "hello"
2982 raise AttributeError, name
2983 B.__getattr__ = __getattr__
2984 vereq(d.spam, "hello")
2985 vereq(d.foo, 24)
2986 vereq(d.bar, 42)
2987 del A.__getattribute__
2988 vereq(d.foo, 42)
2989 del d.foo
2990 vereq(d.foo, "hello")
2991 vereq(d.bar, 42)
2992 del B.__getattr__
2993 try:
2994 d.foo
2995 except AttributeError:
2996 pass
2997 else:
2998 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002999
Guido van Rossume7f3e242002-06-14 02:35:45 +00003000 # Test a nasty bug in recurse_down_subclasses()
3001 import gc
3002 class A(object):
3003 pass
3004 class B(A):
3005 pass
3006 del B
3007 gc.collect()
3008 A.__setitem__ = lambda *a: None # crash
3009
Tim Petersfc57ccb2001-10-12 02:38:24 +00003010def buffer_inherit():
3011 import binascii
3012 # SF bug [#470040] ParseTuple t# vs subclasses.
3013 if verbose:
3014 print "Testing that buffer interface is inherited ..."
3015
3016 class MyStr(str):
3017 pass
3018 base = 'abc'
3019 m = MyStr(base)
3020 # b2a_hex uses the buffer interface to get its argument's value, via
3021 # PyArg_ParseTuple 't#' code.
3022 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3023
3024 # It's not clear that unicode will continue to support the character
3025 # buffer interface, and this test will fail if that's taken away.
3026 class MyUni(unicode):
3027 pass
3028 base = u'abc'
3029 m = MyUni(base)
3030 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3031
3032 class MyInt(int):
3033 pass
3034 m = MyInt(42)
3035 try:
3036 binascii.b2a_hex(m)
3037 raise TestFailed('subclass of int should not have a buffer interface')
3038 except TypeError:
3039 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003040
Tim Petersc9933152001-10-16 20:18:24 +00003041def str_of_str_subclass():
3042 import binascii
3043 import cStringIO
3044
3045 if verbose:
3046 print "Testing __str__ defined in subclass of str ..."
3047
3048 class octetstring(str):
3049 def __str__(self):
3050 return binascii.b2a_hex(self)
3051 def __repr__(self):
3052 return self + " repr"
3053
3054 o = octetstring('A')
3055 vereq(type(o), octetstring)
3056 vereq(type(str(o)), str)
3057 vereq(type(repr(o)), str)
3058 vereq(ord(o), 0x41)
3059 vereq(str(o), '41')
3060 vereq(repr(o), 'A repr')
3061 vereq(o.__str__(), '41')
3062 vereq(o.__repr__(), 'A repr')
3063
3064 capture = cStringIO.StringIO()
3065 # Calling str() or not exercises different internal paths.
3066 print >> capture, o
3067 print >> capture, str(o)
3068 vereq(capture.getvalue(), '41\n41\n')
3069 capture.close()
3070
Guido van Rossumc8e56452001-10-22 00:43:43 +00003071def kwdargs():
3072 if verbose: print "Testing keyword arguments to __init__, __call__..."
3073 def f(a): return a
3074 vereq(f.__call__(a=42), 42)
3075 a = []
3076 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003077 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003078
Guido van Rossumed87ad82001-10-30 02:33:02 +00003079def delhook():
3080 if verbose: print "Testing __del__ hook..."
3081 log = []
3082 class C(object):
3083 def __del__(self):
3084 log.append(1)
3085 c = C()
3086 vereq(log, [])
3087 del c
3088 vereq(log, [1])
3089
Guido van Rossum29d26062001-12-11 04:37:34 +00003090 class D(object): pass
3091 d = D()
3092 try: del d[0]
3093 except TypeError: pass
3094 else: raise TestFailed, "invalid del() didn't raise TypeError"
3095
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003096def hashinherit():
3097 if verbose: print "Testing hash of mutable subclasses..."
3098
3099 class mydict(dict):
3100 pass
3101 d = mydict()
3102 try:
3103 hash(d)
3104 except TypeError:
3105 pass
3106 else:
3107 raise TestFailed, "hash() of dict subclass should fail"
3108
3109 class mylist(list):
3110 pass
3111 d = mylist()
3112 try:
3113 hash(d)
3114 except TypeError:
3115 pass
3116 else:
3117 raise TestFailed, "hash() of list subclass should fail"
3118
Guido van Rossum29d26062001-12-11 04:37:34 +00003119def strops():
3120 try: 'a' + 5
3121 except TypeError: pass
3122 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3123
3124 try: ''.split('')
3125 except ValueError: pass
3126 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3127
3128 try: ''.join([0])
3129 except TypeError: pass
3130 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3131
3132 try: ''.rindex('5')
3133 except ValueError: pass
3134 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3135
Guido van Rossum29d26062001-12-11 04:37:34 +00003136 try: '%(n)s' % None
3137 except TypeError: pass
3138 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3139
3140 try: '%(n' % {}
3141 except ValueError: pass
3142 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3143
3144 try: '%*s' % ('abc')
3145 except TypeError: pass
3146 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3147
3148 try: '%*.*s' % ('abc', 5)
3149 except TypeError: pass
3150 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3151
3152 try: '%s' % (1, 2)
3153 except TypeError: pass
3154 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3155
3156 try: '%' % None
3157 except ValueError: pass
3158 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3159
3160 vereq('534253'.isdigit(), 1)
3161 vereq('534253x'.isdigit(), 0)
3162 vereq('%c' % 5, '\x05')
3163 vereq('%c' % '5', '5')
3164
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003165def deepcopyrecursive():
3166 if verbose: print "Testing deepcopy of recursive objects..."
3167 class Node:
3168 pass
3169 a = Node()
3170 b = Node()
3171 a.b = b
3172 b.a = a
3173 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003174
Guido van Rossumd7035672002-03-12 20:43:31 +00003175def modules():
3176 if verbose: print "Testing uninitialized module objects..."
3177 from types import ModuleType as M
3178 m = M.__new__(M)
3179 str(m)
3180 vereq(hasattr(m, "__name__"), 0)
3181 vereq(hasattr(m, "__file__"), 0)
3182 vereq(hasattr(m, "foo"), 0)
3183 vereq(m.__dict__, None)
3184 m.foo = 1
3185 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003186
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003187def dictproxyiterkeys():
3188 class C(object):
3189 def meth(self):
3190 pass
3191 if verbose: print "Testing dict-proxy iterkeys..."
3192 keys = [ key for key in C.__dict__.iterkeys() ]
3193 keys.sort()
3194 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3195
3196def dictproxyitervalues():
3197 class C(object):
3198 def meth(self):
3199 pass
3200 if verbose: print "Testing dict-proxy itervalues..."
3201 values = [ values for values in C.__dict__.itervalues() ]
3202 vereq(len(values), 5)
3203
3204def dictproxyiteritems():
3205 class C(object):
3206 def meth(self):
3207 pass
3208 if verbose: print "Testing dict-proxy iteritems..."
3209 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3210 keys.sort()
3211 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3212
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003213def funnynew():
3214 if verbose: print "Testing __new__ returning something unexpected..."
3215 class C(object):
3216 def __new__(cls, arg):
3217 if isinstance(arg, str): return [1, 2, 3]
3218 elif isinstance(arg, int): return object.__new__(D)
3219 else: return object.__new__(cls)
3220 class D(C):
3221 def __init__(self, arg):
3222 self.foo = arg
3223 vereq(C("1"), [1, 2, 3])
3224 vereq(D("1"), [1, 2, 3])
3225 d = D(None)
3226 veris(d.foo, None)
3227 d = C(1)
3228 vereq(isinstance(d, D), True)
3229 vereq(d.foo, 1)
3230 d = D(1)
3231 vereq(isinstance(d, D), True)
3232 vereq(d.foo, 1)
3233
Guido van Rossume8fc6402002-04-16 16:44:51 +00003234def imulbug():
3235 # SF bug 544647
3236 if verbose: print "Testing for __imul__ problems..."
3237 class C(object):
3238 def __imul__(self, other):
3239 return (self, other)
3240 x = C()
3241 y = x
3242 y *= 1.0
3243 vereq(y, (x, 1.0))
3244 y = x
3245 y *= 2
3246 vereq(y, (x, 2))
3247 y = x
3248 y *= 3L
3249 vereq(y, (x, 3L))
3250 y = x
3251 y *= 1L<<100
3252 vereq(y, (x, 1L<<100))
3253 y = x
3254 y *= None
3255 vereq(y, (x, None))
3256 y = x
3257 y *= "foo"
3258 vereq(y, (x, "foo"))
3259
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003260def docdescriptor():
3261 # SF bug 542984
3262 if verbose: print "Testing __doc__ descriptor..."
3263 class DocDescr(object):
3264 def __get__(self, object, otype):
3265 if object:
3266 object = object.__class__.__name__ + ' instance'
3267 if otype:
3268 otype = otype.__name__
3269 return 'object=%s; type=%s' % (object, otype)
3270 class OldClass:
3271 __doc__ = DocDescr()
3272 class NewClass(object):
3273 __doc__ = DocDescr()
3274 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3275 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3276 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3277 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3278
Tim Petersafb2c802002-04-18 18:06:20 +00003279def string_exceptions():
3280 if verbose:
3281 print "Testing string exceptions ..."
3282
3283 # Ensure builtin strings work OK as exceptions.
3284 astring = "An exception string."
3285 try:
3286 raise astring
3287 except astring:
3288 pass
3289 else:
3290 raise TestFailed, "builtin string not usable as exception"
3291
3292 # Ensure string subclass instances do not.
3293 class MyStr(str):
3294 pass
3295
3296 newstring = MyStr("oops -- shouldn't work")
3297 try:
3298 raise newstring
3299 except TypeError:
3300 pass
3301 except:
3302 raise TestFailed, "string subclass allowed as exception"
3303
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003304def copy_setstate():
3305 if verbose:
3306 print "Testing that copy.*copy() correctly uses __setstate__..."
3307 import copy
3308 class C(object):
3309 def __init__(self, foo=None):
3310 self.foo = foo
3311 self.__foo = foo
3312 def setfoo(self, foo=None):
3313 self.foo = foo
3314 def getfoo(self):
3315 return self.__foo
3316 def __getstate__(self):
3317 return [self.foo]
3318 def __setstate__(self, lst):
3319 assert len(lst) == 1
3320 self.__foo = self.foo = lst[0]
3321 a = C(42)
3322 a.setfoo(24)
3323 vereq(a.foo, 24)
3324 vereq(a.getfoo(), 42)
3325 b = copy.copy(a)
3326 vereq(b.foo, 24)
3327 vereq(b.getfoo(), 24)
3328 b = copy.deepcopy(a)
3329 vereq(b.foo, 24)
3330 vereq(b.getfoo(), 24)
3331
Guido van Rossum09638c12002-06-13 19:17:46 +00003332def slices():
3333 if verbose:
3334 print "Testing cases with slices and overridden __getitem__ ..."
3335 # Strings
3336 vereq("hello"[:4], "hell")
3337 vereq("hello"[slice(4)], "hell")
3338 vereq(str.__getitem__("hello", slice(4)), "hell")
3339 class S(str):
3340 def __getitem__(self, x):
3341 return str.__getitem__(self, x)
3342 vereq(S("hello")[:4], "hell")
3343 vereq(S("hello")[slice(4)], "hell")
3344 vereq(S("hello").__getitem__(slice(4)), "hell")
3345 # Tuples
3346 vereq((1,2,3)[:2], (1,2))
3347 vereq((1,2,3)[slice(2)], (1,2))
3348 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3349 class T(tuple):
3350 def __getitem__(self, x):
3351 return tuple.__getitem__(self, x)
3352 vereq(T((1,2,3))[:2], (1,2))
3353 vereq(T((1,2,3))[slice(2)], (1,2))
3354 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3355 # Lists
3356 vereq([1,2,3][:2], [1,2])
3357 vereq([1,2,3][slice(2)], [1,2])
3358 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3359 class L(list):
3360 def __getitem__(self, x):
3361 return list.__getitem__(self, x)
3362 vereq(L([1,2,3])[:2], [1,2])
3363 vereq(L([1,2,3])[slice(2)], [1,2])
3364 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3365 # Now do lists and __setitem__
3366 a = L([1,2,3])
3367 a[slice(1, 3)] = [3,2]
3368 vereq(a, [1,3,2])
3369 a[slice(0, 2, 1)] = [3,1]
3370 vereq(a, [3,1,2])
3371 a.__setitem__(slice(1, 3), [2,1])
3372 vereq(a, [3,2,1])
3373 a.__setitem__(slice(0, 2, 1), [2,3])
3374 vereq(a, [2,3,1])
3375
Tim Peters2484aae2002-07-11 06:56:07 +00003376def subtype_resurrection():
3377 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003378 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003379
3380 class C(object):
3381 container = []
3382
3383 def __del__(self):
3384 # resurrect the instance
3385 C.container.append(self)
3386
3387 c = C()
3388 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003389 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003390 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003391 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003392
3393 # If that didn't blow up, it's also interesting to see whether clearing
3394 # the last container slot works: that will attempt to delete c again,
3395 # which will cause c to get appended back to the container again "during"
3396 # the del.
3397 del C.container[-1]
3398 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003399 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003400
Tim Peters14cb1e12002-07-11 18:26:21 +00003401 # Make c mortal again, so that the test framework with -l doesn't report
3402 # it as a leak.
3403 del C.__del__
3404
Guido van Rossum2d702462002-08-06 21:28:28 +00003405def slottrash():
3406 # Deallocating deeply nested slotted trash caused stack overflows
3407 if verbose:
3408 print "Testing slot trash..."
3409 class trash(object):
3410 __slots__ = ['x']
3411 def __init__(self, x):
3412 self.x = x
3413 o = None
3414 for i in xrange(50000):
3415 o = trash(o)
3416 del o
3417
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003418def slotmultipleinheritance():
3419 # SF bug 575229, multiple inheritance w/ slots dumps core
3420 class A(object):
3421 __slots__=()
3422 class B(object):
3423 pass
3424 class C(A,B) :
3425 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003426 vereq(C.__basicsize__, B.__basicsize__)
3427 verify(hasattr(C, '__dict__'))
3428 verify(hasattr(C, '__weakref__'))
3429 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003430
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003431def testrmul():
3432 # SF patch 592646
3433 if verbose:
3434 print "Testing correct invocation of __rmul__..."
3435 class C(object):
3436 def __mul__(self, other):
3437 return "mul"
3438 def __rmul__(self, other):
3439 return "rmul"
3440 a = C()
3441 vereq(a*2, "mul")
3442 vereq(a*2.2, "mul")
3443 vereq(2*a, "rmul")
3444 vereq(2.2*a, "rmul")
3445
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003446def testipow():
3447 # [SF bug 620179]
3448 if verbose:
3449 print "Testing correct invocation of __ipow__..."
3450 class C(object):
3451 def __ipow__(self, other):
3452 pass
3453 a = C()
3454 a **= 2
3455
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003456def do_this_first():
3457 if verbose:
3458 print "Testing SF bug 551412 ..."
3459 # This dumps core when SF bug 551412 isn't fixed --
3460 # but only when test_descr.py is run separately.
3461 # (That can't be helped -- as soon as PyType_Ready()
3462 # is called for PyLong_Type, the bug is gone.)
3463 class UserLong(object):
3464 def __pow__(self, *args):
3465 pass
3466 try:
3467 pow(0L, UserLong(), 0L)
3468 except:
3469 pass
3470
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003471 if verbose:
3472 print "Testing SF bug 570483..."
3473 # Another segfault only when run early
3474 # (before PyType_Ready(tuple) is called)
3475 type.mro(tuple)
3476
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003477def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003478 if verbose:
3479 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003480 # stuff that should work:
3481 class C(object):
3482 pass
3483 class C2(object):
3484 def __getattribute__(self, attr):
3485 if attr == 'a':
3486 return 2
3487 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003488 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003489 def meth(self):
3490 return 1
3491 class D(C):
3492 pass
3493 class E(D):
3494 pass
3495 d = D()
3496 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003497 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003498 D.__bases__ = (C2,)
3499 vereq(d.meth(), 1)
3500 vereq(e.meth(), 1)
3501 vereq(d.a, 2)
3502 vereq(e.a, 2)
3503 vereq(C2.__subclasses__(), [D])
3504
3505 # stuff that shouldn't:
3506 class L(list):
3507 pass
3508
3509 try:
3510 L.__bases__ = (dict,)
3511 except TypeError:
3512 pass
3513 else:
3514 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3515
3516 try:
3517 list.__bases__ = (dict,)
3518 except TypeError:
3519 pass
3520 else:
3521 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3522
3523 try:
3524 del D.__bases__
3525 except TypeError:
3526 pass
3527 else:
3528 raise TestFailed, "shouldn't be able to delete .__bases__"
3529
3530 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003531 D.__bases__ = ()
3532 except TypeError, msg:
3533 if str(msg) == "a new-style class can't have only classic bases":
3534 raise TestFailed, "wrong error message for .__bases__ = ()"
3535 else:
3536 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3537
3538 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003539 D.__bases__ = (D,)
3540 except TypeError:
3541 pass
3542 else:
3543 # actually, we'll have crashed by here...
3544 raise TestFailed, "shouldn't be able to create inheritance cycles"
3545
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003546 try:
3547 D.__bases__ = (E,)
3548 except TypeError:
3549 pass
3550 else:
3551 raise TestFailed, "shouldn't be able to create inheritance cycles"
3552
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003553 # let's throw a classic class into the mix:
3554 class Classic:
3555 def meth2(self):
3556 return 3
3557
3558 D.__bases__ = (C, Classic)
3559
3560 vereq(d.meth2(), 3)
3561 vereq(e.meth2(), 3)
3562 try:
3563 d.a
3564 except AttributeError:
3565 pass
3566 else:
3567 raise TestFailed, "attribute should have vanished"
3568
3569 try:
3570 D.__bases__ = (Classic,)
3571 except TypeError:
3572 pass
3573 else:
3574 raise TestFailed, "new-style class must have a new-style base"
3575
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003576def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003577 if verbose:
3578 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003579 class WorkOnce(type):
3580 def __new__(self, name, bases, ns):
3581 self.flag = 0
3582 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3583 def mro(self):
3584 if self.flag > 0:
3585 raise RuntimeError, "bozo"
3586 else:
3587 self.flag += 1
3588 return type.mro(self)
3589
3590 class WorkAlways(type):
3591 def mro(self):
3592 # this is here to make sure that .mro()s aren't called
3593 # with an exception set (which was possible at one point).
3594 # An error message will be printed in a debug build.
3595 # What's a good way to test for this?
3596 return type.mro(self)
3597
3598 class C(object):
3599 pass
3600
3601 class C2(object):
3602 pass
3603
3604 class D(C):
3605 pass
3606
3607 class E(D):
3608 pass
3609
3610 class F(D):
3611 __metaclass__ = WorkOnce
3612
3613 class G(D):
3614 __metaclass__ = WorkAlways
3615
3616 # Immediate subclasses have their mro's adjusted in alphabetical
3617 # order, so E's will get adjusted before adjusting F's fails. We
3618 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003619
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003620 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003621 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003622
3623 try:
3624 D.__bases__ = (C2,)
3625 except RuntimeError:
3626 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003627 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003628 else:
3629 raise TestFailed, "exception not propagated"
3630
3631def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003632 if verbose:
3633 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003634 class A(object):
3635 pass
3636
3637 class B(object):
3638 pass
3639
3640 class C(A, B):
3641 pass
3642
3643 class D(A, B):
3644 pass
3645
3646 class E(C, D):
3647 pass
3648
3649 try:
3650 C.__bases__ = (B, A)
3651 except TypeError:
3652 pass
3653 else:
3654 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003655
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003656def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003657 if verbose:
3658 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003659 class C(object):
3660 pass
3661
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003662 # C.__module__ could be 'test_descr' or '__main__'
3663 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003664
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003665 C.__name__ = 'D'
3666 vereq((C.__module__, C.__name__), (mod, 'D'))
3667
3668 C.__name__ = 'D.E'
3669 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003670
Guido van Rossum613f24f2003-01-06 23:00:59 +00003671def subclass_right_op():
3672 if verbose:
3673 print "Testing correct dispatch of subclass overloading __r<op>__..."
3674
3675 # This code tests various cases where right-dispatch of a subclass
3676 # should be preferred over left-dispatch of a base class.
3677
3678 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3679
3680 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003681 def __floordiv__(self, other):
3682 return "B.__floordiv__"
3683 def __rfloordiv__(self, other):
3684 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003685
Guido van Rossumf389c772003-02-27 20:04:19 +00003686 vereq(B(1) // 1, "B.__floordiv__")
3687 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003688
3689 # Case 2: subclass of object; this is just the baseline for case 3
3690
3691 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003692 def __floordiv__(self, other):
3693 return "C.__floordiv__"
3694 def __rfloordiv__(self, other):
3695 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003696
Guido van Rossumf389c772003-02-27 20:04:19 +00003697 vereq(C() // 1, "C.__floordiv__")
3698 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003699
3700 # Case 3: subclass of new-style class; here it gets interesting
3701
3702 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003703 def __floordiv__(self, other):
3704 return "D.__floordiv__"
3705 def __rfloordiv__(self, other):
3706 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003707
Guido van Rossumf389c772003-02-27 20:04:19 +00003708 vereq(D() // C(), "D.__floordiv__")
3709 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003710
3711 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3712
3713 class E(C):
3714 pass
3715
Guido van Rossumf389c772003-02-27 20:04:19 +00003716 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003717
Guido van Rossumf389c772003-02-27 20:04:19 +00003718 vereq(E() // 1, "C.__floordiv__")
3719 vereq(1 // E(), "C.__rfloordiv__")
3720 vereq(E() // C(), "C.__floordiv__")
3721 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003722
Guido van Rossum373c7412003-01-07 13:41:37 +00003723def dict_type_with_metaclass():
3724 if verbose:
3725 print "Testing type of __dict__ when __metaclass__ set..."
3726
3727 class B(object):
3728 pass
3729 class M(type):
3730 pass
3731 class C:
3732 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3733 __metaclass__ = M
3734 veris(type(C.__dict__), type(B.__dict__))
3735
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003736def meth_class_get():
3737 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003738 if verbose:
3739 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003740 # Baseline
3741 arg = [1, 2, 3]
3742 res = {1: None, 2: None, 3: None}
3743 vereq(dict.fromkeys(arg), res)
3744 vereq({}.fromkeys(arg), res)
3745 # Now get the descriptor
3746 descr = dict.__dict__["fromkeys"]
3747 # More baseline using the descriptor directly
3748 vereq(descr.__get__(None, dict)(arg), res)
3749 vereq(descr.__get__({})(arg), res)
3750 # Now check various error cases
3751 try:
3752 descr.__get__(None, None)
3753 except TypeError:
3754 pass
3755 else:
3756 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3757 try:
3758 descr.__get__(42)
3759 except TypeError:
3760 pass
3761 else:
3762 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3763 try:
3764 descr.__get__(None, 42)
3765 except TypeError:
3766 pass
3767 else:
3768 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3769 try:
3770 descr.__get__(None, int)
3771 except TypeError:
3772 pass
3773 else:
3774 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3775
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003776def isinst_isclass():
3777 if verbose:
3778 print "Testing proxy isinstance() and isclass()..."
3779 class Proxy(object):
3780 def __init__(self, obj):
3781 self.__obj = obj
3782 def __getattribute__(self, name):
3783 if name.startswith("_Proxy__"):
3784 return object.__getattribute__(self, name)
3785 else:
3786 return getattr(self.__obj, name)
3787 # Test with a classic class
3788 class C:
3789 pass
3790 a = C()
3791 pa = Proxy(a)
3792 verify(isinstance(a, C)) # Baseline
3793 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003794 # Test with a classic subclass
3795 class D(C):
3796 pass
3797 a = D()
3798 pa = Proxy(a)
3799 verify(isinstance(a, C)) # Baseline
3800 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003801 # Test with a new-style class
3802 class C(object):
3803 pass
3804 a = C()
3805 pa = Proxy(a)
3806 verify(isinstance(a, C)) # Baseline
3807 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003808 # Test with a new-style subclass
3809 class D(C):
3810 pass
3811 a = D()
3812 pa = Proxy(a)
3813 verify(isinstance(a, C)) # Baseline
3814 verify(isinstance(pa, C)) # Test
3815
3816def proxysuper():
3817 if verbose:
3818 print "Testing super() for a proxy object..."
3819 class Proxy(object):
3820 def __init__(self, obj):
3821 self.__obj = obj
3822 def __getattribute__(self, name):
3823 if name.startswith("_Proxy__"):
3824 return object.__getattribute__(self, name)
3825 else:
3826 return getattr(self.__obj, name)
3827
3828 class B(object):
3829 def f(self):
3830 return "B.f"
3831
3832 class C(B):
3833 def f(self):
3834 return super(C, self).f() + "->C.f"
3835
3836 obj = C()
3837 p = Proxy(obj)
3838 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003839
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003840
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003841def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003842 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003843 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003844 lists()
3845 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003846 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003847 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003848 ints()
3849 longs()
3850 floats()
3851 complexes()
3852 spamlists()
3853 spamdicts()
3854 pydicts()
3855 pylists()
3856 metaclass()
3857 pymods()
3858 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00003859 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003860 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00003861 ex5()
3862 monotonicity()
3863 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00003864 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003865 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003866 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003867 dynamics()
3868 errors()
3869 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003870 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003871 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003872 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003873 classic()
3874 compattr()
3875 newslot()
3876 altmro()
3877 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003878 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003879 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003880 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003881 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003882 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003883 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003884 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003885 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003886 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003887 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003888 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003889 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003890 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003891 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003892 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003893 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003894 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003895 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003896 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003897 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003898 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003899 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003900 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003901 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003902 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003903 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003904 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003905 dictproxyiterkeys()
3906 dictproxyitervalues()
3907 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003908 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003909 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003910 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003911 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003912 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003913 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003914 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003915 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003916 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003917 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003918 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003919 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003920 test_mutable_bases()
3921 test_mutable_bases_with_failing_mro()
3922 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003923 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00003924 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00003925 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003926 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003927 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003928 proxysuper()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003929
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003930 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003931
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003932if __name__ == "__main__":
3933 test_main()