blob: 56c16628dae50a75dec39df53af2b5e0a06667b7 [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
Barry Warsaw04f357c2002-07-23 19:04:11 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
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
461 try:
462 C() + ""
463 except TypeError:
464 pass
465 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000466 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000467
468def longs():
469 if verbose: print "Testing long operations..."
470 numops(100L, 3L)
471
472def floats():
473 if verbose: print "Testing float operations..."
474 numops(100.0, 3.0)
475
476def complexes():
477 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000478 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000479 class Number(complex):
480 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000481 def __new__(cls, *args, **kwds):
482 result = complex.__new__(cls, *args)
483 result.prec = kwds.get('prec', 12)
484 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000485 def __repr__(self):
486 prec = self.prec
487 if self.imag == 0.0:
488 return "%.*g" % (prec, self.real)
489 if self.real == 0.0:
490 return "%.*gj" % (prec, self.imag)
491 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
492 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000493
Tim Peters6d6c1a32001-08-02 04:15:00 +0000494 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000495 vereq(`a`, "3.14")
496 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000497
Tim Peters3f996e72001-09-13 19:18:27 +0000498 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(`a`, "3.1")
500 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000501
502 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000503 vereq(`a`, "234.5")
504 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000505
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506def spamlists():
507 if verbose: print "Testing spamlist operations..."
508 import copy, xxsubtype as spam
509 def spamlist(l, memo=None):
510 import xxsubtype as spam
511 return spam.spamlist(l)
512 # This is an ugly hack:
513 copy._deepcopy_dispatch[spam.spamlist] = spamlist
514
515 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
516 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
517 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
518 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
519 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
520 "a[b:c]", "__getslice__")
521 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
522 "a+=b", "__iadd__")
523 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
524 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
525 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
526 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
527 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
528 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
529 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
530 # Test subclassing
531 class C(spam.spamlist):
532 def foo(self): return 1
533 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000534 vereq(a, [])
535 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000536 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000537 vereq(a, [100])
538 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000539 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000540 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000541
542def spamdicts():
543 if verbose: print "Testing spamdict operations..."
544 import copy, xxsubtype as spam
545 def spamdict(d, memo=None):
546 import xxsubtype as spam
547 sd = spam.spamdict()
548 for k, v in d.items(): sd[k] = v
549 return sd
550 # This is an ugly hack:
551 copy._deepcopy_dispatch[spam.spamdict] = spamdict
552
553 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
554 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
555 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
556 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
557 d = spamdict({1:2,3:4})
558 l1 = []
559 for i in d.keys(): l1.append(i)
560 l = []
561 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000562 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000563 l = []
564 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000565 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566 l = []
567 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000568 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000569 straightd = {1:2, 3:4}
570 spamd = spamdict(straightd)
571 testunop(spamd, 2, "len(a)", "__len__")
572 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
573 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
574 "a[b]=c", "__setitem__")
575 # Test subclassing
576 class C(spam.spamdict):
577 def foo(self): return 1
578 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(a.items(), [])
580 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000581 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000582 vereq(a.items(), [('foo', 'bar')])
583 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000584 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000585 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000586
587def pydicts():
588 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000589 verify(issubclass(dict, dict))
590 verify(isinstance({}, dict))
591 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000592 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000593 verify(d.__class__ is dict)
594 verify(isinstance(d, dict))
595 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596 state = -1
597 def __init__(self, *a, **kw):
598 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000599 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000600 self.state = a[0]
601 if kw:
602 for k, v in kw.items(): self[v] = k
603 def __getitem__(self, key):
604 return self.get(key, 0)
605 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000606 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000607 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000608 def setstate(self, state):
609 self.state = state
610 def getstate(self):
611 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000612 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000613 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000614 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000615 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000616 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000618 vereq(a.state, -1)
619 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000620 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000621 vereq(a.state, 0)
622 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000624 vereq(a.state, 10)
625 vereq(a.getstate(), 10)
626 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000628 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629 if verbose: print "pydict stress test ..."
630 N = 50
631 for i in range(N):
632 a[i] = C()
633 for j in range(N):
634 a[i][j] = i*j
635 for i in range(N):
636 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000637 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000638
639def pylists():
640 if verbose: print "Testing Python subclass of list..."
641 class C(list):
642 def __getitem__(self, i):
643 return list.__getitem__(self, i) + 100
644 def __getslice__(self, i, j):
645 return (i, j)
646 a = C()
647 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000648 vereq(a[0], 100)
649 vereq(a[1], 101)
650 vereq(a[2], 102)
651 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000652
653def metaclass():
654 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000655 class C:
656 __metaclass__ = type
657 def __init__(self):
658 self.__state = 0
659 def getstate(self):
660 return self.__state
661 def setstate(self, state):
662 self.__state = state
663 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000664 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000665 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000666 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000667 class D:
668 class __metaclass__(type):
669 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000670 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000671 d = D()
672 verify(d.__class__ is D)
673 class M1(type):
674 def __new__(cls, name, bases, dict):
675 dict['__spam__'] = 1
676 return type.__new__(cls, name, bases, dict)
677 class C:
678 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000679 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000680 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000681 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682
Guido van Rossum309b5662001-08-17 11:43:17 +0000683 class _instance(object):
684 pass
685 class M2(object):
686 def __new__(cls, name, bases, dict):
687 self = object.__new__(cls)
688 self.name = name
689 self.bases = bases
690 self.dict = dict
691 return self
692 __new__ = staticmethod(__new__)
693 def __call__(self):
694 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000695 # Early binding of methods
696 for key in self.dict:
697 if key.startswith("__"):
698 continue
699 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000700 return it
701 class C:
702 __metaclass__ = M2
703 def spam(self):
704 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000705 vereq(C.name, 'C')
706 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000707 verify('spam' in C.dict)
708 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000709 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000710
Guido van Rossum91ee7982001-08-30 20:52:40 +0000711 # More metaclass examples
712
713 class autosuper(type):
714 # Automatically add __super to the class
715 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000716 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 cls = super(autosuper, metaclass).__new__(metaclass,
718 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000719 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000720 while name[:1] == "_":
721 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000722 if name:
723 name = "_%s__super" % name
724 else:
725 name = "__super"
726 setattr(cls, name, super(cls))
727 return cls
728 class A:
729 __metaclass__ = autosuper
730 def meth(self):
731 return "A"
732 class B(A):
733 def meth(self):
734 return "B" + self.__super.meth()
735 class C(A):
736 def meth(self):
737 return "C" + self.__super.meth()
738 class D(C, B):
739 def meth(self):
740 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000741 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000742 class E(B, C):
743 def meth(self):
744 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000745 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000746
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000747 class autoproperty(type):
748 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000749 # named _get_x and/or _set_x are found
750 def __new__(metaclass, name, bases, dict):
751 hits = {}
752 for key, val in dict.iteritems():
753 if key.startswith("_get_"):
754 key = key[5:]
755 get, set = hits.get(key, (None, None))
756 get = val
757 hits[key] = get, set
758 elif key.startswith("_set_"):
759 key = key[5:]
760 get, set = hits.get(key, (None, None))
761 set = val
762 hits[key] = get, set
763 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000764 dict[key] = property(get, set)
765 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000766 name, bases, dict)
767 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000768 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000769 def _get_x(self):
770 return -self.__x
771 def _set_x(self, x):
772 self.__x = -x
773 a = A()
774 verify(not hasattr(a, "x"))
775 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000776 vereq(a.x, 12)
777 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000778
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000779 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000780 # Merge of multiple cooperating metaclasses
781 pass
782 class A:
783 __metaclass__ = multimetaclass
784 def _get_x(self):
785 return "A"
786 class B(A):
787 def _get_x(self):
788 return "B" + self.__super._get_x()
789 class C(A):
790 def _get_x(self):
791 return "C" + self.__super._get_x()
792 class D(C, B):
793 def _get_x(self):
794 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000795 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000796
Guido van Rossumf76de622001-10-18 15:49:21 +0000797 # Make sure type(x) doesn't call x.__class__.__init__
798 class T(type):
799 counter = 0
800 def __init__(self, *args):
801 T.counter += 1
802 class C:
803 __metaclass__ = T
804 vereq(T.counter, 1)
805 a = C()
806 vereq(type(a), C)
807 vereq(T.counter, 1)
808
Guido van Rossum29d26062001-12-11 04:37:34 +0000809 class C(object): pass
810 c = C()
811 try: c()
812 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000813 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000814
Tim Peters6d6c1a32001-08-02 04:15:00 +0000815def pymods():
816 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000818 import sys
819 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000820 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000821 def __init__(self, name):
822 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000823 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000824 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000825 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000826 def __setattr__(self, name, value):
827 log.append(("setattr", name, value))
828 MT.__setattr__(self, name, value)
829 def __delattr__(self, name):
830 log.append(("delattr", name))
831 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000832 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000833 a.foo = 12
834 x = a.foo
835 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000836 vereq(log, [("setattr", "foo", 12),
837 ("getattr", "foo"),
838 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000839
840def multi():
841 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842 class C(object):
843 def __init__(self):
844 self.__state = 0
845 def getstate(self):
846 return self.__state
847 def setstate(self, state):
848 self.__state = state
849 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000850 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000851 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000852 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000853 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854 def __init__(self):
855 type({}).__init__(self)
856 C.__init__(self)
857 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000858 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000860 vereq(d.items(), [("hello", "world")])
861 vereq(d["hello"], "world")
862 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000863 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000864 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000865 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000866
Guido van Rossume45763a2001-08-10 21:28:46 +0000867 # SF bug #442833
868 class Node(object):
869 def __int__(self):
870 return int(self.foo())
871 def foo(self):
872 return "23"
873 class Frag(Node, list):
874 def foo(self):
875 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000876 vereq(Node().__int__(), 23)
877 vereq(int(Node()), 23)
878 vereq(Frag().__int__(), 42)
879 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000880
Tim Petersa91e9642001-11-14 23:32:33 +0000881 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000882
883 class A:
884 x = 1
885
886 class B(A):
887 pass
888
889 class C(A):
890 x = 2
891
892 class D(B, C):
893 pass
894 vereq(D.x, 1)
895
896 # Classic MRO is preserved for a classic base class.
897 class E(D, object):
898 pass
899 vereq(E.__mro__, (E, D, B, A, C, object))
900 vereq(E.x, 1)
901
902 # But with a mix of classic bases, their MROs are combined using
903 # new-style MRO.
904 class F(B, C, object):
905 pass
906 vereq(F.__mro__, (F, B, C, A, object))
907 vereq(F.x, 2)
908
909 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000910 class C:
911 def cmethod(self):
912 return "C a"
913 def all_method(self):
914 return "C b"
915
916 class M1(C, object):
917 def m1method(self):
918 return "M1 a"
919 def all_method(self):
920 return "M1 b"
921
922 vereq(M1.__mro__, (M1, C, object))
923 m = M1()
924 vereq(m.cmethod(), "C a")
925 vereq(m.m1method(), "M1 a")
926 vereq(m.all_method(), "M1 b")
927
928 class D(C):
929 def dmethod(self):
930 return "D a"
931 def all_method(self):
932 return "D b"
933
Guido van Rossum9a818922002-11-14 19:50:14 +0000934 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000935 def m2method(self):
936 return "M2 a"
937 def all_method(self):
938 return "M2 b"
939
Guido van Rossum9a818922002-11-14 19:50:14 +0000940 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000941 m = M2()
942 vereq(m.cmethod(), "C a")
943 vereq(m.dmethod(), "D a")
944 vereq(m.m2method(), "M2 a")
945 vereq(m.all_method(), "M2 b")
946
Guido van Rossum9a818922002-11-14 19:50:14 +0000947 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000948 def m3method(self):
949 return "M3 a"
950 def all_method(self):
951 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000952 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000953 m = M3()
954 vereq(m.cmethod(), "C a")
955 vereq(m.dmethod(), "D a")
956 vereq(m.m1method(), "M1 a")
957 vereq(m.m2method(), "M2 a")
958 vereq(m.m3method(), "M3 a")
959 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000960
Guido van Rossume54616c2001-12-14 04:19:56 +0000961 class Classic:
962 pass
963 try:
964 class New(Classic):
965 __metaclass__ = type
966 except TypeError:
967 pass
968 else:
969 raise TestFailed, "new class with only classic bases - shouldn't be"
970
Tim Peters6d6c1a32001-08-02 04:15:00 +0000971def diamond():
972 if verbose: print "Testing multiple inheritance special cases..."
973 class A(object):
974 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000975 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000976 class B(A):
977 def boo(self): return "B"
978 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000979 vereq(B().spam(), "B")
980 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000981 class C(A):
982 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000983 vereq(C().spam(), "A")
984 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000985 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000986 vereq(D().spam(), "B")
987 vereq(D().boo(), "B")
988 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000990 vereq(E().spam(), "B")
991 vereq(E().boo(), "C")
992 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000993 # MRO order disagreement
994 try:
995 class F(D, E): pass
996 except TypeError:
997 pass
998 else:
999 raise TestFailed, "expected MRO order disagreement (F)"
1000 try:
1001 class G(E, D): pass
1002 except TypeError:
1003 pass
1004 else:
1005 raise TestFailed, "expected MRO order disagreement (G)"
1006
1007
1008# see thread python-dev/2002-October/029035.html
1009def ex5():
1010 if verbose: print "Testing ex5 from C3 switch discussion..."
1011 class A(object): pass
1012 class B(object): pass
1013 class C(object): pass
1014 class X(A): pass
1015 class Y(A): pass
1016 class Z(X,B,Y,C): pass
1017 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1018
1019# see "A Monotonic Superclass Linearization for Dylan",
1020# by Kim Barrett et al. (OOPSLA 1996)
1021def monotonicity():
1022 if verbose: print "Testing MRO monotonicity..."
1023 class Boat(object): pass
1024 class DayBoat(Boat): pass
1025 class WheelBoat(Boat): pass
1026 class EngineLess(DayBoat): pass
1027 class SmallMultihull(DayBoat): pass
1028 class PedalWheelBoat(EngineLess,WheelBoat): pass
1029 class SmallCatamaran(SmallMultihull): pass
1030 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1031
1032 vereq(PedalWheelBoat.__mro__,
1033 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1034 object))
1035 vereq(SmallCatamaran.__mro__,
1036 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1037
1038 vereq(Pedalo.__mro__,
1039 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1040 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1041
1042# see "A Monotonic Superclass Linearization for Dylan",
1043# by Kim Barrett et al. (OOPSLA 1996)
1044def consistency_with_epg():
1045 if verbose: print "Testing consistentcy with EPG..."
1046 class Pane(object): pass
1047 class ScrollingMixin(object): pass
1048 class EditingMixin(object): pass
1049 class ScrollablePane(Pane,ScrollingMixin): pass
1050 class EditablePane(Pane,EditingMixin): pass
1051 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1052
1053 vereq(EditableScrollablePane.__mro__,
1054 (EditableScrollablePane, ScrollablePane, EditablePane,
1055 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056
Guido van Rossum37202612001-08-09 19:45:21 +00001057def objects():
1058 if verbose: print "Testing object class..."
1059 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001060 vereq(a.__class__, object)
1061 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001062 b = object()
1063 verify(a is not b)
1064 verify(not hasattr(a, "foo"))
1065 try:
1066 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001067 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001068 pass
1069 else:
1070 verify(0, "object() should not allow setting a foo attribute")
1071 verify(not hasattr(object(), "__dict__"))
1072
1073 class Cdict(object):
1074 pass
1075 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001076 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001077 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001078 vereq(x.foo, 1)
1079 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001080
Tim Peters6d6c1a32001-08-02 04:15:00 +00001081def slots():
1082 if verbose: print "Testing __slots__..."
1083 class C0(object):
1084 __slots__ = []
1085 x = C0()
1086 verify(not hasattr(x, "__dict__"))
1087 verify(not hasattr(x, "foo"))
1088
1089 class C1(object):
1090 __slots__ = ['a']
1091 x = C1()
1092 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001093 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001094 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001095 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001096 x.a = None
1097 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001098 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001099 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001100
1101 class C3(object):
1102 __slots__ = ['a', 'b', 'c']
1103 x = C3()
1104 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001105 verify(not hasattr(x, 'a'))
1106 verify(not hasattr(x, 'b'))
1107 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001108 x.a = 1
1109 x.b = 2
1110 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001111 vereq(x.a, 1)
1112 vereq(x.b, 2)
1113 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001114
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001115 class C4(object):
1116 """Validate name mangling"""
1117 __slots__ = ['__a']
1118 def __init__(self, value):
1119 self.__a = value
1120 def get(self):
1121 return self.__a
1122 x = C4(5)
1123 verify(not hasattr(x, '__dict__'))
1124 verify(not hasattr(x, '__a'))
1125 vereq(x.get(), 5)
1126 try:
1127 x.__a = 6
1128 except AttributeError:
1129 pass
1130 else:
1131 raise TestFailed, "Double underscored names not mangled"
1132
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001133 # Make sure slot names are proper identifiers
1134 try:
1135 class C(object):
1136 __slots__ = [None]
1137 except TypeError:
1138 pass
1139 else:
1140 raise TestFailed, "[None] slots not caught"
1141 try:
1142 class C(object):
1143 __slots__ = ["foo bar"]
1144 except TypeError:
1145 pass
1146 else:
1147 raise TestFailed, "['foo bar'] slots not caught"
1148 try:
1149 class C(object):
1150 __slots__ = ["foo\0bar"]
1151 except TypeError:
1152 pass
1153 else:
1154 raise TestFailed, "['foo\\0bar'] slots not caught"
1155 try:
1156 class C(object):
1157 __slots__ = ["1"]
1158 except TypeError:
1159 pass
1160 else:
1161 raise TestFailed, "['1'] slots not caught"
1162 try:
1163 class C(object):
1164 __slots__ = [""]
1165 except TypeError:
1166 pass
1167 else:
1168 raise TestFailed, "[''] slots not caught"
1169 class C(object):
1170 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1171
Guido van Rossum33bab012001-12-05 22:45:48 +00001172 # Test leaks
1173 class Counted(object):
1174 counter = 0 # counts the number of instances alive
1175 def __init__(self):
1176 Counted.counter += 1
1177 def __del__(self):
1178 Counted.counter -= 1
1179 class C(object):
1180 __slots__ = ['a', 'b', 'c']
1181 x = C()
1182 x.a = Counted()
1183 x.b = Counted()
1184 x.c = Counted()
1185 vereq(Counted.counter, 3)
1186 del x
1187 vereq(Counted.counter, 0)
1188 class D(C):
1189 pass
1190 x = D()
1191 x.a = Counted()
1192 x.z = Counted()
1193 vereq(Counted.counter, 2)
1194 del x
1195 vereq(Counted.counter, 0)
1196 class E(D):
1197 __slots__ = ['e']
1198 x = E()
1199 x.a = Counted()
1200 x.z = Counted()
1201 x.e = Counted()
1202 vereq(Counted.counter, 3)
1203 del x
1204 vereq(Counted.counter, 0)
1205
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001206 # Test cyclical leaks [SF bug 519621]
1207 class F(object):
1208 __slots__ = ['a', 'b']
1209 log = []
1210 s = F()
1211 s.a = [Counted(), s]
1212 vereq(Counted.counter, 1)
1213 s = None
1214 import gc
1215 gc.collect()
1216 vereq(Counted.counter, 0)
1217
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001218 # Test lookup leaks [SF bug 572567]
1219 import sys,gc
1220 class G(object):
1221 def __cmp__(self, other):
1222 return 0
1223 g = G()
1224 orig_objects = len(gc.get_objects())
1225 for i in xrange(10):
1226 g==g
1227 new_objects = len(gc.get_objects())
1228 vereq(orig_objects, new_objects)
1229
Guido van Rossum8b056da2002-08-13 18:26:26 +00001230def slotspecials():
1231 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1232
1233 class D(object):
1234 __slots__ = ["__dict__"]
1235 a = D()
1236 verify(hasattr(a, "__dict__"))
1237 verify(not hasattr(a, "__weakref__"))
1238 a.foo = 42
1239 vereq(a.__dict__, {"foo": 42})
1240
1241 class W(object):
1242 __slots__ = ["__weakref__"]
1243 a = W()
1244 verify(hasattr(a, "__weakref__"))
1245 verify(not hasattr(a, "__dict__"))
1246 try:
1247 a.foo = 42
1248 except AttributeError:
1249 pass
1250 else:
1251 raise TestFailed, "shouldn't be allowed to set a.foo"
1252
1253 class C1(W, D):
1254 __slots__ = []
1255 a = C1()
1256 verify(hasattr(a, "__dict__"))
1257 verify(hasattr(a, "__weakref__"))
1258 a.foo = 42
1259 vereq(a.__dict__, {"foo": 42})
1260
1261 class C2(D, W):
1262 __slots__ = []
1263 a = C2()
1264 verify(hasattr(a, "__dict__"))
1265 verify(hasattr(a, "__weakref__"))
1266 a.foo = 42
1267 vereq(a.__dict__, {"foo": 42})
1268
Guido van Rossum9a818922002-11-14 19:50:14 +00001269# MRO order disagreement
1270#
1271# class C3(C1, C2):
1272# __slots__ = []
1273#
1274# class C4(C2, C1):
1275# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001276
Tim Peters6d6c1a32001-08-02 04:15:00 +00001277def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001278 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001279 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001281 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001282 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001283 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001284 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001285 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001286 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001287 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001288 vereq(E.foo, 1)
1289 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001290 # Test dynamic instances
1291 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001292 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001293 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001294 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001295 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001296 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001297 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001298 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001299 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001300 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001301 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001302 vereq(int(a), 100)
1303 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001304 verify(not hasattr(a, "spam"))
1305 def mygetattr(self, name):
1306 if name == "spam":
1307 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001308 raise AttributeError
1309 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001310 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001311 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001312 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001313 def mysetattr(self, name, value):
1314 if name == "spam":
1315 raise AttributeError
1316 return object.__setattr__(self, name, value)
1317 C.__setattr__ = mysetattr
1318 try:
1319 a.spam = "not spam"
1320 except AttributeError:
1321 pass
1322 else:
1323 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001324 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001325 class D(C):
1326 pass
1327 d = D()
1328 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001329 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001330
Guido van Rossum7e35d572001-09-15 03:14:32 +00001331 # Test handling of int*seq and seq*int
1332 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001333 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001334 vereq("a"*I(2), "aa")
1335 vereq(I(2)*"a", "aa")
1336 vereq(2*I(3), 6)
1337 vereq(I(3)*2, 6)
1338 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001339
1340 # Test handling of long*seq and seq*long
1341 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001342 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001343 vereq("a"*L(2L), "aa")
1344 vereq(L(2L)*"a", "aa")
1345 vereq(2*L(3), 6)
1346 vereq(L(3)*2, 6)
1347 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001348
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001349 # Test comparison of classes with dynamic metaclasses
1350 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001351 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001352 class someclass:
1353 __metaclass__ = dynamicmetaclass
1354 verify(someclass != object)
1355
Tim Peters6d6c1a32001-08-02 04:15:00 +00001356def errors():
1357 if verbose: print "Testing errors..."
1358
1359 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001360 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001361 pass
1362 except TypeError:
1363 pass
1364 else:
1365 verify(0, "inheritance from both list and dict should be illegal")
1366
1367 try:
1368 class C(object, None):
1369 pass
1370 except TypeError:
1371 pass
1372 else:
1373 verify(0, "inheritance from non-type should be illegal")
1374 class Classic:
1375 pass
1376
1377 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001378 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001379 pass
1380 except TypeError:
1381 pass
1382 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001383 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001384
1385 try:
1386 class C(object):
1387 __slots__ = 1
1388 except TypeError:
1389 pass
1390 else:
1391 verify(0, "__slots__ = 1 should be illegal")
1392
1393 try:
1394 class C(object):
1395 __slots__ = [1]
1396 except TypeError:
1397 pass
1398 else:
1399 verify(0, "__slots__ = [1] should be illegal")
1400
1401def classmethods():
1402 if verbose: print "Testing class methods..."
1403 class C(object):
1404 def foo(*a): return a
1405 goo = classmethod(foo)
1406 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001407 vereq(C.goo(1), (C, 1))
1408 vereq(c.goo(1), (C, 1))
1409 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001410 class D(C):
1411 pass
1412 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001413 vereq(D.goo(1), (D, 1))
1414 vereq(d.goo(1), (D, 1))
1415 vereq(d.foo(1), (d, 1))
1416 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001417 # Test for a specific crash (SF bug 528132)
1418 def f(cls, arg): return (cls, arg)
1419 ff = classmethod(f)
1420 vereq(ff.__get__(0, int)(42), (int, 42))
1421 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001422
Guido van Rossum155db9a2002-04-02 17:53:47 +00001423 # Test super() with classmethods (SF bug 535444)
1424 veris(C.goo.im_self, C)
1425 veris(D.goo.im_self, D)
1426 veris(super(D,D).goo.im_self, D)
1427 veris(super(D,d).goo.im_self, D)
1428 vereq(super(D,D).goo(), (D,))
1429 vereq(super(D,d).goo(), (D,))
1430
Fred Drakef841aa62002-03-28 15:49:54 +00001431def classmethods_in_c():
1432 if verbose: print "Testing C-based class methods..."
1433 import xxsubtype as spam
1434 a = (1, 2, 3)
1435 d = {'abc': 123}
1436 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1437 veris(x, None)
1438 vereq((spam.spamlist,) + a, a1)
1439 vereq(d, d1)
1440 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1441 veris(x, None)
1442 vereq((spam.spamlist,) + a, a1)
1443 vereq(d, d1)
1444
Tim Peters6d6c1a32001-08-02 04:15:00 +00001445def staticmethods():
1446 if verbose: print "Testing static methods..."
1447 class C(object):
1448 def foo(*a): return a
1449 goo = staticmethod(foo)
1450 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001451 vereq(C.goo(1), (1,))
1452 vereq(c.goo(1), (1,))
1453 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001454 class D(C):
1455 pass
1456 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001457 vereq(D.goo(1), (1,))
1458 vereq(d.goo(1), (1,))
1459 vereq(d.foo(1), (d, 1))
1460 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001461
Fred Drakef841aa62002-03-28 15:49:54 +00001462def staticmethods_in_c():
1463 if verbose: print "Testing C-based static methods..."
1464 import xxsubtype as spam
1465 a = (1, 2, 3)
1466 d = {"abc": 123}
1467 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1468 veris(x, None)
1469 vereq(a, a1)
1470 vereq(d, d1)
1471 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1472 veris(x, None)
1473 vereq(a, a1)
1474 vereq(d, d1)
1475
Tim Peters6d6c1a32001-08-02 04:15:00 +00001476def classic():
1477 if verbose: print "Testing classic classes..."
1478 class C:
1479 def foo(*a): return a
1480 goo = classmethod(foo)
1481 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001482 vereq(C.goo(1), (C, 1))
1483 vereq(c.goo(1), (C, 1))
1484 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001485 class D(C):
1486 pass
1487 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001488 vereq(D.goo(1), (D, 1))
1489 vereq(d.goo(1), (D, 1))
1490 vereq(d.foo(1), (d, 1))
1491 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001492 class E: # *not* subclassing from C
1493 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001494 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001495 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001496
1497def compattr():
1498 if verbose: print "Testing computed attributes..."
1499 class C(object):
1500 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001501 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001502 self.__get = get
1503 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001504 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001505 def __get__(self, obj, type=None):
1506 return self.__get(obj)
1507 def __set__(self, obj, value):
1508 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001509 def __delete__(self, obj):
1510 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001511 def __init__(self):
1512 self.__x = 0
1513 def __get_x(self):
1514 x = self.__x
1515 self.__x = x+1
1516 return x
1517 def __set_x(self, x):
1518 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001519 def __delete_x(self):
1520 del self.__x
1521 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001522 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001523 vereq(a.x, 0)
1524 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001525 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001526 vereq(a.x, 10)
1527 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001528 del a.x
1529 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001530
1531def newslot():
1532 if verbose: print "Testing __new__ slot override..."
1533 class C(list):
1534 def __new__(cls):
1535 self = list.__new__(cls)
1536 self.foo = 1
1537 return self
1538 def __init__(self):
1539 self.foo = self.foo + 2
1540 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001541 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001542 verify(a.__class__ is C)
1543 class D(C):
1544 pass
1545 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001546 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001547 verify(b.__class__ is D)
1548
Tim Peters6d6c1a32001-08-02 04:15:00 +00001549def altmro():
1550 if verbose: print "Testing mro() and overriding it..."
1551 class A(object):
1552 def f(self): return "A"
1553 class B(A):
1554 pass
1555 class C(A):
1556 def f(self): return "C"
1557 class D(B, C):
1558 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001559 vereq(D.mro(), [D, B, C, A, object])
1560 vereq(D.__mro__, (D, B, C, A, object))
1561 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001562
Guido van Rossumd3077402001-08-12 05:24:18 +00001563 class PerverseMetaType(type):
1564 def mro(cls):
1565 L = type.mro(cls)
1566 L.reverse()
1567 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001568 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001569 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001570 vereq(X.__mro__, (object, A, C, B, D, X))
1571 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001572
1573def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001574 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001575
1576 class B(object):
1577 "Intermediate class because object doesn't have a __setattr__"
1578
1579 class C(B):
1580
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001581 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001582 if name == "foo":
1583 return ("getattr", name)
1584 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001585 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001586 def __setattr__(self, name, value):
1587 if name == "foo":
1588 self.setattr = (name, value)
1589 else:
1590 return B.__setattr__(self, name, value)
1591 def __delattr__(self, name):
1592 if name == "foo":
1593 self.delattr = name
1594 else:
1595 return B.__delattr__(self, name)
1596
1597 def __getitem__(self, key):
1598 return ("getitem", key)
1599 def __setitem__(self, key, value):
1600 self.setitem = (key, value)
1601 def __delitem__(self, key):
1602 self.delitem = key
1603
1604 def __getslice__(self, i, j):
1605 return ("getslice", i, j)
1606 def __setslice__(self, i, j, value):
1607 self.setslice = (i, j, value)
1608 def __delslice__(self, i, j):
1609 self.delslice = (i, j)
1610
1611 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001612 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001613 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001614 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001615 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001616 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001617
Guido van Rossum45704552001-10-08 16:35:45 +00001618 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001619 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001620 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001621 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001622 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623
Guido van Rossum45704552001-10-08 16:35:45 +00001624 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001625 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001626 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001627 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001628 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001629
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001630def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001631 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001632 class C(object):
1633 def __init__(self, x):
1634 self.x = x
1635 def foo(self):
1636 return self.x
1637 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001638 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001639 class D(C):
1640 boo = C.foo
1641 goo = c1.foo
1642 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001643 vereq(d2.foo(), 2)
1644 vereq(d2.boo(), 2)
1645 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001646 class E(object):
1647 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001648 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001649 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001650
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001651def specials():
1652 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001653 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001654 # Test the default behavior for static classes
1655 class C(object):
1656 def __getitem__(self, i):
1657 if 0 <= i < 10: return i
1658 raise IndexError
1659 c1 = C()
1660 c2 = C()
1661 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(hash(c1), id(c1))
1663 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1664 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001665 verify(c1 != c2)
1666 verify(not c1 != c1)
1667 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001668 # Note that the module name appears in str/repr, and that varies
1669 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001670 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001671 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001672 verify(-1 not in c1)
1673 for i in range(10):
1674 verify(i in c1)
1675 verify(10 not in c1)
1676 # Test the default behavior for dynamic classes
1677 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001678 def __getitem__(self, i):
1679 if 0 <= i < 10: return i
1680 raise IndexError
1681 d1 = D()
1682 d2 = D()
1683 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001684 vereq(hash(d1), id(d1))
1685 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1686 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001687 verify(d1 != d2)
1688 verify(not d1 != d1)
1689 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001690 # Note that the module name appears in str/repr, and that varies
1691 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001692 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001693 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001694 verify(-1 not in d1)
1695 for i in range(10):
1696 verify(i in d1)
1697 verify(10 not in d1)
1698 # Test overridden behavior for static classes
1699 class Proxy(object):
1700 def __init__(self, x):
1701 self.x = x
1702 def __nonzero__(self):
1703 return not not self.x
1704 def __hash__(self):
1705 return hash(self.x)
1706 def __eq__(self, other):
1707 return self.x == other
1708 def __ne__(self, other):
1709 return self.x != other
1710 def __cmp__(self, other):
1711 return cmp(self.x, other.x)
1712 def __str__(self):
1713 return "Proxy:%s" % self.x
1714 def __repr__(self):
1715 return "Proxy(%r)" % self.x
1716 def __contains__(self, value):
1717 return value in self.x
1718 p0 = Proxy(0)
1719 p1 = Proxy(1)
1720 p_1 = Proxy(-1)
1721 verify(not p0)
1722 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001723 vereq(hash(p0), hash(0))
1724 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001725 verify(p0 != p1)
1726 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001727 vereq(not p0, p1)
1728 vereq(cmp(p0, p1), -1)
1729 vereq(cmp(p0, p0), 0)
1730 vereq(cmp(p0, p_1), 1)
1731 vereq(str(p0), "Proxy:0")
1732 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001733 p10 = Proxy(range(10))
1734 verify(-1 not in p10)
1735 for i in range(10):
1736 verify(i in p10)
1737 verify(10 not in p10)
1738 # Test overridden behavior for dynamic classes
1739 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001740 def __init__(self, x):
1741 self.x = x
1742 def __nonzero__(self):
1743 return not not self.x
1744 def __hash__(self):
1745 return hash(self.x)
1746 def __eq__(self, other):
1747 return self.x == other
1748 def __ne__(self, other):
1749 return self.x != other
1750 def __cmp__(self, other):
1751 return cmp(self.x, other.x)
1752 def __str__(self):
1753 return "DProxy:%s" % self.x
1754 def __repr__(self):
1755 return "DProxy(%r)" % self.x
1756 def __contains__(self, value):
1757 return value in self.x
1758 p0 = DProxy(0)
1759 p1 = DProxy(1)
1760 p_1 = DProxy(-1)
1761 verify(not p0)
1762 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001763 vereq(hash(p0), hash(0))
1764 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001765 verify(p0 != p1)
1766 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001767 vereq(not p0, p1)
1768 vereq(cmp(p0, p1), -1)
1769 vereq(cmp(p0, p0), 0)
1770 vereq(cmp(p0, p_1), 1)
1771 vereq(str(p0), "DProxy:0")
1772 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001773 p10 = DProxy(range(10))
1774 verify(-1 not in p10)
1775 for i in range(10):
1776 verify(i in p10)
1777 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001778 # Safety test for __cmp__
1779 def unsafecmp(a, b):
1780 try:
1781 a.__class__.__cmp__(a, b)
1782 except TypeError:
1783 pass
1784 else:
1785 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1786 a.__class__, a, b)
1787 unsafecmp(u"123", "123")
1788 unsafecmp("123", u"123")
1789 unsafecmp(1, 1.0)
1790 unsafecmp(1.0, 1)
1791 unsafecmp(1, 1L)
1792 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001793
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001794def weakrefs():
1795 if verbose: print "Testing weak references..."
1796 import weakref
1797 class C(object):
1798 pass
1799 c = C()
1800 r = weakref.ref(c)
1801 verify(r() is c)
1802 del c
1803 verify(r() is None)
1804 del r
1805 class NoWeak(object):
1806 __slots__ = ['foo']
1807 no = NoWeak()
1808 try:
1809 weakref.ref(no)
1810 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001811 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001812 else:
1813 verify(0, "weakref.ref(no) should be illegal")
1814 class Weak(object):
1815 __slots__ = ['foo', '__weakref__']
1816 yes = Weak()
1817 r = weakref.ref(yes)
1818 verify(r() is yes)
1819 del yes
1820 verify(r() is None)
1821 del r
1822
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001823def properties():
1824 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001825 class C(object):
1826 def getx(self):
1827 return self.__x
1828 def setx(self, value):
1829 self.__x = value
1830 def delx(self):
1831 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001832 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001833 a = C()
1834 verify(not hasattr(a, "x"))
1835 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001836 vereq(a._C__x, 42)
1837 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001838 del a.x
1839 verify(not hasattr(a, "x"))
1840 verify(not hasattr(a, "_C__x"))
1841 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001842 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001843 C.x.__delete__(a)
1844 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001845
Tim Peters66c1a522001-09-24 21:17:50 +00001846 raw = C.__dict__['x']
1847 verify(isinstance(raw, property))
1848
1849 attrs = dir(raw)
1850 verify("__doc__" in attrs)
1851 verify("fget" in attrs)
1852 verify("fset" in attrs)
1853 verify("fdel" in attrs)
1854
Guido van Rossum45704552001-10-08 16:35:45 +00001855 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001856 verify(raw.fget is C.__dict__['getx'])
1857 verify(raw.fset is C.__dict__['setx'])
1858 verify(raw.fdel is C.__dict__['delx'])
1859
1860 for attr in "__doc__", "fget", "fset", "fdel":
1861 try:
1862 setattr(raw, attr, 42)
1863 except TypeError, msg:
1864 if str(msg).find('readonly') < 0:
1865 raise TestFailed("when setting readonly attr %r on a "
1866 "property, got unexpected TypeError "
1867 "msg %r" % (attr, str(msg)))
1868 else:
1869 raise TestFailed("expected TypeError from trying to set "
1870 "readonly %r attr on a property" % attr)
1871
Neal Norwitz673cd822002-10-18 16:33:13 +00001872 class D(object):
1873 __getitem__ = property(lambda s: 1/0)
1874
1875 d = D()
1876 try:
1877 for i in d:
1878 str(i)
1879 except ZeroDivisionError:
1880 pass
1881 else:
1882 raise TestFailed, "expected ZeroDivisionError from bad property"
1883
Guido van Rossumc4a18802001-08-24 16:55:27 +00001884def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001885 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001886
1887 class A(object):
1888 def meth(self, a):
1889 return "A(%r)" % a
1890
Guido van Rossum45704552001-10-08 16:35:45 +00001891 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001892
1893 class B(A):
1894 def __init__(self):
1895 self.__super = super(B, self)
1896 def meth(self, a):
1897 return "B(%r)" % a + self.__super.meth(a)
1898
Guido van Rossum45704552001-10-08 16:35:45 +00001899 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001900
1901 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001902 def meth(self, a):
1903 return "C(%r)" % a + self.__super.meth(a)
1904 C._C__super = super(C)
1905
Guido van Rossum45704552001-10-08 16:35:45 +00001906 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001907
1908 class D(C, B):
1909 def meth(self, a):
1910 return "D(%r)" % a + super(D, self).meth(a)
1911
Guido van Rossum5b443c62001-12-03 15:38:28 +00001912 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1913
1914 # Test for subclassing super
1915
1916 class mysuper(super):
1917 def __init__(self, *args):
1918 return super(mysuper, self).__init__(*args)
1919
1920 class E(D):
1921 def meth(self, a):
1922 return "E(%r)" % a + mysuper(E, self).meth(a)
1923
1924 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1925
1926 class F(E):
1927 def meth(self, a):
1928 s = self.__super
1929 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1930 F._F__super = mysuper(F)
1931
1932 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1933
1934 # Make sure certain errors are raised
1935
1936 try:
1937 super(D, 42)
1938 except TypeError:
1939 pass
1940 else:
1941 raise TestFailed, "shouldn't allow super(D, 42)"
1942
1943 try:
1944 super(D, C())
1945 except TypeError:
1946 pass
1947 else:
1948 raise TestFailed, "shouldn't allow super(D, C())"
1949
1950 try:
1951 super(D).__get__(12)
1952 except TypeError:
1953 pass
1954 else:
1955 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1956
1957 try:
1958 super(D).__get__(C())
1959 except TypeError:
1960 pass
1961 else:
1962 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001963
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001964def inherits():
1965 if verbose: print "Testing inheritance from basic types..."
1966
1967 class hexint(int):
1968 def __repr__(self):
1969 return hex(self)
1970 def __add__(self, other):
1971 return hexint(int.__add__(self, other))
1972 # (Note that overriding __radd__ doesn't work,
1973 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001974 vereq(repr(hexint(7) + 9), "0x10")
1975 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001976 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001977 vereq(a, 12345)
1978 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001979 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001980 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001981 verify((+a).__class__ is int)
1982 verify((a >> 0).__class__ is int)
1983 verify((a << 0).__class__ is int)
1984 verify((hexint(0) << 12).__class__ is int)
1985 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001986
1987 class octlong(long):
1988 __slots__ = []
1989 def __str__(self):
1990 s = oct(self)
1991 if s[-1] == 'L':
1992 s = s[:-1]
1993 return s
1994 def __add__(self, other):
1995 return self.__class__(super(octlong, self).__add__(other))
1996 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001997 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001998 # (Note that overriding __radd__ here only seems to work
1999 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002000 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002001 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002002 vereq(a, 12345L)
2003 vereq(long(a), 12345L)
2004 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002005 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002006 verify((+a).__class__ is long)
2007 verify((-a).__class__ is long)
2008 verify((-octlong(0)).__class__ is long)
2009 verify((a >> 0).__class__ is long)
2010 verify((a << 0).__class__ is long)
2011 verify((a - 0).__class__ is long)
2012 verify((a * 1).__class__ is long)
2013 verify((a ** 1).__class__ is long)
2014 verify((a // 1).__class__ is long)
2015 verify((1 * a).__class__ is long)
2016 verify((a | 0).__class__ is long)
2017 verify((a ^ 0).__class__ is long)
2018 verify((a & -1L).__class__ is long)
2019 verify((octlong(0) << 12).__class__ is long)
2020 verify((octlong(0) >> 12).__class__ is long)
2021 verify(abs(octlong(0)).__class__ is long)
2022
2023 # Because octlong overrides __add__, we can't check the absence of +0
2024 # optimizations using octlong.
2025 class longclone(long):
2026 pass
2027 a = longclone(1)
2028 verify((a + 0).__class__ is long)
2029 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002030
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002031 # Check that negative clones don't segfault
2032 a = longclone(-1)
2033 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002034 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002035
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002036 class precfloat(float):
2037 __slots__ = ['prec']
2038 def __init__(self, value=0.0, prec=12):
2039 self.prec = int(prec)
2040 float.__init__(value)
2041 def __repr__(self):
2042 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002043 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002044 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002045 vereq(a, 12345.0)
2046 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002047 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002048 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002049 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002050
Tim Peters2400fa42001-09-12 19:12:49 +00002051 class madcomplex(complex):
2052 def __repr__(self):
2053 return "%.17gj%+.17g" % (self.imag, self.real)
2054 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002055 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002056 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002057 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002058 vereq(a, base)
2059 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002060 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002061 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002062 vereq(repr(a), "4j-3")
2063 vereq(a, base)
2064 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002065 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002066 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002067 veris((+a).__class__, complex)
2068 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002069 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002070 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002071 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002072 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002073 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002074 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002075 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002076
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002077 class madtuple(tuple):
2078 _rev = None
2079 def rev(self):
2080 if self._rev is not None:
2081 return self._rev
2082 L = list(self)
2083 L.reverse()
2084 self._rev = self.__class__(L)
2085 return self._rev
2086 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002087 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2088 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2089 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002090 for i in range(512):
2091 t = madtuple(range(i))
2092 u = t.rev()
2093 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002094 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002095 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002096 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002097 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002098 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002099 verify(a[:].__class__ is tuple)
2100 verify((a * 1).__class__ is tuple)
2101 verify((a * 0).__class__ is tuple)
2102 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002103 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002104 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002105 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002106 verify((a + a).__class__ is tuple)
2107 verify((a * 0).__class__ is tuple)
2108 verify((a * 1).__class__ is tuple)
2109 verify((a * 2).__class__ is tuple)
2110 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002111
2112 class madstring(str):
2113 _rev = None
2114 def rev(self):
2115 if self._rev is not None:
2116 return self._rev
2117 L = list(self)
2118 L.reverse()
2119 self._rev = self.__class__("".join(L))
2120 return self._rev
2121 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002122 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2123 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2124 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002125 for i in range(256):
2126 s = madstring("".join(map(chr, range(i))))
2127 t = s.rev()
2128 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002129 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002130 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002131 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002132 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002133
Tim Peters8fa5dd02001-09-12 02:18:30 +00002134 base = "\x00" * 5
2135 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002136 vereq(s, base)
2137 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002138 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002139 vereq(hash(s), hash(base))
2140 vereq({s: 1}[base], 1)
2141 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002142 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002143 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002144 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002145 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002146 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002147 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002148 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002149 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002150 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002151 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002152 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002153 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002154 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002155 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002156 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002157 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002158 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002159 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002160 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002161 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002162 identitytab = ''.join([chr(i) for i in range(256)])
2163 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002164 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002165 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002166 vereq(s.translate(identitytab, "x"), base)
2167 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002168 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002169 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002170 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002171 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002172 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002173 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002174 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002176 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002177 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002178
Tim Peters111f6092001-09-12 07:54:51 +00002179 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002180 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002181 verify(intern(s).__class__ is str)
2182 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002184
2185 i = intern("y x")
2186 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002188 verify(intern(s).__class__ is str)
2189 verify(intern(s) is i)
2190
2191 s = madstring(i)
2192 verify(intern(s).__class__ is str)
2193 verify(intern(s) is i)
2194
Guido van Rossum91ee7982001-08-30 20:52:40 +00002195 class madunicode(unicode):
2196 _rev = None
2197 def rev(self):
2198 if self._rev is not None:
2199 return self._rev
2200 L = list(self)
2201 L.reverse()
2202 self._rev = self.__class__(u"".join(L))
2203 return self._rev
2204 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002205 vereq(u, u"ABCDEF")
2206 vereq(u.rev(), madunicode(u"FEDCBA"))
2207 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002208 base = u"12345"
2209 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002210 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002211 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002212 vereq(hash(u), hash(base))
2213 vereq({u: 1}[base], 1)
2214 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002215 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002216 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002217 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002218 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002219 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002220 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002221 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002222 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002223 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002224 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002225 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002226 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002227 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002228 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002229 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002230 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002231 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002232 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002233 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002235 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002236 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002237 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002238 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002239 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002240 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002241 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002242 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002243 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002244 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002245 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002246 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002247 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002249 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002250 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002251 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002252 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002253
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002254 class sublist(list):
2255 pass
2256 a = sublist(range(5))
2257 vereq(a, range(5))
2258 a.append("hello")
2259 vereq(a, range(5) + ["hello"])
2260 a[5] = 5
2261 vereq(a, range(6))
2262 a.extend(range(6, 20))
2263 vereq(a, range(20))
2264 a[-5:] = []
2265 vereq(a, range(15))
2266 del a[10:15]
2267 vereq(len(a), 10)
2268 vereq(a, range(10))
2269 vereq(list(a), range(10))
2270 vereq(a[0], 0)
2271 vereq(a[9], 9)
2272 vereq(a[-10], 0)
2273 vereq(a[-1], 9)
2274 vereq(a[:5], range(5))
2275
Tim Peters59c9a642001-09-13 05:38:56 +00002276 class CountedInput(file):
2277 """Counts lines read by self.readline().
2278
2279 self.lineno is the 0-based ordinal of the last line read, up to
2280 a maximum of one greater than the number of lines in the file.
2281
2282 self.ateof is true if and only if the final "" line has been read,
2283 at which point self.lineno stops incrementing, and further calls
2284 to readline() continue to return "".
2285 """
2286
2287 lineno = 0
2288 ateof = 0
2289 def readline(self):
2290 if self.ateof:
2291 return ""
2292 s = file.readline(self)
2293 # Next line works too.
2294 # s = super(CountedInput, self).readline()
2295 self.lineno += 1
2296 if s == "":
2297 self.ateof = 1
2298 return s
2299
Tim Peters561f8992001-09-13 19:36:36 +00002300 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002301 lines = ['a\n', 'b\n', 'c\n']
2302 try:
2303 f.writelines(lines)
2304 f.close()
2305 f = CountedInput(TESTFN)
2306 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2307 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002308 vereq(expected, got)
2309 vereq(f.lineno, i)
2310 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002311 f.close()
2312 finally:
2313 try:
2314 f.close()
2315 except:
2316 pass
2317 try:
2318 import os
2319 os.unlink(TESTFN)
2320 except:
2321 pass
2322
Tim Peters808b94e2001-09-13 19:33:07 +00002323def keywords():
2324 if verbose:
2325 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002326 vereq(int(x=1), 1)
2327 vereq(float(x=2), 2.0)
2328 vereq(long(x=3), 3L)
2329 vereq(complex(imag=42, real=666), complex(666, 42))
2330 vereq(str(object=500), '500')
2331 vereq(unicode(string='abc', errors='strict'), u'abc')
2332 vereq(tuple(sequence=range(3)), (0, 1, 2))
2333 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002334 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002335
2336 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002337 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002338 try:
2339 constructor(bogus_keyword_arg=1)
2340 except TypeError:
2341 pass
2342 else:
2343 raise TestFailed("expected TypeError from bogus keyword "
2344 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002345
Tim Peters8fa45672001-09-13 21:01:29 +00002346def restricted():
2347 import rexec
2348 if verbose:
2349 print "Testing interaction with restricted execution ..."
2350
2351 sandbox = rexec.RExec()
2352
2353 code1 = """f = open(%r, 'w')""" % TESTFN
2354 code2 = """f = file(%r, 'w')""" % TESTFN
2355 code3 = """\
2356f = open(%r)
2357t = type(f) # a sneaky way to get the file() constructor
2358f.close()
2359f = t(%r, 'w') # rexec can't catch this by itself
2360""" % (TESTFN, TESTFN)
2361
2362 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2363 f.close()
2364
2365 try:
2366 for code in code1, code2, code3:
2367 try:
2368 sandbox.r_exec(code)
2369 except IOError, msg:
2370 if str(msg).find("restricted") >= 0:
2371 outcome = "OK"
2372 else:
2373 outcome = "got an exception, but not an expected one"
2374 else:
2375 outcome = "expected a restricted-execution exception"
2376
2377 if outcome != "OK":
2378 raise TestFailed("%s, in %r" % (outcome, code))
2379
2380 finally:
2381 try:
2382 import os
2383 os.unlink(TESTFN)
2384 except:
2385 pass
2386
Tim Peters0ab085c2001-09-14 00:25:33 +00002387def str_subclass_as_dict_key():
2388 if verbose:
2389 print "Testing a str subclass used as dict key .."
2390
2391 class cistr(str):
2392 """Sublcass of str that computes __eq__ case-insensitively.
2393
2394 Also computes a hash code of the string in canonical form.
2395 """
2396
2397 def __init__(self, value):
2398 self.canonical = value.lower()
2399 self.hashcode = hash(self.canonical)
2400
2401 def __eq__(self, other):
2402 if not isinstance(other, cistr):
2403 other = cistr(other)
2404 return self.canonical == other.canonical
2405
2406 def __hash__(self):
2407 return self.hashcode
2408
Guido van Rossum45704552001-10-08 16:35:45 +00002409 vereq(cistr('ABC'), 'abc')
2410 vereq('aBc', cistr('ABC'))
2411 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002412
2413 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002414 vereq(d[cistr('one')], 1)
2415 vereq(d[cistr('tWo')], 2)
2416 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002417 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002418 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002419
Guido van Rossumab3b0342001-09-18 20:38:53 +00002420def classic_comparisons():
2421 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002422 class classic:
2423 pass
2424 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002425 if verbose: print " (base = %s)" % base
2426 class C(base):
2427 def __init__(self, value):
2428 self.value = int(value)
2429 def __cmp__(self, other):
2430 if isinstance(other, C):
2431 return cmp(self.value, other.value)
2432 if isinstance(other, int) or isinstance(other, long):
2433 return cmp(self.value, other)
2434 return NotImplemented
2435 c1 = C(1)
2436 c2 = C(2)
2437 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002439 c = {1: c1, 2: c2, 3: c3}
2440 for x in 1, 2, 3:
2441 for y in 1, 2, 3:
2442 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2443 for op in "<", "<=", "==", "!=", ">", ">=":
2444 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2445 "x=%d, y=%d" % (x, y))
2446 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2447 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2448
Guido van Rossum0639f592001-09-18 21:06:04 +00002449def rich_comparisons():
2450 if verbose:
2451 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002452 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002453 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002454 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002455 vereq(z, 1+0j)
2456 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002457 class ZZ(complex):
2458 def __eq__(self, other):
2459 try:
2460 return abs(self - other) <= 1e-6
2461 except:
2462 return NotImplemented
2463 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002464 vereq(zz, 1+0j)
2465 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002466
Guido van Rossum0639f592001-09-18 21:06:04 +00002467 class classic:
2468 pass
2469 for base in (classic, int, object, list):
2470 if verbose: print " (base = %s)" % base
2471 class C(base):
2472 def __init__(self, value):
2473 self.value = int(value)
2474 def __cmp__(self, other):
2475 raise TestFailed, "shouldn't call __cmp__"
2476 def __eq__(self, other):
2477 if isinstance(other, C):
2478 return self.value == other.value
2479 if isinstance(other, int) or isinstance(other, long):
2480 return self.value == other
2481 return NotImplemented
2482 def __ne__(self, other):
2483 if isinstance(other, C):
2484 return self.value != other.value
2485 if isinstance(other, int) or isinstance(other, long):
2486 return self.value != other
2487 return NotImplemented
2488 def __lt__(self, other):
2489 if isinstance(other, C):
2490 return self.value < other.value
2491 if isinstance(other, int) or isinstance(other, long):
2492 return self.value < other
2493 return NotImplemented
2494 def __le__(self, other):
2495 if isinstance(other, C):
2496 return self.value <= other.value
2497 if isinstance(other, int) or isinstance(other, long):
2498 return self.value <= other
2499 return NotImplemented
2500 def __gt__(self, other):
2501 if isinstance(other, C):
2502 return self.value > other.value
2503 if isinstance(other, int) or isinstance(other, long):
2504 return self.value > other
2505 return NotImplemented
2506 def __ge__(self, other):
2507 if isinstance(other, C):
2508 return self.value >= other.value
2509 if isinstance(other, int) or isinstance(other, long):
2510 return self.value >= other
2511 return NotImplemented
2512 c1 = C(1)
2513 c2 = C(2)
2514 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002515 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002516 c = {1: c1, 2: c2, 3: c3}
2517 for x in 1, 2, 3:
2518 for y in 1, 2, 3:
2519 for op in "<", "<=", "==", "!=", ">", ">=":
2520 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2521 "x=%d, y=%d" % (x, y))
2522 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2523 "x=%d, y=%d" % (x, y))
2524 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2525 "x=%d, y=%d" % (x, y))
2526
Guido van Rossum1952e382001-09-19 01:25:16 +00002527def coercions():
2528 if verbose: print "Testing coercions..."
2529 class I(int): pass
2530 coerce(I(0), 0)
2531 coerce(0, I(0))
2532 class L(long): pass
2533 coerce(L(0), 0)
2534 coerce(L(0), 0L)
2535 coerce(0, L(0))
2536 coerce(0L, L(0))
2537 class F(float): pass
2538 coerce(F(0), 0)
2539 coerce(F(0), 0L)
2540 coerce(F(0), 0.)
2541 coerce(0, F(0))
2542 coerce(0L, F(0))
2543 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002544 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002545 coerce(C(0), 0)
2546 coerce(C(0), 0L)
2547 coerce(C(0), 0.)
2548 coerce(C(0), 0j)
2549 coerce(0, C(0))
2550 coerce(0L, C(0))
2551 coerce(0., C(0))
2552 coerce(0j, C(0))
2553
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002554def descrdoc():
2555 if verbose: print "Testing descriptor doc strings..."
2556 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002557 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002558 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002559 check(file.name, "file name") # member descriptor
2560
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002561def setclass():
2562 if verbose: print "Testing __class__ assignment..."
2563 class C(object): pass
2564 class D(object): pass
2565 class E(object): pass
2566 class F(D, E): pass
2567 for cls in C, D, E, F:
2568 for cls2 in C, D, E, F:
2569 x = cls()
2570 x.__class__ = cls2
2571 verify(x.__class__ is cls2)
2572 x.__class__ = cls
2573 verify(x.__class__ is cls)
2574 def cant(x, C):
2575 try:
2576 x.__class__ = C
2577 except TypeError:
2578 pass
2579 else:
2580 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002581 try:
2582 delattr(x, "__class__")
2583 except TypeError:
2584 pass
2585 else:
2586 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002587 cant(C(), list)
2588 cant(list(), C)
2589 cant(C(), 1)
2590 cant(C(), object)
2591 cant(object(), list)
2592 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002593 class Int(int): __slots__ = []
2594 cant(2, Int)
2595 cant(Int(), int)
2596 cant(True, int)
2597 cant(2, bool)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002598
Guido van Rossum6661be32001-10-26 04:26:12 +00002599def setdict():
2600 if verbose: print "Testing __dict__ assignment..."
2601 class C(object): pass
2602 a = C()
2603 a.__dict__ = {'b': 1}
2604 vereq(a.b, 1)
2605 def cant(x, dict):
2606 try:
2607 x.__dict__ = dict
2608 except TypeError:
2609 pass
2610 else:
2611 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2612 cant(a, None)
2613 cant(a, [])
2614 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002615 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002616 # Classes don't allow __dict__ assignment
2617 cant(C, {})
2618
Guido van Rossum3926a632001-09-25 16:25:58 +00002619def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002620 if verbose:
2621 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002622 import pickle, cPickle
2623
2624 def sorteditems(d):
2625 L = d.items()
2626 L.sort()
2627 return L
2628
2629 global C
2630 class C(object):
2631 def __init__(self, a, b):
2632 super(C, self).__init__()
2633 self.a = a
2634 self.b = b
2635 def __repr__(self):
2636 return "C(%r, %r)" % (self.a, self.b)
2637
2638 global C1
2639 class C1(list):
2640 def __new__(cls, a, b):
2641 return super(C1, cls).__new__(cls)
2642 def __init__(self, a, b):
2643 self.a = a
2644 self.b = b
2645 def __repr__(self):
2646 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2647
2648 global C2
2649 class C2(int):
2650 def __new__(cls, a, b, val=0):
2651 return super(C2, cls).__new__(cls, val)
2652 def __init__(self, a, b, val=0):
2653 self.a = a
2654 self.b = b
2655 def __repr__(self):
2656 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2657
Guido van Rossum90c45142001-11-24 21:07:01 +00002658 global C3
2659 class C3(object):
2660 def __init__(self, foo):
2661 self.foo = foo
2662 def __getstate__(self):
2663 return self.foo
2664 def __setstate__(self, foo):
2665 self.foo = foo
2666
2667 global C4classic, C4
2668 class C4classic: # classic
2669 pass
2670 class C4(C4classic, object): # mixed inheritance
2671 pass
2672
Guido van Rossum3926a632001-09-25 16:25:58 +00002673 for p in pickle, cPickle:
2674 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002675 if verbose:
2676 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002677
2678 for cls in C, C1, C2:
2679 s = p.dumps(cls, bin)
2680 cls2 = p.loads(s)
2681 verify(cls2 is cls)
2682
2683 a = C1(1, 2); a.append(42); a.append(24)
2684 b = C2("hello", "world", 42)
2685 s = p.dumps((a, b), bin)
2686 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002687 vereq(x.__class__, a.__class__)
2688 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2689 vereq(y.__class__, b.__class__)
2690 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2691 vereq(`x`, `a`)
2692 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002693 if verbose:
2694 print "a = x =", a
2695 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002696 # Test for __getstate__ and __setstate__ on new style class
2697 u = C3(42)
2698 s = p.dumps(u, bin)
2699 v = p.loads(s)
2700 veris(u.__class__, v.__class__)
2701 vereq(u.foo, v.foo)
2702 # Test for picklability of hybrid class
2703 u = C4()
2704 u.foo = 42
2705 s = p.dumps(u, bin)
2706 v = p.loads(s)
2707 veris(u.__class__, v.__class__)
2708 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002709
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002710 # Testing copy.deepcopy()
2711 if verbose:
2712 print "deepcopy"
2713 import copy
2714 for cls in C, C1, C2:
2715 cls2 = copy.deepcopy(cls)
2716 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002717
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002718 a = C1(1, 2); a.append(42); a.append(24)
2719 b = C2("hello", "world", 42)
2720 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002721 vereq(x.__class__, a.__class__)
2722 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2723 vereq(y.__class__, b.__class__)
2724 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2725 vereq(`x`, `a`)
2726 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002727 if verbose:
2728 print "a = x =", a
2729 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002730
Guido van Rossum8c842552002-03-14 23:05:54 +00002731def pickleslots():
2732 if verbose: print "Testing pickling of classes with __slots__ ..."
2733 import pickle, cPickle
2734 # Pickling of classes with __slots__ but without __getstate__ should fail
2735 global B, C, D, E
2736 class B(object):
2737 pass
2738 for base in [object, B]:
2739 class C(base):
2740 __slots__ = ['a']
2741 class D(C):
2742 pass
2743 try:
2744 pickle.dumps(C())
2745 except TypeError:
2746 pass
2747 else:
2748 raise TestFailed, "should fail: pickle C instance - %s" % base
2749 try:
2750 cPickle.dumps(C())
2751 except TypeError:
2752 pass
2753 else:
2754 raise TestFailed, "should fail: cPickle C instance - %s" % base
2755 try:
2756 pickle.dumps(C())
2757 except TypeError:
2758 pass
2759 else:
2760 raise TestFailed, "should fail: pickle D instance - %s" % base
2761 try:
2762 cPickle.dumps(D())
2763 except TypeError:
2764 pass
2765 else:
2766 raise TestFailed, "should fail: cPickle D instance - %s" % base
2767 # Give C a __getstate__ and __setstate__
2768 class C(base):
2769 __slots__ = ['a']
2770 def __getstate__(self):
2771 try:
2772 d = self.__dict__.copy()
2773 except AttributeError:
2774 d = {}
2775 try:
2776 d['a'] = self.a
2777 except AttributeError:
2778 pass
2779 return d
2780 def __setstate__(self, d):
2781 for k, v in d.items():
2782 setattr(self, k, v)
2783 class D(C):
2784 pass
2785 # Now it should work
2786 x = C()
2787 y = pickle.loads(pickle.dumps(x))
2788 vereq(hasattr(y, 'a'), 0)
2789 y = cPickle.loads(cPickle.dumps(x))
2790 vereq(hasattr(y, 'a'), 0)
2791 x.a = 42
2792 y = pickle.loads(pickle.dumps(x))
2793 vereq(y.a, 42)
2794 y = cPickle.loads(cPickle.dumps(x))
2795 vereq(y.a, 42)
2796 x = D()
2797 x.a = 42
2798 x.b = 100
2799 y = pickle.loads(pickle.dumps(x))
2800 vereq(y.a + y.b, 142)
2801 y = cPickle.loads(cPickle.dumps(x))
2802 vereq(y.a + y.b, 142)
2803 # But a subclass that adds a slot should not work
2804 class E(C):
2805 __slots__ = ['b']
2806 try:
2807 pickle.dumps(E())
2808 except TypeError:
2809 pass
2810 else:
2811 raise TestFailed, "should fail: pickle E instance - %s" % base
2812 try:
2813 cPickle.dumps(E())
2814 except TypeError:
2815 pass
2816 else:
2817 raise TestFailed, "should fail: cPickle E instance - %s" % base
2818
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002819def copies():
2820 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2821 import copy
2822 class C(object):
2823 pass
2824
2825 a = C()
2826 a.foo = 12
2827 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002828 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002829
2830 a.bar = [1,2,3]
2831 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002832 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002833 verify(c.bar is a.bar)
2834
2835 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002836 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002837 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002838 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002839
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002840def binopoverride():
2841 if verbose: print "Testing overrides of binary operations..."
2842 class I(int):
2843 def __repr__(self):
2844 return "I(%r)" % int(self)
2845 def __add__(self, other):
2846 return I(int(self) + int(other))
2847 __radd__ = __add__
2848 def __pow__(self, other, mod=None):
2849 if mod is None:
2850 return I(pow(int(self), int(other)))
2851 else:
2852 return I(pow(int(self), int(other), int(mod)))
2853 def __rpow__(self, other, mod=None):
2854 if mod is None:
2855 return I(pow(int(other), int(self), mod))
2856 else:
2857 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002858
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002859 vereq(`I(1) + I(2)`, "I(3)")
2860 vereq(`I(1) + 2`, "I(3)")
2861 vereq(`1 + I(2)`, "I(3)")
2862 vereq(`I(2) ** I(3)`, "I(8)")
2863 vereq(`2 ** I(3)`, "I(8)")
2864 vereq(`I(2) ** 3`, "I(8)")
2865 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2866 class S(str):
2867 def __eq__(self, other):
2868 return self.lower() == other.lower()
2869
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002870def subclasspropagation():
2871 if verbose: print "Testing propagation of slot functions to subclasses..."
2872 class A(object):
2873 pass
2874 class B(A):
2875 pass
2876 class C(A):
2877 pass
2878 class D(B, C):
2879 pass
2880 d = D()
2881 vereq(hash(d), id(d))
2882 A.__hash__ = lambda self: 42
2883 vereq(hash(d), 42)
2884 C.__hash__ = lambda self: 314
2885 vereq(hash(d), 314)
2886 B.__hash__ = lambda self: 144
2887 vereq(hash(d), 144)
2888 D.__hash__ = lambda self: 100
2889 vereq(hash(d), 100)
2890 del D.__hash__
2891 vereq(hash(d), 144)
2892 del B.__hash__
2893 vereq(hash(d), 314)
2894 del C.__hash__
2895 vereq(hash(d), 42)
2896 del A.__hash__
2897 vereq(hash(d), id(d))
2898 d.foo = 42
2899 d.bar = 42
2900 vereq(d.foo, 42)
2901 vereq(d.bar, 42)
2902 def __getattribute__(self, name):
2903 if name == "foo":
2904 return 24
2905 return object.__getattribute__(self, name)
2906 A.__getattribute__ = __getattribute__
2907 vereq(d.foo, 24)
2908 vereq(d.bar, 42)
2909 def __getattr__(self, name):
2910 if name in ("spam", "foo", "bar"):
2911 return "hello"
2912 raise AttributeError, name
2913 B.__getattr__ = __getattr__
2914 vereq(d.spam, "hello")
2915 vereq(d.foo, 24)
2916 vereq(d.bar, 42)
2917 del A.__getattribute__
2918 vereq(d.foo, 42)
2919 del d.foo
2920 vereq(d.foo, "hello")
2921 vereq(d.bar, 42)
2922 del B.__getattr__
2923 try:
2924 d.foo
2925 except AttributeError:
2926 pass
2927 else:
2928 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002929
Guido van Rossume7f3e242002-06-14 02:35:45 +00002930 # Test a nasty bug in recurse_down_subclasses()
2931 import gc
2932 class A(object):
2933 pass
2934 class B(A):
2935 pass
2936 del B
2937 gc.collect()
2938 A.__setitem__ = lambda *a: None # crash
2939
Tim Petersfc57ccb2001-10-12 02:38:24 +00002940def buffer_inherit():
2941 import binascii
2942 # SF bug [#470040] ParseTuple t# vs subclasses.
2943 if verbose:
2944 print "Testing that buffer interface is inherited ..."
2945
2946 class MyStr(str):
2947 pass
2948 base = 'abc'
2949 m = MyStr(base)
2950 # b2a_hex uses the buffer interface to get its argument's value, via
2951 # PyArg_ParseTuple 't#' code.
2952 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2953
2954 # It's not clear that unicode will continue to support the character
2955 # buffer interface, and this test will fail if that's taken away.
2956 class MyUni(unicode):
2957 pass
2958 base = u'abc'
2959 m = MyUni(base)
2960 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2961
2962 class MyInt(int):
2963 pass
2964 m = MyInt(42)
2965 try:
2966 binascii.b2a_hex(m)
2967 raise TestFailed('subclass of int should not have a buffer interface')
2968 except TypeError:
2969 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002970
Tim Petersc9933152001-10-16 20:18:24 +00002971def str_of_str_subclass():
2972 import binascii
2973 import cStringIO
2974
2975 if verbose:
2976 print "Testing __str__ defined in subclass of str ..."
2977
2978 class octetstring(str):
2979 def __str__(self):
2980 return binascii.b2a_hex(self)
2981 def __repr__(self):
2982 return self + " repr"
2983
2984 o = octetstring('A')
2985 vereq(type(o), octetstring)
2986 vereq(type(str(o)), str)
2987 vereq(type(repr(o)), str)
2988 vereq(ord(o), 0x41)
2989 vereq(str(o), '41')
2990 vereq(repr(o), 'A repr')
2991 vereq(o.__str__(), '41')
2992 vereq(o.__repr__(), 'A repr')
2993
2994 capture = cStringIO.StringIO()
2995 # Calling str() or not exercises different internal paths.
2996 print >> capture, o
2997 print >> capture, str(o)
2998 vereq(capture.getvalue(), '41\n41\n')
2999 capture.close()
3000
Guido van Rossumc8e56452001-10-22 00:43:43 +00003001def kwdargs():
3002 if verbose: print "Testing keyword arguments to __init__, __call__..."
3003 def f(a): return a
3004 vereq(f.__call__(a=42), 42)
3005 a = []
3006 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003007 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003008
Guido van Rossumed87ad82001-10-30 02:33:02 +00003009def delhook():
3010 if verbose: print "Testing __del__ hook..."
3011 log = []
3012 class C(object):
3013 def __del__(self):
3014 log.append(1)
3015 c = C()
3016 vereq(log, [])
3017 del c
3018 vereq(log, [1])
3019
Guido van Rossum29d26062001-12-11 04:37:34 +00003020 class D(object): pass
3021 d = D()
3022 try: del d[0]
3023 except TypeError: pass
3024 else: raise TestFailed, "invalid del() didn't raise TypeError"
3025
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003026def hashinherit():
3027 if verbose: print "Testing hash of mutable subclasses..."
3028
3029 class mydict(dict):
3030 pass
3031 d = mydict()
3032 try:
3033 hash(d)
3034 except TypeError:
3035 pass
3036 else:
3037 raise TestFailed, "hash() of dict subclass should fail"
3038
3039 class mylist(list):
3040 pass
3041 d = mylist()
3042 try:
3043 hash(d)
3044 except TypeError:
3045 pass
3046 else:
3047 raise TestFailed, "hash() of list subclass should fail"
3048
Guido van Rossum29d26062001-12-11 04:37:34 +00003049def strops():
3050 try: 'a' + 5
3051 except TypeError: pass
3052 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3053
3054 try: ''.split('')
3055 except ValueError: pass
3056 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3057
3058 try: ''.join([0])
3059 except TypeError: pass
3060 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3061
3062 try: ''.rindex('5')
3063 except ValueError: pass
3064 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3065
Guido van Rossum29d26062001-12-11 04:37:34 +00003066 try: '%(n)s' % None
3067 except TypeError: pass
3068 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3069
3070 try: '%(n' % {}
3071 except ValueError: pass
3072 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3073
3074 try: '%*s' % ('abc')
3075 except TypeError: pass
3076 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3077
3078 try: '%*.*s' % ('abc', 5)
3079 except TypeError: pass
3080 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3081
3082 try: '%s' % (1, 2)
3083 except TypeError: pass
3084 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3085
3086 try: '%' % None
3087 except ValueError: pass
3088 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3089
3090 vereq('534253'.isdigit(), 1)
3091 vereq('534253x'.isdigit(), 0)
3092 vereq('%c' % 5, '\x05')
3093 vereq('%c' % '5', '5')
3094
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003095def deepcopyrecursive():
3096 if verbose: print "Testing deepcopy of recursive objects..."
3097 class Node:
3098 pass
3099 a = Node()
3100 b = Node()
3101 a.b = b
3102 b.a = a
3103 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003104
Guido van Rossumd7035672002-03-12 20:43:31 +00003105def modules():
3106 if verbose: print "Testing uninitialized module objects..."
3107 from types import ModuleType as M
3108 m = M.__new__(M)
3109 str(m)
3110 vereq(hasattr(m, "__name__"), 0)
3111 vereq(hasattr(m, "__file__"), 0)
3112 vereq(hasattr(m, "foo"), 0)
3113 vereq(m.__dict__, None)
3114 m.foo = 1
3115 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003116
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003117def dictproxyiterkeys():
3118 class C(object):
3119 def meth(self):
3120 pass
3121 if verbose: print "Testing dict-proxy iterkeys..."
3122 keys = [ key for key in C.__dict__.iterkeys() ]
3123 keys.sort()
3124 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3125
3126def dictproxyitervalues():
3127 class C(object):
3128 def meth(self):
3129 pass
3130 if verbose: print "Testing dict-proxy itervalues..."
3131 values = [ values for values in C.__dict__.itervalues() ]
3132 vereq(len(values), 5)
3133
3134def dictproxyiteritems():
3135 class C(object):
3136 def meth(self):
3137 pass
3138 if verbose: print "Testing dict-proxy iteritems..."
3139 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3140 keys.sort()
3141 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3142
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003143def funnynew():
3144 if verbose: print "Testing __new__ returning something unexpected..."
3145 class C(object):
3146 def __new__(cls, arg):
3147 if isinstance(arg, str): return [1, 2, 3]
3148 elif isinstance(arg, int): return object.__new__(D)
3149 else: return object.__new__(cls)
3150 class D(C):
3151 def __init__(self, arg):
3152 self.foo = arg
3153 vereq(C("1"), [1, 2, 3])
3154 vereq(D("1"), [1, 2, 3])
3155 d = D(None)
3156 veris(d.foo, None)
3157 d = C(1)
3158 vereq(isinstance(d, D), True)
3159 vereq(d.foo, 1)
3160 d = D(1)
3161 vereq(isinstance(d, D), True)
3162 vereq(d.foo, 1)
3163
Guido van Rossume8fc6402002-04-16 16:44:51 +00003164def imulbug():
3165 # SF bug 544647
3166 if verbose: print "Testing for __imul__ problems..."
3167 class C(object):
3168 def __imul__(self, other):
3169 return (self, other)
3170 x = C()
3171 y = x
3172 y *= 1.0
3173 vereq(y, (x, 1.0))
3174 y = x
3175 y *= 2
3176 vereq(y, (x, 2))
3177 y = x
3178 y *= 3L
3179 vereq(y, (x, 3L))
3180 y = x
3181 y *= 1L<<100
3182 vereq(y, (x, 1L<<100))
3183 y = x
3184 y *= None
3185 vereq(y, (x, None))
3186 y = x
3187 y *= "foo"
3188 vereq(y, (x, "foo"))
3189
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003190def docdescriptor():
3191 # SF bug 542984
3192 if verbose: print "Testing __doc__ descriptor..."
3193 class DocDescr(object):
3194 def __get__(self, object, otype):
3195 if object:
3196 object = object.__class__.__name__ + ' instance'
3197 if otype:
3198 otype = otype.__name__
3199 return 'object=%s; type=%s' % (object, otype)
3200 class OldClass:
3201 __doc__ = DocDescr()
3202 class NewClass(object):
3203 __doc__ = DocDescr()
3204 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3205 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3206 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3207 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3208
Tim Petersafb2c802002-04-18 18:06:20 +00003209def string_exceptions():
3210 if verbose:
3211 print "Testing string exceptions ..."
3212
3213 # Ensure builtin strings work OK as exceptions.
3214 astring = "An exception string."
3215 try:
3216 raise astring
3217 except astring:
3218 pass
3219 else:
3220 raise TestFailed, "builtin string not usable as exception"
3221
3222 # Ensure string subclass instances do not.
3223 class MyStr(str):
3224 pass
3225
3226 newstring = MyStr("oops -- shouldn't work")
3227 try:
3228 raise newstring
3229 except TypeError:
3230 pass
3231 except:
3232 raise TestFailed, "string subclass allowed as exception"
3233
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003234def copy_setstate():
3235 if verbose:
3236 print "Testing that copy.*copy() correctly uses __setstate__..."
3237 import copy
3238 class C(object):
3239 def __init__(self, foo=None):
3240 self.foo = foo
3241 self.__foo = foo
3242 def setfoo(self, foo=None):
3243 self.foo = foo
3244 def getfoo(self):
3245 return self.__foo
3246 def __getstate__(self):
3247 return [self.foo]
3248 def __setstate__(self, lst):
3249 assert len(lst) == 1
3250 self.__foo = self.foo = lst[0]
3251 a = C(42)
3252 a.setfoo(24)
3253 vereq(a.foo, 24)
3254 vereq(a.getfoo(), 42)
3255 b = copy.copy(a)
3256 vereq(b.foo, 24)
3257 vereq(b.getfoo(), 24)
3258 b = copy.deepcopy(a)
3259 vereq(b.foo, 24)
3260 vereq(b.getfoo(), 24)
3261
Guido van Rossum09638c12002-06-13 19:17:46 +00003262def slices():
3263 if verbose:
3264 print "Testing cases with slices and overridden __getitem__ ..."
3265 # Strings
3266 vereq("hello"[:4], "hell")
3267 vereq("hello"[slice(4)], "hell")
3268 vereq(str.__getitem__("hello", slice(4)), "hell")
3269 class S(str):
3270 def __getitem__(self, x):
3271 return str.__getitem__(self, x)
3272 vereq(S("hello")[:4], "hell")
3273 vereq(S("hello")[slice(4)], "hell")
3274 vereq(S("hello").__getitem__(slice(4)), "hell")
3275 # Tuples
3276 vereq((1,2,3)[:2], (1,2))
3277 vereq((1,2,3)[slice(2)], (1,2))
3278 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3279 class T(tuple):
3280 def __getitem__(self, x):
3281 return tuple.__getitem__(self, x)
3282 vereq(T((1,2,3))[:2], (1,2))
3283 vereq(T((1,2,3))[slice(2)], (1,2))
3284 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3285 # Lists
3286 vereq([1,2,3][:2], [1,2])
3287 vereq([1,2,3][slice(2)], [1,2])
3288 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3289 class L(list):
3290 def __getitem__(self, x):
3291 return list.__getitem__(self, x)
3292 vereq(L([1,2,3])[:2], [1,2])
3293 vereq(L([1,2,3])[slice(2)], [1,2])
3294 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3295 # Now do lists and __setitem__
3296 a = L([1,2,3])
3297 a[slice(1, 3)] = [3,2]
3298 vereq(a, [1,3,2])
3299 a[slice(0, 2, 1)] = [3,1]
3300 vereq(a, [3,1,2])
3301 a.__setitem__(slice(1, 3), [2,1])
3302 vereq(a, [3,2,1])
3303 a.__setitem__(slice(0, 2, 1), [2,3])
3304 vereq(a, [2,3,1])
3305
Tim Peters2484aae2002-07-11 06:56:07 +00003306def subtype_resurrection():
3307 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003308 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003309
3310 class C(object):
3311 container = []
3312
3313 def __del__(self):
3314 # resurrect the instance
3315 C.container.append(self)
3316
3317 c = C()
3318 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003319 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003320 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003321 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003322
3323 # If that didn't blow up, it's also interesting to see whether clearing
3324 # the last container slot works: that will attempt to delete c again,
3325 # which will cause c to get appended back to the container again "during"
3326 # the del.
3327 del C.container[-1]
3328 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003329 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003330
Tim Peters14cb1e12002-07-11 18:26:21 +00003331 # Make c mortal again, so that the test framework with -l doesn't report
3332 # it as a leak.
3333 del C.__del__
3334
Guido van Rossum2d702462002-08-06 21:28:28 +00003335def slottrash():
3336 # Deallocating deeply nested slotted trash caused stack overflows
3337 if verbose:
3338 print "Testing slot trash..."
3339 class trash(object):
3340 __slots__ = ['x']
3341 def __init__(self, x):
3342 self.x = x
3343 o = None
3344 for i in xrange(50000):
3345 o = trash(o)
3346 del o
3347
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003348def slotmultipleinheritance():
3349 # SF bug 575229, multiple inheritance w/ slots dumps core
3350 class A(object):
3351 __slots__=()
3352 class B(object):
3353 pass
3354 class C(A,B) :
3355 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003356 vereq(C.__basicsize__, B.__basicsize__)
3357 verify(hasattr(C, '__dict__'))
3358 verify(hasattr(C, '__weakref__'))
3359 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003360
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003361def testrmul():
3362 # SF patch 592646
3363 if verbose:
3364 print "Testing correct invocation of __rmul__..."
3365 class C(object):
3366 def __mul__(self, other):
3367 return "mul"
3368 def __rmul__(self, other):
3369 return "rmul"
3370 a = C()
3371 vereq(a*2, "mul")
3372 vereq(a*2.2, "mul")
3373 vereq(2*a, "rmul")
3374 vereq(2.2*a, "rmul")
3375
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003376def testipow():
3377 # [SF bug 620179]
3378 if verbose:
3379 print "Testing correct invocation of __ipow__..."
3380 class C(object):
3381 def __ipow__(self, other):
3382 pass
3383 a = C()
3384 a **= 2
3385
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003386def do_this_first():
3387 if verbose:
3388 print "Testing SF bug 551412 ..."
3389 # This dumps core when SF bug 551412 isn't fixed --
3390 # but only when test_descr.py is run separately.
3391 # (That can't be helped -- as soon as PyType_Ready()
3392 # is called for PyLong_Type, the bug is gone.)
3393 class UserLong(object):
3394 def __pow__(self, *args):
3395 pass
3396 try:
3397 pow(0L, UserLong(), 0L)
3398 except:
3399 pass
3400
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003401 if verbose:
3402 print "Testing SF bug 570483..."
3403 # Another segfault only when run early
3404 # (before PyType_Ready(tuple) is called)
3405 type.mro(tuple)
3406
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003407def test_main():
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003408 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003409 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003410 lists()
3411 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003412 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003413 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003414 ints()
3415 longs()
3416 floats()
3417 complexes()
3418 spamlists()
3419 spamdicts()
3420 pydicts()
3421 pylists()
3422 metaclass()
3423 pymods()
3424 multi()
3425 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00003426 ex5()
3427 monotonicity()
3428 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00003429 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003430 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003431 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003432 dynamics()
3433 errors()
3434 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003435 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003436 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00003437 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003438 classic()
3439 compattr()
3440 newslot()
3441 altmro()
3442 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00003443 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00003444 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00003445 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00003446 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00003447 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00003448 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00003449 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00003450 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00003451 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00003452 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00003453 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00003454 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00003455 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00003456 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00003457 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00003458 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003459 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003460 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003461 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00003462 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00003463 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00003464 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00003465 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003466 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00003467 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003468 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00003469 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003470 dictproxyiterkeys()
3471 dictproxyitervalues()
3472 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00003473 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003474 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00003475 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003476 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00003477 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003478 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00003479 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00003480 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00003481 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003482 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003483 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003484 testipow()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003485 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00003486
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003487if __name__ == "__main__":
3488 test_main()