blob: 8ef7979241956df6e3f9cc06d82dec8e739d06e7 [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'
1840 return self
1841
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
2838 # Give C a __getstate__ and __setstate__
2839 class C(base):
2840 __slots__ = ['a']
2841 def __getstate__(self):
2842 try:
2843 d = self.__dict__.copy()
2844 except AttributeError:
2845 d = {}
2846 try:
2847 d['a'] = self.a
2848 except AttributeError:
2849 pass
2850 return d
2851 def __setstate__(self, d):
2852 for k, v in d.items():
2853 setattr(self, k, v)
2854 class D(C):
2855 pass
2856 # Now it should work
2857 x = C()
2858 y = pickle.loads(pickle.dumps(x))
2859 vereq(hasattr(y, 'a'), 0)
2860 y = cPickle.loads(cPickle.dumps(x))
2861 vereq(hasattr(y, 'a'), 0)
2862 x.a = 42
2863 y = pickle.loads(pickle.dumps(x))
2864 vereq(y.a, 42)
2865 y = cPickle.loads(cPickle.dumps(x))
2866 vereq(y.a, 42)
2867 x = D()
2868 x.a = 42
2869 x.b = 100
2870 y = pickle.loads(pickle.dumps(x))
2871 vereq(y.a + y.b, 142)
2872 y = cPickle.loads(cPickle.dumps(x))
2873 vereq(y.a + y.b, 142)
2874 # But a subclass that adds a slot should not work
2875 class E(C):
2876 __slots__ = ['b']
2877 try:
2878 pickle.dumps(E())
2879 except TypeError:
2880 pass
2881 else:
2882 raise TestFailed, "should fail: pickle E instance - %s" % base
2883 try:
2884 cPickle.dumps(E())
2885 except TypeError:
2886 pass
2887 else:
2888 raise TestFailed, "should fail: cPickle E instance - %s" % base
2889
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002890def copies():
2891 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2892 import copy
2893 class C(object):
2894 pass
2895
2896 a = C()
2897 a.foo = 12
2898 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002899 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002900
2901 a.bar = [1,2,3]
2902 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002903 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002904 verify(c.bar is a.bar)
2905
2906 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002907 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002908 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002909 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002910
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002911def binopoverride():
2912 if verbose: print "Testing overrides of binary operations..."
2913 class I(int):
2914 def __repr__(self):
2915 return "I(%r)" % int(self)
2916 def __add__(self, other):
2917 return I(int(self) + int(other))
2918 __radd__ = __add__
2919 def __pow__(self, other, mod=None):
2920 if mod is None:
2921 return I(pow(int(self), int(other)))
2922 else:
2923 return I(pow(int(self), int(other), int(mod)))
2924 def __rpow__(self, other, mod=None):
2925 if mod is None:
2926 return I(pow(int(other), int(self), mod))
2927 else:
2928 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002929
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002930 vereq(`I(1) + I(2)`, "I(3)")
2931 vereq(`I(1) + 2`, "I(3)")
2932 vereq(`1 + I(2)`, "I(3)")
2933 vereq(`I(2) ** I(3)`, "I(8)")
2934 vereq(`2 ** I(3)`, "I(8)")
2935 vereq(`I(2) ** 3`, "I(8)")
2936 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2937 class S(str):
2938 def __eq__(self, other):
2939 return self.lower() == other.lower()
2940
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002941def subclasspropagation():
2942 if verbose: print "Testing propagation of slot functions to subclasses..."
2943 class A(object):
2944 pass
2945 class B(A):
2946 pass
2947 class C(A):
2948 pass
2949 class D(B, C):
2950 pass
2951 d = D()
2952 vereq(hash(d), id(d))
2953 A.__hash__ = lambda self: 42
2954 vereq(hash(d), 42)
2955 C.__hash__ = lambda self: 314
2956 vereq(hash(d), 314)
2957 B.__hash__ = lambda self: 144
2958 vereq(hash(d), 144)
2959 D.__hash__ = lambda self: 100
2960 vereq(hash(d), 100)
2961 del D.__hash__
2962 vereq(hash(d), 144)
2963 del B.__hash__
2964 vereq(hash(d), 314)
2965 del C.__hash__
2966 vereq(hash(d), 42)
2967 del A.__hash__
2968 vereq(hash(d), id(d))
2969 d.foo = 42
2970 d.bar = 42
2971 vereq(d.foo, 42)
2972 vereq(d.bar, 42)
2973 def __getattribute__(self, name):
2974 if name == "foo":
2975 return 24
2976 return object.__getattribute__(self, name)
2977 A.__getattribute__ = __getattribute__
2978 vereq(d.foo, 24)
2979 vereq(d.bar, 42)
2980 def __getattr__(self, name):
2981 if name in ("spam", "foo", "bar"):
2982 return "hello"
2983 raise AttributeError, name
2984 B.__getattr__ = __getattr__
2985 vereq(d.spam, "hello")
2986 vereq(d.foo, 24)
2987 vereq(d.bar, 42)
2988 del A.__getattribute__
2989 vereq(d.foo, 42)
2990 del d.foo
2991 vereq(d.foo, "hello")
2992 vereq(d.bar, 42)
2993 del B.__getattr__
2994 try:
2995 d.foo
2996 except AttributeError:
2997 pass
2998 else:
2999 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003000
Guido van Rossume7f3e242002-06-14 02:35:45 +00003001 # Test a nasty bug in recurse_down_subclasses()
3002 import gc
3003 class A(object):
3004 pass
3005 class B(A):
3006 pass
3007 del B
3008 gc.collect()
3009 A.__setitem__ = lambda *a: None # crash
3010
Tim Petersfc57ccb2001-10-12 02:38:24 +00003011def buffer_inherit():
3012 import binascii
3013 # SF bug [#470040] ParseTuple t# vs subclasses.
3014 if verbose:
3015 print "Testing that buffer interface is inherited ..."
3016
3017 class MyStr(str):
3018 pass
3019 base = 'abc'
3020 m = MyStr(base)
3021 # b2a_hex uses the buffer interface to get its argument's value, via
3022 # PyArg_ParseTuple 't#' code.
3023 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3024
3025 # It's not clear that unicode will continue to support the character
3026 # buffer interface, and this test will fail if that's taken away.
3027 class MyUni(unicode):
3028 pass
3029 base = u'abc'
3030 m = MyUni(base)
3031 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3032
3033 class MyInt(int):
3034 pass
3035 m = MyInt(42)
3036 try:
3037 binascii.b2a_hex(m)
3038 raise TestFailed('subclass of int should not have a buffer interface')
3039 except TypeError:
3040 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003041
Tim Petersc9933152001-10-16 20:18:24 +00003042def str_of_str_subclass():
3043 import binascii
3044 import cStringIO
3045
3046 if verbose:
3047 print "Testing __str__ defined in subclass of str ..."
3048
3049 class octetstring(str):
3050 def __str__(self):
3051 return binascii.b2a_hex(self)
3052 def __repr__(self):
3053 return self + " repr"
3054
3055 o = octetstring('A')
3056 vereq(type(o), octetstring)
3057 vereq(type(str(o)), str)
3058 vereq(type(repr(o)), str)
3059 vereq(ord(o), 0x41)
3060 vereq(str(o), '41')
3061 vereq(repr(o), 'A repr')
3062 vereq(o.__str__(), '41')
3063 vereq(o.__repr__(), 'A repr')
3064
3065 capture = cStringIO.StringIO()
3066 # Calling str() or not exercises different internal paths.
3067 print >> capture, o
3068 print >> capture, str(o)
3069 vereq(capture.getvalue(), '41\n41\n')
3070 capture.close()
3071
Guido van Rossumc8e56452001-10-22 00:43:43 +00003072def kwdargs():
3073 if verbose: print "Testing keyword arguments to __init__, __call__..."
3074 def f(a): return a
3075 vereq(f.__call__(a=42), 42)
3076 a = []
3077 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003078 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003079
Guido van Rossumed87ad82001-10-30 02:33:02 +00003080def delhook():
3081 if verbose: print "Testing __del__ hook..."
3082 log = []
3083 class C(object):
3084 def __del__(self):
3085 log.append(1)
3086 c = C()
3087 vereq(log, [])
3088 del c
3089 vereq(log, [1])
3090
Guido van Rossum29d26062001-12-11 04:37:34 +00003091 class D(object): pass
3092 d = D()
3093 try: del d[0]
3094 except TypeError: pass
3095 else: raise TestFailed, "invalid del() didn't raise TypeError"
3096
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003097def hashinherit():
3098 if verbose: print "Testing hash of mutable subclasses..."
3099
3100 class mydict(dict):
3101 pass
3102 d = mydict()
3103 try:
3104 hash(d)
3105 except TypeError:
3106 pass
3107 else:
3108 raise TestFailed, "hash() of dict subclass should fail"
3109
3110 class mylist(list):
3111 pass
3112 d = mylist()
3113 try:
3114 hash(d)
3115 except TypeError:
3116 pass
3117 else:
3118 raise TestFailed, "hash() of list subclass should fail"
3119
Guido van Rossum29d26062001-12-11 04:37:34 +00003120def strops():
3121 try: 'a' + 5
3122 except TypeError: pass
3123 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3124
3125 try: ''.split('')
3126 except ValueError: pass
3127 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3128
3129 try: ''.join([0])
3130 except TypeError: pass
3131 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3132
3133 try: ''.rindex('5')
3134 except ValueError: pass
3135 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3136
Guido van Rossum29d26062001-12-11 04:37:34 +00003137 try: '%(n)s' % None
3138 except TypeError: pass
3139 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3140
3141 try: '%(n' % {}
3142 except ValueError: pass
3143 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3144
3145 try: '%*s' % ('abc')
3146 except TypeError: pass
3147 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3148
3149 try: '%*.*s' % ('abc', 5)
3150 except TypeError: pass
3151 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3152
3153 try: '%s' % (1, 2)
3154 except TypeError: pass
3155 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3156
3157 try: '%' % None
3158 except ValueError: pass
3159 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3160
3161 vereq('534253'.isdigit(), 1)
3162 vereq('534253x'.isdigit(), 0)
3163 vereq('%c' % 5, '\x05')
3164 vereq('%c' % '5', '5')
3165
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003166def deepcopyrecursive():
3167 if verbose: print "Testing deepcopy of recursive objects..."
3168 class Node:
3169 pass
3170 a = Node()
3171 b = Node()
3172 a.b = b
3173 b.a = a
3174 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003175
Guido van Rossumd7035672002-03-12 20:43:31 +00003176def modules():
3177 if verbose: print "Testing uninitialized module objects..."
3178 from types import ModuleType as M
3179 m = M.__new__(M)
3180 str(m)
3181 vereq(hasattr(m, "__name__"), 0)
3182 vereq(hasattr(m, "__file__"), 0)
3183 vereq(hasattr(m, "foo"), 0)
3184 vereq(m.__dict__, None)
3185 m.foo = 1
3186 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003187
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003188def dictproxyiterkeys():
3189 class C(object):
3190 def meth(self):
3191 pass
3192 if verbose: print "Testing dict-proxy iterkeys..."
3193 keys = [ key for key in C.__dict__.iterkeys() ]
3194 keys.sort()
3195 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3196
3197def dictproxyitervalues():
3198 class C(object):
3199 def meth(self):
3200 pass
3201 if verbose: print "Testing dict-proxy itervalues..."
3202 values = [ values for values in C.__dict__.itervalues() ]
3203 vereq(len(values), 5)
3204
3205def dictproxyiteritems():
3206 class C(object):
3207 def meth(self):
3208 pass
3209 if verbose: print "Testing dict-proxy iteritems..."
3210 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3211 keys.sort()
3212 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3213
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003214def funnynew():
3215 if verbose: print "Testing __new__ returning something unexpected..."
3216 class C(object):
3217 def __new__(cls, arg):
3218 if isinstance(arg, str): return [1, 2, 3]
3219 elif isinstance(arg, int): return object.__new__(D)
3220 else: return object.__new__(cls)
3221 class D(C):
3222 def __init__(self, arg):
3223 self.foo = arg
3224 vereq(C("1"), [1, 2, 3])
3225 vereq(D("1"), [1, 2, 3])
3226 d = D(None)
3227 veris(d.foo, None)
3228 d = C(1)
3229 vereq(isinstance(d, D), True)
3230 vereq(d.foo, 1)
3231 d = D(1)
3232 vereq(isinstance(d, D), True)
3233 vereq(d.foo, 1)
3234
Guido van Rossume8fc6402002-04-16 16:44:51 +00003235def imulbug():
3236 # SF bug 544647
3237 if verbose: print "Testing for __imul__ problems..."
3238 class C(object):
3239 def __imul__(self, other):
3240 return (self, other)
3241 x = C()
3242 y = x
3243 y *= 1.0
3244 vereq(y, (x, 1.0))
3245 y = x
3246 y *= 2
3247 vereq(y, (x, 2))
3248 y = x
3249 y *= 3L
3250 vereq(y, (x, 3L))
3251 y = x
3252 y *= 1L<<100
3253 vereq(y, (x, 1L<<100))
3254 y = x
3255 y *= None
3256 vereq(y, (x, None))
3257 y = x
3258 y *= "foo"
3259 vereq(y, (x, "foo"))
3260
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003261def docdescriptor():
3262 # SF bug 542984
3263 if verbose: print "Testing __doc__ descriptor..."
3264 class DocDescr(object):
3265 def __get__(self, object, otype):
3266 if object:
3267 object = object.__class__.__name__ + ' instance'
3268 if otype:
3269 otype = otype.__name__
3270 return 'object=%s; type=%s' % (object, otype)
3271 class OldClass:
3272 __doc__ = DocDescr()
3273 class NewClass(object):
3274 __doc__ = DocDescr()
3275 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3276 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3277 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3278 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3279
Tim Petersafb2c802002-04-18 18:06:20 +00003280def string_exceptions():
3281 if verbose:
3282 print "Testing string exceptions ..."
3283
3284 # Ensure builtin strings work OK as exceptions.
3285 astring = "An exception string."
3286 try:
3287 raise astring
3288 except astring:
3289 pass
3290 else:
3291 raise TestFailed, "builtin string not usable as exception"
3292
3293 # Ensure string subclass instances do not.
3294 class MyStr(str):
3295 pass
3296
3297 newstring = MyStr("oops -- shouldn't work")
3298 try:
3299 raise newstring
3300 except TypeError:
3301 pass
3302 except:
3303 raise TestFailed, "string subclass allowed as exception"
3304
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003305def copy_setstate():
3306 if verbose:
3307 print "Testing that copy.*copy() correctly uses __setstate__..."
3308 import copy
3309 class C(object):
3310 def __init__(self, foo=None):
3311 self.foo = foo
3312 self.__foo = foo
3313 def setfoo(self, foo=None):
3314 self.foo = foo
3315 def getfoo(self):
3316 return self.__foo
3317 def __getstate__(self):
3318 return [self.foo]
3319 def __setstate__(self, lst):
3320 assert len(lst) == 1
3321 self.__foo = self.foo = lst[0]
3322 a = C(42)
3323 a.setfoo(24)
3324 vereq(a.foo, 24)
3325 vereq(a.getfoo(), 42)
3326 b = copy.copy(a)
3327 vereq(b.foo, 24)
3328 vereq(b.getfoo(), 24)
3329 b = copy.deepcopy(a)
3330 vereq(b.foo, 24)
3331 vereq(b.getfoo(), 24)
3332
Guido van Rossum09638c12002-06-13 19:17:46 +00003333def slices():
3334 if verbose:
3335 print "Testing cases with slices and overridden __getitem__ ..."
3336 # Strings
3337 vereq("hello"[:4], "hell")
3338 vereq("hello"[slice(4)], "hell")
3339 vereq(str.__getitem__("hello", slice(4)), "hell")
3340 class S(str):
3341 def __getitem__(self, x):
3342 return str.__getitem__(self, x)
3343 vereq(S("hello")[:4], "hell")
3344 vereq(S("hello")[slice(4)], "hell")
3345 vereq(S("hello").__getitem__(slice(4)), "hell")
3346 # Tuples
3347 vereq((1,2,3)[:2], (1,2))
3348 vereq((1,2,3)[slice(2)], (1,2))
3349 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3350 class T(tuple):
3351 def __getitem__(self, x):
3352 return tuple.__getitem__(self, x)
3353 vereq(T((1,2,3))[:2], (1,2))
3354 vereq(T((1,2,3))[slice(2)], (1,2))
3355 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3356 # Lists
3357 vereq([1,2,3][:2], [1,2])
3358 vereq([1,2,3][slice(2)], [1,2])
3359 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3360 class L(list):
3361 def __getitem__(self, x):
3362 return list.__getitem__(self, x)
3363 vereq(L([1,2,3])[:2], [1,2])
3364 vereq(L([1,2,3])[slice(2)], [1,2])
3365 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3366 # Now do lists and __setitem__
3367 a = L([1,2,3])
3368 a[slice(1, 3)] = [3,2]
3369 vereq(a, [1,3,2])
3370 a[slice(0, 2, 1)] = [3,1]
3371 vereq(a, [3,1,2])
3372 a.__setitem__(slice(1, 3), [2,1])
3373 vereq(a, [3,2,1])
3374 a.__setitem__(slice(0, 2, 1), [2,3])
3375 vereq(a, [2,3,1])
3376
Tim Peters2484aae2002-07-11 06:56:07 +00003377def subtype_resurrection():
3378 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003379 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003380
3381 class C(object):
3382 container = []
3383
3384 def __del__(self):
3385 # resurrect the instance
3386 C.container.append(self)
3387
3388 c = C()
3389 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003390 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003391 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003392 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003393
3394 # If that didn't blow up, it's also interesting to see whether clearing
3395 # the last container slot works: that will attempt to delete c again,
3396 # which will cause c to get appended back to the container again "during"
3397 # the del.
3398 del C.container[-1]
3399 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003400 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003401
Tim Peters14cb1e12002-07-11 18:26:21 +00003402 # Make c mortal again, so that the test framework with -l doesn't report
3403 # it as a leak.
3404 del C.__del__
3405
Guido van Rossum2d702462002-08-06 21:28:28 +00003406def slottrash():
3407 # Deallocating deeply nested slotted trash caused stack overflows
3408 if verbose:
3409 print "Testing slot trash..."
3410 class trash(object):
3411 __slots__ = ['x']
3412 def __init__(self, x):
3413 self.x = x
3414 o = None
3415 for i in xrange(50000):
3416 o = trash(o)
3417 del o
3418
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003419def slotmultipleinheritance():
3420 # SF bug 575229, multiple inheritance w/ slots dumps core
3421 class A(object):
3422 __slots__=()
3423 class B(object):
3424 pass
3425 class C(A,B) :
3426 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003427 vereq(C.__basicsize__, B.__basicsize__)
3428 verify(hasattr(C, '__dict__'))
3429 verify(hasattr(C, '__weakref__'))
3430 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003431
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003432def testrmul():
3433 # SF patch 592646
3434 if verbose:
3435 print "Testing correct invocation of __rmul__..."
3436 class C(object):
3437 def __mul__(self, other):
3438 return "mul"
3439 def __rmul__(self, other):
3440 return "rmul"
3441 a = C()
3442 vereq(a*2, "mul")
3443 vereq(a*2.2, "mul")
3444 vereq(2*a, "rmul")
3445 vereq(2.2*a, "rmul")
3446
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003447def testipow():
3448 # [SF bug 620179]
3449 if verbose:
3450 print "Testing correct invocation of __ipow__..."
3451 class C(object):
3452 def __ipow__(self, other):
3453 pass
3454 a = C()
3455 a **= 2
3456
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003457def do_this_first():
3458 if verbose:
3459 print "Testing SF bug 551412 ..."
3460 # This dumps core when SF bug 551412 isn't fixed --
3461 # but only when test_descr.py is run separately.
3462 # (That can't be helped -- as soon as PyType_Ready()
3463 # is called for PyLong_Type, the bug is gone.)
3464 class UserLong(object):
3465 def __pow__(self, *args):
3466 pass
3467 try:
3468 pow(0L, UserLong(), 0L)
3469 except:
3470 pass
3471
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003472 if verbose:
3473 print "Testing SF bug 570483..."
3474 # Another segfault only when run early
3475 # (before PyType_Ready(tuple) is called)
3476 type.mro(tuple)
3477
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003478def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003479 if verbose:
3480 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003481 # stuff that should work:
3482 class C(object):
3483 pass
3484 class C2(object):
3485 def __getattribute__(self, attr):
3486 if attr == 'a':
3487 return 2
3488 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003489 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003490 def meth(self):
3491 return 1
3492 class D(C):
3493 pass
3494 class E(D):
3495 pass
3496 d = D()
3497 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003498 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003499 D.__bases__ = (C2,)
3500 vereq(d.meth(), 1)
3501 vereq(e.meth(), 1)
3502 vereq(d.a, 2)
3503 vereq(e.a, 2)
3504 vereq(C2.__subclasses__(), [D])
3505
3506 # stuff that shouldn't:
3507 class L(list):
3508 pass
3509
3510 try:
3511 L.__bases__ = (dict,)
3512 except TypeError:
3513 pass
3514 else:
3515 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3516
3517 try:
3518 list.__bases__ = (dict,)
3519 except TypeError:
3520 pass
3521 else:
3522 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3523
3524 try:
3525 del D.__bases__
3526 except TypeError:
3527 pass
3528 else:
3529 raise TestFailed, "shouldn't be able to delete .__bases__"
3530
3531 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003532 D.__bases__ = ()
3533 except TypeError, msg:
3534 if str(msg) == "a new-style class can't have only classic bases":
3535 raise TestFailed, "wrong error message for .__bases__ = ()"
3536 else:
3537 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3538
3539 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003540 D.__bases__ = (D,)
3541 except TypeError:
3542 pass
3543 else:
3544 # actually, we'll have crashed by here...
3545 raise TestFailed, "shouldn't be able to create inheritance cycles"
3546
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003547 try:
3548 D.__bases__ = (E,)
3549 except TypeError:
3550 pass
3551 else:
3552 raise TestFailed, "shouldn't be able to create inheritance cycles"
3553
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003554 # let's throw a classic class into the mix:
3555 class Classic:
3556 def meth2(self):
3557 return 3
3558
3559 D.__bases__ = (C, Classic)
3560
3561 vereq(d.meth2(), 3)
3562 vereq(e.meth2(), 3)
3563 try:
3564 d.a
3565 except AttributeError:
3566 pass
3567 else:
3568 raise TestFailed, "attribute should have vanished"
3569
3570 try:
3571 D.__bases__ = (Classic,)
3572 except TypeError:
3573 pass
3574 else:
3575 raise TestFailed, "new-style class must have a new-style base"
3576
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003577def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003578 if verbose:
3579 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003580 class WorkOnce(type):
3581 def __new__(self, name, bases, ns):
3582 self.flag = 0
3583 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3584 def mro(self):
3585 if self.flag > 0:
3586 raise RuntimeError, "bozo"
3587 else:
3588 self.flag += 1
3589 return type.mro(self)
3590
3591 class WorkAlways(type):
3592 def mro(self):
3593 # this is here to make sure that .mro()s aren't called
3594 # with an exception set (which was possible at one point).
3595 # An error message will be printed in a debug build.
3596 # What's a good way to test for this?
3597 return type.mro(self)
3598
3599 class C(object):
3600 pass
3601
3602 class C2(object):
3603 pass
3604
3605 class D(C):
3606 pass
3607
3608 class E(D):
3609 pass
3610
3611 class F(D):
3612 __metaclass__ = WorkOnce
3613
3614 class G(D):
3615 __metaclass__ = WorkAlways
3616
3617 # Immediate subclasses have their mro's adjusted in alphabetical
3618 # order, so E's will get adjusted before adjusting F's fails. We
3619 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003620
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003621 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003622 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003623
3624 try:
3625 D.__bases__ = (C2,)
3626 except RuntimeError:
3627 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003628 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003629 else:
3630 raise TestFailed, "exception not propagated"
3631
3632def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003633 if verbose:
3634 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003635 class A(object):
3636 pass
3637
3638 class B(object):
3639 pass
3640
3641 class C(A, B):
3642 pass
3643
3644 class D(A, B):
3645 pass
3646
3647 class E(C, D):
3648 pass
3649
3650 try:
3651 C.__bases__ = (B, A)
3652 except TypeError:
3653 pass
3654 else:
3655 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003656
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003657def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003658 if verbose:
3659 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003660 class C(object):
3661 pass
3662
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003663 # C.__module__ could be 'test_descr' or '__main__'
3664 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003665
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003666 C.__name__ = 'D'
3667 vereq((C.__module__, C.__name__), (mod, 'D'))
3668
3669 C.__name__ = 'D.E'
3670 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003671
Guido van Rossum613f24f2003-01-06 23:00:59 +00003672def subclass_right_op():
3673 if verbose:
3674 print "Testing correct dispatch of subclass overloading __r<op>__..."
3675
3676 # This code tests various cases where right-dispatch of a subclass
3677 # should be preferred over left-dispatch of a base class.
3678
3679 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3680
3681 class B(int):
3682 def __div__(self, other):
3683 return "B.__div__"
3684 def __rdiv__(self, other):
3685 return "B.__rdiv__"
3686
3687 vereq(B(1) / 1, "B.__div__")
3688 vereq(1 / B(1), "B.__rdiv__")
3689
3690 # Case 2: subclass of object; this is just the baseline for case 3
3691
3692 class C(object):
3693 def __div__(self, other):
3694 return "C.__div__"
3695 def __rdiv__(self, other):
3696 return "C.__rdiv__"
3697
3698 vereq(C(1) / 1, "C.__div__")
3699 vereq(1 / C(1), "C.__rdiv__")
3700
3701 # Case 3: subclass of new-style class; here it gets interesting
3702
3703 class D(C):
3704 def __div__(self, other):
3705 return "D.__div__"
3706 def __rdiv__(self, other):
3707 return "D.__rdiv__"
3708
3709 vereq(D(1) / C(1), "D.__div__")
3710 vereq(C(1) / D(1), "D.__rdiv__")
3711
3712 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3713
3714 class E(C):
3715 pass
3716
3717 vereq(E.__rdiv__, C.__rdiv__)
3718
3719 vereq(E(1) / 1, "C.__div__")
3720 vereq(1 / E(1), "C.__rdiv__")
3721 vereq(E(1) / C(1), "C.__div__")
3722 vereq(C(1) / E(1), "C.__div__") # This one would fail
3723
Guido van Rossum373c7412003-01-07 13:41:37 +00003724def dict_type_with_metaclass():
3725 if verbose:
3726 print "Testing type of __dict__ when __metaclass__ set..."
3727
3728 class B(object):
3729 pass
3730 class M(type):
3731 pass
3732 class C:
3733 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3734 __metaclass__ = M
3735 veris(type(C.__dict__), type(B.__dict__))
3736
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003737
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003738def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003739 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003740 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003741 lists()
3742 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003743 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003744 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003745 ints()
3746 longs()
3747 floats()
3748 complexes()
3749 spamlists()
3750 spamdicts()
3751 pydicts()
3752 pylists()
3753 metaclass()
3754 pymods()
3755 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00003756 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003757 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00003758 ex5()
3759 monotonicity()
3760 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00003761 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003762 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003763 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003764 dynamics()
3765 errors()
3766 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003767 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003768 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003769 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003770 classic()
3771 compattr()
3772 newslot()
3773 altmro()
3774 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003775 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003776 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003777 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003778 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003779 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003780 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003781 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003782 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003783 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003784 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003785 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003786 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003787 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003788 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003789 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003790 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003791 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003792 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003793 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003794 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003795 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003796 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003797 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003798 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003799 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003800 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003801 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003802 dictproxyiterkeys()
3803 dictproxyitervalues()
3804 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003805 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003806 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003807 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003808 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003809 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003810 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003811 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003812 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003813 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003814 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003815 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003816 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003817 test_mutable_bases()
3818 test_mutable_bases_with_failing_mro()
3819 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003820 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00003821 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00003822 dict_type_with_metaclass()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003823
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003824 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003825
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003826if __name__ == "__main__":
3827 test_main()