blob: 9587596187469874ec55e9c15955d8cba569ffff [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)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001270 class H(object):
1271 __slots__ = ['a', 'b']
1272 def __init__(self):
1273 self.a = 1
1274 self.b = 2
1275 def __del__(self):
1276 assert self.a == 1
1277 assert self.b == 2
1278
1279 save_stderr = sys.stderr
1280 sys.stderr = sys.stdout
1281 h = H()
1282 try:
1283 del h
1284 finally:
1285 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001286
Guido van Rossum8b056da2002-08-13 18:26:26 +00001287def slotspecials():
1288 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1289
1290 class D(object):
1291 __slots__ = ["__dict__"]
1292 a = D()
1293 verify(hasattr(a, "__dict__"))
1294 verify(not hasattr(a, "__weakref__"))
1295 a.foo = 42
1296 vereq(a.__dict__, {"foo": 42})
1297
1298 class W(object):
1299 __slots__ = ["__weakref__"]
1300 a = W()
1301 verify(hasattr(a, "__weakref__"))
1302 verify(not hasattr(a, "__dict__"))
1303 try:
1304 a.foo = 42
1305 except AttributeError:
1306 pass
1307 else:
1308 raise TestFailed, "shouldn't be allowed to set a.foo"
1309
1310 class C1(W, D):
1311 __slots__ = []
1312 a = C1()
1313 verify(hasattr(a, "__dict__"))
1314 verify(hasattr(a, "__weakref__"))
1315 a.foo = 42
1316 vereq(a.__dict__, {"foo": 42})
1317
1318 class C2(D, W):
1319 __slots__ = []
1320 a = C2()
1321 verify(hasattr(a, "__dict__"))
1322 verify(hasattr(a, "__weakref__"))
1323 a.foo = 42
1324 vereq(a.__dict__, {"foo": 42})
1325
Guido van Rossum9a818922002-11-14 19:50:14 +00001326# MRO order disagreement
1327#
1328# class C3(C1, C2):
1329# __slots__ = []
1330#
1331# class C4(C2, C1):
1332# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001333
Tim Peters6d6c1a32001-08-02 04:15:00 +00001334def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001335 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001337 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001338 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001339 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001340 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001343 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001344 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001345 vereq(E.foo, 1)
1346 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001347 # Test dynamic instances
1348 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001349 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001350 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001351 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001352 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001353 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001354 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001355 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001356 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001357 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001358 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(int(a), 100)
1360 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001361 verify(not hasattr(a, "spam"))
1362 def mygetattr(self, name):
1363 if name == "spam":
1364 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001365 raise AttributeError
1366 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001367 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001368 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001369 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001370 def mysetattr(self, name, value):
1371 if name == "spam":
1372 raise AttributeError
1373 return object.__setattr__(self, name, value)
1374 C.__setattr__ = mysetattr
1375 try:
1376 a.spam = "not spam"
1377 except AttributeError:
1378 pass
1379 else:
1380 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001381 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001382 class D(C):
1383 pass
1384 d = D()
1385 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001386 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001387
Guido van Rossum7e35d572001-09-15 03:14:32 +00001388 # Test handling of int*seq and seq*int
1389 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001390 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001391 vereq("a"*I(2), "aa")
1392 vereq(I(2)*"a", "aa")
1393 vereq(2*I(3), 6)
1394 vereq(I(3)*2, 6)
1395 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001396
1397 # Test handling of long*seq and seq*long
1398 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001399 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001400 vereq("a"*L(2L), "aa")
1401 vereq(L(2L)*"a", "aa")
1402 vereq(2*L(3), 6)
1403 vereq(L(3)*2, 6)
1404 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001405
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001406 # Test comparison of classes with dynamic metaclasses
1407 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001408 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001409 class someclass:
1410 __metaclass__ = dynamicmetaclass
1411 verify(someclass != object)
1412
Tim Peters6d6c1a32001-08-02 04:15:00 +00001413def errors():
1414 if verbose: print "Testing errors..."
1415
1416 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001417 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001418 pass
1419 except TypeError:
1420 pass
1421 else:
1422 verify(0, "inheritance from both list and dict should be illegal")
1423
1424 try:
1425 class C(object, None):
1426 pass
1427 except TypeError:
1428 pass
1429 else:
1430 verify(0, "inheritance from non-type should be illegal")
1431 class Classic:
1432 pass
1433
1434 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001435 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001436 pass
1437 except TypeError:
1438 pass
1439 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001440 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001441
1442 try:
1443 class C(object):
1444 __slots__ = 1
1445 except TypeError:
1446 pass
1447 else:
1448 verify(0, "__slots__ = 1 should be illegal")
1449
1450 try:
1451 class C(object):
1452 __slots__ = [1]
1453 except TypeError:
1454 pass
1455 else:
1456 verify(0, "__slots__ = [1] should be illegal")
1457
1458def classmethods():
1459 if verbose: print "Testing class methods..."
1460 class C(object):
1461 def foo(*a): return a
1462 goo = classmethod(foo)
1463 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001464 vereq(C.goo(1), (C, 1))
1465 vereq(c.goo(1), (C, 1))
1466 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001467 class D(C):
1468 pass
1469 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001470 vereq(D.goo(1), (D, 1))
1471 vereq(d.goo(1), (D, 1))
1472 vereq(d.foo(1), (d, 1))
1473 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001474 # Test for a specific crash (SF bug 528132)
1475 def f(cls, arg): return (cls, arg)
1476 ff = classmethod(f)
1477 vereq(ff.__get__(0, int)(42), (int, 42))
1478 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001479
Guido van Rossum155db9a2002-04-02 17:53:47 +00001480 # Test super() with classmethods (SF bug 535444)
1481 veris(C.goo.im_self, C)
1482 veris(D.goo.im_self, D)
1483 veris(super(D,D).goo.im_self, D)
1484 veris(super(D,d).goo.im_self, D)
1485 vereq(super(D,D).goo(), (D,))
1486 vereq(super(D,d).goo(), (D,))
1487
Fred Drakef841aa62002-03-28 15:49:54 +00001488def classmethods_in_c():
1489 if verbose: print "Testing C-based class methods..."
1490 import xxsubtype as spam
1491 a = (1, 2, 3)
1492 d = {'abc': 123}
1493 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001494 veris(x, spam.spamlist)
1495 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001496 vereq(d, d1)
1497 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001498 veris(x, spam.spamlist)
1499 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001500 vereq(d, d1)
1501
Tim Peters6d6c1a32001-08-02 04:15:00 +00001502def staticmethods():
1503 if verbose: print "Testing static methods..."
1504 class C(object):
1505 def foo(*a): return a
1506 goo = staticmethod(foo)
1507 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001508 vereq(C.goo(1), (1,))
1509 vereq(c.goo(1), (1,))
1510 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001511 class D(C):
1512 pass
1513 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001514 vereq(D.goo(1), (1,))
1515 vereq(d.goo(1), (1,))
1516 vereq(d.foo(1), (d, 1))
1517 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001518
Fred Drakef841aa62002-03-28 15:49:54 +00001519def staticmethods_in_c():
1520 if verbose: print "Testing C-based static methods..."
1521 import xxsubtype as spam
1522 a = (1, 2, 3)
1523 d = {"abc": 123}
1524 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1525 veris(x, None)
1526 vereq(a, a1)
1527 vereq(d, d1)
1528 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1529 veris(x, None)
1530 vereq(a, a1)
1531 vereq(d, d1)
1532
Tim Peters6d6c1a32001-08-02 04:15:00 +00001533def classic():
1534 if verbose: print "Testing classic classes..."
1535 class C:
1536 def foo(*a): return a
1537 goo = classmethod(foo)
1538 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001539 vereq(C.goo(1), (C, 1))
1540 vereq(c.goo(1), (C, 1))
1541 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001542 class D(C):
1543 pass
1544 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001545 vereq(D.goo(1), (D, 1))
1546 vereq(d.goo(1), (D, 1))
1547 vereq(d.foo(1), (d, 1))
1548 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001549 class E: # *not* subclassing from C
1550 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001551 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001552 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001553
1554def compattr():
1555 if verbose: print "Testing computed attributes..."
1556 class C(object):
1557 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001558 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001559 self.__get = get
1560 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001561 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001562 def __get__(self, obj, type=None):
1563 return self.__get(obj)
1564 def __set__(self, obj, value):
1565 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001566 def __delete__(self, obj):
1567 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001568 def __init__(self):
1569 self.__x = 0
1570 def __get_x(self):
1571 x = self.__x
1572 self.__x = x+1
1573 return x
1574 def __set_x(self, x):
1575 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001576 def __delete_x(self):
1577 del self.__x
1578 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001579 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001580 vereq(a.x, 0)
1581 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001582 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(a.x, 10)
1584 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001585 del a.x
1586 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587
1588def newslot():
1589 if verbose: print "Testing __new__ slot override..."
1590 class C(list):
1591 def __new__(cls):
1592 self = list.__new__(cls)
1593 self.foo = 1
1594 return self
1595 def __init__(self):
1596 self.foo = self.foo + 2
1597 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001598 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001599 verify(a.__class__ is C)
1600 class D(C):
1601 pass
1602 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001603 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001604 verify(b.__class__ is D)
1605
Tim Peters6d6c1a32001-08-02 04:15:00 +00001606def altmro():
1607 if verbose: print "Testing mro() and overriding it..."
1608 class A(object):
1609 def f(self): return "A"
1610 class B(A):
1611 pass
1612 class C(A):
1613 def f(self): return "C"
1614 class D(B, C):
1615 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001616 vereq(D.mro(), [D, B, C, A, object])
1617 vereq(D.__mro__, (D, B, C, A, object))
1618 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001619
Guido van Rossumd3077402001-08-12 05:24:18 +00001620 class PerverseMetaType(type):
1621 def mro(cls):
1622 L = type.mro(cls)
1623 L.reverse()
1624 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001625 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001626 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001627 vereq(X.__mro__, (object, A, C, B, D, X))
1628 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001629
1630def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001631 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001632
1633 class B(object):
1634 "Intermediate class because object doesn't have a __setattr__"
1635
1636 class C(B):
1637
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001638 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001639 if name == "foo":
1640 return ("getattr", name)
1641 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001642 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001643 def __setattr__(self, name, value):
1644 if name == "foo":
1645 self.setattr = (name, value)
1646 else:
1647 return B.__setattr__(self, name, value)
1648 def __delattr__(self, name):
1649 if name == "foo":
1650 self.delattr = name
1651 else:
1652 return B.__delattr__(self, name)
1653
1654 def __getitem__(self, key):
1655 return ("getitem", key)
1656 def __setitem__(self, key, value):
1657 self.setitem = (key, value)
1658 def __delitem__(self, key):
1659 self.delitem = key
1660
1661 def __getslice__(self, i, j):
1662 return ("getslice", i, j)
1663 def __setslice__(self, i, j, value):
1664 self.setslice = (i, j, value)
1665 def __delslice__(self, i, j):
1666 self.delslice = (i, j)
1667
1668 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001669 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001670 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001671 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001672 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001673 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001674
Guido van Rossum45704552001-10-08 16:35:45 +00001675 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001676 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001677 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001678 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001679 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001680
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001682 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001684 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001685 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001686
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001687def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001688 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001689 class C(object):
1690 def __init__(self, x):
1691 self.x = x
1692 def foo(self):
1693 return self.x
1694 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001695 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001696 class D(C):
1697 boo = C.foo
1698 goo = c1.foo
1699 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001700 vereq(d2.foo(), 2)
1701 vereq(d2.boo(), 2)
1702 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001703 class E(object):
1704 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001705 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001706 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001707
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001708def specials():
1709 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001710 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001711 # Test the default behavior for static classes
1712 class C(object):
1713 def __getitem__(self, i):
1714 if 0 <= i < 10: return i
1715 raise IndexError
1716 c1 = C()
1717 c2 = C()
1718 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001719 vereq(hash(c1), id(c1))
1720 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1721 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001722 verify(c1 != c2)
1723 verify(not c1 != c1)
1724 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001725 # Note that the module name appears in str/repr, and that varies
1726 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001727 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001728 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001729 verify(-1 not in c1)
1730 for i in range(10):
1731 verify(i in c1)
1732 verify(10 not in c1)
1733 # Test the default behavior for dynamic classes
1734 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001735 def __getitem__(self, i):
1736 if 0 <= i < 10: return i
1737 raise IndexError
1738 d1 = D()
1739 d2 = D()
1740 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001741 vereq(hash(d1), id(d1))
1742 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1743 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001744 verify(d1 != d2)
1745 verify(not d1 != d1)
1746 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001747 # Note that the module name appears in str/repr, and that varies
1748 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001749 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001750 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001751 verify(-1 not in d1)
1752 for i in range(10):
1753 verify(i in d1)
1754 verify(10 not in d1)
1755 # Test overridden behavior for static classes
1756 class Proxy(object):
1757 def __init__(self, x):
1758 self.x = x
1759 def __nonzero__(self):
1760 return not not self.x
1761 def __hash__(self):
1762 return hash(self.x)
1763 def __eq__(self, other):
1764 return self.x == other
1765 def __ne__(self, other):
1766 return self.x != other
1767 def __cmp__(self, other):
1768 return cmp(self.x, other.x)
1769 def __str__(self):
1770 return "Proxy:%s" % self.x
1771 def __repr__(self):
1772 return "Proxy(%r)" % self.x
1773 def __contains__(self, value):
1774 return value in self.x
1775 p0 = Proxy(0)
1776 p1 = Proxy(1)
1777 p_1 = Proxy(-1)
1778 verify(not p0)
1779 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001780 vereq(hash(p0), hash(0))
1781 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001782 verify(p0 != p1)
1783 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001784 vereq(not p0, p1)
1785 vereq(cmp(p0, p1), -1)
1786 vereq(cmp(p0, p0), 0)
1787 vereq(cmp(p0, p_1), 1)
1788 vereq(str(p0), "Proxy:0")
1789 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001790 p10 = Proxy(range(10))
1791 verify(-1 not in p10)
1792 for i in range(10):
1793 verify(i in p10)
1794 verify(10 not in p10)
1795 # Test overridden behavior for dynamic classes
1796 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001797 def __init__(self, x):
1798 self.x = x
1799 def __nonzero__(self):
1800 return not not self.x
1801 def __hash__(self):
1802 return hash(self.x)
1803 def __eq__(self, other):
1804 return self.x == other
1805 def __ne__(self, other):
1806 return self.x != other
1807 def __cmp__(self, other):
1808 return cmp(self.x, other.x)
1809 def __str__(self):
1810 return "DProxy:%s" % self.x
1811 def __repr__(self):
1812 return "DProxy(%r)" % self.x
1813 def __contains__(self, value):
1814 return value in self.x
1815 p0 = DProxy(0)
1816 p1 = DProxy(1)
1817 p_1 = DProxy(-1)
1818 verify(not p0)
1819 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001820 vereq(hash(p0), hash(0))
1821 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001822 verify(p0 != p1)
1823 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001824 vereq(not p0, p1)
1825 vereq(cmp(p0, p1), -1)
1826 vereq(cmp(p0, p0), 0)
1827 vereq(cmp(p0, p_1), 1)
1828 vereq(str(p0), "DProxy:0")
1829 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001830 p10 = DProxy(range(10))
1831 verify(-1 not in p10)
1832 for i in range(10):
1833 verify(i in p10)
1834 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001835 # Safety test for __cmp__
1836 def unsafecmp(a, b):
1837 try:
1838 a.__class__.__cmp__(a, b)
1839 except TypeError:
1840 pass
1841 else:
1842 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1843 a.__class__, a, b)
1844 unsafecmp(u"123", "123")
1845 unsafecmp("123", u"123")
1846 unsafecmp(1, 1.0)
1847 unsafecmp(1.0, 1)
1848 unsafecmp(1, 1L)
1849 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001850
Neal Norwitz1a997502003-01-13 20:13:12 +00001851 class Letter(str):
1852 def __new__(cls, letter):
1853 if letter == 'EPS':
1854 return str.__new__(cls)
1855 return str.__new__(cls, letter)
1856 def __str__(self):
1857 if not self:
1858 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001859 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001860
1861 # sys.stdout needs to be the original to trigger the recursion bug
1862 import sys
1863 test_stdout = sys.stdout
1864 sys.stdout = get_original_stdout()
1865 try:
1866 # nothing should actually be printed, this should raise an exception
1867 print Letter('w')
1868 except RuntimeError:
1869 pass
1870 else:
1871 raise TestFailed, "expected a RuntimeError for print recursion"
1872 sys.stdout = test_stdout
1873
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001874def weakrefs():
1875 if verbose: print "Testing weak references..."
1876 import weakref
1877 class C(object):
1878 pass
1879 c = C()
1880 r = weakref.ref(c)
1881 verify(r() is c)
1882 del c
1883 verify(r() is None)
1884 del r
1885 class NoWeak(object):
1886 __slots__ = ['foo']
1887 no = NoWeak()
1888 try:
1889 weakref.ref(no)
1890 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001891 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001892 else:
1893 verify(0, "weakref.ref(no) should be illegal")
1894 class Weak(object):
1895 __slots__ = ['foo', '__weakref__']
1896 yes = Weak()
1897 r = weakref.ref(yes)
1898 verify(r() is yes)
1899 del yes
1900 verify(r() is None)
1901 del r
1902
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001903def properties():
1904 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001905 class C(object):
1906 def getx(self):
1907 return self.__x
1908 def setx(self, value):
1909 self.__x = value
1910 def delx(self):
1911 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001912 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001913 a = C()
1914 verify(not hasattr(a, "x"))
1915 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001916 vereq(a._C__x, 42)
1917 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001918 del a.x
1919 verify(not hasattr(a, "x"))
1920 verify(not hasattr(a, "_C__x"))
1921 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001922 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001923 C.x.__delete__(a)
1924 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001925
Tim Peters66c1a522001-09-24 21:17:50 +00001926 raw = C.__dict__['x']
1927 verify(isinstance(raw, property))
1928
1929 attrs = dir(raw)
1930 verify("__doc__" in attrs)
1931 verify("fget" in attrs)
1932 verify("fset" in attrs)
1933 verify("fdel" in attrs)
1934
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001936 verify(raw.fget is C.__dict__['getx'])
1937 verify(raw.fset is C.__dict__['setx'])
1938 verify(raw.fdel is C.__dict__['delx'])
1939
1940 for attr in "__doc__", "fget", "fset", "fdel":
1941 try:
1942 setattr(raw, attr, 42)
1943 except TypeError, msg:
1944 if str(msg).find('readonly') < 0:
1945 raise TestFailed("when setting readonly attr %r on a "
1946 "property, got unexpected TypeError "
1947 "msg %r" % (attr, str(msg)))
1948 else:
1949 raise TestFailed("expected TypeError from trying to set "
1950 "readonly %r attr on a property" % attr)
1951
Neal Norwitz673cd822002-10-18 16:33:13 +00001952 class D(object):
1953 __getitem__ = property(lambda s: 1/0)
1954
1955 d = D()
1956 try:
1957 for i in d:
1958 str(i)
1959 except ZeroDivisionError:
1960 pass
1961 else:
1962 raise TestFailed, "expected ZeroDivisionError from bad property"
1963
Guido van Rossumc4a18802001-08-24 16:55:27 +00001964def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001965 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001966
1967 class A(object):
1968 def meth(self, a):
1969 return "A(%r)" % a
1970
Guido van Rossum45704552001-10-08 16:35:45 +00001971 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001972
1973 class B(A):
1974 def __init__(self):
1975 self.__super = super(B, self)
1976 def meth(self, a):
1977 return "B(%r)" % a + self.__super.meth(a)
1978
Guido van Rossum45704552001-10-08 16:35:45 +00001979 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001980
1981 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001982 def meth(self, a):
1983 return "C(%r)" % a + self.__super.meth(a)
1984 C._C__super = super(C)
1985
Guido van Rossum45704552001-10-08 16:35:45 +00001986 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001987
1988 class D(C, B):
1989 def meth(self, a):
1990 return "D(%r)" % a + super(D, self).meth(a)
1991
Guido van Rossum5b443c62001-12-03 15:38:28 +00001992 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1993
1994 # Test for subclassing super
1995
1996 class mysuper(super):
1997 def __init__(self, *args):
1998 return super(mysuper, self).__init__(*args)
1999
2000 class E(D):
2001 def meth(self, a):
2002 return "E(%r)" % a + mysuper(E, self).meth(a)
2003
2004 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2005
2006 class F(E):
2007 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002008 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002009 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2010 F._F__super = mysuper(F)
2011
2012 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2013
2014 # Make sure certain errors are raised
2015
2016 try:
2017 super(D, 42)
2018 except TypeError:
2019 pass
2020 else:
2021 raise TestFailed, "shouldn't allow super(D, 42)"
2022
2023 try:
2024 super(D, C())
2025 except TypeError:
2026 pass
2027 else:
2028 raise TestFailed, "shouldn't allow super(D, C())"
2029
2030 try:
2031 super(D).__get__(12)
2032 except TypeError:
2033 pass
2034 else:
2035 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2036
2037 try:
2038 super(D).__get__(C())
2039 except TypeError:
2040 pass
2041 else:
2042 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002043
Guido van Rossuma4541a32003-04-16 20:02:22 +00002044 # Make sure data descriptors can be overridden and accessed via super
2045 # (new feature in Python 2.3)
2046
2047 class DDbase(object):
2048 def getx(self): return 42
2049 x = property(getx)
2050
2051 class DDsub(DDbase):
2052 def getx(self): return "hello"
2053 x = property(getx)
2054
2055 dd = DDsub()
2056 vereq(dd.x, "hello")
2057 vereq(super(DDsub, dd).x, 42)
2058
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002059def inherits():
2060 if verbose: print "Testing inheritance from basic types..."
2061
2062 class hexint(int):
2063 def __repr__(self):
2064 return hex(self)
2065 def __add__(self, other):
2066 return hexint(int.__add__(self, other))
2067 # (Note that overriding __radd__ doesn't work,
2068 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002069 vereq(repr(hexint(7) + 9), "0x10")
2070 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002071 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002072 vereq(a, 12345)
2073 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002074 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002075 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002076 verify((+a).__class__ is int)
2077 verify((a >> 0).__class__ is int)
2078 verify((a << 0).__class__ is int)
2079 verify((hexint(0) << 12).__class__ is int)
2080 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002081
2082 class octlong(long):
2083 __slots__ = []
2084 def __str__(self):
2085 s = oct(self)
2086 if s[-1] == 'L':
2087 s = s[:-1]
2088 return s
2089 def __add__(self, other):
2090 return self.__class__(super(octlong, self).__add__(other))
2091 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002092 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002093 # (Note that overriding __radd__ here only seems to work
2094 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002095 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002096 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002097 vereq(a, 12345L)
2098 vereq(long(a), 12345L)
2099 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002100 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002101 verify((+a).__class__ is long)
2102 verify((-a).__class__ is long)
2103 verify((-octlong(0)).__class__ is long)
2104 verify((a >> 0).__class__ is long)
2105 verify((a << 0).__class__ is long)
2106 verify((a - 0).__class__ is long)
2107 verify((a * 1).__class__ is long)
2108 verify((a ** 1).__class__ is long)
2109 verify((a // 1).__class__ is long)
2110 verify((1 * a).__class__ is long)
2111 verify((a | 0).__class__ is long)
2112 verify((a ^ 0).__class__ is long)
2113 verify((a & -1L).__class__ is long)
2114 verify((octlong(0) << 12).__class__ is long)
2115 verify((octlong(0) >> 12).__class__ is long)
2116 verify(abs(octlong(0)).__class__ is long)
2117
2118 # Because octlong overrides __add__, we can't check the absence of +0
2119 # optimizations using octlong.
2120 class longclone(long):
2121 pass
2122 a = longclone(1)
2123 verify((a + 0).__class__ is long)
2124 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002125
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002126 # Check that negative clones don't segfault
2127 a = longclone(-1)
2128 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002129 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002130
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002131 class precfloat(float):
2132 __slots__ = ['prec']
2133 def __init__(self, value=0.0, prec=12):
2134 self.prec = int(prec)
2135 float.__init__(value)
2136 def __repr__(self):
2137 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002138 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002139 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002140 vereq(a, 12345.0)
2141 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002142 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002143 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002144 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002145
Tim Peters2400fa42001-09-12 19:12:49 +00002146 class madcomplex(complex):
2147 def __repr__(self):
2148 return "%.17gj%+.17g" % (self.imag, self.real)
2149 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002150 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002151 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002152 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002153 vereq(a, base)
2154 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002155 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002156 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002157 vereq(repr(a), "4j-3")
2158 vereq(a, base)
2159 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002160 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002161 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002162 veris((+a).__class__, complex)
2163 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002164 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002165 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002166 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002167 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002168 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002169 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002170 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002171
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002172 class madtuple(tuple):
2173 _rev = None
2174 def rev(self):
2175 if self._rev is not None:
2176 return self._rev
2177 L = list(self)
2178 L.reverse()
2179 self._rev = self.__class__(L)
2180 return self._rev
2181 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002182 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2183 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2184 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002185 for i in range(512):
2186 t = madtuple(range(i))
2187 u = t.rev()
2188 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002189 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002190 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002192 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002193 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002194 verify(a[:].__class__ is tuple)
2195 verify((a * 1).__class__ is tuple)
2196 verify((a * 0).__class__ is tuple)
2197 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002198 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002199 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002200 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002201 verify((a + a).__class__ is tuple)
2202 verify((a * 0).__class__ is tuple)
2203 verify((a * 1).__class__ is tuple)
2204 verify((a * 2).__class__ is tuple)
2205 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002206
2207 class madstring(str):
2208 _rev = None
2209 def rev(self):
2210 if self._rev is not None:
2211 return self._rev
2212 L = list(self)
2213 L.reverse()
2214 self._rev = self.__class__("".join(L))
2215 return self._rev
2216 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002217 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2218 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2219 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002220 for i in range(256):
2221 s = madstring("".join(map(chr, range(i))))
2222 t = s.rev()
2223 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002224 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002225 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002226 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002227 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002228
Tim Peters8fa5dd02001-09-12 02:18:30 +00002229 base = "\x00" * 5
2230 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002231 vereq(s, base)
2232 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002233 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(hash(s), hash(base))
2235 vereq({s: 1}[base], 1)
2236 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002237 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002238 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002239 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002240 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002241 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002242 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002243 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002244 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002245 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002246 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002247 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002249 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002250 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002251 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002252 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002253 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002254 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002255 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002257 identitytab = ''.join([chr(i) for i in range(256)])
2258 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002259 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002260 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002261 vereq(s.translate(identitytab, "x"), base)
2262 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002263 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002265 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002267 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002269 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002271 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002273
Tim Peters111f6092001-09-12 07:54:51 +00002274 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002275 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002276 verify(intern(s).__class__ is str)
2277 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002279
2280 i = intern("y x")
2281 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002283 verify(intern(s).__class__ is str)
2284 verify(intern(s) is i)
2285
2286 s = madstring(i)
2287 verify(intern(s).__class__ is str)
2288 verify(intern(s) is i)
2289
Guido van Rossum91ee7982001-08-30 20:52:40 +00002290 class madunicode(unicode):
2291 _rev = None
2292 def rev(self):
2293 if self._rev is not None:
2294 return self._rev
2295 L = list(self)
2296 L.reverse()
2297 self._rev = self.__class__(u"".join(L))
2298 return self._rev
2299 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002300 vereq(u, u"ABCDEF")
2301 vereq(u.rev(), madunicode(u"FEDCBA"))
2302 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002303 base = u"12345"
2304 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002305 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002306 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002307 vereq(hash(u), hash(base))
2308 vereq({u: 1}[base], 1)
2309 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002310 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002311 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002312 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002313 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002314 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002315 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002316 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002317 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002318 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002319 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002320 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002321 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002322 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002323 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002324 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002326 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002328 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002329 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002330 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002331 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002332 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002333 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002334 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002335 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002336 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002337 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002338 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002340 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002341 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002342 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002344 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002345 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002346 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002348
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002349 class sublist(list):
2350 pass
2351 a = sublist(range(5))
2352 vereq(a, range(5))
2353 a.append("hello")
2354 vereq(a, range(5) + ["hello"])
2355 a[5] = 5
2356 vereq(a, range(6))
2357 a.extend(range(6, 20))
2358 vereq(a, range(20))
2359 a[-5:] = []
2360 vereq(a, range(15))
2361 del a[10:15]
2362 vereq(len(a), 10)
2363 vereq(a, range(10))
2364 vereq(list(a), range(10))
2365 vereq(a[0], 0)
2366 vereq(a[9], 9)
2367 vereq(a[-10], 0)
2368 vereq(a[-1], 9)
2369 vereq(a[:5], range(5))
2370
Tim Peters59c9a642001-09-13 05:38:56 +00002371 class CountedInput(file):
2372 """Counts lines read by self.readline().
2373
2374 self.lineno is the 0-based ordinal of the last line read, up to
2375 a maximum of one greater than the number of lines in the file.
2376
2377 self.ateof is true if and only if the final "" line has been read,
2378 at which point self.lineno stops incrementing, and further calls
2379 to readline() continue to return "".
2380 """
2381
2382 lineno = 0
2383 ateof = 0
2384 def readline(self):
2385 if self.ateof:
2386 return ""
2387 s = file.readline(self)
2388 # Next line works too.
2389 # s = super(CountedInput, self).readline()
2390 self.lineno += 1
2391 if s == "":
2392 self.ateof = 1
2393 return s
2394
Tim Peters561f8992001-09-13 19:36:36 +00002395 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002396 lines = ['a\n', 'b\n', 'c\n']
2397 try:
2398 f.writelines(lines)
2399 f.close()
2400 f = CountedInput(TESTFN)
2401 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2402 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002403 vereq(expected, got)
2404 vereq(f.lineno, i)
2405 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002406 f.close()
2407 finally:
2408 try:
2409 f.close()
2410 except:
2411 pass
2412 try:
2413 import os
2414 os.unlink(TESTFN)
2415 except:
2416 pass
2417
Tim Peters808b94e2001-09-13 19:33:07 +00002418def keywords():
2419 if verbose:
2420 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002421 vereq(int(x=1), 1)
2422 vereq(float(x=2), 2.0)
2423 vereq(long(x=3), 3L)
2424 vereq(complex(imag=42, real=666), complex(666, 42))
2425 vereq(str(object=500), '500')
2426 vereq(unicode(string='abc', errors='strict'), u'abc')
2427 vereq(tuple(sequence=range(3)), (0, 1, 2))
2428 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002429 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002430
2431 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002432 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002433 try:
2434 constructor(bogus_keyword_arg=1)
2435 except TypeError:
2436 pass
2437 else:
2438 raise TestFailed("expected TypeError from bogus keyword "
2439 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002440
Tim Peters8fa45672001-09-13 21:01:29 +00002441def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002442 # XXX This test is disabled because rexec is not deemed safe
2443 return
Tim Peters8fa45672001-09-13 21:01:29 +00002444 import rexec
2445 if verbose:
2446 print "Testing interaction with restricted execution ..."
2447
2448 sandbox = rexec.RExec()
2449
2450 code1 = """f = open(%r, 'w')""" % TESTFN
2451 code2 = """f = file(%r, 'w')""" % TESTFN
2452 code3 = """\
2453f = open(%r)
2454t = type(f) # a sneaky way to get the file() constructor
2455f.close()
2456f = t(%r, 'w') # rexec can't catch this by itself
2457""" % (TESTFN, TESTFN)
2458
2459 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2460 f.close()
2461
2462 try:
2463 for code in code1, code2, code3:
2464 try:
2465 sandbox.r_exec(code)
2466 except IOError, msg:
2467 if str(msg).find("restricted") >= 0:
2468 outcome = "OK"
2469 else:
2470 outcome = "got an exception, but not an expected one"
2471 else:
2472 outcome = "expected a restricted-execution exception"
2473
2474 if outcome != "OK":
2475 raise TestFailed("%s, in %r" % (outcome, code))
2476
2477 finally:
2478 try:
2479 import os
2480 os.unlink(TESTFN)
2481 except:
2482 pass
2483
Tim Peters0ab085c2001-09-14 00:25:33 +00002484def str_subclass_as_dict_key():
2485 if verbose:
2486 print "Testing a str subclass used as dict key .."
2487
2488 class cistr(str):
2489 """Sublcass of str that computes __eq__ case-insensitively.
2490
2491 Also computes a hash code of the string in canonical form.
2492 """
2493
2494 def __init__(self, value):
2495 self.canonical = value.lower()
2496 self.hashcode = hash(self.canonical)
2497
2498 def __eq__(self, other):
2499 if not isinstance(other, cistr):
2500 other = cistr(other)
2501 return self.canonical == other.canonical
2502
2503 def __hash__(self):
2504 return self.hashcode
2505
Guido van Rossum45704552001-10-08 16:35:45 +00002506 vereq(cistr('ABC'), 'abc')
2507 vereq('aBc', cistr('ABC'))
2508 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002509
2510 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002511 vereq(d[cistr('one')], 1)
2512 vereq(d[cistr('tWo')], 2)
2513 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002514 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002515 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002516
Guido van Rossumab3b0342001-09-18 20:38:53 +00002517def classic_comparisons():
2518 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002519 class classic:
2520 pass
2521 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002522 if verbose: print " (base = %s)" % base
2523 class C(base):
2524 def __init__(self, value):
2525 self.value = int(value)
2526 def __cmp__(self, other):
2527 if isinstance(other, C):
2528 return cmp(self.value, other.value)
2529 if isinstance(other, int) or isinstance(other, long):
2530 return cmp(self.value, other)
2531 return NotImplemented
2532 c1 = C(1)
2533 c2 = C(2)
2534 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002535 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002536 c = {1: c1, 2: c2, 3: c3}
2537 for x in 1, 2, 3:
2538 for y in 1, 2, 3:
2539 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2540 for op in "<", "<=", "==", "!=", ">", ">=":
2541 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2542 "x=%d, y=%d" % (x, y))
2543 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2544 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2545
Guido van Rossum0639f592001-09-18 21:06:04 +00002546def rich_comparisons():
2547 if verbose:
2548 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002549 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002550 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002551 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002552 vereq(z, 1+0j)
2553 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002554 class ZZ(complex):
2555 def __eq__(self, other):
2556 try:
2557 return abs(self - other) <= 1e-6
2558 except:
2559 return NotImplemented
2560 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002561 vereq(zz, 1+0j)
2562 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002563
Guido van Rossum0639f592001-09-18 21:06:04 +00002564 class classic:
2565 pass
2566 for base in (classic, int, object, list):
2567 if verbose: print " (base = %s)" % base
2568 class C(base):
2569 def __init__(self, value):
2570 self.value = int(value)
2571 def __cmp__(self, other):
2572 raise TestFailed, "shouldn't call __cmp__"
2573 def __eq__(self, other):
2574 if isinstance(other, C):
2575 return self.value == other.value
2576 if isinstance(other, int) or isinstance(other, long):
2577 return self.value == other
2578 return NotImplemented
2579 def __ne__(self, other):
2580 if isinstance(other, C):
2581 return self.value != other.value
2582 if isinstance(other, int) or isinstance(other, long):
2583 return self.value != other
2584 return NotImplemented
2585 def __lt__(self, other):
2586 if isinstance(other, C):
2587 return self.value < other.value
2588 if isinstance(other, int) or isinstance(other, long):
2589 return self.value < other
2590 return NotImplemented
2591 def __le__(self, other):
2592 if isinstance(other, C):
2593 return self.value <= other.value
2594 if isinstance(other, int) or isinstance(other, long):
2595 return self.value <= other
2596 return NotImplemented
2597 def __gt__(self, other):
2598 if isinstance(other, C):
2599 return self.value > other.value
2600 if isinstance(other, int) or isinstance(other, long):
2601 return self.value > other
2602 return NotImplemented
2603 def __ge__(self, other):
2604 if isinstance(other, C):
2605 return self.value >= other.value
2606 if isinstance(other, int) or isinstance(other, long):
2607 return self.value >= other
2608 return NotImplemented
2609 c1 = C(1)
2610 c2 = C(2)
2611 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002612 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002613 c = {1: c1, 2: c2, 3: c3}
2614 for x in 1, 2, 3:
2615 for y in 1, 2, 3:
2616 for op in "<", "<=", "==", "!=", ">", ">=":
2617 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2618 "x=%d, y=%d" % (x, y))
2619 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2620 "x=%d, y=%d" % (x, y))
2621 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2622 "x=%d, y=%d" % (x, y))
2623
Guido van Rossum1952e382001-09-19 01:25:16 +00002624def coercions():
2625 if verbose: print "Testing coercions..."
2626 class I(int): pass
2627 coerce(I(0), 0)
2628 coerce(0, I(0))
2629 class L(long): pass
2630 coerce(L(0), 0)
2631 coerce(L(0), 0L)
2632 coerce(0, L(0))
2633 coerce(0L, L(0))
2634 class F(float): pass
2635 coerce(F(0), 0)
2636 coerce(F(0), 0L)
2637 coerce(F(0), 0.)
2638 coerce(0, F(0))
2639 coerce(0L, F(0))
2640 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002641 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002642 coerce(C(0), 0)
2643 coerce(C(0), 0L)
2644 coerce(C(0), 0.)
2645 coerce(C(0), 0j)
2646 coerce(0, C(0))
2647 coerce(0L, C(0))
2648 coerce(0., C(0))
2649 coerce(0j, C(0))
2650
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002651def descrdoc():
2652 if verbose: print "Testing descriptor doc strings..."
2653 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002654 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002655 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002656 check(file.name, "file name") # member descriptor
2657
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002658def setclass():
2659 if verbose: print "Testing __class__ assignment..."
2660 class C(object): pass
2661 class D(object): pass
2662 class E(object): pass
2663 class F(D, E): pass
2664 for cls in C, D, E, F:
2665 for cls2 in C, D, E, F:
2666 x = cls()
2667 x.__class__ = cls2
2668 verify(x.__class__ is cls2)
2669 x.__class__ = cls
2670 verify(x.__class__ is cls)
2671 def cant(x, C):
2672 try:
2673 x.__class__ = C
2674 except TypeError:
2675 pass
2676 else:
2677 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002678 try:
2679 delattr(x, "__class__")
2680 except TypeError:
2681 pass
2682 else:
2683 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002684 cant(C(), list)
2685 cant(list(), C)
2686 cant(C(), 1)
2687 cant(C(), object)
2688 cant(object(), list)
2689 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002690 class Int(int): __slots__ = []
2691 cant(2, Int)
2692 cant(Int(), int)
2693 cant(True, int)
2694 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002695 o = object()
2696 cant(o, type(1))
2697 cant(o, type(None))
2698 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002699
Guido van Rossum6661be32001-10-26 04:26:12 +00002700def setdict():
2701 if verbose: print "Testing __dict__ assignment..."
2702 class C(object): pass
2703 a = C()
2704 a.__dict__ = {'b': 1}
2705 vereq(a.b, 1)
2706 def cant(x, dict):
2707 try:
2708 x.__dict__ = dict
2709 except TypeError:
2710 pass
2711 else:
2712 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2713 cant(a, None)
2714 cant(a, [])
2715 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002716 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002717 # Classes don't allow __dict__ assignment
2718 cant(C, {})
2719
Guido van Rossum3926a632001-09-25 16:25:58 +00002720def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002721 if verbose:
2722 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002723 import pickle, cPickle
2724
2725 def sorteditems(d):
2726 L = d.items()
2727 L.sort()
2728 return L
2729
2730 global C
2731 class C(object):
2732 def __init__(self, a, b):
2733 super(C, self).__init__()
2734 self.a = a
2735 self.b = b
2736 def __repr__(self):
2737 return "C(%r, %r)" % (self.a, self.b)
2738
2739 global C1
2740 class C1(list):
2741 def __new__(cls, a, b):
2742 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002743 def __getnewargs__(self):
2744 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002745 def __init__(self, a, b):
2746 self.a = a
2747 self.b = b
2748 def __repr__(self):
2749 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2750
2751 global C2
2752 class C2(int):
2753 def __new__(cls, a, b, val=0):
2754 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002755 def __getnewargs__(self):
2756 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002757 def __init__(self, a, b, val=0):
2758 self.a = a
2759 self.b = b
2760 def __repr__(self):
2761 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2762
Guido van Rossum90c45142001-11-24 21:07:01 +00002763 global C3
2764 class C3(object):
2765 def __init__(self, foo):
2766 self.foo = foo
2767 def __getstate__(self):
2768 return self.foo
2769 def __setstate__(self, foo):
2770 self.foo = foo
2771
2772 global C4classic, C4
2773 class C4classic: # classic
2774 pass
2775 class C4(C4classic, object): # mixed inheritance
2776 pass
2777
Guido van Rossum3926a632001-09-25 16:25:58 +00002778 for p in pickle, cPickle:
2779 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002780 if verbose:
2781 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002782
2783 for cls in C, C1, C2:
2784 s = p.dumps(cls, bin)
2785 cls2 = p.loads(s)
2786 verify(cls2 is cls)
2787
2788 a = C1(1, 2); a.append(42); a.append(24)
2789 b = C2("hello", "world", 42)
2790 s = p.dumps((a, b), bin)
2791 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002792 vereq(x.__class__, a.__class__)
2793 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2794 vereq(y.__class__, b.__class__)
2795 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2796 vereq(`x`, `a`)
2797 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002798 if verbose:
2799 print "a = x =", a
2800 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002801 # Test for __getstate__ and __setstate__ on new style class
2802 u = C3(42)
2803 s = p.dumps(u, bin)
2804 v = p.loads(s)
2805 veris(u.__class__, v.__class__)
2806 vereq(u.foo, v.foo)
2807 # Test for picklability of hybrid class
2808 u = C4()
2809 u.foo = 42
2810 s = p.dumps(u, bin)
2811 v = p.loads(s)
2812 veris(u.__class__, v.__class__)
2813 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002814
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002815 # Testing copy.deepcopy()
2816 if verbose:
2817 print "deepcopy"
2818 import copy
2819 for cls in C, C1, C2:
2820 cls2 = copy.deepcopy(cls)
2821 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002822
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002823 a = C1(1, 2); a.append(42); a.append(24)
2824 b = C2("hello", "world", 42)
2825 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002826 vereq(x.__class__, a.__class__)
2827 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2828 vereq(y.__class__, b.__class__)
2829 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2830 vereq(`x`, `a`)
2831 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002832 if verbose:
2833 print "a = x =", a
2834 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002835
Guido van Rossum8c842552002-03-14 23:05:54 +00002836def pickleslots():
2837 if verbose: print "Testing pickling of classes with __slots__ ..."
2838 import pickle, cPickle
2839 # Pickling of classes with __slots__ but without __getstate__ should fail
2840 global B, C, D, E
2841 class B(object):
2842 pass
2843 for base in [object, B]:
2844 class C(base):
2845 __slots__ = ['a']
2846 class D(C):
2847 pass
2848 try:
2849 pickle.dumps(C())
2850 except TypeError:
2851 pass
2852 else:
2853 raise TestFailed, "should fail: pickle C instance - %s" % base
2854 try:
2855 cPickle.dumps(C())
2856 except TypeError:
2857 pass
2858 else:
2859 raise TestFailed, "should fail: cPickle C instance - %s" % base
2860 try:
2861 pickle.dumps(C())
2862 except TypeError:
2863 pass
2864 else:
2865 raise TestFailed, "should fail: pickle D instance - %s" % base
2866 try:
2867 cPickle.dumps(D())
2868 except TypeError:
2869 pass
2870 else:
2871 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002872 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002873 class C(base):
2874 __slots__ = ['a']
2875 def __getstate__(self):
2876 try:
2877 d = self.__dict__.copy()
2878 except AttributeError:
2879 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002880 for cls in self.__class__.__mro__:
2881 for sn in cls.__dict__.get('__slots__', ()):
2882 try:
2883 d[sn] = getattr(self, sn)
2884 except AttributeError:
2885 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002886 return d
2887 def __setstate__(self, d):
2888 for k, v in d.items():
2889 setattr(self, k, v)
2890 class D(C):
2891 pass
2892 # Now it should work
2893 x = C()
2894 y = pickle.loads(pickle.dumps(x))
2895 vereq(hasattr(y, 'a'), 0)
2896 y = cPickle.loads(cPickle.dumps(x))
2897 vereq(hasattr(y, 'a'), 0)
2898 x.a = 42
2899 y = pickle.loads(pickle.dumps(x))
2900 vereq(y.a, 42)
2901 y = cPickle.loads(cPickle.dumps(x))
2902 vereq(y.a, 42)
2903 x = D()
2904 x.a = 42
2905 x.b = 100
2906 y = pickle.loads(pickle.dumps(x))
2907 vereq(y.a + y.b, 142)
2908 y = cPickle.loads(cPickle.dumps(x))
2909 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002910 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002911 class E(C):
2912 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002913 x = E()
2914 x.a = 42
2915 x.b = "foo"
2916 y = pickle.loads(pickle.dumps(x))
2917 vereq(y.a, x.a)
2918 vereq(y.b, x.b)
2919 y = cPickle.loads(cPickle.dumps(x))
2920 vereq(y.a, x.a)
2921 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002922
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002923def copies():
2924 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2925 import copy
2926 class C(object):
2927 pass
2928
2929 a = C()
2930 a.foo = 12
2931 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002932 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002933
2934 a.bar = [1,2,3]
2935 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002936 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002937 verify(c.bar is a.bar)
2938
2939 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002940 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002941 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002942 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002943
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002944def binopoverride():
2945 if verbose: print "Testing overrides of binary operations..."
2946 class I(int):
2947 def __repr__(self):
2948 return "I(%r)" % int(self)
2949 def __add__(self, other):
2950 return I(int(self) + int(other))
2951 __radd__ = __add__
2952 def __pow__(self, other, mod=None):
2953 if mod is None:
2954 return I(pow(int(self), int(other)))
2955 else:
2956 return I(pow(int(self), int(other), int(mod)))
2957 def __rpow__(self, other, mod=None):
2958 if mod is None:
2959 return I(pow(int(other), int(self), mod))
2960 else:
2961 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002962
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002963 vereq(`I(1) + I(2)`, "I(3)")
2964 vereq(`I(1) + 2`, "I(3)")
2965 vereq(`1 + I(2)`, "I(3)")
2966 vereq(`I(2) ** I(3)`, "I(8)")
2967 vereq(`2 ** I(3)`, "I(8)")
2968 vereq(`I(2) ** 3`, "I(8)")
2969 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2970 class S(str):
2971 def __eq__(self, other):
2972 return self.lower() == other.lower()
2973
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002974def subclasspropagation():
2975 if verbose: print "Testing propagation of slot functions to subclasses..."
2976 class A(object):
2977 pass
2978 class B(A):
2979 pass
2980 class C(A):
2981 pass
2982 class D(B, C):
2983 pass
2984 d = D()
2985 vereq(hash(d), id(d))
2986 A.__hash__ = lambda self: 42
2987 vereq(hash(d), 42)
2988 C.__hash__ = lambda self: 314
2989 vereq(hash(d), 314)
2990 B.__hash__ = lambda self: 144
2991 vereq(hash(d), 144)
2992 D.__hash__ = lambda self: 100
2993 vereq(hash(d), 100)
2994 del D.__hash__
2995 vereq(hash(d), 144)
2996 del B.__hash__
2997 vereq(hash(d), 314)
2998 del C.__hash__
2999 vereq(hash(d), 42)
3000 del A.__hash__
3001 vereq(hash(d), id(d))
3002 d.foo = 42
3003 d.bar = 42
3004 vereq(d.foo, 42)
3005 vereq(d.bar, 42)
3006 def __getattribute__(self, name):
3007 if name == "foo":
3008 return 24
3009 return object.__getattribute__(self, name)
3010 A.__getattribute__ = __getattribute__
3011 vereq(d.foo, 24)
3012 vereq(d.bar, 42)
3013 def __getattr__(self, name):
3014 if name in ("spam", "foo", "bar"):
3015 return "hello"
3016 raise AttributeError, name
3017 B.__getattr__ = __getattr__
3018 vereq(d.spam, "hello")
3019 vereq(d.foo, 24)
3020 vereq(d.bar, 42)
3021 del A.__getattribute__
3022 vereq(d.foo, 42)
3023 del d.foo
3024 vereq(d.foo, "hello")
3025 vereq(d.bar, 42)
3026 del B.__getattr__
3027 try:
3028 d.foo
3029 except AttributeError:
3030 pass
3031 else:
3032 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003033
Guido van Rossume7f3e242002-06-14 02:35:45 +00003034 # Test a nasty bug in recurse_down_subclasses()
3035 import gc
3036 class A(object):
3037 pass
3038 class B(A):
3039 pass
3040 del B
3041 gc.collect()
3042 A.__setitem__ = lambda *a: None # crash
3043
Tim Petersfc57ccb2001-10-12 02:38:24 +00003044def buffer_inherit():
3045 import binascii
3046 # SF bug [#470040] ParseTuple t# vs subclasses.
3047 if verbose:
3048 print "Testing that buffer interface is inherited ..."
3049
3050 class MyStr(str):
3051 pass
3052 base = 'abc'
3053 m = MyStr(base)
3054 # b2a_hex uses the buffer interface to get its argument's value, via
3055 # PyArg_ParseTuple 't#' code.
3056 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3057
3058 # It's not clear that unicode will continue to support the character
3059 # buffer interface, and this test will fail if that's taken away.
3060 class MyUni(unicode):
3061 pass
3062 base = u'abc'
3063 m = MyUni(base)
3064 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3065
3066 class MyInt(int):
3067 pass
3068 m = MyInt(42)
3069 try:
3070 binascii.b2a_hex(m)
3071 raise TestFailed('subclass of int should not have a buffer interface')
3072 except TypeError:
3073 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003074
Tim Petersc9933152001-10-16 20:18:24 +00003075def str_of_str_subclass():
3076 import binascii
3077 import cStringIO
3078
3079 if verbose:
3080 print "Testing __str__ defined in subclass of str ..."
3081
3082 class octetstring(str):
3083 def __str__(self):
3084 return binascii.b2a_hex(self)
3085 def __repr__(self):
3086 return self + " repr"
3087
3088 o = octetstring('A')
3089 vereq(type(o), octetstring)
3090 vereq(type(str(o)), str)
3091 vereq(type(repr(o)), str)
3092 vereq(ord(o), 0x41)
3093 vereq(str(o), '41')
3094 vereq(repr(o), 'A repr')
3095 vereq(o.__str__(), '41')
3096 vereq(o.__repr__(), 'A repr')
3097
3098 capture = cStringIO.StringIO()
3099 # Calling str() or not exercises different internal paths.
3100 print >> capture, o
3101 print >> capture, str(o)
3102 vereq(capture.getvalue(), '41\n41\n')
3103 capture.close()
3104
Guido van Rossumc8e56452001-10-22 00:43:43 +00003105def kwdargs():
3106 if verbose: print "Testing keyword arguments to __init__, __call__..."
3107 def f(a): return a
3108 vereq(f.__call__(a=42), 42)
3109 a = []
3110 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003111 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003112
Guido van Rossumed87ad82001-10-30 02:33:02 +00003113def delhook():
3114 if verbose: print "Testing __del__ hook..."
3115 log = []
3116 class C(object):
3117 def __del__(self):
3118 log.append(1)
3119 c = C()
3120 vereq(log, [])
3121 del c
3122 vereq(log, [1])
3123
Guido van Rossum29d26062001-12-11 04:37:34 +00003124 class D(object): pass
3125 d = D()
3126 try: del d[0]
3127 except TypeError: pass
3128 else: raise TestFailed, "invalid del() didn't raise TypeError"
3129
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003130def hashinherit():
3131 if verbose: print "Testing hash of mutable subclasses..."
3132
3133 class mydict(dict):
3134 pass
3135 d = mydict()
3136 try:
3137 hash(d)
3138 except TypeError:
3139 pass
3140 else:
3141 raise TestFailed, "hash() of dict subclass should fail"
3142
3143 class mylist(list):
3144 pass
3145 d = mylist()
3146 try:
3147 hash(d)
3148 except TypeError:
3149 pass
3150 else:
3151 raise TestFailed, "hash() of list subclass should fail"
3152
Guido van Rossum29d26062001-12-11 04:37:34 +00003153def strops():
3154 try: 'a' + 5
3155 except TypeError: pass
3156 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3157
3158 try: ''.split('')
3159 except ValueError: pass
3160 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3161
3162 try: ''.join([0])
3163 except TypeError: pass
3164 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3165
3166 try: ''.rindex('5')
3167 except ValueError: pass
3168 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3169
Guido van Rossum29d26062001-12-11 04:37:34 +00003170 try: '%(n)s' % None
3171 except TypeError: pass
3172 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3173
3174 try: '%(n' % {}
3175 except ValueError: pass
3176 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3177
3178 try: '%*s' % ('abc')
3179 except TypeError: pass
3180 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3181
3182 try: '%*.*s' % ('abc', 5)
3183 except TypeError: pass
3184 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3185
3186 try: '%s' % (1, 2)
3187 except TypeError: pass
3188 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3189
3190 try: '%' % None
3191 except ValueError: pass
3192 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3193
3194 vereq('534253'.isdigit(), 1)
3195 vereq('534253x'.isdigit(), 0)
3196 vereq('%c' % 5, '\x05')
3197 vereq('%c' % '5', '5')
3198
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003199def deepcopyrecursive():
3200 if verbose: print "Testing deepcopy of recursive objects..."
3201 class Node:
3202 pass
3203 a = Node()
3204 b = Node()
3205 a.b = b
3206 b.a = a
3207 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003208
Guido van Rossumd7035672002-03-12 20:43:31 +00003209def modules():
3210 if verbose: print "Testing uninitialized module objects..."
3211 from types import ModuleType as M
3212 m = M.__new__(M)
3213 str(m)
3214 vereq(hasattr(m, "__name__"), 0)
3215 vereq(hasattr(m, "__file__"), 0)
3216 vereq(hasattr(m, "foo"), 0)
3217 vereq(m.__dict__, None)
3218 m.foo = 1
3219 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003220
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003221def dictproxyiterkeys():
3222 class C(object):
3223 def meth(self):
3224 pass
3225 if verbose: print "Testing dict-proxy iterkeys..."
3226 keys = [ key for key in C.__dict__.iterkeys() ]
3227 keys.sort()
3228 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3229
3230def dictproxyitervalues():
3231 class C(object):
3232 def meth(self):
3233 pass
3234 if verbose: print "Testing dict-proxy itervalues..."
3235 values = [ values for values in C.__dict__.itervalues() ]
3236 vereq(len(values), 5)
3237
3238def dictproxyiteritems():
3239 class C(object):
3240 def meth(self):
3241 pass
3242 if verbose: print "Testing dict-proxy iteritems..."
3243 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3244 keys.sort()
3245 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3246
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003247def funnynew():
3248 if verbose: print "Testing __new__ returning something unexpected..."
3249 class C(object):
3250 def __new__(cls, arg):
3251 if isinstance(arg, str): return [1, 2, 3]
3252 elif isinstance(arg, int): return object.__new__(D)
3253 else: return object.__new__(cls)
3254 class D(C):
3255 def __init__(self, arg):
3256 self.foo = arg
3257 vereq(C("1"), [1, 2, 3])
3258 vereq(D("1"), [1, 2, 3])
3259 d = D(None)
3260 veris(d.foo, None)
3261 d = C(1)
3262 vereq(isinstance(d, D), True)
3263 vereq(d.foo, 1)
3264 d = D(1)
3265 vereq(isinstance(d, D), True)
3266 vereq(d.foo, 1)
3267
Guido van Rossume8fc6402002-04-16 16:44:51 +00003268def imulbug():
3269 # SF bug 544647
3270 if verbose: print "Testing for __imul__ problems..."
3271 class C(object):
3272 def __imul__(self, other):
3273 return (self, other)
3274 x = C()
3275 y = x
3276 y *= 1.0
3277 vereq(y, (x, 1.0))
3278 y = x
3279 y *= 2
3280 vereq(y, (x, 2))
3281 y = x
3282 y *= 3L
3283 vereq(y, (x, 3L))
3284 y = x
3285 y *= 1L<<100
3286 vereq(y, (x, 1L<<100))
3287 y = x
3288 y *= None
3289 vereq(y, (x, None))
3290 y = x
3291 y *= "foo"
3292 vereq(y, (x, "foo"))
3293
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003294def docdescriptor():
3295 # SF bug 542984
3296 if verbose: print "Testing __doc__ descriptor..."
3297 class DocDescr(object):
3298 def __get__(self, object, otype):
3299 if object:
3300 object = object.__class__.__name__ + ' instance'
3301 if otype:
3302 otype = otype.__name__
3303 return 'object=%s; type=%s' % (object, otype)
3304 class OldClass:
3305 __doc__ = DocDescr()
3306 class NewClass(object):
3307 __doc__ = DocDescr()
3308 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3309 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3310 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3311 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3312
Tim Petersafb2c802002-04-18 18:06:20 +00003313def string_exceptions():
3314 if verbose:
3315 print "Testing string exceptions ..."
3316
3317 # Ensure builtin strings work OK as exceptions.
3318 astring = "An exception string."
3319 try:
3320 raise astring
3321 except astring:
3322 pass
3323 else:
3324 raise TestFailed, "builtin string not usable as exception"
3325
3326 # Ensure string subclass instances do not.
3327 class MyStr(str):
3328 pass
3329
3330 newstring = MyStr("oops -- shouldn't work")
3331 try:
3332 raise newstring
3333 except TypeError:
3334 pass
3335 except:
3336 raise TestFailed, "string subclass allowed as exception"
3337
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003338def copy_setstate():
3339 if verbose:
3340 print "Testing that copy.*copy() correctly uses __setstate__..."
3341 import copy
3342 class C(object):
3343 def __init__(self, foo=None):
3344 self.foo = foo
3345 self.__foo = foo
3346 def setfoo(self, foo=None):
3347 self.foo = foo
3348 def getfoo(self):
3349 return self.__foo
3350 def __getstate__(self):
3351 return [self.foo]
3352 def __setstate__(self, lst):
3353 assert len(lst) == 1
3354 self.__foo = self.foo = lst[0]
3355 a = C(42)
3356 a.setfoo(24)
3357 vereq(a.foo, 24)
3358 vereq(a.getfoo(), 42)
3359 b = copy.copy(a)
3360 vereq(b.foo, 24)
3361 vereq(b.getfoo(), 24)
3362 b = copy.deepcopy(a)
3363 vereq(b.foo, 24)
3364 vereq(b.getfoo(), 24)
3365
Guido van Rossum09638c12002-06-13 19:17:46 +00003366def slices():
3367 if verbose:
3368 print "Testing cases with slices and overridden __getitem__ ..."
3369 # Strings
3370 vereq("hello"[:4], "hell")
3371 vereq("hello"[slice(4)], "hell")
3372 vereq(str.__getitem__("hello", slice(4)), "hell")
3373 class S(str):
3374 def __getitem__(self, x):
3375 return str.__getitem__(self, x)
3376 vereq(S("hello")[:4], "hell")
3377 vereq(S("hello")[slice(4)], "hell")
3378 vereq(S("hello").__getitem__(slice(4)), "hell")
3379 # Tuples
3380 vereq((1,2,3)[:2], (1,2))
3381 vereq((1,2,3)[slice(2)], (1,2))
3382 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3383 class T(tuple):
3384 def __getitem__(self, x):
3385 return tuple.__getitem__(self, x)
3386 vereq(T((1,2,3))[:2], (1,2))
3387 vereq(T((1,2,3))[slice(2)], (1,2))
3388 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3389 # Lists
3390 vereq([1,2,3][:2], [1,2])
3391 vereq([1,2,3][slice(2)], [1,2])
3392 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3393 class L(list):
3394 def __getitem__(self, x):
3395 return list.__getitem__(self, x)
3396 vereq(L([1,2,3])[:2], [1,2])
3397 vereq(L([1,2,3])[slice(2)], [1,2])
3398 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3399 # Now do lists and __setitem__
3400 a = L([1,2,3])
3401 a[slice(1, 3)] = [3,2]
3402 vereq(a, [1,3,2])
3403 a[slice(0, 2, 1)] = [3,1]
3404 vereq(a, [3,1,2])
3405 a.__setitem__(slice(1, 3), [2,1])
3406 vereq(a, [3,2,1])
3407 a.__setitem__(slice(0, 2, 1), [2,3])
3408 vereq(a, [2,3,1])
3409
Tim Peters2484aae2002-07-11 06:56:07 +00003410def subtype_resurrection():
3411 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003412 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003413
3414 class C(object):
3415 container = []
3416
3417 def __del__(self):
3418 # resurrect the instance
3419 C.container.append(self)
3420
3421 c = C()
3422 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003423 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003424 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003425 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003426
3427 # If that didn't blow up, it's also interesting to see whether clearing
3428 # the last container slot works: that will attempt to delete c again,
3429 # which will cause c to get appended back to the container again "during"
3430 # the del.
3431 del C.container[-1]
3432 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003433 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003434
Tim Peters14cb1e12002-07-11 18:26:21 +00003435 # Make c mortal again, so that the test framework with -l doesn't report
3436 # it as a leak.
3437 del C.__del__
3438
Guido van Rossum2d702462002-08-06 21:28:28 +00003439def slottrash():
3440 # Deallocating deeply nested slotted trash caused stack overflows
3441 if verbose:
3442 print "Testing slot trash..."
3443 class trash(object):
3444 __slots__ = ['x']
3445 def __init__(self, x):
3446 self.x = x
3447 o = None
3448 for i in xrange(50000):
3449 o = trash(o)
3450 del o
3451
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003452def slotmultipleinheritance():
3453 # SF bug 575229, multiple inheritance w/ slots dumps core
3454 class A(object):
3455 __slots__=()
3456 class B(object):
3457 pass
3458 class C(A,B) :
3459 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003460 vereq(C.__basicsize__, B.__basicsize__)
3461 verify(hasattr(C, '__dict__'))
3462 verify(hasattr(C, '__weakref__'))
3463 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003464
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003465def testrmul():
3466 # SF patch 592646
3467 if verbose:
3468 print "Testing correct invocation of __rmul__..."
3469 class C(object):
3470 def __mul__(self, other):
3471 return "mul"
3472 def __rmul__(self, other):
3473 return "rmul"
3474 a = C()
3475 vereq(a*2, "mul")
3476 vereq(a*2.2, "mul")
3477 vereq(2*a, "rmul")
3478 vereq(2.2*a, "rmul")
3479
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003480def testipow():
3481 # [SF bug 620179]
3482 if verbose:
3483 print "Testing correct invocation of __ipow__..."
3484 class C(object):
3485 def __ipow__(self, other):
3486 pass
3487 a = C()
3488 a **= 2
3489
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003490def do_this_first():
3491 if verbose:
3492 print "Testing SF bug 551412 ..."
3493 # This dumps core when SF bug 551412 isn't fixed --
3494 # but only when test_descr.py is run separately.
3495 # (That can't be helped -- as soon as PyType_Ready()
3496 # is called for PyLong_Type, the bug is gone.)
3497 class UserLong(object):
3498 def __pow__(self, *args):
3499 pass
3500 try:
3501 pow(0L, UserLong(), 0L)
3502 except:
3503 pass
3504
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003505 if verbose:
3506 print "Testing SF bug 570483..."
3507 # Another segfault only when run early
3508 # (before PyType_Ready(tuple) is called)
3509 type.mro(tuple)
3510
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003511def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003512 if verbose:
3513 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003514 # stuff that should work:
3515 class C(object):
3516 pass
3517 class C2(object):
3518 def __getattribute__(self, attr):
3519 if attr == 'a':
3520 return 2
3521 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003522 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003523 def meth(self):
3524 return 1
3525 class D(C):
3526 pass
3527 class E(D):
3528 pass
3529 d = D()
3530 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003531 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003532 D.__bases__ = (C2,)
3533 vereq(d.meth(), 1)
3534 vereq(e.meth(), 1)
3535 vereq(d.a, 2)
3536 vereq(e.a, 2)
3537 vereq(C2.__subclasses__(), [D])
3538
3539 # stuff that shouldn't:
3540 class L(list):
3541 pass
3542
3543 try:
3544 L.__bases__ = (dict,)
3545 except TypeError:
3546 pass
3547 else:
3548 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3549
3550 try:
3551 list.__bases__ = (dict,)
3552 except TypeError:
3553 pass
3554 else:
3555 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3556
3557 try:
3558 del D.__bases__
3559 except TypeError:
3560 pass
3561 else:
3562 raise TestFailed, "shouldn't be able to delete .__bases__"
3563
3564 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003565 D.__bases__ = ()
3566 except TypeError, msg:
3567 if str(msg) == "a new-style class can't have only classic bases":
3568 raise TestFailed, "wrong error message for .__bases__ = ()"
3569 else:
3570 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3571
3572 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003573 D.__bases__ = (D,)
3574 except TypeError:
3575 pass
3576 else:
3577 # actually, we'll have crashed by here...
3578 raise TestFailed, "shouldn't be able to create inheritance cycles"
3579
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003580 try:
3581 D.__bases__ = (E,)
3582 except TypeError:
3583 pass
3584 else:
3585 raise TestFailed, "shouldn't be able to create inheritance cycles"
3586
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003587 # let's throw a classic class into the mix:
3588 class Classic:
3589 def meth2(self):
3590 return 3
3591
3592 D.__bases__ = (C, Classic)
3593
3594 vereq(d.meth2(), 3)
3595 vereq(e.meth2(), 3)
3596 try:
3597 d.a
3598 except AttributeError:
3599 pass
3600 else:
3601 raise TestFailed, "attribute should have vanished"
3602
3603 try:
3604 D.__bases__ = (Classic,)
3605 except TypeError:
3606 pass
3607 else:
3608 raise TestFailed, "new-style class must have a new-style base"
3609
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003610def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003611 if verbose:
3612 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003613 class WorkOnce(type):
3614 def __new__(self, name, bases, ns):
3615 self.flag = 0
3616 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3617 def mro(self):
3618 if self.flag > 0:
3619 raise RuntimeError, "bozo"
3620 else:
3621 self.flag += 1
3622 return type.mro(self)
3623
3624 class WorkAlways(type):
3625 def mro(self):
3626 # this is here to make sure that .mro()s aren't called
3627 # with an exception set (which was possible at one point).
3628 # An error message will be printed in a debug build.
3629 # What's a good way to test for this?
3630 return type.mro(self)
3631
3632 class C(object):
3633 pass
3634
3635 class C2(object):
3636 pass
3637
3638 class D(C):
3639 pass
3640
3641 class E(D):
3642 pass
3643
3644 class F(D):
3645 __metaclass__ = WorkOnce
3646
3647 class G(D):
3648 __metaclass__ = WorkAlways
3649
3650 # Immediate subclasses have their mro's adjusted in alphabetical
3651 # order, so E's will get adjusted before adjusting F's fails. We
3652 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003653
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003654 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003655 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003656
3657 try:
3658 D.__bases__ = (C2,)
3659 except RuntimeError:
3660 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003661 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003662 else:
3663 raise TestFailed, "exception not propagated"
3664
3665def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003666 if verbose:
3667 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003668 class A(object):
3669 pass
3670
3671 class B(object):
3672 pass
3673
3674 class C(A, B):
3675 pass
3676
3677 class D(A, B):
3678 pass
3679
3680 class E(C, D):
3681 pass
3682
3683 try:
3684 C.__bases__ = (B, A)
3685 except TypeError:
3686 pass
3687 else:
3688 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003689
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003690def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003691 if verbose:
3692 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003693 class C(object):
3694 pass
3695
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003696 # C.__module__ could be 'test_descr' or '__main__'
3697 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003698
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003699 C.__name__ = 'D'
3700 vereq((C.__module__, C.__name__), (mod, 'D'))
3701
3702 C.__name__ = 'D.E'
3703 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003704
Guido van Rossum613f24f2003-01-06 23:00:59 +00003705def subclass_right_op():
3706 if verbose:
3707 print "Testing correct dispatch of subclass overloading __r<op>__..."
3708
3709 # This code tests various cases where right-dispatch of a subclass
3710 # should be preferred over left-dispatch of a base class.
3711
3712 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3713
3714 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003715 def __floordiv__(self, other):
3716 return "B.__floordiv__"
3717 def __rfloordiv__(self, other):
3718 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003719
Guido van Rossumf389c772003-02-27 20:04:19 +00003720 vereq(B(1) // 1, "B.__floordiv__")
3721 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003722
3723 # Case 2: subclass of object; this is just the baseline for case 3
3724
3725 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003726 def __floordiv__(self, other):
3727 return "C.__floordiv__"
3728 def __rfloordiv__(self, other):
3729 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003730
Guido van Rossumf389c772003-02-27 20:04:19 +00003731 vereq(C() // 1, "C.__floordiv__")
3732 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003733
3734 # Case 3: subclass of new-style class; here it gets interesting
3735
3736 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003737 def __floordiv__(self, other):
3738 return "D.__floordiv__"
3739 def __rfloordiv__(self, other):
3740 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003741
Guido van Rossumf389c772003-02-27 20:04:19 +00003742 vereq(D() // C(), "D.__floordiv__")
3743 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003744
3745 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3746
3747 class E(C):
3748 pass
3749
Guido van Rossumf389c772003-02-27 20:04:19 +00003750 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003751
Guido van Rossumf389c772003-02-27 20:04:19 +00003752 vereq(E() // 1, "C.__floordiv__")
3753 vereq(1 // E(), "C.__rfloordiv__")
3754 vereq(E() // C(), "C.__floordiv__")
3755 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003756
Guido van Rossum373c7412003-01-07 13:41:37 +00003757def dict_type_with_metaclass():
3758 if verbose:
3759 print "Testing type of __dict__ when __metaclass__ set..."
3760
3761 class B(object):
3762 pass
3763 class M(type):
3764 pass
3765 class C:
3766 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3767 __metaclass__ = M
3768 veris(type(C.__dict__), type(B.__dict__))
3769
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003770def meth_class_get():
3771 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003772 if verbose:
3773 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003774 # Baseline
3775 arg = [1, 2, 3]
3776 res = {1: None, 2: None, 3: None}
3777 vereq(dict.fromkeys(arg), res)
3778 vereq({}.fromkeys(arg), res)
3779 # Now get the descriptor
3780 descr = dict.__dict__["fromkeys"]
3781 # More baseline using the descriptor directly
3782 vereq(descr.__get__(None, dict)(arg), res)
3783 vereq(descr.__get__({})(arg), res)
3784 # Now check various error cases
3785 try:
3786 descr.__get__(None, None)
3787 except TypeError:
3788 pass
3789 else:
3790 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3791 try:
3792 descr.__get__(42)
3793 except TypeError:
3794 pass
3795 else:
3796 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3797 try:
3798 descr.__get__(None, 42)
3799 except TypeError:
3800 pass
3801 else:
3802 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3803 try:
3804 descr.__get__(None, int)
3805 except TypeError:
3806 pass
3807 else:
3808 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3809
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003810def isinst_isclass():
3811 if verbose:
3812 print "Testing proxy isinstance() and isclass()..."
3813 class Proxy(object):
3814 def __init__(self, obj):
3815 self.__obj = obj
3816 def __getattribute__(self, name):
3817 if name.startswith("_Proxy__"):
3818 return object.__getattribute__(self, name)
3819 else:
3820 return getattr(self.__obj, name)
3821 # Test with a classic class
3822 class C:
3823 pass
3824 a = C()
3825 pa = Proxy(a)
3826 verify(isinstance(a, C)) # Baseline
3827 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003828 # Test with a classic subclass
3829 class D(C):
3830 pass
3831 a = D()
3832 pa = Proxy(a)
3833 verify(isinstance(a, C)) # Baseline
3834 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003835 # Test with a new-style class
3836 class C(object):
3837 pass
3838 a = C()
3839 pa = Proxy(a)
3840 verify(isinstance(a, C)) # Baseline
3841 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003842 # Test with a new-style subclass
3843 class D(C):
3844 pass
3845 a = D()
3846 pa = Proxy(a)
3847 verify(isinstance(a, C)) # Baseline
3848 verify(isinstance(pa, C)) # Test
3849
3850def proxysuper():
3851 if verbose:
3852 print "Testing super() for a proxy object..."
3853 class Proxy(object):
3854 def __init__(self, obj):
3855 self.__obj = obj
3856 def __getattribute__(self, name):
3857 if name.startswith("_Proxy__"):
3858 return object.__getattribute__(self, name)
3859 else:
3860 return getattr(self.__obj, name)
3861
3862 class B(object):
3863 def f(self):
3864 return "B.f"
3865
3866 class C(B):
3867 def f(self):
3868 return super(C, self).f() + "->C.f"
3869
3870 obj = C()
3871 p = Proxy(obj)
3872 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003873
Guido van Rossum52b27052003-04-15 20:05:10 +00003874def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003875 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00003876 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003877 try:
3878 object.__setattr__(str, "foo", 42)
3879 except TypeError:
3880 pass
3881 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003882 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003883 try:
3884 object.__delattr__(str, "lower")
3885 except TypeError:
3886 pass
3887 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003888 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003889
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003890def weakref_segfault():
3891 # SF 742911
3892 if verbose:
3893 print "Testing weakref segfault..."
3894
3895 import weakref
3896
3897 class Provoker:
3898 def __init__(self, referrent):
3899 self.ref = weakref.ref(referrent)
3900
3901 def __del__(self):
3902 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003903
3904 class Oops(object):
3905 pass
3906
3907 o = Oops()
3908 o.whatever = Provoker(o)
3909 del o
3910
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003911
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003912def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003913 weakref_segfault() # Must be first, somehow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003914 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003915 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003916 lists()
3917 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003918 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003919 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003920 ints()
3921 longs()
3922 floats()
3923 complexes()
3924 spamlists()
3925 spamdicts()
3926 pydicts()
3927 pylists()
3928 metaclass()
3929 pymods()
3930 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00003931 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003932 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00003933 ex5()
3934 monotonicity()
3935 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00003936 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003937 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003938 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003939 dynamics()
3940 errors()
3941 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003942 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003943 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003944 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003945 classic()
3946 compattr()
3947 newslot()
3948 altmro()
3949 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003950 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003951 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003952 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003953 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003954 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003955 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003956 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003957 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003958 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003959 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003960 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003961 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003962 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003963 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003964 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003965 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003966 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003967 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003968 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003969 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003970 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003971 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003972 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003973 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003974 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003975 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003976 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003977 dictproxyiterkeys()
3978 dictproxyitervalues()
3979 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003980 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003981 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003982 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003983 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003984 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003985 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003986 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003987 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003988 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003989 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003990 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003991 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003992 test_mutable_bases()
3993 test_mutable_bases_with_failing_mro()
3994 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003995 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00003996 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00003997 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003998 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003999 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004000 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004001 carloverre()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004002
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004003 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004004
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004005if __name__ == "__main__":
4006 test_main()