blob: 972e22401ae8a58863d2116610e9f06ae53f39ee [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
Raymond Hettingerf394df42003-04-06 19:13:41 +00001065mro_err_msg = """Cannot create a consistent method resolution
1066order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +00001067
Guido van Rossumd32047f2002-11-25 21:38:52 +00001068def mro_disagreement():
1069 if verbose: print "Testing error messages for MRO disagreement..."
1070 def raises(exc, expected, callable, *args):
1071 try:
1072 callable(*args)
1073 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001074 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001075 raise TestFailed, "Message %r, expected %r" % (str(msg),
1076 expected)
1077 else:
1078 raise TestFailed, "Expected %s" % exc
1079 class A(object): pass
1080 class B(A): pass
1081 class C(object): pass
1082 # Test some very simple errors
1083 raises(TypeError, "duplicate base class A",
1084 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001085 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001086 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001087 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001088 type, "X", (A, C, B), {})
1089 # Test a slightly more complex error
1090 class GridLayout(object): pass
1091 class HorizontalGrid(GridLayout): pass
1092 class VerticalGrid(GridLayout): pass
1093 class HVGrid(HorizontalGrid, VerticalGrid): pass
1094 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +00001095 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001096 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1097
Guido van Rossum37202612001-08-09 19:45:21 +00001098def objects():
1099 if verbose: print "Testing object class..."
1100 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001101 vereq(a.__class__, object)
1102 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001103 b = object()
1104 verify(a is not b)
1105 verify(not hasattr(a, "foo"))
1106 try:
1107 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001108 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001109 pass
1110 else:
1111 verify(0, "object() should not allow setting a foo attribute")
1112 verify(not hasattr(object(), "__dict__"))
1113
1114 class Cdict(object):
1115 pass
1116 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001117 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001118 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001119 vereq(x.foo, 1)
1120 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001121
Tim Peters6d6c1a32001-08-02 04:15:00 +00001122def slots():
1123 if verbose: print "Testing __slots__..."
1124 class C0(object):
1125 __slots__ = []
1126 x = C0()
1127 verify(not hasattr(x, "__dict__"))
1128 verify(not hasattr(x, "foo"))
1129
1130 class C1(object):
1131 __slots__ = ['a']
1132 x = C1()
1133 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001134 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001135 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001136 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001137 x.a = None
1138 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001139 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001140 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001141
1142 class C3(object):
1143 __slots__ = ['a', 'b', 'c']
1144 x = C3()
1145 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001146 verify(not hasattr(x, 'a'))
1147 verify(not hasattr(x, 'b'))
1148 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001149 x.a = 1
1150 x.b = 2
1151 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001152 vereq(x.a, 1)
1153 vereq(x.b, 2)
1154 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001156 class C4(object):
1157 """Validate name mangling"""
1158 __slots__ = ['__a']
1159 def __init__(self, value):
1160 self.__a = value
1161 def get(self):
1162 return self.__a
1163 x = C4(5)
1164 verify(not hasattr(x, '__dict__'))
1165 verify(not hasattr(x, '__a'))
1166 vereq(x.get(), 5)
1167 try:
1168 x.__a = 6
1169 except AttributeError:
1170 pass
1171 else:
1172 raise TestFailed, "Double underscored names not mangled"
1173
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001174 # Make sure slot names are proper identifiers
1175 try:
1176 class C(object):
1177 __slots__ = [None]
1178 except TypeError:
1179 pass
1180 else:
1181 raise TestFailed, "[None] slots not caught"
1182 try:
1183 class C(object):
1184 __slots__ = ["foo bar"]
1185 except TypeError:
1186 pass
1187 else:
1188 raise TestFailed, "['foo bar'] slots not caught"
1189 try:
1190 class C(object):
1191 __slots__ = ["foo\0bar"]
1192 except TypeError:
1193 pass
1194 else:
1195 raise TestFailed, "['foo\\0bar'] slots not caught"
1196 try:
1197 class C(object):
1198 __slots__ = ["1"]
1199 except TypeError:
1200 pass
1201 else:
1202 raise TestFailed, "['1'] slots not caught"
1203 try:
1204 class C(object):
1205 __slots__ = [""]
1206 except TypeError:
1207 pass
1208 else:
1209 raise TestFailed, "[''] slots not caught"
1210 class C(object):
1211 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1212
Guido van Rossum33bab012001-12-05 22:45:48 +00001213 # Test leaks
1214 class Counted(object):
1215 counter = 0 # counts the number of instances alive
1216 def __init__(self):
1217 Counted.counter += 1
1218 def __del__(self):
1219 Counted.counter -= 1
1220 class C(object):
1221 __slots__ = ['a', 'b', 'c']
1222 x = C()
1223 x.a = Counted()
1224 x.b = Counted()
1225 x.c = Counted()
1226 vereq(Counted.counter, 3)
1227 del x
1228 vereq(Counted.counter, 0)
1229 class D(C):
1230 pass
1231 x = D()
1232 x.a = Counted()
1233 x.z = Counted()
1234 vereq(Counted.counter, 2)
1235 del x
1236 vereq(Counted.counter, 0)
1237 class E(D):
1238 __slots__ = ['e']
1239 x = E()
1240 x.a = Counted()
1241 x.z = Counted()
1242 x.e = Counted()
1243 vereq(Counted.counter, 3)
1244 del x
1245 vereq(Counted.counter, 0)
1246
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001247 # Test cyclical leaks [SF bug 519621]
1248 class F(object):
1249 __slots__ = ['a', 'b']
1250 log = []
1251 s = F()
1252 s.a = [Counted(), s]
1253 vereq(Counted.counter, 1)
1254 s = None
1255 import gc
1256 gc.collect()
1257 vereq(Counted.counter, 0)
1258
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001259 # Test lookup leaks [SF bug 572567]
1260 import sys,gc
1261 class G(object):
1262 def __cmp__(self, other):
1263 return 0
1264 g = G()
1265 orig_objects = len(gc.get_objects())
1266 for i in xrange(10):
1267 g==g
1268 new_objects = len(gc.get_objects())
1269 vereq(orig_objects, new_objects)
1270
Guido van Rossum8b056da2002-08-13 18:26:26 +00001271def slotspecials():
1272 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1273
1274 class D(object):
1275 __slots__ = ["__dict__"]
1276 a = D()
1277 verify(hasattr(a, "__dict__"))
1278 verify(not hasattr(a, "__weakref__"))
1279 a.foo = 42
1280 vereq(a.__dict__, {"foo": 42})
1281
1282 class W(object):
1283 __slots__ = ["__weakref__"]
1284 a = W()
1285 verify(hasattr(a, "__weakref__"))
1286 verify(not hasattr(a, "__dict__"))
1287 try:
1288 a.foo = 42
1289 except AttributeError:
1290 pass
1291 else:
1292 raise TestFailed, "shouldn't be allowed to set a.foo"
1293
1294 class C1(W, D):
1295 __slots__ = []
1296 a = C1()
1297 verify(hasattr(a, "__dict__"))
1298 verify(hasattr(a, "__weakref__"))
1299 a.foo = 42
1300 vereq(a.__dict__, {"foo": 42})
1301
1302 class C2(D, W):
1303 __slots__ = []
1304 a = C2()
1305 verify(hasattr(a, "__dict__"))
1306 verify(hasattr(a, "__weakref__"))
1307 a.foo = 42
1308 vereq(a.__dict__, {"foo": 42})
1309
Guido van Rossum9a818922002-11-14 19:50:14 +00001310# MRO order disagreement
1311#
1312# class C3(C1, C2):
1313# __slots__ = []
1314#
1315# class C4(C2, C1):
1316# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001317
Tim Peters6d6c1a32001-08-02 04:15:00 +00001318def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001319 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001320 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001321 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001322 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001323 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001324 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001325 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001326 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001327 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001328 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001329 vereq(E.foo, 1)
1330 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001331 # Test dynamic instances
1332 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001333 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001334 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001335 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001336 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001337 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001338 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001339 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001340 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001341 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001342 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001343 vereq(int(a), 100)
1344 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001345 verify(not hasattr(a, "spam"))
1346 def mygetattr(self, name):
1347 if name == "spam":
1348 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001349 raise AttributeError
1350 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001351 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001352 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001353 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001354 def mysetattr(self, name, value):
1355 if name == "spam":
1356 raise AttributeError
1357 return object.__setattr__(self, name, value)
1358 C.__setattr__ = mysetattr
1359 try:
1360 a.spam = "not spam"
1361 except AttributeError:
1362 pass
1363 else:
1364 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001365 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001366 class D(C):
1367 pass
1368 d = D()
1369 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001370 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001371
Guido van Rossum7e35d572001-09-15 03:14:32 +00001372 # Test handling of int*seq and seq*int
1373 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001374 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001375 vereq("a"*I(2), "aa")
1376 vereq(I(2)*"a", "aa")
1377 vereq(2*I(3), 6)
1378 vereq(I(3)*2, 6)
1379 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001380
1381 # Test handling of long*seq and seq*long
1382 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001383 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001384 vereq("a"*L(2L), "aa")
1385 vereq(L(2L)*"a", "aa")
1386 vereq(2*L(3), 6)
1387 vereq(L(3)*2, 6)
1388 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001389
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001390 # Test comparison of classes with dynamic metaclasses
1391 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001392 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001393 class someclass:
1394 __metaclass__ = dynamicmetaclass
1395 verify(someclass != object)
1396
Tim Peters6d6c1a32001-08-02 04:15:00 +00001397def errors():
1398 if verbose: print "Testing errors..."
1399
1400 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001401 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001402 pass
1403 except TypeError:
1404 pass
1405 else:
1406 verify(0, "inheritance from both list and dict should be illegal")
1407
1408 try:
1409 class C(object, None):
1410 pass
1411 except TypeError:
1412 pass
1413 else:
1414 verify(0, "inheritance from non-type should be illegal")
1415 class Classic:
1416 pass
1417
1418 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001419 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001420 pass
1421 except TypeError:
1422 pass
1423 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001424 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001425
1426 try:
1427 class C(object):
1428 __slots__ = 1
1429 except TypeError:
1430 pass
1431 else:
1432 verify(0, "__slots__ = 1 should be illegal")
1433
1434 try:
1435 class C(object):
1436 __slots__ = [1]
1437 except TypeError:
1438 pass
1439 else:
1440 verify(0, "__slots__ = [1] should be illegal")
1441
1442def classmethods():
1443 if verbose: print "Testing class methods..."
1444 class C(object):
1445 def foo(*a): return a
1446 goo = classmethod(foo)
1447 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001448 vereq(C.goo(1), (C, 1))
1449 vereq(c.goo(1), (C, 1))
1450 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001451 class D(C):
1452 pass
1453 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001454 vereq(D.goo(1), (D, 1))
1455 vereq(d.goo(1), (D, 1))
1456 vereq(d.foo(1), (d, 1))
1457 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001458 # Test for a specific crash (SF bug 528132)
1459 def f(cls, arg): return (cls, arg)
1460 ff = classmethod(f)
1461 vereq(ff.__get__(0, int)(42), (int, 42))
1462 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001463
Guido van Rossum155db9a2002-04-02 17:53:47 +00001464 # Test super() with classmethods (SF bug 535444)
1465 veris(C.goo.im_self, C)
1466 veris(D.goo.im_self, D)
1467 veris(super(D,D).goo.im_self, D)
1468 veris(super(D,d).goo.im_self, D)
1469 vereq(super(D,D).goo(), (D,))
1470 vereq(super(D,d).goo(), (D,))
1471
Fred Drakef841aa62002-03-28 15:49:54 +00001472def classmethods_in_c():
1473 if verbose: print "Testing C-based class methods..."
1474 import xxsubtype as spam
1475 a = (1, 2, 3)
1476 d = {'abc': 123}
1477 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001478 veris(x, spam.spamlist)
1479 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001480 vereq(d, d1)
1481 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001482 veris(x, spam.spamlist)
1483 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001484 vereq(d, d1)
1485
Tim Peters6d6c1a32001-08-02 04:15:00 +00001486def staticmethods():
1487 if verbose: print "Testing static methods..."
1488 class C(object):
1489 def foo(*a): return a
1490 goo = staticmethod(foo)
1491 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001492 vereq(C.goo(1), (1,))
1493 vereq(c.goo(1), (1,))
1494 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001495 class D(C):
1496 pass
1497 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001498 vereq(D.goo(1), (1,))
1499 vereq(d.goo(1), (1,))
1500 vereq(d.foo(1), (d, 1))
1501 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001502
Fred Drakef841aa62002-03-28 15:49:54 +00001503def staticmethods_in_c():
1504 if verbose: print "Testing C-based static methods..."
1505 import xxsubtype as spam
1506 a = (1, 2, 3)
1507 d = {"abc": 123}
1508 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1509 veris(x, None)
1510 vereq(a, a1)
1511 vereq(d, d1)
1512 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1513 veris(x, None)
1514 vereq(a, a1)
1515 vereq(d, d1)
1516
Tim Peters6d6c1a32001-08-02 04:15:00 +00001517def classic():
1518 if verbose: print "Testing classic classes..."
1519 class C:
1520 def foo(*a): return a
1521 goo = classmethod(foo)
1522 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001523 vereq(C.goo(1), (C, 1))
1524 vereq(c.goo(1), (C, 1))
1525 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001526 class D(C):
1527 pass
1528 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001529 vereq(D.goo(1), (D, 1))
1530 vereq(d.goo(1), (D, 1))
1531 vereq(d.foo(1), (d, 1))
1532 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001533 class E: # *not* subclassing from C
1534 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001535 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001536 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001537
1538def compattr():
1539 if verbose: print "Testing computed attributes..."
1540 class C(object):
1541 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001542 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001543 self.__get = get
1544 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001545 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001546 def __get__(self, obj, type=None):
1547 return self.__get(obj)
1548 def __set__(self, obj, value):
1549 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001550 def __delete__(self, obj):
1551 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001552 def __init__(self):
1553 self.__x = 0
1554 def __get_x(self):
1555 x = self.__x
1556 self.__x = x+1
1557 return x
1558 def __set_x(self, x):
1559 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001560 def __delete_x(self):
1561 del self.__x
1562 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001563 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001564 vereq(a.x, 0)
1565 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001566 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001567 vereq(a.x, 10)
1568 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001569 del a.x
1570 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001571
1572def newslot():
1573 if verbose: print "Testing __new__ slot override..."
1574 class C(list):
1575 def __new__(cls):
1576 self = list.__new__(cls)
1577 self.foo = 1
1578 return self
1579 def __init__(self):
1580 self.foo = self.foo + 2
1581 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001582 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001583 verify(a.__class__ is C)
1584 class D(C):
1585 pass
1586 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001587 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001588 verify(b.__class__ is D)
1589
Tim Peters6d6c1a32001-08-02 04:15:00 +00001590def altmro():
1591 if verbose: print "Testing mro() and overriding it..."
1592 class A(object):
1593 def f(self): return "A"
1594 class B(A):
1595 pass
1596 class C(A):
1597 def f(self): return "C"
1598 class D(B, C):
1599 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001600 vereq(D.mro(), [D, B, C, A, object])
1601 vereq(D.__mro__, (D, B, C, A, object))
1602 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001603
Guido van Rossumd3077402001-08-12 05:24:18 +00001604 class PerverseMetaType(type):
1605 def mro(cls):
1606 L = type.mro(cls)
1607 L.reverse()
1608 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001609 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001610 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001611 vereq(X.__mro__, (object, A, C, B, D, X))
1612 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001613
1614def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001615 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001616
1617 class B(object):
1618 "Intermediate class because object doesn't have a __setattr__"
1619
1620 class C(B):
1621
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001622 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623 if name == "foo":
1624 return ("getattr", name)
1625 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001626 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001627 def __setattr__(self, name, value):
1628 if name == "foo":
1629 self.setattr = (name, value)
1630 else:
1631 return B.__setattr__(self, name, value)
1632 def __delattr__(self, name):
1633 if name == "foo":
1634 self.delattr = name
1635 else:
1636 return B.__delattr__(self, name)
1637
1638 def __getitem__(self, key):
1639 return ("getitem", key)
1640 def __setitem__(self, key, value):
1641 self.setitem = (key, value)
1642 def __delitem__(self, key):
1643 self.delitem = key
1644
1645 def __getslice__(self, i, j):
1646 return ("getslice", i, j)
1647 def __setslice__(self, i, j, value):
1648 self.setslice = (i, j, value)
1649 def __delslice__(self, i, j):
1650 self.delslice = (i, j)
1651
1652 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001654 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001655 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001656 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001657 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001658
Guido van Rossum45704552001-10-08 16:35:45 +00001659 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001660 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001661 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001662 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001663 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001664
Guido van Rossum45704552001-10-08 16:35:45 +00001665 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001666 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001668 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001669 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001670
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001671def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001672 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001673 class C(object):
1674 def __init__(self, x):
1675 self.x = x
1676 def foo(self):
1677 return self.x
1678 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001679 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001680 class D(C):
1681 boo = C.foo
1682 goo = c1.foo
1683 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001684 vereq(d2.foo(), 2)
1685 vereq(d2.boo(), 2)
1686 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001687 class E(object):
1688 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001689 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001690 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001691
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001692def specials():
1693 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001694 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001695 # Test the default behavior for static classes
1696 class C(object):
1697 def __getitem__(self, i):
1698 if 0 <= i < 10: return i
1699 raise IndexError
1700 c1 = C()
1701 c2 = C()
1702 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001703 vereq(hash(c1), id(c1))
1704 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1705 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001706 verify(c1 != c2)
1707 verify(not c1 != c1)
1708 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001709 # Note that the module name appears in str/repr, and that varies
1710 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001711 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001712 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001713 verify(-1 not in c1)
1714 for i in range(10):
1715 verify(i in c1)
1716 verify(10 not in c1)
1717 # Test the default behavior for dynamic classes
1718 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001719 def __getitem__(self, i):
1720 if 0 <= i < 10: return i
1721 raise IndexError
1722 d1 = D()
1723 d2 = D()
1724 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001725 vereq(hash(d1), id(d1))
1726 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1727 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001728 verify(d1 != d2)
1729 verify(not d1 != d1)
1730 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001731 # Note that the module name appears in str/repr, and that varies
1732 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001733 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001734 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001735 verify(-1 not in d1)
1736 for i in range(10):
1737 verify(i in d1)
1738 verify(10 not in d1)
1739 # Test overridden behavior for static classes
1740 class Proxy(object):
1741 def __init__(self, x):
1742 self.x = x
1743 def __nonzero__(self):
1744 return not not self.x
1745 def __hash__(self):
1746 return hash(self.x)
1747 def __eq__(self, other):
1748 return self.x == other
1749 def __ne__(self, other):
1750 return self.x != other
1751 def __cmp__(self, other):
1752 return cmp(self.x, other.x)
1753 def __str__(self):
1754 return "Proxy:%s" % self.x
1755 def __repr__(self):
1756 return "Proxy(%r)" % self.x
1757 def __contains__(self, value):
1758 return value in self.x
1759 p0 = Proxy(0)
1760 p1 = Proxy(1)
1761 p_1 = Proxy(-1)
1762 verify(not p0)
1763 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001764 vereq(hash(p0), hash(0))
1765 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001766 verify(p0 != p1)
1767 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(not p0, p1)
1769 vereq(cmp(p0, p1), -1)
1770 vereq(cmp(p0, p0), 0)
1771 vereq(cmp(p0, p_1), 1)
1772 vereq(str(p0), "Proxy:0")
1773 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001774 p10 = Proxy(range(10))
1775 verify(-1 not in p10)
1776 for i in range(10):
1777 verify(i in p10)
1778 verify(10 not in p10)
1779 # Test overridden behavior for dynamic classes
1780 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001781 def __init__(self, x):
1782 self.x = x
1783 def __nonzero__(self):
1784 return not not self.x
1785 def __hash__(self):
1786 return hash(self.x)
1787 def __eq__(self, other):
1788 return self.x == other
1789 def __ne__(self, other):
1790 return self.x != other
1791 def __cmp__(self, other):
1792 return cmp(self.x, other.x)
1793 def __str__(self):
1794 return "DProxy:%s" % self.x
1795 def __repr__(self):
1796 return "DProxy(%r)" % self.x
1797 def __contains__(self, value):
1798 return value in self.x
1799 p0 = DProxy(0)
1800 p1 = DProxy(1)
1801 p_1 = DProxy(-1)
1802 verify(not p0)
1803 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001804 vereq(hash(p0), hash(0))
1805 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001806 verify(p0 != p1)
1807 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001808 vereq(not p0, p1)
1809 vereq(cmp(p0, p1), -1)
1810 vereq(cmp(p0, p0), 0)
1811 vereq(cmp(p0, p_1), 1)
1812 vereq(str(p0), "DProxy:0")
1813 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001814 p10 = DProxy(range(10))
1815 verify(-1 not in p10)
1816 for i in range(10):
1817 verify(i in p10)
1818 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001819 # Safety test for __cmp__
1820 def unsafecmp(a, b):
1821 try:
1822 a.__class__.__cmp__(a, b)
1823 except TypeError:
1824 pass
1825 else:
1826 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1827 a.__class__, a, b)
1828 unsafecmp(u"123", "123")
1829 unsafecmp("123", u"123")
1830 unsafecmp(1, 1.0)
1831 unsafecmp(1.0, 1)
1832 unsafecmp(1, 1L)
1833 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001834
Neal Norwitz1a997502003-01-13 20:13:12 +00001835 class Letter(str):
1836 def __new__(cls, letter):
1837 if letter == 'EPS':
1838 return str.__new__(cls)
1839 return str.__new__(cls, letter)
1840 def __str__(self):
1841 if not self:
1842 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001843 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001844
1845 # sys.stdout needs to be the original to trigger the recursion bug
1846 import sys
1847 test_stdout = sys.stdout
1848 sys.stdout = get_original_stdout()
1849 try:
1850 # nothing should actually be printed, this should raise an exception
1851 print Letter('w')
1852 except RuntimeError:
1853 pass
1854 else:
1855 raise TestFailed, "expected a RuntimeError for print recursion"
1856 sys.stdout = test_stdout
1857
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001858def weakrefs():
1859 if verbose: print "Testing weak references..."
1860 import weakref
1861 class C(object):
1862 pass
1863 c = C()
1864 r = weakref.ref(c)
1865 verify(r() is c)
1866 del c
1867 verify(r() is None)
1868 del r
1869 class NoWeak(object):
1870 __slots__ = ['foo']
1871 no = NoWeak()
1872 try:
1873 weakref.ref(no)
1874 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001875 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001876 else:
1877 verify(0, "weakref.ref(no) should be illegal")
1878 class Weak(object):
1879 __slots__ = ['foo', '__weakref__']
1880 yes = Weak()
1881 r = weakref.ref(yes)
1882 verify(r() is yes)
1883 del yes
1884 verify(r() is None)
1885 del r
1886
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001887def properties():
1888 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001889 class C(object):
1890 def getx(self):
1891 return self.__x
1892 def setx(self, value):
1893 self.__x = value
1894 def delx(self):
1895 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001896 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001897 a = C()
1898 verify(not hasattr(a, "x"))
1899 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001900 vereq(a._C__x, 42)
1901 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001902 del a.x
1903 verify(not hasattr(a, "x"))
1904 verify(not hasattr(a, "_C__x"))
1905 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001906 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001907 C.x.__delete__(a)
1908 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001909
Tim Peters66c1a522001-09-24 21:17:50 +00001910 raw = C.__dict__['x']
1911 verify(isinstance(raw, property))
1912
1913 attrs = dir(raw)
1914 verify("__doc__" in attrs)
1915 verify("fget" in attrs)
1916 verify("fset" in attrs)
1917 verify("fdel" in attrs)
1918
Guido van Rossum45704552001-10-08 16:35:45 +00001919 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001920 verify(raw.fget is C.__dict__['getx'])
1921 verify(raw.fset is C.__dict__['setx'])
1922 verify(raw.fdel is C.__dict__['delx'])
1923
1924 for attr in "__doc__", "fget", "fset", "fdel":
1925 try:
1926 setattr(raw, attr, 42)
1927 except TypeError, msg:
1928 if str(msg).find('readonly') < 0:
1929 raise TestFailed("when setting readonly attr %r on a "
1930 "property, got unexpected TypeError "
1931 "msg %r" % (attr, str(msg)))
1932 else:
1933 raise TestFailed("expected TypeError from trying to set "
1934 "readonly %r attr on a property" % attr)
1935
Neal Norwitz673cd822002-10-18 16:33:13 +00001936 class D(object):
1937 __getitem__ = property(lambda s: 1/0)
1938
1939 d = D()
1940 try:
1941 for i in d:
1942 str(i)
1943 except ZeroDivisionError:
1944 pass
1945 else:
1946 raise TestFailed, "expected ZeroDivisionError from bad property"
1947
Guido van Rossumc4a18802001-08-24 16:55:27 +00001948def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001949 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001950
1951 class A(object):
1952 def meth(self, a):
1953 return "A(%r)" % a
1954
Guido van Rossum45704552001-10-08 16:35:45 +00001955 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001956
1957 class B(A):
1958 def __init__(self):
1959 self.__super = super(B, self)
1960 def meth(self, a):
1961 return "B(%r)" % a + self.__super.meth(a)
1962
Guido van Rossum45704552001-10-08 16:35:45 +00001963 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001964
1965 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001966 def meth(self, a):
1967 return "C(%r)" % a + self.__super.meth(a)
1968 C._C__super = super(C)
1969
Guido van Rossum45704552001-10-08 16:35:45 +00001970 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001971
1972 class D(C, B):
1973 def meth(self, a):
1974 return "D(%r)" % a + super(D, self).meth(a)
1975
Guido van Rossum5b443c62001-12-03 15:38:28 +00001976 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1977
1978 # Test for subclassing super
1979
1980 class mysuper(super):
1981 def __init__(self, *args):
1982 return super(mysuper, self).__init__(*args)
1983
1984 class E(D):
1985 def meth(self, a):
1986 return "E(%r)" % a + mysuper(E, self).meth(a)
1987
1988 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1989
1990 class F(E):
1991 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00001992 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00001993 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1994 F._F__super = mysuper(F)
1995
1996 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1997
1998 # Make sure certain errors are raised
1999
2000 try:
2001 super(D, 42)
2002 except TypeError:
2003 pass
2004 else:
2005 raise TestFailed, "shouldn't allow super(D, 42)"
2006
2007 try:
2008 super(D, C())
2009 except TypeError:
2010 pass
2011 else:
2012 raise TestFailed, "shouldn't allow super(D, C())"
2013
2014 try:
2015 super(D).__get__(12)
2016 except TypeError:
2017 pass
2018 else:
2019 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2020
2021 try:
2022 super(D).__get__(C())
2023 except TypeError:
2024 pass
2025 else:
2026 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002027
Guido van Rossuma4541a32003-04-16 20:02:22 +00002028 # Make sure data descriptors can be overridden and accessed via super
2029 # (new feature in Python 2.3)
2030
2031 class DDbase(object):
2032 def getx(self): return 42
2033 x = property(getx)
2034
2035 class DDsub(DDbase):
2036 def getx(self): return "hello"
2037 x = property(getx)
2038
2039 dd = DDsub()
2040 vereq(dd.x, "hello")
2041 vereq(super(DDsub, dd).x, 42)
2042
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002043def inherits():
2044 if verbose: print "Testing inheritance from basic types..."
2045
2046 class hexint(int):
2047 def __repr__(self):
2048 return hex(self)
2049 def __add__(self, other):
2050 return hexint(int.__add__(self, other))
2051 # (Note that overriding __radd__ doesn't work,
2052 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002053 vereq(repr(hexint(7) + 9), "0x10")
2054 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002055 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002056 vereq(a, 12345)
2057 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002058 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002059 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002060 verify((+a).__class__ is int)
2061 verify((a >> 0).__class__ is int)
2062 verify((a << 0).__class__ is int)
2063 verify((hexint(0) << 12).__class__ is int)
2064 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002065
2066 class octlong(long):
2067 __slots__ = []
2068 def __str__(self):
2069 s = oct(self)
2070 if s[-1] == 'L':
2071 s = s[:-1]
2072 return s
2073 def __add__(self, other):
2074 return self.__class__(super(octlong, self).__add__(other))
2075 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002076 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002077 # (Note that overriding __radd__ here only seems to work
2078 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002079 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002080 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002081 vereq(a, 12345L)
2082 vereq(long(a), 12345L)
2083 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002084 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002085 verify((+a).__class__ is long)
2086 verify((-a).__class__ is long)
2087 verify((-octlong(0)).__class__ is long)
2088 verify((a >> 0).__class__ is long)
2089 verify((a << 0).__class__ is long)
2090 verify((a - 0).__class__ is long)
2091 verify((a * 1).__class__ is long)
2092 verify((a ** 1).__class__ is long)
2093 verify((a // 1).__class__ is long)
2094 verify((1 * a).__class__ is long)
2095 verify((a | 0).__class__ is long)
2096 verify((a ^ 0).__class__ is long)
2097 verify((a & -1L).__class__ is long)
2098 verify((octlong(0) << 12).__class__ is long)
2099 verify((octlong(0) >> 12).__class__ is long)
2100 verify(abs(octlong(0)).__class__ is long)
2101
2102 # Because octlong overrides __add__, we can't check the absence of +0
2103 # optimizations using octlong.
2104 class longclone(long):
2105 pass
2106 a = longclone(1)
2107 verify((a + 0).__class__ is long)
2108 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002109
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002110 # Check that negative clones don't segfault
2111 a = longclone(-1)
2112 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002113 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002114
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002115 class precfloat(float):
2116 __slots__ = ['prec']
2117 def __init__(self, value=0.0, prec=12):
2118 self.prec = int(prec)
2119 float.__init__(value)
2120 def __repr__(self):
2121 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002122 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002123 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002124 vereq(a, 12345.0)
2125 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002126 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002127 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002128 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002129
Tim Peters2400fa42001-09-12 19:12:49 +00002130 class madcomplex(complex):
2131 def __repr__(self):
2132 return "%.17gj%+.17g" % (self.imag, self.real)
2133 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002134 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002135 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002136 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002137 vereq(a, base)
2138 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002139 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002140 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002141 vereq(repr(a), "4j-3")
2142 vereq(a, base)
2143 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002144 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002145 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002146 veris((+a).__class__, complex)
2147 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002148 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002149 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002150 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002151 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002152 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002153 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002154 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002155
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002156 class madtuple(tuple):
2157 _rev = None
2158 def rev(self):
2159 if self._rev is not None:
2160 return self._rev
2161 L = list(self)
2162 L.reverse()
2163 self._rev = self.__class__(L)
2164 return self._rev
2165 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002166 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2167 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2168 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002169 for i in range(512):
2170 t = madtuple(range(i))
2171 u = t.rev()
2172 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002173 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002174 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002176 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002177 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002178 verify(a[:].__class__ is tuple)
2179 verify((a * 1).__class__ is tuple)
2180 verify((a * 0).__class__ is tuple)
2181 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002182 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002184 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002185 verify((a + a).__class__ is tuple)
2186 verify((a * 0).__class__ is tuple)
2187 verify((a * 1).__class__ is tuple)
2188 verify((a * 2).__class__ is tuple)
2189 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002190
2191 class madstring(str):
2192 _rev = None
2193 def rev(self):
2194 if self._rev is not None:
2195 return self._rev
2196 L = list(self)
2197 L.reverse()
2198 self._rev = self.__class__("".join(L))
2199 return self._rev
2200 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002201 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2202 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2203 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002204 for i in range(256):
2205 s = madstring("".join(map(chr, range(i))))
2206 t = s.rev()
2207 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002208 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002209 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002210 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002211 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002212
Tim Peters8fa5dd02001-09-12 02:18:30 +00002213 base = "\x00" * 5
2214 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002215 vereq(s, base)
2216 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002217 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002218 vereq(hash(s), hash(base))
2219 vereq({s: 1}[base], 1)
2220 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002221 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002222 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002223 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002224 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002225 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002226 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002227 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002228 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002229 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002230 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002231 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002232 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002233 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002235 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002236 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002237 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002238 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002239 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002240 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002241 identitytab = ''.join([chr(i) for i in range(256)])
2242 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002243 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002244 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002245 vereq(s.translate(identitytab, "x"), base)
2246 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002247 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002249 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002250 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002251 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002252 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002253 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002254 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002255 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002257
Tim Peters111f6092001-09-12 07:54:51 +00002258 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002259 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002260 verify(intern(s).__class__ is str)
2261 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002263
2264 i = intern("y x")
2265 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002267 verify(intern(s).__class__ is str)
2268 verify(intern(s) is i)
2269
2270 s = madstring(i)
2271 verify(intern(s).__class__ is str)
2272 verify(intern(s) is i)
2273
Guido van Rossum91ee7982001-08-30 20:52:40 +00002274 class madunicode(unicode):
2275 _rev = None
2276 def rev(self):
2277 if self._rev is not None:
2278 return self._rev
2279 L = list(self)
2280 L.reverse()
2281 self._rev = self.__class__(u"".join(L))
2282 return self._rev
2283 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(u, u"ABCDEF")
2285 vereq(u.rev(), madunicode(u"FEDCBA"))
2286 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002287 base = u"12345"
2288 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002290 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002291 vereq(hash(u), hash(base))
2292 vereq({u: 1}[base], 1)
2293 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002294 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002295 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002296 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002297 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002298 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002299 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002300 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002301 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002302 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002303 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002304 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002305 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002306 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002307 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002308 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002309 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002310 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002311 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002312 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002313 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002314 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002315 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002316 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002317 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002318 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002319 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002320 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002321 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002322 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002323 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002324 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002326 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002328 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002329 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002330 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002331 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002332
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002333 class sublist(list):
2334 pass
2335 a = sublist(range(5))
2336 vereq(a, range(5))
2337 a.append("hello")
2338 vereq(a, range(5) + ["hello"])
2339 a[5] = 5
2340 vereq(a, range(6))
2341 a.extend(range(6, 20))
2342 vereq(a, range(20))
2343 a[-5:] = []
2344 vereq(a, range(15))
2345 del a[10:15]
2346 vereq(len(a), 10)
2347 vereq(a, range(10))
2348 vereq(list(a), range(10))
2349 vereq(a[0], 0)
2350 vereq(a[9], 9)
2351 vereq(a[-10], 0)
2352 vereq(a[-1], 9)
2353 vereq(a[:5], range(5))
2354
Tim Peters59c9a642001-09-13 05:38:56 +00002355 class CountedInput(file):
2356 """Counts lines read by self.readline().
2357
2358 self.lineno is the 0-based ordinal of the last line read, up to
2359 a maximum of one greater than the number of lines in the file.
2360
2361 self.ateof is true if and only if the final "" line has been read,
2362 at which point self.lineno stops incrementing, and further calls
2363 to readline() continue to return "".
2364 """
2365
2366 lineno = 0
2367 ateof = 0
2368 def readline(self):
2369 if self.ateof:
2370 return ""
2371 s = file.readline(self)
2372 # Next line works too.
2373 # s = super(CountedInput, self).readline()
2374 self.lineno += 1
2375 if s == "":
2376 self.ateof = 1
2377 return s
2378
Tim Peters561f8992001-09-13 19:36:36 +00002379 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002380 lines = ['a\n', 'b\n', 'c\n']
2381 try:
2382 f.writelines(lines)
2383 f.close()
2384 f = CountedInput(TESTFN)
2385 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2386 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002387 vereq(expected, got)
2388 vereq(f.lineno, i)
2389 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002390 f.close()
2391 finally:
2392 try:
2393 f.close()
2394 except:
2395 pass
2396 try:
2397 import os
2398 os.unlink(TESTFN)
2399 except:
2400 pass
2401
Tim Peters808b94e2001-09-13 19:33:07 +00002402def keywords():
2403 if verbose:
2404 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002405 vereq(int(x=1), 1)
2406 vereq(float(x=2), 2.0)
2407 vereq(long(x=3), 3L)
2408 vereq(complex(imag=42, real=666), complex(666, 42))
2409 vereq(str(object=500), '500')
2410 vereq(unicode(string='abc', errors='strict'), u'abc')
2411 vereq(tuple(sequence=range(3)), (0, 1, 2))
2412 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002413 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002414
2415 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002416 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002417 try:
2418 constructor(bogus_keyword_arg=1)
2419 except TypeError:
2420 pass
2421 else:
2422 raise TestFailed("expected TypeError from bogus keyword "
2423 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002424
Tim Peters8fa45672001-09-13 21:01:29 +00002425def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002426 # XXX This test is disabled because rexec is not deemed safe
2427 return
Tim Peters8fa45672001-09-13 21:01:29 +00002428 import rexec
2429 if verbose:
2430 print "Testing interaction with restricted execution ..."
2431
2432 sandbox = rexec.RExec()
2433
2434 code1 = """f = open(%r, 'w')""" % TESTFN
2435 code2 = """f = file(%r, 'w')""" % TESTFN
2436 code3 = """\
2437f = open(%r)
2438t = type(f) # a sneaky way to get the file() constructor
2439f.close()
2440f = t(%r, 'w') # rexec can't catch this by itself
2441""" % (TESTFN, TESTFN)
2442
2443 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2444 f.close()
2445
2446 try:
2447 for code in code1, code2, code3:
2448 try:
2449 sandbox.r_exec(code)
2450 except IOError, msg:
2451 if str(msg).find("restricted") >= 0:
2452 outcome = "OK"
2453 else:
2454 outcome = "got an exception, but not an expected one"
2455 else:
2456 outcome = "expected a restricted-execution exception"
2457
2458 if outcome != "OK":
2459 raise TestFailed("%s, in %r" % (outcome, code))
2460
2461 finally:
2462 try:
2463 import os
2464 os.unlink(TESTFN)
2465 except:
2466 pass
2467
Tim Peters0ab085c2001-09-14 00:25:33 +00002468def str_subclass_as_dict_key():
2469 if verbose:
2470 print "Testing a str subclass used as dict key .."
2471
2472 class cistr(str):
2473 """Sublcass of str that computes __eq__ case-insensitively.
2474
2475 Also computes a hash code of the string in canonical form.
2476 """
2477
2478 def __init__(self, value):
2479 self.canonical = value.lower()
2480 self.hashcode = hash(self.canonical)
2481
2482 def __eq__(self, other):
2483 if not isinstance(other, cistr):
2484 other = cistr(other)
2485 return self.canonical == other.canonical
2486
2487 def __hash__(self):
2488 return self.hashcode
2489
Guido van Rossum45704552001-10-08 16:35:45 +00002490 vereq(cistr('ABC'), 'abc')
2491 vereq('aBc', cistr('ABC'))
2492 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002493
2494 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002495 vereq(d[cistr('one')], 1)
2496 vereq(d[cistr('tWo')], 2)
2497 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002498 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002499 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002500
Guido van Rossumab3b0342001-09-18 20:38:53 +00002501def classic_comparisons():
2502 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002503 class classic:
2504 pass
2505 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002506 if verbose: print " (base = %s)" % base
2507 class C(base):
2508 def __init__(self, value):
2509 self.value = int(value)
2510 def __cmp__(self, other):
2511 if isinstance(other, C):
2512 return cmp(self.value, other.value)
2513 if isinstance(other, int) or isinstance(other, long):
2514 return cmp(self.value, other)
2515 return NotImplemented
2516 c1 = C(1)
2517 c2 = C(2)
2518 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002519 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002520 c = {1: c1, 2: c2, 3: c3}
2521 for x in 1, 2, 3:
2522 for y in 1, 2, 3:
2523 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2524 for op in "<", "<=", "==", "!=", ">", ">=":
2525 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2526 "x=%d, y=%d" % (x, y))
2527 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2528 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2529
Guido van Rossum0639f592001-09-18 21:06:04 +00002530def rich_comparisons():
2531 if verbose:
2532 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002533 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002534 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002535 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002536 vereq(z, 1+0j)
2537 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002538 class ZZ(complex):
2539 def __eq__(self, other):
2540 try:
2541 return abs(self - other) <= 1e-6
2542 except:
2543 return NotImplemented
2544 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002545 vereq(zz, 1+0j)
2546 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002547
Guido van Rossum0639f592001-09-18 21:06:04 +00002548 class classic:
2549 pass
2550 for base in (classic, int, object, list):
2551 if verbose: print " (base = %s)" % base
2552 class C(base):
2553 def __init__(self, value):
2554 self.value = int(value)
2555 def __cmp__(self, other):
2556 raise TestFailed, "shouldn't call __cmp__"
2557 def __eq__(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 __ne__(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 __lt__(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 def __le__(self, other):
2576 if isinstance(other, C):
2577 return self.value <= other.value
2578 if isinstance(other, int) or isinstance(other, long):
2579 return self.value <= other
2580 return NotImplemented
2581 def __gt__(self, other):
2582 if isinstance(other, C):
2583 return self.value > other.value
2584 if isinstance(other, int) or isinstance(other, long):
2585 return self.value > other
2586 return NotImplemented
2587 def __ge__(self, other):
2588 if isinstance(other, C):
2589 return self.value >= other.value
2590 if isinstance(other, int) or isinstance(other, long):
2591 return self.value >= other
2592 return NotImplemented
2593 c1 = C(1)
2594 c2 = C(2)
2595 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002596 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002597 c = {1: c1, 2: c2, 3: c3}
2598 for x in 1, 2, 3:
2599 for y in 1, 2, 3:
2600 for op in "<", "<=", "==", "!=", ">", ">=":
2601 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2602 "x=%d, y=%d" % (x, y))
2603 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2604 "x=%d, y=%d" % (x, y))
2605 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2606 "x=%d, y=%d" % (x, y))
2607
Guido van Rossum1952e382001-09-19 01:25:16 +00002608def coercions():
2609 if verbose: print "Testing coercions..."
2610 class I(int): pass
2611 coerce(I(0), 0)
2612 coerce(0, I(0))
2613 class L(long): pass
2614 coerce(L(0), 0)
2615 coerce(L(0), 0L)
2616 coerce(0, L(0))
2617 coerce(0L, L(0))
2618 class F(float): pass
2619 coerce(F(0), 0)
2620 coerce(F(0), 0L)
2621 coerce(F(0), 0.)
2622 coerce(0, F(0))
2623 coerce(0L, F(0))
2624 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002625 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002626 coerce(C(0), 0)
2627 coerce(C(0), 0L)
2628 coerce(C(0), 0.)
2629 coerce(C(0), 0j)
2630 coerce(0, C(0))
2631 coerce(0L, C(0))
2632 coerce(0., C(0))
2633 coerce(0j, C(0))
2634
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002635def descrdoc():
2636 if verbose: print "Testing descriptor doc strings..."
2637 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002638 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002639 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002640 check(file.name, "file name") # member descriptor
2641
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002642def setclass():
2643 if verbose: print "Testing __class__ assignment..."
2644 class C(object): pass
2645 class D(object): pass
2646 class E(object): pass
2647 class F(D, E): pass
2648 for cls in C, D, E, F:
2649 for cls2 in C, D, E, F:
2650 x = cls()
2651 x.__class__ = cls2
2652 verify(x.__class__ is cls2)
2653 x.__class__ = cls
2654 verify(x.__class__ is cls)
2655 def cant(x, C):
2656 try:
2657 x.__class__ = C
2658 except TypeError:
2659 pass
2660 else:
2661 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002662 try:
2663 delattr(x, "__class__")
2664 except TypeError:
2665 pass
2666 else:
2667 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002668 cant(C(), list)
2669 cant(list(), C)
2670 cant(C(), 1)
2671 cant(C(), object)
2672 cant(object(), list)
2673 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002674 class Int(int): __slots__ = []
2675 cant(2, Int)
2676 cant(Int(), int)
2677 cant(True, int)
2678 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002679 o = object()
2680 cant(o, type(1))
2681 cant(o, type(None))
2682 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002683
Guido van Rossum6661be32001-10-26 04:26:12 +00002684def setdict():
2685 if verbose: print "Testing __dict__ assignment..."
2686 class C(object): pass
2687 a = C()
2688 a.__dict__ = {'b': 1}
2689 vereq(a.b, 1)
2690 def cant(x, dict):
2691 try:
2692 x.__dict__ = dict
2693 except TypeError:
2694 pass
2695 else:
2696 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2697 cant(a, None)
2698 cant(a, [])
2699 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002700 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002701 # Classes don't allow __dict__ assignment
2702 cant(C, {})
2703
Guido van Rossum3926a632001-09-25 16:25:58 +00002704def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002705 if verbose:
2706 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002707 import pickle, cPickle
2708
2709 def sorteditems(d):
2710 L = d.items()
2711 L.sort()
2712 return L
2713
2714 global C
2715 class C(object):
2716 def __init__(self, a, b):
2717 super(C, self).__init__()
2718 self.a = a
2719 self.b = b
2720 def __repr__(self):
2721 return "C(%r, %r)" % (self.a, self.b)
2722
2723 global C1
2724 class C1(list):
2725 def __new__(cls, a, b):
2726 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002727 def __getnewargs__(self):
2728 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002729 def __init__(self, a, b):
2730 self.a = a
2731 self.b = b
2732 def __repr__(self):
2733 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2734
2735 global C2
2736 class C2(int):
2737 def __new__(cls, a, b, val=0):
2738 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002739 def __getnewargs__(self):
2740 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002741 def __init__(self, a, b, val=0):
2742 self.a = a
2743 self.b = b
2744 def __repr__(self):
2745 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2746
Guido van Rossum90c45142001-11-24 21:07:01 +00002747 global C3
2748 class C3(object):
2749 def __init__(self, foo):
2750 self.foo = foo
2751 def __getstate__(self):
2752 return self.foo
2753 def __setstate__(self, foo):
2754 self.foo = foo
2755
2756 global C4classic, C4
2757 class C4classic: # classic
2758 pass
2759 class C4(C4classic, object): # mixed inheritance
2760 pass
2761
Guido van Rossum3926a632001-09-25 16:25:58 +00002762 for p in pickle, cPickle:
2763 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002764 if verbose:
2765 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002766
2767 for cls in C, C1, C2:
2768 s = p.dumps(cls, bin)
2769 cls2 = p.loads(s)
2770 verify(cls2 is cls)
2771
2772 a = C1(1, 2); a.append(42); a.append(24)
2773 b = C2("hello", "world", 42)
2774 s = p.dumps((a, b), bin)
2775 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002776 vereq(x.__class__, a.__class__)
2777 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2778 vereq(y.__class__, b.__class__)
2779 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2780 vereq(`x`, `a`)
2781 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002782 if verbose:
2783 print "a = x =", a
2784 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002785 # Test for __getstate__ and __setstate__ on new style class
2786 u = C3(42)
2787 s = p.dumps(u, bin)
2788 v = p.loads(s)
2789 veris(u.__class__, v.__class__)
2790 vereq(u.foo, v.foo)
2791 # Test for picklability of hybrid class
2792 u = C4()
2793 u.foo = 42
2794 s = p.dumps(u, bin)
2795 v = p.loads(s)
2796 veris(u.__class__, v.__class__)
2797 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002798
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002799 # Testing copy.deepcopy()
2800 if verbose:
2801 print "deepcopy"
2802 import copy
2803 for cls in C, C1, C2:
2804 cls2 = copy.deepcopy(cls)
2805 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002806
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002807 a = C1(1, 2); a.append(42); a.append(24)
2808 b = C2("hello", "world", 42)
2809 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002810 vereq(x.__class__, a.__class__)
2811 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2812 vereq(y.__class__, b.__class__)
2813 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2814 vereq(`x`, `a`)
2815 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002816 if verbose:
2817 print "a = x =", a
2818 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002819
Guido van Rossum8c842552002-03-14 23:05:54 +00002820def pickleslots():
2821 if verbose: print "Testing pickling of classes with __slots__ ..."
2822 import pickle, cPickle
2823 # Pickling of classes with __slots__ but without __getstate__ should fail
2824 global B, C, D, E
2825 class B(object):
2826 pass
2827 for base in [object, B]:
2828 class C(base):
2829 __slots__ = ['a']
2830 class D(C):
2831 pass
2832 try:
2833 pickle.dumps(C())
2834 except TypeError:
2835 pass
2836 else:
2837 raise TestFailed, "should fail: pickle C instance - %s" % base
2838 try:
2839 cPickle.dumps(C())
2840 except TypeError:
2841 pass
2842 else:
2843 raise TestFailed, "should fail: cPickle C instance - %s" % base
2844 try:
2845 pickle.dumps(C())
2846 except TypeError:
2847 pass
2848 else:
2849 raise TestFailed, "should fail: pickle D instance - %s" % base
2850 try:
2851 cPickle.dumps(D())
2852 except TypeError:
2853 pass
2854 else:
2855 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002856 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002857 class C(base):
2858 __slots__ = ['a']
2859 def __getstate__(self):
2860 try:
2861 d = self.__dict__.copy()
2862 except AttributeError:
2863 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002864 for cls in self.__class__.__mro__:
2865 for sn in cls.__dict__.get('__slots__', ()):
2866 try:
2867 d[sn] = getattr(self, sn)
2868 except AttributeError:
2869 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002870 return d
2871 def __setstate__(self, d):
2872 for k, v in d.items():
2873 setattr(self, k, v)
2874 class D(C):
2875 pass
2876 # Now it should work
2877 x = C()
2878 y = pickle.loads(pickle.dumps(x))
2879 vereq(hasattr(y, 'a'), 0)
2880 y = cPickle.loads(cPickle.dumps(x))
2881 vereq(hasattr(y, 'a'), 0)
2882 x.a = 42
2883 y = pickle.loads(pickle.dumps(x))
2884 vereq(y.a, 42)
2885 y = cPickle.loads(cPickle.dumps(x))
2886 vereq(y.a, 42)
2887 x = D()
2888 x.a = 42
2889 x.b = 100
2890 y = pickle.loads(pickle.dumps(x))
2891 vereq(y.a + y.b, 142)
2892 y = cPickle.loads(cPickle.dumps(x))
2893 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002894 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002895 class E(C):
2896 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002897 x = E()
2898 x.a = 42
2899 x.b = "foo"
2900 y = pickle.loads(pickle.dumps(x))
2901 vereq(y.a, x.a)
2902 vereq(y.b, x.b)
2903 y = cPickle.loads(cPickle.dumps(x))
2904 vereq(y.a, x.a)
2905 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002906
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002907def copies():
2908 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2909 import copy
2910 class C(object):
2911 pass
2912
2913 a = C()
2914 a.foo = 12
2915 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002916 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002917
2918 a.bar = [1,2,3]
2919 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002920 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002921 verify(c.bar is a.bar)
2922
2923 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002924 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002925 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002926 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002927
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002928def binopoverride():
2929 if verbose: print "Testing overrides of binary operations..."
2930 class I(int):
2931 def __repr__(self):
2932 return "I(%r)" % int(self)
2933 def __add__(self, other):
2934 return I(int(self) + int(other))
2935 __radd__ = __add__
2936 def __pow__(self, other, mod=None):
2937 if mod is None:
2938 return I(pow(int(self), int(other)))
2939 else:
2940 return I(pow(int(self), int(other), int(mod)))
2941 def __rpow__(self, other, mod=None):
2942 if mod is None:
2943 return I(pow(int(other), int(self), mod))
2944 else:
2945 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002946
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002947 vereq(`I(1) + I(2)`, "I(3)")
2948 vereq(`I(1) + 2`, "I(3)")
2949 vereq(`1 + I(2)`, "I(3)")
2950 vereq(`I(2) ** I(3)`, "I(8)")
2951 vereq(`2 ** I(3)`, "I(8)")
2952 vereq(`I(2) ** 3`, "I(8)")
2953 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2954 class S(str):
2955 def __eq__(self, other):
2956 return self.lower() == other.lower()
2957
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002958def subclasspropagation():
2959 if verbose: print "Testing propagation of slot functions to subclasses..."
2960 class A(object):
2961 pass
2962 class B(A):
2963 pass
2964 class C(A):
2965 pass
2966 class D(B, C):
2967 pass
2968 d = D()
2969 vereq(hash(d), id(d))
2970 A.__hash__ = lambda self: 42
2971 vereq(hash(d), 42)
2972 C.__hash__ = lambda self: 314
2973 vereq(hash(d), 314)
2974 B.__hash__ = lambda self: 144
2975 vereq(hash(d), 144)
2976 D.__hash__ = lambda self: 100
2977 vereq(hash(d), 100)
2978 del D.__hash__
2979 vereq(hash(d), 144)
2980 del B.__hash__
2981 vereq(hash(d), 314)
2982 del C.__hash__
2983 vereq(hash(d), 42)
2984 del A.__hash__
2985 vereq(hash(d), id(d))
2986 d.foo = 42
2987 d.bar = 42
2988 vereq(d.foo, 42)
2989 vereq(d.bar, 42)
2990 def __getattribute__(self, name):
2991 if name == "foo":
2992 return 24
2993 return object.__getattribute__(self, name)
2994 A.__getattribute__ = __getattribute__
2995 vereq(d.foo, 24)
2996 vereq(d.bar, 42)
2997 def __getattr__(self, name):
2998 if name in ("spam", "foo", "bar"):
2999 return "hello"
3000 raise AttributeError, name
3001 B.__getattr__ = __getattr__
3002 vereq(d.spam, "hello")
3003 vereq(d.foo, 24)
3004 vereq(d.bar, 42)
3005 del A.__getattribute__
3006 vereq(d.foo, 42)
3007 del d.foo
3008 vereq(d.foo, "hello")
3009 vereq(d.bar, 42)
3010 del B.__getattr__
3011 try:
3012 d.foo
3013 except AttributeError:
3014 pass
3015 else:
3016 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003017
Guido van Rossume7f3e242002-06-14 02:35:45 +00003018 # Test a nasty bug in recurse_down_subclasses()
3019 import gc
3020 class A(object):
3021 pass
3022 class B(A):
3023 pass
3024 del B
3025 gc.collect()
3026 A.__setitem__ = lambda *a: None # crash
3027
Tim Petersfc57ccb2001-10-12 02:38:24 +00003028def buffer_inherit():
3029 import binascii
3030 # SF bug [#470040] ParseTuple t# vs subclasses.
3031 if verbose:
3032 print "Testing that buffer interface is inherited ..."
3033
3034 class MyStr(str):
3035 pass
3036 base = 'abc'
3037 m = MyStr(base)
3038 # b2a_hex uses the buffer interface to get its argument's value, via
3039 # PyArg_ParseTuple 't#' code.
3040 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3041
3042 # It's not clear that unicode will continue to support the character
3043 # buffer interface, and this test will fail if that's taken away.
3044 class MyUni(unicode):
3045 pass
3046 base = u'abc'
3047 m = MyUni(base)
3048 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3049
3050 class MyInt(int):
3051 pass
3052 m = MyInt(42)
3053 try:
3054 binascii.b2a_hex(m)
3055 raise TestFailed('subclass of int should not have a buffer interface')
3056 except TypeError:
3057 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003058
Tim Petersc9933152001-10-16 20:18:24 +00003059def str_of_str_subclass():
3060 import binascii
3061 import cStringIO
3062
3063 if verbose:
3064 print "Testing __str__ defined in subclass of str ..."
3065
3066 class octetstring(str):
3067 def __str__(self):
3068 return binascii.b2a_hex(self)
3069 def __repr__(self):
3070 return self + " repr"
3071
3072 o = octetstring('A')
3073 vereq(type(o), octetstring)
3074 vereq(type(str(o)), str)
3075 vereq(type(repr(o)), str)
3076 vereq(ord(o), 0x41)
3077 vereq(str(o), '41')
3078 vereq(repr(o), 'A repr')
3079 vereq(o.__str__(), '41')
3080 vereq(o.__repr__(), 'A repr')
3081
3082 capture = cStringIO.StringIO()
3083 # Calling str() or not exercises different internal paths.
3084 print >> capture, o
3085 print >> capture, str(o)
3086 vereq(capture.getvalue(), '41\n41\n')
3087 capture.close()
3088
Guido van Rossumc8e56452001-10-22 00:43:43 +00003089def kwdargs():
3090 if verbose: print "Testing keyword arguments to __init__, __call__..."
3091 def f(a): return a
3092 vereq(f.__call__(a=42), 42)
3093 a = []
3094 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003095 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003096
Guido van Rossumed87ad82001-10-30 02:33:02 +00003097def delhook():
3098 if verbose: print "Testing __del__ hook..."
3099 log = []
3100 class C(object):
3101 def __del__(self):
3102 log.append(1)
3103 c = C()
3104 vereq(log, [])
3105 del c
3106 vereq(log, [1])
3107
Guido van Rossum29d26062001-12-11 04:37:34 +00003108 class D(object): pass
3109 d = D()
3110 try: del d[0]
3111 except TypeError: pass
3112 else: raise TestFailed, "invalid del() didn't raise TypeError"
3113
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003114def hashinherit():
3115 if verbose: print "Testing hash of mutable subclasses..."
3116
3117 class mydict(dict):
3118 pass
3119 d = mydict()
3120 try:
3121 hash(d)
3122 except TypeError:
3123 pass
3124 else:
3125 raise TestFailed, "hash() of dict subclass should fail"
3126
3127 class mylist(list):
3128 pass
3129 d = mylist()
3130 try:
3131 hash(d)
3132 except TypeError:
3133 pass
3134 else:
3135 raise TestFailed, "hash() of list subclass should fail"
3136
Guido van Rossum29d26062001-12-11 04:37:34 +00003137def strops():
3138 try: 'a' + 5
3139 except TypeError: pass
3140 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3141
3142 try: ''.split('')
3143 except ValueError: pass
3144 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3145
3146 try: ''.join([0])
3147 except TypeError: pass
3148 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3149
3150 try: ''.rindex('5')
3151 except ValueError: pass
3152 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3153
Guido van Rossum29d26062001-12-11 04:37:34 +00003154 try: '%(n)s' % None
3155 except TypeError: pass
3156 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3157
3158 try: '%(n' % {}
3159 except ValueError: pass
3160 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3161
3162 try: '%*s' % ('abc')
3163 except TypeError: pass
3164 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3165
3166 try: '%*.*s' % ('abc', 5)
3167 except TypeError: pass
3168 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3169
3170 try: '%s' % (1, 2)
3171 except TypeError: pass
3172 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3173
3174 try: '%' % None
3175 except ValueError: pass
3176 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3177
3178 vereq('534253'.isdigit(), 1)
3179 vereq('534253x'.isdigit(), 0)
3180 vereq('%c' % 5, '\x05')
3181 vereq('%c' % '5', '5')
3182
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003183def deepcopyrecursive():
3184 if verbose: print "Testing deepcopy of recursive objects..."
3185 class Node:
3186 pass
3187 a = Node()
3188 b = Node()
3189 a.b = b
3190 b.a = a
3191 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003192
Guido van Rossumd7035672002-03-12 20:43:31 +00003193def modules():
3194 if verbose: print "Testing uninitialized module objects..."
3195 from types import ModuleType as M
3196 m = M.__new__(M)
3197 str(m)
3198 vereq(hasattr(m, "__name__"), 0)
3199 vereq(hasattr(m, "__file__"), 0)
3200 vereq(hasattr(m, "foo"), 0)
3201 vereq(m.__dict__, None)
3202 m.foo = 1
3203 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003204
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003205def dictproxyiterkeys():
3206 class C(object):
3207 def meth(self):
3208 pass
3209 if verbose: print "Testing dict-proxy iterkeys..."
3210 keys = [ key for key in C.__dict__.iterkeys() ]
3211 keys.sort()
3212 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3213
3214def dictproxyitervalues():
3215 class C(object):
3216 def meth(self):
3217 pass
3218 if verbose: print "Testing dict-proxy itervalues..."
3219 values = [ values for values in C.__dict__.itervalues() ]
3220 vereq(len(values), 5)
3221
3222def dictproxyiteritems():
3223 class C(object):
3224 def meth(self):
3225 pass
3226 if verbose: print "Testing dict-proxy iteritems..."
3227 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3228 keys.sort()
3229 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3230
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003231def funnynew():
3232 if verbose: print "Testing __new__ returning something unexpected..."
3233 class C(object):
3234 def __new__(cls, arg):
3235 if isinstance(arg, str): return [1, 2, 3]
3236 elif isinstance(arg, int): return object.__new__(D)
3237 else: return object.__new__(cls)
3238 class D(C):
3239 def __init__(self, arg):
3240 self.foo = arg
3241 vereq(C("1"), [1, 2, 3])
3242 vereq(D("1"), [1, 2, 3])
3243 d = D(None)
3244 veris(d.foo, None)
3245 d = C(1)
3246 vereq(isinstance(d, D), True)
3247 vereq(d.foo, 1)
3248 d = D(1)
3249 vereq(isinstance(d, D), True)
3250 vereq(d.foo, 1)
3251
Guido van Rossume8fc6402002-04-16 16:44:51 +00003252def imulbug():
3253 # SF bug 544647
3254 if verbose: print "Testing for __imul__ problems..."
3255 class C(object):
3256 def __imul__(self, other):
3257 return (self, other)
3258 x = C()
3259 y = x
3260 y *= 1.0
3261 vereq(y, (x, 1.0))
3262 y = x
3263 y *= 2
3264 vereq(y, (x, 2))
3265 y = x
3266 y *= 3L
3267 vereq(y, (x, 3L))
3268 y = x
3269 y *= 1L<<100
3270 vereq(y, (x, 1L<<100))
3271 y = x
3272 y *= None
3273 vereq(y, (x, None))
3274 y = x
3275 y *= "foo"
3276 vereq(y, (x, "foo"))
3277
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003278def docdescriptor():
3279 # SF bug 542984
3280 if verbose: print "Testing __doc__ descriptor..."
3281 class DocDescr(object):
3282 def __get__(self, object, otype):
3283 if object:
3284 object = object.__class__.__name__ + ' instance'
3285 if otype:
3286 otype = otype.__name__
3287 return 'object=%s; type=%s' % (object, otype)
3288 class OldClass:
3289 __doc__ = DocDescr()
3290 class NewClass(object):
3291 __doc__ = DocDescr()
3292 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3293 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3294 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3295 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3296
Tim Petersafb2c802002-04-18 18:06:20 +00003297def string_exceptions():
3298 if verbose:
3299 print "Testing string exceptions ..."
3300
3301 # Ensure builtin strings work OK as exceptions.
3302 astring = "An exception string."
3303 try:
3304 raise astring
3305 except astring:
3306 pass
3307 else:
3308 raise TestFailed, "builtin string not usable as exception"
3309
3310 # Ensure string subclass instances do not.
3311 class MyStr(str):
3312 pass
3313
3314 newstring = MyStr("oops -- shouldn't work")
3315 try:
3316 raise newstring
3317 except TypeError:
3318 pass
3319 except:
3320 raise TestFailed, "string subclass allowed as exception"
3321
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003322def copy_setstate():
3323 if verbose:
3324 print "Testing that copy.*copy() correctly uses __setstate__..."
3325 import copy
3326 class C(object):
3327 def __init__(self, foo=None):
3328 self.foo = foo
3329 self.__foo = foo
3330 def setfoo(self, foo=None):
3331 self.foo = foo
3332 def getfoo(self):
3333 return self.__foo
3334 def __getstate__(self):
3335 return [self.foo]
3336 def __setstate__(self, lst):
3337 assert len(lst) == 1
3338 self.__foo = self.foo = lst[0]
3339 a = C(42)
3340 a.setfoo(24)
3341 vereq(a.foo, 24)
3342 vereq(a.getfoo(), 42)
3343 b = copy.copy(a)
3344 vereq(b.foo, 24)
3345 vereq(b.getfoo(), 24)
3346 b = copy.deepcopy(a)
3347 vereq(b.foo, 24)
3348 vereq(b.getfoo(), 24)
3349
Guido van Rossum09638c12002-06-13 19:17:46 +00003350def slices():
3351 if verbose:
3352 print "Testing cases with slices and overridden __getitem__ ..."
3353 # Strings
3354 vereq("hello"[:4], "hell")
3355 vereq("hello"[slice(4)], "hell")
3356 vereq(str.__getitem__("hello", slice(4)), "hell")
3357 class S(str):
3358 def __getitem__(self, x):
3359 return str.__getitem__(self, x)
3360 vereq(S("hello")[:4], "hell")
3361 vereq(S("hello")[slice(4)], "hell")
3362 vereq(S("hello").__getitem__(slice(4)), "hell")
3363 # Tuples
3364 vereq((1,2,3)[:2], (1,2))
3365 vereq((1,2,3)[slice(2)], (1,2))
3366 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3367 class T(tuple):
3368 def __getitem__(self, x):
3369 return tuple.__getitem__(self, x)
3370 vereq(T((1,2,3))[:2], (1,2))
3371 vereq(T((1,2,3))[slice(2)], (1,2))
3372 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3373 # Lists
3374 vereq([1,2,3][:2], [1,2])
3375 vereq([1,2,3][slice(2)], [1,2])
3376 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3377 class L(list):
3378 def __getitem__(self, x):
3379 return list.__getitem__(self, x)
3380 vereq(L([1,2,3])[:2], [1,2])
3381 vereq(L([1,2,3])[slice(2)], [1,2])
3382 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3383 # Now do lists and __setitem__
3384 a = L([1,2,3])
3385 a[slice(1, 3)] = [3,2]
3386 vereq(a, [1,3,2])
3387 a[slice(0, 2, 1)] = [3,1]
3388 vereq(a, [3,1,2])
3389 a.__setitem__(slice(1, 3), [2,1])
3390 vereq(a, [3,2,1])
3391 a.__setitem__(slice(0, 2, 1), [2,3])
3392 vereq(a, [2,3,1])
3393
Tim Peters2484aae2002-07-11 06:56:07 +00003394def subtype_resurrection():
3395 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003396 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003397
3398 class C(object):
3399 container = []
3400
3401 def __del__(self):
3402 # resurrect the instance
3403 C.container.append(self)
3404
3405 c = C()
3406 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003407 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003408 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003409 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003410
3411 # If that didn't blow up, it's also interesting to see whether clearing
3412 # the last container slot works: that will attempt to delete c again,
3413 # which will cause c to get appended back to the container again "during"
3414 # the del.
3415 del C.container[-1]
3416 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003417 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003418
Tim Peters14cb1e12002-07-11 18:26:21 +00003419 # Make c mortal again, so that the test framework with -l doesn't report
3420 # it as a leak.
3421 del C.__del__
3422
Guido van Rossum2d702462002-08-06 21:28:28 +00003423def slottrash():
3424 # Deallocating deeply nested slotted trash caused stack overflows
3425 if verbose:
3426 print "Testing slot trash..."
3427 class trash(object):
3428 __slots__ = ['x']
3429 def __init__(self, x):
3430 self.x = x
3431 o = None
3432 for i in xrange(50000):
3433 o = trash(o)
3434 del o
3435
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003436def slotmultipleinheritance():
3437 # SF bug 575229, multiple inheritance w/ slots dumps core
3438 class A(object):
3439 __slots__=()
3440 class B(object):
3441 pass
3442 class C(A,B) :
3443 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003444 vereq(C.__basicsize__, B.__basicsize__)
3445 verify(hasattr(C, '__dict__'))
3446 verify(hasattr(C, '__weakref__'))
3447 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003448
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003449def testrmul():
3450 # SF patch 592646
3451 if verbose:
3452 print "Testing correct invocation of __rmul__..."
3453 class C(object):
3454 def __mul__(self, other):
3455 return "mul"
3456 def __rmul__(self, other):
3457 return "rmul"
3458 a = C()
3459 vereq(a*2, "mul")
3460 vereq(a*2.2, "mul")
3461 vereq(2*a, "rmul")
3462 vereq(2.2*a, "rmul")
3463
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003464def testipow():
3465 # [SF bug 620179]
3466 if verbose:
3467 print "Testing correct invocation of __ipow__..."
3468 class C(object):
3469 def __ipow__(self, other):
3470 pass
3471 a = C()
3472 a **= 2
3473
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003474def do_this_first():
3475 if verbose:
3476 print "Testing SF bug 551412 ..."
3477 # This dumps core when SF bug 551412 isn't fixed --
3478 # but only when test_descr.py is run separately.
3479 # (That can't be helped -- as soon as PyType_Ready()
3480 # is called for PyLong_Type, the bug is gone.)
3481 class UserLong(object):
3482 def __pow__(self, *args):
3483 pass
3484 try:
3485 pow(0L, UserLong(), 0L)
3486 except:
3487 pass
3488
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003489 if verbose:
3490 print "Testing SF bug 570483..."
3491 # Another segfault only when run early
3492 # (before PyType_Ready(tuple) is called)
3493 type.mro(tuple)
3494
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003495def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003496 if verbose:
3497 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003498 # stuff that should work:
3499 class C(object):
3500 pass
3501 class C2(object):
3502 def __getattribute__(self, attr):
3503 if attr == 'a':
3504 return 2
3505 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003506 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003507 def meth(self):
3508 return 1
3509 class D(C):
3510 pass
3511 class E(D):
3512 pass
3513 d = D()
3514 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003515 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003516 D.__bases__ = (C2,)
3517 vereq(d.meth(), 1)
3518 vereq(e.meth(), 1)
3519 vereq(d.a, 2)
3520 vereq(e.a, 2)
3521 vereq(C2.__subclasses__(), [D])
3522
3523 # stuff that shouldn't:
3524 class L(list):
3525 pass
3526
3527 try:
3528 L.__bases__ = (dict,)
3529 except TypeError:
3530 pass
3531 else:
3532 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3533
3534 try:
3535 list.__bases__ = (dict,)
3536 except TypeError:
3537 pass
3538 else:
3539 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3540
3541 try:
3542 del D.__bases__
3543 except TypeError:
3544 pass
3545 else:
3546 raise TestFailed, "shouldn't be able to delete .__bases__"
3547
3548 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003549 D.__bases__ = ()
3550 except TypeError, msg:
3551 if str(msg) == "a new-style class can't have only classic bases":
3552 raise TestFailed, "wrong error message for .__bases__ = ()"
3553 else:
3554 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3555
3556 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003557 D.__bases__ = (D,)
3558 except TypeError:
3559 pass
3560 else:
3561 # actually, we'll have crashed by here...
3562 raise TestFailed, "shouldn't be able to create inheritance cycles"
3563
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003564 try:
3565 D.__bases__ = (E,)
3566 except TypeError:
3567 pass
3568 else:
3569 raise TestFailed, "shouldn't be able to create inheritance cycles"
3570
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003571 # let's throw a classic class into the mix:
3572 class Classic:
3573 def meth2(self):
3574 return 3
3575
3576 D.__bases__ = (C, Classic)
3577
3578 vereq(d.meth2(), 3)
3579 vereq(e.meth2(), 3)
3580 try:
3581 d.a
3582 except AttributeError:
3583 pass
3584 else:
3585 raise TestFailed, "attribute should have vanished"
3586
3587 try:
3588 D.__bases__ = (Classic,)
3589 except TypeError:
3590 pass
3591 else:
3592 raise TestFailed, "new-style class must have a new-style base"
3593
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003594def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003595 if verbose:
3596 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003597 class WorkOnce(type):
3598 def __new__(self, name, bases, ns):
3599 self.flag = 0
3600 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3601 def mro(self):
3602 if self.flag > 0:
3603 raise RuntimeError, "bozo"
3604 else:
3605 self.flag += 1
3606 return type.mro(self)
3607
3608 class WorkAlways(type):
3609 def mro(self):
3610 # this is here to make sure that .mro()s aren't called
3611 # with an exception set (which was possible at one point).
3612 # An error message will be printed in a debug build.
3613 # What's a good way to test for this?
3614 return type.mro(self)
3615
3616 class C(object):
3617 pass
3618
3619 class C2(object):
3620 pass
3621
3622 class D(C):
3623 pass
3624
3625 class E(D):
3626 pass
3627
3628 class F(D):
3629 __metaclass__ = WorkOnce
3630
3631 class G(D):
3632 __metaclass__ = WorkAlways
3633
3634 # Immediate subclasses have their mro's adjusted in alphabetical
3635 # order, so E's will get adjusted before adjusting F's fails. We
3636 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003637
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003638 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003639 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003640
3641 try:
3642 D.__bases__ = (C2,)
3643 except RuntimeError:
3644 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003645 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003646 else:
3647 raise TestFailed, "exception not propagated"
3648
3649def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003650 if verbose:
3651 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003652 class A(object):
3653 pass
3654
3655 class B(object):
3656 pass
3657
3658 class C(A, B):
3659 pass
3660
3661 class D(A, B):
3662 pass
3663
3664 class E(C, D):
3665 pass
3666
3667 try:
3668 C.__bases__ = (B, A)
3669 except TypeError:
3670 pass
3671 else:
3672 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003673
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003674def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003675 if verbose:
3676 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003677 class C(object):
3678 pass
3679
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003680 # C.__module__ could be 'test_descr' or '__main__'
3681 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003682
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003683 C.__name__ = 'D'
3684 vereq((C.__module__, C.__name__), (mod, 'D'))
3685
3686 C.__name__ = 'D.E'
3687 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003688
Guido van Rossum613f24f2003-01-06 23:00:59 +00003689def subclass_right_op():
3690 if verbose:
3691 print "Testing correct dispatch of subclass overloading __r<op>__..."
3692
3693 # This code tests various cases where right-dispatch of a subclass
3694 # should be preferred over left-dispatch of a base class.
3695
3696 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3697
3698 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003699 def __floordiv__(self, other):
3700 return "B.__floordiv__"
3701 def __rfloordiv__(self, other):
3702 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003703
Guido van Rossumf389c772003-02-27 20:04:19 +00003704 vereq(B(1) // 1, "B.__floordiv__")
3705 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003706
3707 # Case 2: subclass of object; this is just the baseline for case 3
3708
3709 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003710 def __floordiv__(self, other):
3711 return "C.__floordiv__"
3712 def __rfloordiv__(self, other):
3713 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003714
Guido van Rossumf389c772003-02-27 20:04:19 +00003715 vereq(C() // 1, "C.__floordiv__")
3716 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003717
3718 # Case 3: subclass of new-style class; here it gets interesting
3719
3720 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003721 def __floordiv__(self, other):
3722 return "D.__floordiv__"
3723 def __rfloordiv__(self, other):
3724 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003725
Guido van Rossumf389c772003-02-27 20:04:19 +00003726 vereq(D() // C(), "D.__floordiv__")
3727 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003728
3729 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3730
3731 class E(C):
3732 pass
3733
Guido van Rossumf389c772003-02-27 20:04:19 +00003734 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003735
Guido van Rossumf389c772003-02-27 20:04:19 +00003736 vereq(E() // 1, "C.__floordiv__")
3737 vereq(1 // E(), "C.__rfloordiv__")
3738 vereq(E() // C(), "C.__floordiv__")
3739 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003740
Guido van Rossum373c7412003-01-07 13:41:37 +00003741def dict_type_with_metaclass():
3742 if verbose:
3743 print "Testing type of __dict__ when __metaclass__ set..."
3744
3745 class B(object):
3746 pass
3747 class M(type):
3748 pass
3749 class C:
3750 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3751 __metaclass__ = M
3752 veris(type(C.__dict__), type(B.__dict__))
3753
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003754def meth_class_get():
3755 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003756 if verbose:
3757 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003758 # Baseline
3759 arg = [1, 2, 3]
3760 res = {1: None, 2: None, 3: None}
3761 vereq(dict.fromkeys(arg), res)
3762 vereq({}.fromkeys(arg), res)
3763 # Now get the descriptor
3764 descr = dict.__dict__["fromkeys"]
3765 # More baseline using the descriptor directly
3766 vereq(descr.__get__(None, dict)(arg), res)
3767 vereq(descr.__get__({})(arg), res)
3768 # Now check various error cases
3769 try:
3770 descr.__get__(None, None)
3771 except TypeError:
3772 pass
3773 else:
3774 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3775 try:
3776 descr.__get__(42)
3777 except TypeError:
3778 pass
3779 else:
3780 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3781 try:
3782 descr.__get__(None, 42)
3783 except TypeError:
3784 pass
3785 else:
3786 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3787 try:
3788 descr.__get__(None, int)
3789 except TypeError:
3790 pass
3791 else:
3792 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3793
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003794def isinst_isclass():
3795 if verbose:
3796 print "Testing proxy isinstance() and isclass()..."
3797 class Proxy(object):
3798 def __init__(self, obj):
3799 self.__obj = obj
3800 def __getattribute__(self, name):
3801 if name.startswith("_Proxy__"):
3802 return object.__getattribute__(self, name)
3803 else:
3804 return getattr(self.__obj, name)
3805 # Test with a classic class
3806 class C:
3807 pass
3808 a = C()
3809 pa = Proxy(a)
3810 verify(isinstance(a, C)) # Baseline
3811 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003812 # Test with a classic subclass
3813 class D(C):
3814 pass
3815 a = D()
3816 pa = Proxy(a)
3817 verify(isinstance(a, C)) # Baseline
3818 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003819 # Test with a new-style class
3820 class C(object):
3821 pass
3822 a = C()
3823 pa = Proxy(a)
3824 verify(isinstance(a, C)) # Baseline
3825 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003826 # Test with a new-style subclass
3827 class D(C):
3828 pass
3829 a = D()
3830 pa = Proxy(a)
3831 verify(isinstance(a, C)) # Baseline
3832 verify(isinstance(pa, C)) # Test
3833
3834def proxysuper():
3835 if verbose:
3836 print "Testing super() for a proxy object..."
3837 class Proxy(object):
3838 def __init__(self, obj):
3839 self.__obj = obj
3840 def __getattribute__(self, name):
3841 if name.startswith("_Proxy__"):
3842 return object.__getattribute__(self, name)
3843 else:
3844 return getattr(self.__obj, name)
3845
3846 class B(object):
3847 def f(self):
3848 return "B.f"
3849
3850 class C(B):
3851 def f(self):
3852 return super(C, self).f() + "->C.f"
3853
3854 obj = C()
3855 p = Proxy(obj)
3856 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003857
Guido van Rossum52b27052003-04-15 20:05:10 +00003858def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003859 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00003860 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003861 try:
3862 object.__setattr__(str, "foo", 42)
3863 except TypeError:
3864 pass
3865 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003866 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003867 try:
3868 object.__delattr__(str, "lower")
3869 except TypeError:
3870 pass
3871 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003872 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003873
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003874
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003875def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003876 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003877 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003878 lists()
3879 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003880 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003881 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003882 ints()
3883 longs()
3884 floats()
3885 complexes()
3886 spamlists()
3887 spamdicts()
3888 pydicts()
3889 pylists()
3890 metaclass()
3891 pymods()
3892 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00003893 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003894 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00003895 ex5()
3896 monotonicity()
3897 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00003898 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003899 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003900 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003901 dynamics()
3902 errors()
3903 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003904 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003905 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003906 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003907 classic()
3908 compattr()
3909 newslot()
3910 altmro()
3911 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003912 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003913 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003914 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003915 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003916 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003917 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003918 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003919 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003920 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003921 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003922 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003923 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003924 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003925 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003926 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003927 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003928 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003929 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003930 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003931 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003932 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003933 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003934 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003935 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003936 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003937 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003938 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003939 dictproxyiterkeys()
3940 dictproxyitervalues()
3941 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003942 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003943 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003944 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003945 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003946 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003947 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003948 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003949 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003950 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003951 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003952 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003953 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003954 test_mutable_bases()
3955 test_mutable_bases_with_failing_mro()
3956 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003957 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00003958 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00003959 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003960 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003961 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003962 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00003963 carloverre()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003964
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003965 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003966
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003967if __name__ == "__main__":
3968 test_main()