blob: a224bb90fd94bac44b6213c7810ea661c5efa9fc [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Neal Norwitz1a997502003-01-13 20:13:12 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
16 if verbose: print "checking", expr
17 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
29 if verbose: print "checking", expr
30 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
32 # XXX Hack so this passes before 2.3 when -Qnew is specified.
33 if meth == "__div__" and 1/2 == 0.5:
34 meth = "__truediv__"
35
Guido van Rossum45704552001-10-08 16:35:45 +000036 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 t = type(a)
38 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000039 while meth not in t.__dict__:
40 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000041 vereq(m, t.__dict__[meth])
42 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045
46def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
47 if verbose: print "checking", expr
48 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000049 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 t = type(a)
51 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000052 while meth not in t.__dict__:
53 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000054 vereq(m, t.__dict__[meth])
55 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000056 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058
59def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
60 if verbose: print "checking", stmt
61 dict = {'a': deepcopy(a), 'b': b}
62 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 t = type(a)
65 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000066 while meth not in t.__dict__:
67 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000068 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000069 dict['a'] = deepcopy(a)
70 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict['a'] = deepcopy(a)
73 bm = getattr(dict['a'], meth)
74 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076
77def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
78 if verbose: print "checking", stmt
79 dict = {'a': deepcopy(a), 'b': b, 'c': c}
80 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000081 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 t = type(a)
83 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000084 while meth not in t.__dict__:
85 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 dict['a'] = deepcopy(a)
88 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict['a'] = deepcopy(a)
91 bm = getattr(dict['a'], meth)
92 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094
95def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
96 if verbose: print "checking", stmt
97 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
98 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000099 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000101 while meth not in t.__dict__:
102 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105 dict['a'] = deepcopy(a)
106 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108 dict['a'] = deepcopy(a)
109 bm = getattr(dict['a'], meth)
110 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000111 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000112
Tim Peters2f93e282001-10-04 05:27:00 +0000113def class_docstrings():
114 class Classic:
115 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000116 vereq(Classic.__doc__, "A classic docstring.")
117 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000118
119 class Classic2:
120 pass
121 verify(Classic2.__doc__ is None)
122
Tim Peters4fb1fe82001-10-04 05:48:13 +0000123 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000124 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000125 vereq(NewStatic.__doc__, "Another docstring.")
126 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 pass
130 verify(NewStatic2.__doc__ is None)
131
Tim Peters4fb1fe82001-10-04 05:48:13 +0000132 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000133 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000134 vereq(NewDynamic.__doc__, "Another docstring.")
135 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000136
Tim Peters4fb1fe82001-10-04 05:48:13 +0000137 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000138 pass
139 verify(NewDynamic2.__doc__ is None)
140
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141def lists():
142 if verbose: print "Testing list operations..."
143 testbinop([1], [2], [1,2], "a+b", "__add__")
144 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
145 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
146 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
147 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
148 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
149 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
150 testunop([1,2,3], 3, "len(a)", "__len__")
151 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
152 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
153 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
154 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
155
156def dicts():
157 if verbose: print "Testing dict operations..."
158 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
159 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
160 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
161 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
162 d = {1:2,3:4}
163 l1 = []
164 for i in d.keys(): l1.append(i)
165 l = []
166 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 l = []
169 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000171 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000172 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000173 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 d = {1:2, 3:4}
175 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000176 vereq(eval(repr(d), {}), d)
177 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000178 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
179
Tim Peters25786c02001-09-02 08:22:48 +0000180def dict_constructor():
181 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 print "Testing dict constructor ..."
183 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000186 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000187 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000188 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000189 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000190 vereq(d, dict(d.iteritems()))
191 d = dict({'one':1, 'two':2})
192 vereq(d, dict(one=1, two=2))
193 vereq(d, dict(**d))
194 vereq(d, dict({"one": 1}, two=2))
195 vereq(d, dict([("two", 2)], one=1))
196 vereq(d, dict([("one", 100), ("two", 200)], **d))
197 verify(d is not dict(**d))
Tim Peters25786c02001-09-02 08:22:48 +0000198 for badarg in 0, 0L, 0j, "0", [0], (0,):
199 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000200 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000201 except TypeError:
202 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000203 except ValueError:
204 if badarg == "0":
205 # It's a sequence, and its elements are also sequences (gotta
206 # love strings <wink>), but they aren't of length 2, so this
207 # one seemed better as a ValueError than a TypeError.
208 pass
209 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000210 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000211 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000212 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000213
214 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000216 except TypeError:
217 pass
218 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000219 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000220
221 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000222 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000223 dict = {1:2, 3:4, 'a':1j}
224
Tim Peters25786c02001-09-02 08:22:48 +0000225 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000226 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000227 except TypeError:
228 pass
229 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000230 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000231
232 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000233 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000234 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000235 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000236
Tim Peters1fc240e2001-10-26 05:06:50 +0000237 # Init from sequence of iterable objects, each producing a 2-sequence.
238 class AddressBookEntry:
239 def __init__(self, first, last):
240 self.first = first
241 self.last = last
242 def __iter__(self):
243 return iter([self.first, self.last])
244
Tim Petersa427a2b2001-10-29 22:25:45 +0000245 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000246 AddressBookEntry('Barry', 'Peters'),
247 AddressBookEntry('Tim', 'Peters'),
248 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000249 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
250
Tim Petersa427a2b2001-10-29 22:25:45 +0000251 d = dict(zip(range(4), range(1, 5)))
252 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000253
254 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000255 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000256 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000257 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000258 except ValueError:
259 pass
260 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000261 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000262
Tim Peters5d2b77c2001-09-03 05:47:38 +0000263def test_dir():
264 if verbose:
265 print "Testing dir() ..."
266 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000267 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000268 del junk
269
270 # Just make sure these don't blow up!
271 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
272 dir(arg)
273
Tim Peters37a309d2001-09-04 01:20:04 +0000274 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275 class C:
276 Cdata = 1
277 def Cmethod(self): pass
278
279 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000281 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000282
283 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000284 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000285
286 c.cdata = 2
287 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000288 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000289 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000290
291 class A(C):
292 Adata = 1
293 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000294
Tim Peters37a309d2001-09-04 01:20:04 +0000295 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000296 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000297 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000298 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000300 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000301 a.adata = 42
302 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000303 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000304
305 # The same, but with new-style classes. Since these have object as a
306 # base class, a lot more gets sucked in.
307 def interesting(strings):
308 return [s for s in strings if not s.startswith('_')]
309
Tim Peters5d2b77c2001-09-03 05:47:38 +0000310 class C(object):
311 Cdata = 1
312 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000313
314 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000315 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000316
317 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000318 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000319 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000320
321 c.cdata = 2
322 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000323 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000324 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000325
Tim Peters5d2b77c2001-09-03 05:47:38 +0000326 class A(C):
327 Adata = 1
328 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000329
330 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000331 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000332 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000333 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000334 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000335 a.adata = 42
336 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000337 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000338 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000339
Tim Peterscaaff8d2001-09-10 23:12:14 +0000340 # Try a module subclass.
341 import sys
342 class M(type(sys)):
343 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000344 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000345 minstance.b = 2
346 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000347 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
348 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000349
350 class M2(M):
351 def getdict(self):
352 return "Not a dict!"
353 __dict__ = property(getdict)
354
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000355 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000356 m2instance.b = 2
357 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000358 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000359 try:
360 dir(m2instance)
361 except TypeError:
362 pass
363
Tim Peters9e6a3992001-10-30 05:45:26 +0000364 # Two essentially featureless objects, just inheriting stuff from
365 # object.
366 vereq(dir(None), dir(Ellipsis))
367
Guido van Rossum44022412002-05-13 18:29:46 +0000368 # Nasty test case for proxied objects
369 class Wrapper(object):
370 def __init__(self, obj):
371 self.__obj = obj
372 def __repr__(self):
373 return "Wrapper(%s)" % repr(self.__obj)
374 def __getitem__(self, key):
375 return Wrapper(self.__obj[key])
376 def __len__(self):
377 return len(self.__obj)
378 def __getattr__(self, name):
379 return Wrapper(getattr(self.__obj, name))
380
381 class C(object):
382 def __getclass(self):
383 return Wrapper(type(self))
384 __class__ = property(__getclass)
385
386 dir(C()) # This used to segfault
387
Tim Peters6d6c1a32001-08-02 04:15:00 +0000388binops = {
389 'add': '+',
390 'sub': '-',
391 'mul': '*',
392 'div': '/',
393 'mod': '%',
394 'divmod': 'divmod',
395 'pow': '**',
396 'lshift': '<<',
397 'rshift': '>>',
398 'and': '&',
399 'xor': '^',
400 'or': '|',
401 'cmp': 'cmp',
402 'lt': '<',
403 'le': '<=',
404 'eq': '==',
405 'ne': '!=',
406 'gt': '>',
407 'ge': '>=',
408 }
409
410for name, expr in binops.items():
411 if expr.islower():
412 expr = expr + "(a, b)"
413 else:
414 expr = 'a %s b' % expr
415 binops[name] = expr
416
417unops = {
418 'pos': '+',
419 'neg': '-',
420 'abs': 'abs',
421 'invert': '~',
422 'int': 'int',
423 'long': 'long',
424 'float': 'float',
425 'oct': 'oct',
426 'hex': 'hex',
427 }
428
429for name, expr in unops.items():
430 if expr.islower():
431 expr = expr + "(a)"
432 else:
433 expr = '%s a' % expr
434 unops[name] = expr
435
436def numops(a, b, skip=[]):
437 dict = {'a': a, 'b': b}
438 for name, expr in binops.items():
439 if name not in skip:
440 name = "__%s__" % name
441 if hasattr(a, name):
442 res = eval(expr, dict)
443 testbinop(a, b, res, expr, name)
444 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000445 if name not in skip:
446 name = "__%s__" % name
447 if hasattr(a, name):
448 res = eval(expr, dict)
449 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450
451def ints():
452 if verbose: print "Testing int operations..."
453 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000454 # The following crashes in Python 2.2
455 vereq((1).__nonzero__(), 1)
456 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000457 # This returns 'NotImplemented' in Python 2.2
458 class C(int):
459 def __add__(self, other):
460 return NotImplemented
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000461 vereq(C(5L), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000462 try:
463 C() + ""
464 except TypeError:
465 pass
466 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000467 raise TestFailed, "NotImplemented should have caused TypeError"
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000468 import sys
469 try:
470 C(sys.maxint+1)
471 except OverflowError:
472 pass
473 else:
474 raise TestFailed, "should have raised OverflowError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475
476def longs():
477 if verbose: print "Testing long operations..."
478 numops(100L, 3L)
479
480def floats():
481 if verbose: print "Testing float operations..."
482 numops(100.0, 3.0)
483
484def complexes():
485 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000486 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000487 class Number(complex):
488 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000489 def __new__(cls, *args, **kwds):
490 result = complex.__new__(cls, *args)
491 result.prec = kwds.get('prec', 12)
492 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000493 def __repr__(self):
494 prec = self.prec
495 if self.imag == 0.0:
496 return "%.*g" % (prec, self.real)
497 if self.real == 0.0:
498 return "%.*gj" % (prec, self.imag)
499 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
500 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000501
Tim Peters6d6c1a32001-08-02 04:15:00 +0000502 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000503 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000504 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000505
Tim Peters3f996e72001-09-13 19:18:27 +0000506 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000507 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000508 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000509
510 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000511 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000512 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000513
Tim Peters6d6c1a32001-08-02 04:15:00 +0000514def spamlists():
515 if verbose: print "Testing spamlist operations..."
516 import copy, xxsubtype as spam
517 def spamlist(l, memo=None):
518 import xxsubtype as spam
519 return spam.spamlist(l)
520 # This is an ugly hack:
521 copy._deepcopy_dispatch[spam.spamlist] = spamlist
522
523 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
524 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
525 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
526 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
527 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
528 "a[b:c]", "__getslice__")
529 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
530 "a+=b", "__iadd__")
531 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
532 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
533 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
534 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
535 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
536 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
537 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
538 # Test subclassing
539 class C(spam.spamlist):
540 def foo(self): return 1
541 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000542 vereq(a, [])
543 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000544 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000545 vereq(a, [100])
546 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000548 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549
550def spamdicts():
551 if verbose: print "Testing spamdict operations..."
552 import copy, xxsubtype as spam
553 def spamdict(d, memo=None):
554 import xxsubtype as spam
555 sd = spam.spamdict()
556 for k, v in d.items(): sd[k] = v
557 return sd
558 # This is an ugly hack:
559 copy._deepcopy_dispatch[spam.spamdict] = spamdict
560
561 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
562 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
563 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
564 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
565 d = spamdict({1:2,3:4})
566 l1 = []
567 for i in d.keys(): l1.append(i)
568 l = []
569 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000570 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000571 l = []
572 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000573 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 l = []
575 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000576 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 straightd = {1:2, 3:4}
578 spamd = spamdict(straightd)
579 testunop(spamd, 2, "len(a)", "__len__")
580 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
581 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
582 "a[b]=c", "__setitem__")
583 # Test subclassing
584 class C(spam.spamdict):
585 def foo(self): return 1
586 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000587 vereq(a.items(), [])
588 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a.items(), [('foo', 'bar')])
591 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000594
595def pydicts():
596 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000597 verify(issubclass(dict, dict))
598 verify(isinstance({}, dict))
599 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000600 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000601 verify(d.__class__ is dict)
602 verify(isinstance(d, dict))
603 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604 state = -1
605 def __init__(self, *a, **kw):
606 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000607 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000608 self.state = a[0]
609 if kw:
610 for k, v in kw.items(): self[v] = k
611 def __getitem__(self, key):
612 return self.get(key, 0)
613 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000614 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000615 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000616 def setstate(self, state):
617 self.state = state
618 def getstate(self):
619 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000620 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000622 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000624 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000625 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000626 vereq(a.state, -1)
627 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000628 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a.state, 0)
630 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000631 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000632 vereq(a.state, 10)
633 vereq(a.getstate(), 10)
634 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000635 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000636 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000637 if verbose: print "pydict stress test ..."
638 N = 50
639 for i in range(N):
640 a[i] = C()
641 for j in range(N):
642 a[i][j] = i*j
643 for i in range(N):
644 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000645 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000646
647def pylists():
648 if verbose: print "Testing Python subclass of list..."
649 class C(list):
650 def __getitem__(self, i):
651 return list.__getitem__(self, i) + 100
652 def __getslice__(self, i, j):
653 return (i, j)
654 a = C()
655 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000656 vereq(a[0], 100)
657 vereq(a[1], 101)
658 vereq(a[2], 102)
659 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000660
661def metaclass():
662 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000663 class C:
664 __metaclass__ = type
665 def __init__(self):
666 self.__state = 0
667 def getstate(self):
668 return self.__state
669 def setstate(self, state):
670 self.__state = state
671 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000672 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675 class D:
676 class __metaclass__(type):
677 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000678 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000679 d = D()
680 verify(d.__class__ is D)
681 class M1(type):
682 def __new__(cls, name, bases, dict):
683 dict['__spam__'] = 1
684 return type.__new__(cls, name, bases, dict)
685 class C:
686 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000687 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000688 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000689 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000690
Guido van Rossum309b5662001-08-17 11:43:17 +0000691 class _instance(object):
692 pass
693 class M2(object):
694 def __new__(cls, name, bases, dict):
695 self = object.__new__(cls)
696 self.name = name
697 self.bases = bases
698 self.dict = dict
699 return self
700 __new__ = staticmethod(__new__)
701 def __call__(self):
702 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000703 # Early binding of methods
704 for key in self.dict:
705 if key.startswith("__"):
706 continue
707 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000708 return it
709 class C:
710 __metaclass__ = M2
711 def spam(self):
712 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000713 vereq(C.name, 'C')
714 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000715 verify('spam' in C.dict)
716 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000717 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000718
Guido van Rossum91ee7982001-08-30 20:52:40 +0000719 # More metaclass examples
720
721 class autosuper(type):
722 # Automatically add __super to the class
723 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000724 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000725 cls = super(autosuper, metaclass).__new__(metaclass,
726 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000727 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000728 while name[:1] == "_":
729 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000730 if name:
731 name = "_%s__super" % name
732 else:
733 name = "__super"
734 setattr(cls, name, super(cls))
735 return cls
736 class A:
737 __metaclass__ = autosuper
738 def meth(self):
739 return "A"
740 class B(A):
741 def meth(self):
742 return "B" + self.__super.meth()
743 class C(A):
744 def meth(self):
745 return "C" + self.__super.meth()
746 class D(C, B):
747 def meth(self):
748 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000749 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000750 class E(B, C):
751 def meth(self):
752 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000753 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000754
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000755 class autoproperty(type):
756 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000757 # named _get_x and/or _set_x are found
758 def __new__(metaclass, name, bases, dict):
759 hits = {}
760 for key, val in dict.iteritems():
761 if key.startswith("_get_"):
762 key = key[5:]
763 get, set = hits.get(key, (None, None))
764 get = val
765 hits[key] = get, set
766 elif key.startswith("_set_"):
767 key = key[5:]
768 get, set = hits.get(key, (None, None))
769 set = val
770 hits[key] = get, set
771 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000772 dict[key] = property(get, set)
773 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000774 name, bases, dict)
775 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000776 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000777 def _get_x(self):
778 return -self.__x
779 def _set_x(self, x):
780 self.__x = -x
781 a = A()
782 verify(not hasattr(a, "x"))
783 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000784 vereq(a.x, 12)
785 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000786
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000787 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000788 # Merge of multiple cooperating metaclasses
789 pass
790 class A:
791 __metaclass__ = multimetaclass
792 def _get_x(self):
793 return "A"
794 class B(A):
795 def _get_x(self):
796 return "B" + self.__super._get_x()
797 class C(A):
798 def _get_x(self):
799 return "C" + self.__super._get_x()
800 class D(C, B):
801 def _get_x(self):
802 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000803 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000804
Guido van Rossumf76de622001-10-18 15:49:21 +0000805 # Make sure type(x) doesn't call x.__class__.__init__
806 class T(type):
807 counter = 0
808 def __init__(self, *args):
809 T.counter += 1
810 class C:
811 __metaclass__ = T
812 vereq(T.counter, 1)
813 a = C()
814 vereq(type(a), C)
815 vereq(T.counter, 1)
816
Guido van Rossum29d26062001-12-11 04:37:34 +0000817 class C(object): pass
818 c = C()
819 try: c()
820 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000821 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000822
Tim Peters6d6c1a32001-08-02 04:15:00 +0000823def pymods():
824 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000826 import sys
827 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000829 def __init__(self, name):
830 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000831 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000832 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000833 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 def __setattr__(self, name, value):
835 log.append(("setattr", name, value))
836 MT.__setattr__(self, name, value)
837 def __delattr__(self, name):
838 log.append(("delattr", name))
839 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000840 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841 a.foo = 12
842 x = a.foo
843 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000844 vereq(log, [("setattr", "foo", 12),
845 ("getattr", "foo"),
846 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847
848def multi():
849 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 class C(object):
851 def __init__(self):
852 self.__state = 0
853 def getstate(self):
854 return self.__state
855 def setstate(self, state):
856 self.__state = state
857 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000858 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000860 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000861 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862 def __init__(self):
863 type({}).__init__(self)
864 C.__init__(self)
865 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000866 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000868 vereq(d.items(), [("hello", "world")])
869 vereq(d["hello"], "world")
870 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000871 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000872 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000873 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874
Guido van Rossume45763a2001-08-10 21:28:46 +0000875 # SF bug #442833
876 class Node(object):
877 def __int__(self):
878 return int(self.foo())
879 def foo(self):
880 return "23"
881 class Frag(Node, list):
882 def foo(self):
883 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000884 vereq(Node().__int__(), 23)
885 vereq(int(Node()), 23)
886 vereq(Frag().__int__(), 42)
887 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000888
Tim Petersa91e9642001-11-14 23:32:33 +0000889 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000890
891 class A:
892 x = 1
893
894 class B(A):
895 pass
896
897 class C(A):
898 x = 2
899
900 class D(B, C):
901 pass
902 vereq(D.x, 1)
903
904 # Classic MRO is preserved for a classic base class.
905 class E(D, object):
906 pass
907 vereq(E.__mro__, (E, D, B, A, C, object))
908 vereq(E.x, 1)
909
910 # But with a mix of classic bases, their MROs are combined using
911 # new-style MRO.
912 class F(B, C, object):
913 pass
914 vereq(F.__mro__, (F, B, C, A, object))
915 vereq(F.x, 2)
916
917 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000918 class C:
919 def cmethod(self):
920 return "C a"
921 def all_method(self):
922 return "C b"
923
924 class M1(C, object):
925 def m1method(self):
926 return "M1 a"
927 def all_method(self):
928 return "M1 b"
929
930 vereq(M1.__mro__, (M1, C, object))
931 m = M1()
932 vereq(m.cmethod(), "C a")
933 vereq(m.m1method(), "M1 a")
934 vereq(m.all_method(), "M1 b")
935
936 class D(C):
937 def dmethod(self):
938 return "D a"
939 def all_method(self):
940 return "D b"
941
Guido van Rossum9a818922002-11-14 19:50:14 +0000942 class M2(D, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000943 def m2method(self):
944 return "M2 a"
945 def all_method(self):
946 return "M2 b"
947
Guido van Rossum9a818922002-11-14 19:50:14 +0000948 vereq(M2.__mro__, (M2, D, C, object))
Tim Petersa91e9642001-11-14 23:32:33 +0000949 m = M2()
950 vereq(m.cmethod(), "C a")
951 vereq(m.dmethod(), "D a")
952 vereq(m.m2method(), "M2 a")
953 vereq(m.all_method(), "M2 b")
954
Guido van Rossum9a818922002-11-14 19:50:14 +0000955 class M3(M1, M2, object):
Tim Petersa91e9642001-11-14 23:32:33 +0000956 def m3method(self):
957 return "M3 a"
958 def all_method(self):
959 return "M3 b"
Guido van Rossum9a818922002-11-14 19:50:14 +0000960 vereq(M3.__mro__, (M3, M1, M2, D, C, object))
Tim Peters144b98d2001-11-14 23:56:45 +0000961 m = M3()
962 vereq(m.cmethod(), "C a")
963 vereq(m.dmethod(), "D a")
964 vereq(m.m1method(), "M1 a")
965 vereq(m.m2method(), "M2 a")
966 vereq(m.m3method(), "M3 a")
967 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000968
Guido van Rossume54616c2001-12-14 04:19:56 +0000969 class Classic:
970 pass
971 try:
972 class New(Classic):
973 __metaclass__ = type
974 except TypeError:
975 pass
976 else:
977 raise TestFailed, "new class with only classic bases - shouldn't be"
978
Tim Peters6d6c1a32001-08-02 04:15:00 +0000979def diamond():
980 if verbose: print "Testing multiple inheritance special cases..."
981 class A(object):
982 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000983 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000984 class B(A):
985 def boo(self): return "B"
986 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000987 vereq(B().spam(), "B")
988 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989 class C(A):
990 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000991 vereq(C().spam(), "A")
992 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000993 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000994 vereq(D().spam(), "B")
995 vereq(D().boo(), "B")
996 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000998 vereq(E().spam(), "B")
999 vereq(E().boo(), "C")
1000 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +00001001 # MRO order disagreement
1002 try:
1003 class F(D, E): pass
1004 except TypeError:
1005 pass
1006 else:
1007 raise TestFailed, "expected MRO order disagreement (F)"
1008 try:
1009 class G(E, D): pass
1010 except TypeError:
1011 pass
1012 else:
1013 raise TestFailed, "expected MRO order disagreement (G)"
1014
1015
1016# see thread python-dev/2002-October/029035.html
1017def ex5():
1018 if verbose: print "Testing ex5 from C3 switch discussion..."
1019 class A(object): pass
1020 class B(object): pass
1021 class C(object): pass
1022 class X(A): pass
1023 class Y(A): pass
1024 class Z(X,B,Y,C): pass
1025 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
1026
1027# see "A Monotonic Superclass Linearization for Dylan",
1028# by Kim Barrett et al. (OOPSLA 1996)
1029def monotonicity():
1030 if verbose: print "Testing MRO monotonicity..."
1031 class Boat(object): pass
1032 class DayBoat(Boat): pass
1033 class WheelBoat(Boat): pass
1034 class EngineLess(DayBoat): pass
1035 class SmallMultihull(DayBoat): pass
1036 class PedalWheelBoat(EngineLess,WheelBoat): pass
1037 class SmallCatamaran(SmallMultihull): pass
1038 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
1039
1040 vereq(PedalWheelBoat.__mro__,
1041 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
1042 object))
1043 vereq(SmallCatamaran.__mro__,
1044 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
1045
1046 vereq(Pedalo.__mro__,
1047 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
1048 SmallMultihull, DayBoat, WheelBoat, Boat, object))
1049
1050# see "A Monotonic Superclass Linearization for Dylan",
1051# by Kim Barrett et al. (OOPSLA 1996)
1052def consistency_with_epg():
1053 if verbose: print "Testing consistentcy with EPG..."
1054 class Pane(object): pass
1055 class ScrollingMixin(object): pass
1056 class EditingMixin(object): pass
1057 class ScrollablePane(Pane,ScrollingMixin): pass
1058 class EditablePane(Pane,EditingMixin): pass
1059 class EditableScrollablePane(ScrollablePane,EditablePane): pass
1060
1061 vereq(EditableScrollablePane.__mro__,
1062 (EditableScrollablePane, ScrollablePane, EditablePane,
1063 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001064
Raymond Hettingerf394df42003-04-06 19:13:41 +00001065mro_err_msg = """Cannot create a consistent method resolution
1066order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +00001067
Guido van Rossumd32047f2002-11-25 21:38:52 +00001068def mro_disagreement():
1069 if verbose: print "Testing error messages for MRO disagreement..."
1070 def raises(exc, expected, callable, *args):
1071 try:
1072 callable(*args)
1073 except exc, msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +00001074 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +00001075 raise TestFailed, "Message %r, expected %r" % (str(msg),
1076 expected)
1077 else:
1078 raise TestFailed, "Expected %s" % exc
1079 class A(object): pass
1080 class B(A): pass
1081 class C(object): pass
1082 # Test some very simple errors
1083 raises(TypeError, "duplicate base class A",
1084 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001085 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001086 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +00001087 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001088 type, "X", (A, C, B), {})
1089 # Test a slightly more complex error
1090 class GridLayout(object): pass
1091 class HorizontalGrid(GridLayout): pass
1092 class VerticalGrid(GridLayout): pass
1093 class HVGrid(HorizontalGrid, VerticalGrid): pass
1094 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +00001095 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +00001096 type, "ConfusedGrid", (HVGrid, VHGrid), {})
1097
Guido van Rossum37202612001-08-09 19:45:21 +00001098def objects():
1099 if verbose: print "Testing object class..."
1100 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +00001101 vereq(a.__class__, object)
1102 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +00001103 b = object()
1104 verify(a is not b)
1105 verify(not hasattr(a, "foo"))
1106 try:
1107 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001108 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001109 pass
1110 else:
1111 verify(0, "object() should not allow setting a foo attribute")
1112 verify(not hasattr(object(), "__dict__"))
1113
1114 class Cdict(object):
1115 pass
1116 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001117 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001118 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001119 vereq(x.foo, 1)
1120 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001121
Tim Peters6d6c1a32001-08-02 04:15:00 +00001122def slots():
1123 if verbose: print "Testing __slots__..."
1124 class C0(object):
1125 __slots__ = []
1126 x = C0()
1127 verify(not hasattr(x, "__dict__"))
1128 verify(not hasattr(x, "foo"))
1129
1130 class C1(object):
1131 __slots__ = ['a']
1132 x = C1()
1133 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001134 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001135 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001136 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001137 x.a = None
1138 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001139 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001140 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001141
1142 class C3(object):
1143 __slots__ = ['a', 'b', 'c']
1144 x = C3()
1145 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001146 verify(not hasattr(x, 'a'))
1147 verify(not hasattr(x, 'b'))
1148 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001149 x.a = 1
1150 x.b = 2
1151 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001152 vereq(x.a, 1)
1153 vereq(x.b, 2)
1154 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001156 class C4(object):
1157 """Validate name mangling"""
1158 __slots__ = ['__a']
1159 def __init__(self, value):
1160 self.__a = value
1161 def get(self):
1162 return self.__a
1163 x = C4(5)
1164 verify(not hasattr(x, '__dict__'))
1165 verify(not hasattr(x, '__a'))
1166 vereq(x.get(), 5)
1167 try:
1168 x.__a = 6
1169 except AttributeError:
1170 pass
1171 else:
1172 raise TestFailed, "Double underscored names not mangled"
1173
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001174 # Make sure slot names are proper identifiers
1175 try:
1176 class C(object):
1177 __slots__ = [None]
1178 except TypeError:
1179 pass
1180 else:
1181 raise TestFailed, "[None] slots not caught"
1182 try:
1183 class C(object):
1184 __slots__ = ["foo bar"]
1185 except TypeError:
1186 pass
1187 else:
1188 raise TestFailed, "['foo bar'] slots not caught"
1189 try:
1190 class C(object):
1191 __slots__ = ["foo\0bar"]
1192 except TypeError:
1193 pass
1194 else:
1195 raise TestFailed, "['foo\\0bar'] slots not caught"
1196 try:
1197 class C(object):
1198 __slots__ = ["1"]
1199 except TypeError:
1200 pass
1201 else:
1202 raise TestFailed, "['1'] slots not caught"
1203 try:
1204 class C(object):
1205 __slots__ = [""]
1206 except TypeError:
1207 pass
1208 else:
1209 raise TestFailed, "[''] slots not caught"
1210 class C(object):
1211 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1212
Guido van Rossum33bab012001-12-05 22:45:48 +00001213 # Test leaks
1214 class Counted(object):
1215 counter = 0 # counts the number of instances alive
1216 def __init__(self):
1217 Counted.counter += 1
1218 def __del__(self):
1219 Counted.counter -= 1
1220 class C(object):
1221 __slots__ = ['a', 'b', 'c']
1222 x = C()
1223 x.a = Counted()
1224 x.b = Counted()
1225 x.c = Counted()
1226 vereq(Counted.counter, 3)
1227 del x
1228 vereq(Counted.counter, 0)
1229 class D(C):
1230 pass
1231 x = D()
1232 x.a = Counted()
1233 x.z = Counted()
1234 vereq(Counted.counter, 2)
1235 del x
1236 vereq(Counted.counter, 0)
1237 class E(D):
1238 __slots__ = ['e']
1239 x = E()
1240 x.a = Counted()
1241 x.z = Counted()
1242 x.e = Counted()
1243 vereq(Counted.counter, 3)
1244 del x
1245 vereq(Counted.counter, 0)
1246
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001247 # Test cyclical leaks [SF bug 519621]
1248 class F(object):
1249 __slots__ = ['a', 'b']
1250 log = []
1251 s = F()
1252 s.a = [Counted(), s]
1253 vereq(Counted.counter, 1)
1254 s = None
1255 import gc
1256 gc.collect()
1257 vereq(Counted.counter, 0)
1258
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001259 # Test lookup leaks [SF bug 572567]
1260 import sys,gc
1261 class G(object):
1262 def __cmp__(self, other):
1263 return 0
1264 g = G()
1265 orig_objects = len(gc.get_objects())
1266 for i in xrange(10):
1267 g==g
1268 new_objects = len(gc.get_objects())
1269 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001270 class H(object):
1271 __slots__ = ['a', 'b']
1272 def __init__(self):
1273 self.a = 1
1274 self.b = 2
1275 def __del__(self):
1276 assert self.a == 1
1277 assert self.b == 2
1278
1279 save_stderr = sys.stderr
1280 sys.stderr = sys.stdout
1281 h = H()
1282 try:
1283 del h
1284 finally:
1285 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001286
Guido van Rossum8b056da2002-08-13 18:26:26 +00001287def slotspecials():
1288 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1289
1290 class D(object):
1291 __slots__ = ["__dict__"]
1292 a = D()
1293 verify(hasattr(a, "__dict__"))
1294 verify(not hasattr(a, "__weakref__"))
1295 a.foo = 42
1296 vereq(a.__dict__, {"foo": 42})
1297
1298 class W(object):
1299 __slots__ = ["__weakref__"]
1300 a = W()
1301 verify(hasattr(a, "__weakref__"))
1302 verify(not hasattr(a, "__dict__"))
1303 try:
1304 a.foo = 42
1305 except AttributeError:
1306 pass
1307 else:
1308 raise TestFailed, "shouldn't be allowed to set a.foo"
1309
1310 class C1(W, D):
1311 __slots__ = []
1312 a = C1()
1313 verify(hasattr(a, "__dict__"))
1314 verify(hasattr(a, "__weakref__"))
1315 a.foo = 42
1316 vereq(a.__dict__, {"foo": 42})
1317
1318 class C2(D, W):
1319 __slots__ = []
1320 a = C2()
1321 verify(hasattr(a, "__dict__"))
1322 verify(hasattr(a, "__weakref__"))
1323 a.foo = 42
1324 vereq(a.__dict__, {"foo": 42})
1325
Guido van Rossum9a818922002-11-14 19:50:14 +00001326# MRO order disagreement
1327#
1328# class C3(C1, C2):
1329# __slots__ = []
1330#
1331# class C4(C2, C1):
1332# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001333
Tim Peters6d6c1a32001-08-02 04:15:00 +00001334def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001335 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001337 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001338 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001339 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001340 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001343 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001344 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001345 vereq(E.foo, 1)
1346 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001347 # Test dynamic instances
1348 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001349 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001350 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001351 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001352 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001353 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001354 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001355 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001356 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001357 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001358 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001359 vereq(int(a), 100)
1360 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001361 verify(not hasattr(a, "spam"))
1362 def mygetattr(self, name):
1363 if name == "spam":
1364 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001365 raise AttributeError
1366 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001367 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001368 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001369 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001370 def mysetattr(self, name, value):
1371 if name == "spam":
1372 raise AttributeError
1373 return object.__setattr__(self, name, value)
1374 C.__setattr__ = mysetattr
1375 try:
1376 a.spam = "not spam"
1377 except AttributeError:
1378 pass
1379 else:
1380 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001381 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001382 class D(C):
1383 pass
1384 d = D()
1385 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001386 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001387
Guido van Rossum7e35d572001-09-15 03:14:32 +00001388 # Test handling of int*seq and seq*int
1389 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001390 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001391 vereq("a"*I(2), "aa")
1392 vereq(I(2)*"a", "aa")
1393 vereq(2*I(3), 6)
1394 vereq(I(3)*2, 6)
1395 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001396
1397 # Test handling of long*seq and seq*long
1398 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001399 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001400 vereq("a"*L(2L), "aa")
1401 vereq(L(2L)*"a", "aa")
1402 vereq(2*L(3), 6)
1403 vereq(L(3)*2, 6)
1404 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001405
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001406 # Test comparison of classes with dynamic metaclasses
1407 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001408 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001409 class someclass:
1410 __metaclass__ = dynamicmetaclass
1411 verify(someclass != object)
1412
Tim Peters6d6c1a32001-08-02 04:15:00 +00001413def errors():
1414 if verbose: print "Testing errors..."
1415
1416 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001417 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001418 pass
1419 except TypeError:
1420 pass
1421 else:
1422 verify(0, "inheritance from both list and dict should be illegal")
1423
1424 try:
1425 class C(object, None):
1426 pass
1427 except TypeError:
1428 pass
1429 else:
1430 verify(0, "inheritance from non-type should be illegal")
1431 class Classic:
1432 pass
1433
1434 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001435 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001436 pass
1437 except TypeError:
1438 pass
1439 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001440 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001441
1442 try:
1443 class C(object):
1444 __slots__ = 1
1445 except TypeError:
1446 pass
1447 else:
1448 verify(0, "__slots__ = 1 should be illegal")
1449
1450 try:
1451 class C(object):
1452 __slots__ = [1]
1453 except TypeError:
1454 pass
1455 else:
1456 verify(0, "__slots__ = [1] should be illegal")
1457
1458def classmethods():
1459 if verbose: print "Testing class methods..."
1460 class C(object):
1461 def foo(*a): return a
1462 goo = classmethod(foo)
1463 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001464 vereq(C.goo(1), (C, 1))
1465 vereq(c.goo(1), (C, 1))
1466 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001467 class D(C):
1468 pass
1469 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001470 vereq(D.goo(1), (D, 1))
1471 vereq(d.goo(1), (D, 1))
1472 vereq(d.foo(1), (d, 1))
1473 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001474 # Test for a specific crash (SF bug 528132)
1475 def f(cls, arg): return (cls, arg)
1476 ff = classmethod(f)
1477 vereq(ff.__get__(0, int)(42), (int, 42))
1478 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001479
Guido van Rossum155db9a2002-04-02 17:53:47 +00001480 # Test super() with classmethods (SF bug 535444)
1481 veris(C.goo.im_self, C)
1482 veris(D.goo.im_self, D)
1483 veris(super(D,D).goo.im_self, D)
1484 veris(super(D,d).goo.im_self, D)
1485 vereq(super(D,D).goo(), (D,))
1486 vereq(super(D,d).goo(), (D,))
1487
Raymond Hettingerbe971532003-06-18 01:13:41 +00001488 # Verify that argument is checked for callability (SF bug 753451)
1489 try:
1490 classmethod(1).__get__(1)
1491 except TypeError:
1492 pass
1493 else:
1494 raise TestFailed, "classmethod should check for callability"
1495
Fred Drakef841aa62002-03-28 15:49:54 +00001496def classmethods_in_c():
1497 if verbose: print "Testing C-based class methods..."
1498 import xxsubtype as spam
1499 a = (1, 2, 3)
1500 d = {'abc': 123}
1501 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001502 veris(x, spam.spamlist)
1503 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001504 vereq(d, d1)
1505 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001506 veris(x, spam.spamlist)
1507 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001508 vereq(d, d1)
1509
Tim Peters6d6c1a32001-08-02 04:15:00 +00001510def staticmethods():
1511 if verbose: print "Testing static methods..."
1512 class C(object):
1513 def foo(*a): return a
1514 goo = staticmethod(foo)
1515 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001516 vereq(C.goo(1), (1,))
1517 vereq(c.goo(1), (1,))
1518 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001519 class D(C):
1520 pass
1521 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001522 vereq(D.goo(1), (1,))
1523 vereq(d.goo(1), (1,))
1524 vereq(d.foo(1), (d, 1))
1525 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001526
Fred Drakef841aa62002-03-28 15:49:54 +00001527def staticmethods_in_c():
1528 if verbose: print "Testing C-based static methods..."
1529 import xxsubtype as spam
1530 a = (1, 2, 3)
1531 d = {"abc": 123}
1532 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1533 veris(x, None)
1534 vereq(a, a1)
1535 vereq(d, d1)
1536 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1537 veris(x, None)
1538 vereq(a, a1)
1539 vereq(d, d1)
1540
Tim Peters6d6c1a32001-08-02 04:15:00 +00001541def classic():
1542 if verbose: print "Testing classic classes..."
1543 class C:
1544 def foo(*a): return a
1545 goo = classmethod(foo)
1546 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001547 vereq(C.goo(1), (C, 1))
1548 vereq(c.goo(1), (C, 1))
1549 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001550 class D(C):
1551 pass
1552 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001553 vereq(D.goo(1), (D, 1))
1554 vereq(d.goo(1), (D, 1))
1555 vereq(d.foo(1), (d, 1))
1556 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001557 class E: # *not* subclassing from C
1558 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001559 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001560 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001561
1562def compattr():
1563 if verbose: print "Testing computed attributes..."
1564 class C(object):
1565 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001566 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001567 self.__get = get
1568 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001569 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001570 def __get__(self, obj, type=None):
1571 return self.__get(obj)
1572 def __set__(self, obj, value):
1573 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001574 def __delete__(self, obj):
1575 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001576 def __init__(self):
1577 self.__x = 0
1578 def __get_x(self):
1579 x = self.__x
1580 self.__x = x+1
1581 return x
1582 def __set_x(self, x):
1583 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001584 def __delete_x(self):
1585 del self.__x
1586 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001588 vereq(a.x, 0)
1589 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001590 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001591 vereq(a.x, 10)
1592 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001593 del a.x
1594 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001595
1596def newslot():
1597 if verbose: print "Testing __new__ slot override..."
1598 class C(list):
1599 def __new__(cls):
1600 self = list.__new__(cls)
1601 self.foo = 1
1602 return self
1603 def __init__(self):
1604 self.foo = self.foo + 2
1605 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001606 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001607 verify(a.__class__ is C)
1608 class D(C):
1609 pass
1610 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001611 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001612 verify(b.__class__ is D)
1613
Tim Peters6d6c1a32001-08-02 04:15:00 +00001614def altmro():
1615 if verbose: print "Testing mro() and overriding it..."
1616 class A(object):
1617 def f(self): return "A"
1618 class B(A):
1619 pass
1620 class C(A):
1621 def f(self): return "C"
1622 class D(B, C):
1623 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001624 vereq(D.mro(), [D, B, C, A, object])
1625 vereq(D.__mro__, (D, B, C, A, object))
1626 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001627
Guido van Rossumd3077402001-08-12 05:24:18 +00001628 class PerverseMetaType(type):
1629 def mro(cls):
1630 L = type.mro(cls)
1631 L.reverse()
1632 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001633 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001634 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001635 vereq(X.__mro__, (object, A, C, B, D, X))
1636 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001637
1638def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001639 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001640
1641 class B(object):
1642 "Intermediate class because object doesn't have a __setattr__"
1643
1644 class C(B):
1645
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001646 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001647 if name == "foo":
1648 return ("getattr", name)
1649 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001650 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001651 def __setattr__(self, name, value):
1652 if name == "foo":
1653 self.setattr = (name, value)
1654 else:
1655 return B.__setattr__(self, name, value)
1656 def __delattr__(self, name):
1657 if name == "foo":
1658 self.delattr = name
1659 else:
1660 return B.__delattr__(self, name)
1661
1662 def __getitem__(self, key):
1663 return ("getitem", key)
1664 def __setitem__(self, key, value):
1665 self.setitem = (key, value)
1666 def __delitem__(self, key):
1667 self.delitem = key
1668
1669 def __getslice__(self, i, j):
1670 return ("getslice", i, j)
1671 def __setslice__(self, i, j, value):
1672 self.setslice = (i, j, value)
1673 def __delslice__(self, i, j):
1674 self.delslice = (i, j)
1675
1676 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001677 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001678 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001679 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001680 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001681 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001682
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001684 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001685 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001686 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001687 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001688
Guido van Rossum45704552001-10-08 16:35:45 +00001689 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001690 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001691 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001692 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001693 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001694
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001695def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001696 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001697 class C(object):
1698 def __init__(self, x):
1699 self.x = x
1700 def foo(self):
1701 return self.x
1702 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001703 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001704 class D(C):
1705 boo = C.foo
1706 goo = c1.foo
1707 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001708 vereq(d2.foo(), 2)
1709 vereq(d2.boo(), 2)
1710 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001711 class E(object):
1712 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001713 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001714 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001715
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001716def specials():
1717 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001718 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001719 # Test the default behavior for static classes
1720 class C(object):
1721 def __getitem__(self, i):
1722 if 0 <= i < 10: return i
1723 raise IndexError
1724 c1 = C()
1725 c2 = C()
1726 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001727 vereq(hash(c1), id(c1))
1728 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1729 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001730 verify(c1 != c2)
1731 verify(not c1 != c1)
1732 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001733 # Note that the module name appears in str/repr, and that varies
1734 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001735 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001736 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001737 verify(-1 not in c1)
1738 for i in range(10):
1739 verify(i in c1)
1740 verify(10 not in c1)
1741 # Test the default behavior for dynamic classes
1742 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001743 def __getitem__(self, i):
1744 if 0 <= i < 10: return i
1745 raise IndexError
1746 d1 = D()
1747 d2 = D()
1748 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001749 vereq(hash(d1), id(d1))
1750 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1751 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001752 verify(d1 != d2)
1753 verify(not d1 != d1)
1754 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001755 # Note that the module name appears in str/repr, and that varies
1756 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001757 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001758 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001759 verify(-1 not in d1)
1760 for i in range(10):
1761 verify(i in d1)
1762 verify(10 not in d1)
1763 # Test overridden behavior for static classes
1764 class Proxy(object):
1765 def __init__(self, x):
1766 self.x = x
1767 def __nonzero__(self):
1768 return not not self.x
1769 def __hash__(self):
1770 return hash(self.x)
1771 def __eq__(self, other):
1772 return self.x == other
1773 def __ne__(self, other):
1774 return self.x != other
1775 def __cmp__(self, other):
1776 return cmp(self.x, other.x)
1777 def __str__(self):
1778 return "Proxy:%s" % self.x
1779 def __repr__(self):
1780 return "Proxy(%r)" % self.x
1781 def __contains__(self, value):
1782 return value in self.x
1783 p0 = Proxy(0)
1784 p1 = Proxy(1)
1785 p_1 = Proxy(-1)
1786 verify(not p0)
1787 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001788 vereq(hash(p0), hash(0))
1789 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001790 verify(p0 != p1)
1791 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001792 vereq(not p0, p1)
1793 vereq(cmp(p0, p1), -1)
1794 vereq(cmp(p0, p0), 0)
1795 vereq(cmp(p0, p_1), 1)
1796 vereq(str(p0), "Proxy:0")
1797 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001798 p10 = Proxy(range(10))
1799 verify(-1 not in p10)
1800 for i in range(10):
1801 verify(i in p10)
1802 verify(10 not in p10)
1803 # Test overridden behavior for dynamic classes
1804 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001805 def __init__(self, x):
1806 self.x = x
1807 def __nonzero__(self):
1808 return not not self.x
1809 def __hash__(self):
1810 return hash(self.x)
1811 def __eq__(self, other):
1812 return self.x == other
1813 def __ne__(self, other):
1814 return self.x != other
1815 def __cmp__(self, other):
1816 return cmp(self.x, other.x)
1817 def __str__(self):
1818 return "DProxy:%s" % self.x
1819 def __repr__(self):
1820 return "DProxy(%r)" % self.x
1821 def __contains__(self, value):
1822 return value in self.x
1823 p0 = DProxy(0)
1824 p1 = DProxy(1)
1825 p_1 = DProxy(-1)
1826 verify(not p0)
1827 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001828 vereq(hash(p0), hash(0))
1829 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001830 verify(p0 != p1)
1831 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001832 vereq(not p0, p1)
1833 vereq(cmp(p0, p1), -1)
1834 vereq(cmp(p0, p0), 0)
1835 vereq(cmp(p0, p_1), 1)
1836 vereq(str(p0), "DProxy:0")
1837 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001838 p10 = DProxy(range(10))
1839 verify(-1 not in p10)
1840 for i in range(10):
1841 verify(i in p10)
1842 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001843 # Safety test for __cmp__
1844 def unsafecmp(a, b):
1845 try:
1846 a.__class__.__cmp__(a, b)
1847 except TypeError:
1848 pass
1849 else:
1850 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1851 a.__class__, a, b)
1852 unsafecmp(u"123", "123")
1853 unsafecmp("123", u"123")
1854 unsafecmp(1, 1.0)
1855 unsafecmp(1.0, 1)
1856 unsafecmp(1, 1L)
1857 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001858
Neal Norwitz1a997502003-01-13 20:13:12 +00001859 class Letter(str):
1860 def __new__(cls, letter):
1861 if letter == 'EPS':
1862 return str.__new__(cls)
1863 return str.__new__(cls, letter)
1864 def __str__(self):
1865 if not self:
1866 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001867 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001868
1869 # sys.stdout needs to be the original to trigger the recursion bug
1870 import sys
1871 test_stdout = sys.stdout
1872 sys.stdout = get_original_stdout()
1873 try:
1874 # nothing should actually be printed, this should raise an exception
1875 print Letter('w')
1876 except RuntimeError:
1877 pass
1878 else:
1879 raise TestFailed, "expected a RuntimeError for print recursion"
1880 sys.stdout = test_stdout
1881
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001882def weakrefs():
1883 if verbose: print "Testing weak references..."
1884 import weakref
1885 class C(object):
1886 pass
1887 c = C()
1888 r = weakref.ref(c)
1889 verify(r() is c)
1890 del c
1891 verify(r() is None)
1892 del r
1893 class NoWeak(object):
1894 __slots__ = ['foo']
1895 no = NoWeak()
1896 try:
1897 weakref.ref(no)
1898 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001899 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001900 else:
1901 verify(0, "weakref.ref(no) should be illegal")
1902 class Weak(object):
1903 __slots__ = ['foo', '__weakref__']
1904 yes = Weak()
1905 r = weakref.ref(yes)
1906 verify(r() is yes)
1907 del yes
1908 verify(r() is None)
1909 del r
1910
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001911def properties():
1912 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001913 class C(object):
1914 def getx(self):
1915 return self.__x
1916 def setx(self, value):
1917 self.__x = value
1918 def delx(self):
1919 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001920 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001921 a = C()
1922 verify(not hasattr(a, "x"))
1923 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001924 vereq(a._C__x, 42)
1925 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001926 del a.x
1927 verify(not hasattr(a, "x"))
1928 verify(not hasattr(a, "_C__x"))
1929 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001930 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001931 C.x.__delete__(a)
1932 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001933
Tim Peters66c1a522001-09-24 21:17:50 +00001934 raw = C.__dict__['x']
1935 verify(isinstance(raw, property))
1936
1937 attrs = dir(raw)
1938 verify("__doc__" in attrs)
1939 verify("fget" in attrs)
1940 verify("fset" in attrs)
1941 verify("fdel" in attrs)
1942
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001944 verify(raw.fget is C.__dict__['getx'])
1945 verify(raw.fset is C.__dict__['setx'])
1946 verify(raw.fdel is C.__dict__['delx'])
1947
1948 for attr in "__doc__", "fget", "fset", "fdel":
1949 try:
1950 setattr(raw, attr, 42)
1951 except TypeError, msg:
1952 if str(msg).find('readonly') < 0:
1953 raise TestFailed("when setting readonly attr %r on a "
1954 "property, got unexpected TypeError "
1955 "msg %r" % (attr, str(msg)))
1956 else:
1957 raise TestFailed("expected TypeError from trying to set "
1958 "readonly %r attr on a property" % attr)
1959
Neal Norwitz673cd822002-10-18 16:33:13 +00001960 class D(object):
1961 __getitem__ = property(lambda s: 1/0)
1962
1963 d = D()
1964 try:
1965 for i in d:
1966 str(i)
1967 except ZeroDivisionError:
1968 pass
1969 else:
1970 raise TestFailed, "expected ZeroDivisionError from bad property"
1971
Guido van Rossumc4a18802001-08-24 16:55:27 +00001972def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001973 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001974
1975 class A(object):
1976 def meth(self, a):
1977 return "A(%r)" % a
1978
Guido van Rossum45704552001-10-08 16:35:45 +00001979 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001980
1981 class B(A):
1982 def __init__(self):
1983 self.__super = super(B, self)
1984 def meth(self, a):
1985 return "B(%r)" % a + self.__super.meth(a)
1986
Guido van Rossum45704552001-10-08 16:35:45 +00001987 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001988
1989 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001990 def meth(self, a):
1991 return "C(%r)" % a + self.__super.meth(a)
1992 C._C__super = super(C)
1993
Guido van Rossum45704552001-10-08 16:35:45 +00001994 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001995
1996 class D(C, B):
1997 def meth(self, a):
1998 return "D(%r)" % a + super(D, self).meth(a)
1999
Guido van Rossum5b443c62001-12-03 15:38:28 +00002000 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2001
2002 # Test for subclassing super
2003
2004 class mysuper(super):
2005 def __init__(self, *args):
2006 return super(mysuper, self).__init__(*args)
2007
2008 class E(D):
2009 def meth(self, a):
2010 return "E(%r)" % a + mysuper(E, self).meth(a)
2011
2012 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2013
2014 class F(E):
2015 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002016 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002017 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2018 F._F__super = mysuper(F)
2019
2020 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2021
2022 # Make sure certain errors are raised
2023
2024 try:
2025 super(D, 42)
2026 except TypeError:
2027 pass
2028 else:
2029 raise TestFailed, "shouldn't allow super(D, 42)"
2030
2031 try:
2032 super(D, C())
2033 except TypeError:
2034 pass
2035 else:
2036 raise TestFailed, "shouldn't allow super(D, C())"
2037
2038 try:
2039 super(D).__get__(12)
2040 except TypeError:
2041 pass
2042 else:
2043 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2044
2045 try:
2046 super(D).__get__(C())
2047 except TypeError:
2048 pass
2049 else:
2050 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002051
Guido van Rossuma4541a32003-04-16 20:02:22 +00002052 # Make sure data descriptors can be overridden and accessed via super
2053 # (new feature in Python 2.3)
2054
2055 class DDbase(object):
2056 def getx(self): return 42
2057 x = property(getx)
2058
2059 class DDsub(DDbase):
2060 def getx(self): return "hello"
2061 x = property(getx)
2062
2063 dd = DDsub()
2064 vereq(dd.x, "hello")
2065 vereq(super(DDsub, dd).x, 42)
2066
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002067 # Ensure that super() lookup of descriptor from classmethod
2068 # works (SF ID# 743627)
2069
2070 class Base(object):
2071 aProp = property(lambda self: "foo")
2072
2073 class Sub(Base):
2074 def test(klass):
2075 return super(Sub,klass).aProp
2076 test = classmethod(test)
2077
2078 veris(Sub.test(), Base.aProp)
2079
2080
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002081def inherits():
2082 if verbose: print "Testing inheritance from basic types..."
2083
2084 class hexint(int):
2085 def __repr__(self):
2086 return hex(self)
2087 def __add__(self, other):
2088 return hexint(int.__add__(self, other))
2089 # (Note that overriding __radd__ doesn't work,
2090 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002091 vereq(repr(hexint(7) + 9), "0x10")
2092 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002093 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002094 vereq(a, 12345)
2095 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002096 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002097 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002098 verify((+a).__class__ is int)
2099 verify((a >> 0).__class__ is int)
2100 verify((a << 0).__class__ is int)
2101 verify((hexint(0) << 12).__class__ is int)
2102 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002103
2104 class octlong(long):
2105 __slots__ = []
2106 def __str__(self):
2107 s = oct(self)
2108 if s[-1] == 'L':
2109 s = s[:-1]
2110 return s
2111 def __add__(self, other):
2112 return self.__class__(super(octlong, self).__add__(other))
2113 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002114 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002115 # (Note that overriding __radd__ here only seems to work
2116 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002117 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002118 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002119 vereq(a, 12345L)
2120 vereq(long(a), 12345L)
2121 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002122 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002123 verify((+a).__class__ is long)
2124 verify((-a).__class__ is long)
2125 verify((-octlong(0)).__class__ is long)
2126 verify((a >> 0).__class__ is long)
2127 verify((a << 0).__class__ is long)
2128 verify((a - 0).__class__ is long)
2129 verify((a * 1).__class__ is long)
2130 verify((a ** 1).__class__ is long)
2131 verify((a // 1).__class__ is long)
2132 verify((1 * a).__class__ is long)
2133 verify((a | 0).__class__ is long)
2134 verify((a ^ 0).__class__ is long)
2135 verify((a & -1L).__class__ is long)
2136 verify((octlong(0) << 12).__class__ is long)
2137 verify((octlong(0) >> 12).__class__ is long)
2138 verify(abs(octlong(0)).__class__ is long)
2139
2140 # Because octlong overrides __add__, we can't check the absence of +0
2141 # optimizations using octlong.
2142 class longclone(long):
2143 pass
2144 a = longclone(1)
2145 verify((a + 0).__class__ is long)
2146 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002147
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002148 # Check that negative clones don't segfault
2149 a = longclone(-1)
2150 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002151 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002152
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002153 class precfloat(float):
2154 __slots__ = ['prec']
2155 def __init__(self, value=0.0, prec=12):
2156 self.prec = int(prec)
2157 float.__init__(value)
2158 def __repr__(self):
2159 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002160 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002161 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002162 vereq(a, 12345.0)
2163 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002164 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002165 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002166 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002167
Tim Peters2400fa42001-09-12 19:12:49 +00002168 class madcomplex(complex):
2169 def __repr__(self):
2170 return "%.17gj%+.17g" % (self.imag, self.real)
2171 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002172 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002173 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002174 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(a, base)
2176 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002177 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002178 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002179 vereq(repr(a), "4j-3")
2180 vereq(a, base)
2181 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002182 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002184 veris((+a).__class__, complex)
2185 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002186 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002187 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002188 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002189 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002190 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002191 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002192 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002193
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002194 class madtuple(tuple):
2195 _rev = None
2196 def rev(self):
2197 if self._rev is not None:
2198 return self._rev
2199 L = list(self)
2200 L.reverse()
2201 self._rev = self.__class__(L)
2202 return self._rev
2203 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002204 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2205 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2206 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002207 for i in range(512):
2208 t = madtuple(range(i))
2209 u = t.rev()
2210 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002211 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002212 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002213 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002214 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002215 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002216 verify(a[:].__class__ is tuple)
2217 verify((a * 1).__class__ is tuple)
2218 verify((a * 0).__class__ is tuple)
2219 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002220 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002222 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002223 verify((a + a).__class__ is tuple)
2224 verify((a * 0).__class__ is tuple)
2225 verify((a * 1).__class__ is tuple)
2226 verify((a * 2).__class__ is tuple)
2227 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002228
2229 class madstring(str):
2230 _rev = None
2231 def rev(self):
2232 if self._rev is not None:
2233 return self._rev
2234 L = list(self)
2235 L.reverse()
2236 self._rev = self.__class__("".join(L))
2237 return self._rev
2238 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002239 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2240 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2241 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002242 for i in range(256):
2243 s = madstring("".join(map(chr, range(i))))
2244 t = s.rev()
2245 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002246 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002247 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002249 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002250
Tim Peters8fa5dd02001-09-12 02:18:30 +00002251 base = "\x00" * 5
2252 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002253 vereq(s, base)
2254 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002255 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(hash(s), hash(base))
2257 vereq({s: 1}[base], 1)
2258 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002259 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002261 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002263 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002265 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002267 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002269 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002271 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002273 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002275 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002277 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002279 identitytab = ''.join([chr(i) for i in range(256)])
2280 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002282 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(s.translate(identitytab, "x"), base)
2284 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002285 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002287 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002289 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002291 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002292 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002293 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002294 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002295
Tim Peters111f6092001-09-12 07:54:51 +00002296 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00002297 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002298 verify(intern(s).__class__ is str)
2299 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00002300 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00002301
2302 i = intern("y x")
2303 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00002304 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00002305 verify(intern(s).__class__ is str)
2306 verify(intern(s) is i)
2307
2308 s = madstring(i)
2309 verify(intern(s).__class__ is str)
2310 verify(intern(s) is i)
2311
Guido van Rossum91ee7982001-08-30 20:52:40 +00002312 class madunicode(unicode):
2313 _rev = None
2314 def rev(self):
2315 if self._rev is not None:
2316 return self._rev
2317 L = list(self)
2318 L.reverse()
2319 self._rev = self.__class__(u"".join(L))
2320 return self._rev
2321 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002322 vereq(u, u"ABCDEF")
2323 vereq(u.rev(), madunicode(u"FEDCBA"))
2324 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002325 base = u"12345"
2326 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002328 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002329 vereq(hash(u), hash(base))
2330 vereq({u: 1}[base], 1)
2331 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002332 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002333 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002334 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002335 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002336 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002337 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002338 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002340 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002341 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002342 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002344 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002345 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002346 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002348 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002349 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002350 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002351 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002352 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002353 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002354 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002356 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002358 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002359 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002360 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002361 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002362 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002363 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002364 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002365 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002366 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002367 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002368 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002369 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002370
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002371 class sublist(list):
2372 pass
2373 a = sublist(range(5))
2374 vereq(a, range(5))
2375 a.append("hello")
2376 vereq(a, range(5) + ["hello"])
2377 a[5] = 5
2378 vereq(a, range(6))
2379 a.extend(range(6, 20))
2380 vereq(a, range(20))
2381 a[-5:] = []
2382 vereq(a, range(15))
2383 del a[10:15]
2384 vereq(len(a), 10)
2385 vereq(a, range(10))
2386 vereq(list(a), range(10))
2387 vereq(a[0], 0)
2388 vereq(a[9], 9)
2389 vereq(a[-10], 0)
2390 vereq(a[-1], 9)
2391 vereq(a[:5], range(5))
2392
Tim Peters59c9a642001-09-13 05:38:56 +00002393 class CountedInput(file):
2394 """Counts lines read by self.readline().
2395
2396 self.lineno is the 0-based ordinal of the last line read, up to
2397 a maximum of one greater than the number of lines in the file.
2398
2399 self.ateof is true if and only if the final "" line has been read,
2400 at which point self.lineno stops incrementing, and further calls
2401 to readline() continue to return "".
2402 """
2403
2404 lineno = 0
2405 ateof = 0
2406 def readline(self):
2407 if self.ateof:
2408 return ""
2409 s = file.readline(self)
2410 # Next line works too.
2411 # s = super(CountedInput, self).readline()
2412 self.lineno += 1
2413 if s == "":
2414 self.ateof = 1
2415 return s
2416
Tim Peters561f8992001-09-13 19:36:36 +00002417 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002418 lines = ['a\n', 'b\n', 'c\n']
2419 try:
2420 f.writelines(lines)
2421 f.close()
2422 f = CountedInput(TESTFN)
2423 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2424 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002425 vereq(expected, got)
2426 vereq(f.lineno, i)
2427 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002428 f.close()
2429 finally:
2430 try:
2431 f.close()
2432 except:
2433 pass
2434 try:
2435 import os
2436 os.unlink(TESTFN)
2437 except:
2438 pass
2439
Tim Peters808b94e2001-09-13 19:33:07 +00002440def keywords():
2441 if verbose:
2442 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002443 vereq(int(x=1), 1)
2444 vereq(float(x=2), 2.0)
2445 vereq(long(x=3), 3L)
2446 vereq(complex(imag=42, real=666), complex(666, 42))
2447 vereq(str(object=500), '500')
2448 vereq(unicode(string='abc', errors='strict'), u'abc')
2449 vereq(tuple(sequence=range(3)), (0, 1, 2))
2450 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002451 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002452
2453 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002454 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002455 try:
2456 constructor(bogus_keyword_arg=1)
2457 except TypeError:
2458 pass
2459 else:
2460 raise TestFailed("expected TypeError from bogus keyword "
2461 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002462
Tim Peters8fa45672001-09-13 21:01:29 +00002463def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002464 # XXX This test is disabled because rexec is not deemed safe
2465 return
Tim Peters8fa45672001-09-13 21:01:29 +00002466 import rexec
2467 if verbose:
2468 print "Testing interaction with restricted execution ..."
2469
2470 sandbox = rexec.RExec()
2471
2472 code1 = """f = open(%r, 'w')""" % TESTFN
2473 code2 = """f = file(%r, 'w')""" % TESTFN
2474 code3 = """\
2475f = open(%r)
2476t = type(f) # a sneaky way to get the file() constructor
2477f.close()
2478f = t(%r, 'w') # rexec can't catch this by itself
2479""" % (TESTFN, TESTFN)
2480
2481 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2482 f.close()
2483
2484 try:
2485 for code in code1, code2, code3:
2486 try:
2487 sandbox.r_exec(code)
2488 except IOError, msg:
2489 if str(msg).find("restricted") >= 0:
2490 outcome = "OK"
2491 else:
2492 outcome = "got an exception, but not an expected one"
2493 else:
2494 outcome = "expected a restricted-execution exception"
2495
2496 if outcome != "OK":
2497 raise TestFailed("%s, in %r" % (outcome, code))
2498
2499 finally:
2500 try:
2501 import os
2502 os.unlink(TESTFN)
2503 except:
2504 pass
2505
Tim Peters0ab085c2001-09-14 00:25:33 +00002506def str_subclass_as_dict_key():
2507 if verbose:
2508 print "Testing a str subclass used as dict key .."
2509
2510 class cistr(str):
2511 """Sublcass of str that computes __eq__ case-insensitively.
2512
2513 Also computes a hash code of the string in canonical form.
2514 """
2515
2516 def __init__(self, value):
2517 self.canonical = value.lower()
2518 self.hashcode = hash(self.canonical)
2519
2520 def __eq__(self, other):
2521 if not isinstance(other, cistr):
2522 other = cistr(other)
2523 return self.canonical == other.canonical
2524
2525 def __hash__(self):
2526 return self.hashcode
2527
Guido van Rossum45704552001-10-08 16:35:45 +00002528 vereq(cistr('ABC'), 'abc')
2529 vereq('aBc', cistr('ABC'))
2530 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002531
2532 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002533 vereq(d[cistr('one')], 1)
2534 vereq(d[cistr('tWo')], 2)
2535 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002536 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002537 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002538
Guido van Rossumab3b0342001-09-18 20:38:53 +00002539def classic_comparisons():
2540 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002541 class classic:
2542 pass
2543 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002544 if verbose: print " (base = %s)" % base
2545 class C(base):
2546 def __init__(self, value):
2547 self.value = int(value)
2548 def __cmp__(self, other):
2549 if isinstance(other, C):
2550 return cmp(self.value, other.value)
2551 if isinstance(other, int) or isinstance(other, long):
2552 return cmp(self.value, other)
2553 return NotImplemented
2554 c1 = C(1)
2555 c2 = C(2)
2556 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002557 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002558 c = {1: c1, 2: c2, 3: c3}
2559 for x in 1, 2, 3:
2560 for y in 1, 2, 3:
2561 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2562 for op in "<", "<=", "==", "!=", ">", ">=":
2563 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2564 "x=%d, y=%d" % (x, y))
2565 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2566 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2567
Guido van Rossum0639f592001-09-18 21:06:04 +00002568def rich_comparisons():
2569 if verbose:
2570 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002571 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002572 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002573 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002574 vereq(z, 1+0j)
2575 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002576 class ZZ(complex):
2577 def __eq__(self, other):
2578 try:
2579 return abs(self - other) <= 1e-6
2580 except:
2581 return NotImplemented
2582 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002583 vereq(zz, 1+0j)
2584 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002585
Guido van Rossum0639f592001-09-18 21:06:04 +00002586 class classic:
2587 pass
2588 for base in (classic, int, object, list):
2589 if verbose: print " (base = %s)" % base
2590 class C(base):
2591 def __init__(self, value):
2592 self.value = int(value)
2593 def __cmp__(self, other):
2594 raise TestFailed, "shouldn't call __cmp__"
2595 def __eq__(self, other):
2596 if isinstance(other, C):
2597 return self.value == other.value
2598 if isinstance(other, int) or isinstance(other, long):
2599 return self.value == other
2600 return NotImplemented
2601 def __ne__(self, other):
2602 if isinstance(other, C):
2603 return self.value != other.value
2604 if isinstance(other, int) or isinstance(other, long):
2605 return self.value != other
2606 return NotImplemented
2607 def __lt__(self, other):
2608 if isinstance(other, C):
2609 return self.value < other.value
2610 if isinstance(other, int) or isinstance(other, long):
2611 return self.value < other
2612 return NotImplemented
2613 def __le__(self, other):
2614 if isinstance(other, C):
2615 return self.value <= other.value
2616 if isinstance(other, int) or isinstance(other, long):
2617 return self.value <= other
2618 return NotImplemented
2619 def __gt__(self, other):
2620 if isinstance(other, C):
2621 return self.value > other.value
2622 if isinstance(other, int) or isinstance(other, long):
2623 return self.value > other
2624 return NotImplemented
2625 def __ge__(self, other):
2626 if isinstance(other, C):
2627 return self.value >= other.value
2628 if isinstance(other, int) or isinstance(other, long):
2629 return self.value >= other
2630 return NotImplemented
2631 c1 = C(1)
2632 c2 = C(2)
2633 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002634 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002635 c = {1: c1, 2: c2, 3: c3}
2636 for x in 1, 2, 3:
2637 for y in 1, 2, 3:
2638 for op in "<", "<=", "==", "!=", ">", ">=":
2639 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2640 "x=%d, y=%d" % (x, y))
2641 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2642 "x=%d, y=%d" % (x, y))
2643 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2644 "x=%d, y=%d" % (x, y))
2645
Guido van Rossum1952e382001-09-19 01:25:16 +00002646def coercions():
2647 if verbose: print "Testing coercions..."
2648 class I(int): pass
2649 coerce(I(0), 0)
2650 coerce(0, I(0))
2651 class L(long): pass
2652 coerce(L(0), 0)
2653 coerce(L(0), 0L)
2654 coerce(0, L(0))
2655 coerce(0L, L(0))
2656 class F(float): pass
2657 coerce(F(0), 0)
2658 coerce(F(0), 0L)
2659 coerce(F(0), 0.)
2660 coerce(0, F(0))
2661 coerce(0L, F(0))
2662 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002663 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002664 coerce(C(0), 0)
2665 coerce(C(0), 0L)
2666 coerce(C(0), 0.)
2667 coerce(C(0), 0j)
2668 coerce(0, C(0))
2669 coerce(0L, C(0))
2670 coerce(0., C(0))
2671 coerce(0j, C(0))
2672
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002673def descrdoc():
2674 if verbose: print "Testing descriptor doc strings..."
2675 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002676 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002677 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002678 check(file.name, "file name") # member descriptor
2679
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002680def setclass():
2681 if verbose: print "Testing __class__ assignment..."
2682 class C(object): pass
2683 class D(object): pass
2684 class E(object): pass
2685 class F(D, E): pass
2686 for cls in C, D, E, F:
2687 for cls2 in C, D, E, F:
2688 x = cls()
2689 x.__class__ = cls2
2690 verify(x.__class__ is cls2)
2691 x.__class__ = cls
2692 verify(x.__class__ is cls)
2693 def cant(x, C):
2694 try:
2695 x.__class__ = C
2696 except TypeError:
2697 pass
2698 else:
2699 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002700 try:
2701 delattr(x, "__class__")
2702 except TypeError:
2703 pass
2704 else:
2705 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002706 cant(C(), list)
2707 cant(list(), C)
2708 cant(C(), 1)
2709 cant(C(), object)
2710 cant(object(), list)
2711 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002712 class Int(int): __slots__ = []
2713 cant(2, Int)
2714 cant(Int(), int)
2715 cant(True, int)
2716 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002717 o = object()
2718 cant(o, type(1))
2719 cant(o, type(None))
2720 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002721
Guido van Rossum6661be32001-10-26 04:26:12 +00002722def setdict():
2723 if verbose: print "Testing __dict__ assignment..."
2724 class C(object): pass
2725 a = C()
2726 a.__dict__ = {'b': 1}
2727 vereq(a.b, 1)
2728 def cant(x, dict):
2729 try:
2730 x.__dict__ = dict
2731 except TypeError:
2732 pass
2733 else:
2734 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2735 cant(a, None)
2736 cant(a, [])
2737 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002738 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002739 # Classes don't allow __dict__ assignment
2740 cant(C, {})
2741
Guido van Rossum3926a632001-09-25 16:25:58 +00002742def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002743 if verbose:
2744 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002745 import pickle, cPickle
2746
2747 def sorteditems(d):
2748 L = d.items()
2749 L.sort()
2750 return L
2751
2752 global C
2753 class C(object):
2754 def __init__(self, a, b):
2755 super(C, self).__init__()
2756 self.a = a
2757 self.b = b
2758 def __repr__(self):
2759 return "C(%r, %r)" % (self.a, self.b)
2760
2761 global C1
2762 class C1(list):
2763 def __new__(cls, a, b):
2764 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002765 def __getnewargs__(self):
2766 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002767 def __init__(self, a, b):
2768 self.a = a
2769 self.b = b
2770 def __repr__(self):
2771 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2772
2773 global C2
2774 class C2(int):
2775 def __new__(cls, a, b, val=0):
2776 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002777 def __getnewargs__(self):
2778 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002779 def __init__(self, a, b, val=0):
2780 self.a = a
2781 self.b = b
2782 def __repr__(self):
2783 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2784
Guido van Rossum90c45142001-11-24 21:07:01 +00002785 global C3
2786 class C3(object):
2787 def __init__(self, foo):
2788 self.foo = foo
2789 def __getstate__(self):
2790 return self.foo
2791 def __setstate__(self, foo):
2792 self.foo = foo
2793
2794 global C4classic, C4
2795 class C4classic: # classic
2796 pass
2797 class C4(C4classic, object): # mixed inheritance
2798 pass
2799
Guido van Rossum3926a632001-09-25 16:25:58 +00002800 for p in pickle, cPickle:
2801 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002802 if verbose:
2803 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002804
2805 for cls in C, C1, C2:
2806 s = p.dumps(cls, bin)
2807 cls2 = p.loads(s)
2808 verify(cls2 is cls)
2809
2810 a = C1(1, 2); a.append(42); a.append(24)
2811 b = C2("hello", "world", 42)
2812 s = p.dumps((a, b), bin)
2813 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002814 vereq(x.__class__, a.__class__)
2815 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2816 vereq(y.__class__, b.__class__)
2817 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002818 vereq(repr(x), repr(a))
2819 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002820 if verbose:
2821 print "a = x =", a
2822 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002823 # Test for __getstate__ and __setstate__ on new style class
2824 u = C3(42)
2825 s = p.dumps(u, bin)
2826 v = p.loads(s)
2827 veris(u.__class__, v.__class__)
2828 vereq(u.foo, v.foo)
2829 # Test for picklability of hybrid class
2830 u = C4()
2831 u.foo = 42
2832 s = p.dumps(u, bin)
2833 v = p.loads(s)
2834 veris(u.__class__, v.__class__)
2835 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002836
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002837 # Testing copy.deepcopy()
2838 if verbose:
2839 print "deepcopy"
2840 import copy
2841 for cls in C, C1, C2:
2842 cls2 = copy.deepcopy(cls)
2843 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002844
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002845 a = C1(1, 2); a.append(42); a.append(24)
2846 b = C2("hello", "world", 42)
2847 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002848 vereq(x.__class__, a.__class__)
2849 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2850 vereq(y.__class__, b.__class__)
2851 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002852 vereq(repr(x), repr(a))
2853 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002854 if verbose:
2855 print "a = x =", a
2856 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002857
Guido van Rossum8c842552002-03-14 23:05:54 +00002858def pickleslots():
2859 if verbose: print "Testing pickling of classes with __slots__ ..."
2860 import pickle, cPickle
2861 # Pickling of classes with __slots__ but without __getstate__ should fail
2862 global B, C, D, E
2863 class B(object):
2864 pass
2865 for base in [object, B]:
2866 class C(base):
2867 __slots__ = ['a']
2868 class D(C):
2869 pass
2870 try:
2871 pickle.dumps(C())
2872 except TypeError:
2873 pass
2874 else:
2875 raise TestFailed, "should fail: pickle C instance - %s" % base
2876 try:
2877 cPickle.dumps(C())
2878 except TypeError:
2879 pass
2880 else:
2881 raise TestFailed, "should fail: cPickle C instance - %s" % base
2882 try:
2883 pickle.dumps(C())
2884 except TypeError:
2885 pass
2886 else:
2887 raise TestFailed, "should fail: pickle D instance - %s" % base
2888 try:
2889 cPickle.dumps(D())
2890 except TypeError:
2891 pass
2892 else:
2893 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002894 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002895 class C(base):
2896 __slots__ = ['a']
2897 def __getstate__(self):
2898 try:
2899 d = self.__dict__.copy()
2900 except AttributeError:
2901 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002902 for cls in self.__class__.__mro__:
2903 for sn in cls.__dict__.get('__slots__', ()):
2904 try:
2905 d[sn] = getattr(self, sn)
2906 except AttributeError:
2907 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002908 return d
2909 def __setstate__(self, d):
2910 for k, v in d.items():
2911 setattr(self, k, v)
2912 class D(C):
2913 pass
2914 # Now it should work
2915 x = C()
2916 y = pickle.loads(pickle.dumps(x))
2917 vereq(hasattr(y, 'a'), 0)
2918 y = cPickle.loads(cPickle.dumps(x))
2919 vereq(hasattr(y, 'a'), 0)
2920 x.a = 42
2921 y = pickle.loads(pickle.dumps(x))
2922 vereq(y.a, 42)
2923 y = cPickle.loads(cPickle.dumps(x))
2924 vereq(y.a, 42)
2925 x = D()
2926 x.a = 42
2927 x.b = 100
2928 y = pickle.loads(pickle.dumps(x))
2929 vereq(y.a + y.b, 142)
2930 y = cPickle.loads(cPickle.dumps(x))
2931 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002932 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002933 class E(C):
2934 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002935 x = E()
2936 x.a = 42
2937 x.b = "foo"
2938 y = pickle.loads(pickle.dumps(x))
2939 vereq(y.a, x.a)
2940 vereq(y.b, x.b)
2941 y = cPickle.loads(cPickle.dumps(x))
2942 vereq(y.a, x.a)
2943 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002944
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002945def copies():
2946 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2947 import copy
2948 class C(object):
2949 pass
2950
2951 a = C()
2952 a.foo = 12
2953 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002954 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002955
2956 a.bar = [1,2,3]
2957 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002958 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002959 verify(c.bar is a.bar)
2960
2961 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002962 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002963 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002964 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002965
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002966def binopoverride():
2967 if verbose: print "Testing overrides of binary operations..."
2968 class I(int):
2969 def __repr__(self):
2970 return "I(%r)" % int(self)
2971 def __add__(self, other):
2972 return I(int(self) + int(other))
2973 __radd__ = __add__
2974 def __pow__(self, other, mod=None):
2975 if mod is None:
2976 return I(pow(int(self), int(other)))
2977 else:
2978 return I(pow(int(self), int(other), int(mod)))
2979 def __rpow__(self, other, mod=None):
2980 if mod is None:
2981 return I(pow(int(other), int(self), mod))
2982 else:
2983 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002984
Walter Dörwald70a6b492004-02-12 17:35:32 +00002985 vereq(repr(I(1) + I(2)), "I(3)")
2986 vereq(repr(I(1) + 2), "I(3)")
2987 vereq(repr(1 + I(2)), "I(3)")
2988 vereq(repr(I(2) ** I(3)), "I(8)")
2989 vereq(repr(2 ** I(3)), "I(8)")
2990 vereq(repr(I(2) ** 3), "I(8)")
2991 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002992 class S(str):
2993 def __eq__(self, other):
2994 return self.lower() == other.lower()
2995
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002996def subclasspropagation():
2997 if verbose: print "Testing propagation of slot functions to subclasses..."
2998 class A(object):
2999 pass
3000 class B(A):
3001 pass
3002 class C(A):
3003 pass
3004 class D(B, C):
3005 pass
3006 d = D()
3007 vereq(hash(d), id(d))
3008 A.__hash__ = lambda self: 42
3009 vereq(hash(d), 42)
3010 C.__hash__ = lambda self: 314
3011 vereq(hash(d), 314)
3012 B.__hash__ = lambda self: 144
3013 vereq(hash(d), 144)
3014 D.__hash__ = lambda self: 100
3015 vereq(hash(d), 100)
3016 del D.__hash__
3017 vereq(hash(d), 144)
3018 del B.__hash__
3019 vereq(hash(d), 314)
3020 del C.__hash__
3021 vereq(hash(d), 42)
3022 del A.__hash__
3023 vereq(hash(d), id(d))
3024 d.foo = 42
3025 d.bar = 42
3026 vereq(d.foo, 42)
3027 vereq(d.bar, 42)
3028 def __getattribute__(self, name):
3029 if name == "foo":
3030 return 24
3031 return object.__getattribute__(self, name)
3032 A.__getattribute__ = __getattribute__
3033 vereq(d.foo, 24)
3034 vereq(d.bar, 42)
3035 def __getattr__(self, name):
3036 if name in ("spam", "foo", "bar"):
3037 return "hello"
3038 raise AttributeError, name
3039 B.__getattr__ = __getattr__
3040 vereq(d.spam, "hello")
3041 vereq(d.foo, 24)
3042 vereq(d.bar, 42)
3043 del A.__getattribute__
3044 vereq(d.foo, 42)
3045 del d.foo
3046 vereq(d.foo, "hello")
3047 vereq(d.bar, 42)
3048 del B.__getattr__
3049 try:
3050 d.foo
3051 except AttributeError:
3052 pass
3053 else:
3054 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003055
Guido van Rossume7f3e242002-06-14 02:35:45 +00003056 # Test a nasty bug in recurse_down_subclasses()
3057 import gc
3058 class A(object):
3059 pass
3060 class B(A):
3061 pass
3062 del B
3063 gc.collect()
3064 A.__setitem__ = lambda *a: None # crash
3065
Tim Petersfc57ccb2001-10-12 02:38:24 +00003066def buffer_inherit():
3067 import binascii
3068 # SF bug [#470040] ParseTuple t# vs subclasses.
3069 if verbose:
3070 print "Testing that buffer interface is inherited ..."
3071
3072 class MyStr(str):
3073 pass
3074 base = 'abc'
3075 m = MyStr(base)
3076 # b2a_hex uses the buffer interface to get its argument's value, via
3077 # PyArg_ParseTuple 't#' code.
3078 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3079
3080 # It's not clear that unicode will continue to support the character
3081 # buffer interface, and this test will fail if that's taken away.
3082 class MyUni(unicode):
3083 pass
3084 base = u'abc'
3085 m = MyUni(base)
3086 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3087
3088 class MyInt(int):
3089 pass
3090 m = MyInt(42)
3091 try:
3092 binascii.b2a_hex(m)
3093 raise TestFailed('subclass of int should not have a buffer interface')
3094 except TypeError:
3095 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003096
Tim Petersc9933152001-10-16 20:18:24 +00003097def str_of_str_subclass():
3098 import binascii
3099 import cStringIO
3100
3101 if verbose:
3102 print "Testing __str__ defined in subclass of str ..."
3103
3104 class octetstring(str):
3105 def __str__(self):
3106 return binascii.b2a_hex(self)
3107 def __repr__(self):
3108 return self + " repr"
3109
3110 o = octetstring('A')
3111 vereq(type(o), octetstring)
3112 vereq(type(str(o)), str)
3113 vereq(type(repr(o)), str)
3114 vereq(ord(o), 0x41)
3115 vereq(str(o), '41')
3116 vereq(repr(o), 'A repr')
3117 vereq(o.__str__(), '41')
3118 vereq(o.__repr__(), 'A repr')
3119
3120 capture = cStringIO.StringIO()
3121 # Calling str() or not exercises different internal paths.
3122 print >> capture, o
3123 print >> capture, str(o)
3124 vereq(capture.getvalue(), '41\n41\n')
3125 capture.close()
3126
Guido van Rossumc8e56452001-10-22 00:43:43 +00003127def kwdargs():
3128 if verbose: print "Testing keyword arguments to __init__, __call__..."
3129 def f(a): return a
3130 vereq(f.__call__(a=42), 42)
3131 a = []
3132 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003133 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003134
Guido van Rossumed87ad82001-10-30 02:33:02 +00003135def delhook():
3136 if verbose: print "Testing __del__ hook..."
3137 log = []
3138 class C(object):
3139 def __del__(self):
3140 log.append(1)
3141 c = C()
3142 vereq(log, [])
3143 del c
3144 vereq(log, [1])
3145
Guido van Rossum29d26062001-12-11 04:37:34 +00003146 class D(object): pass
3147 d = D()
3148 try: del d[0]
3149 except TypeError: pass
3150 else: raise TestFailed, "invalid del() didn't raise TypeError"
3151
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003152def hashinherit():
3153 if verbose: print "Testing hash of mutable subclasses..."
3154
3155 class mydict(dict):
3156 pass
3157 d = mydict()
3158 try:
3159 hash(d)
3160 except TypeError:
3161 pass
3162 else:
3163 raise TestFailed, "hash() of dict subclass should fail"
3164
3165 class mylist(list):
3166 pass
3167 d = mylist()
3168 try:
3169 hash(d)
3170 except TypeError:
3171 pass
3172 else:
3173 raise TestFailed, "hash() of list subclass should fail"
3174
Guido van Rossum29d26062001-12-11 04:37:34 +00003175def strops():
3176 try: 'a' + 5
3177 except TypeError: pass
3178 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3179
3180 try: ''.split('')
3181 except ValueError: pass
3182 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3183
3184 try: ''.join([0])
3185 except TypeError: pass
3186 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3187
3188 try: ''.rindex('5')
3189 except ValueError: pass
3190 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3191
Guido van Rossum29d26062001-12-11 04:37:34 +00003192 try: '%(n)s' % None
3193 except TypeError: pass
3194 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3195
3196 try: '%(n' % {}
3197 except ValueError: pass
3198 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3199
3200 try: '%*s' % ('abc')
3201 except TypeError: pass
3202 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3203
3204 try: '%*.*s' % ('abc', 5)
3205 except TypeError: pass
3206 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3207
3208 try: '%s' % (1, 2)
3209 except TypeError: pass
3210 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3211
3212 try: '%' % None
3213 except ValueError: pass
3214 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3215
3216 vereq('534253'.isdigit(), 1)
3217 vereq('534253x'.isdigit(), 0)
3218 vereq('%c' % 5, '\x05')
3219 vereq('%c' % '5', '5')
3220
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003221def deepcopyrecursive():
3222 if verbose: print "Testing deepcopy of recursive objects..."
3223 class Node:
3224 pass
3225 a = Node()
3226 b = Node()
3227 a.b = b
3228 b.a = a
3229 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003230
Guido van Rossumd7035672002-03-12 20:43:31 +00003231def modules():
3232 if verbose: print "Testing uninitialized module objects..."
3233 from types import ModuleType as M
3234 m = M.__new__(M)
3235 str(m)
3236 vereq(hasattr(m, "__name__"), 0)
3237 vereq(hasattr(m, "__file__"), 0)
3238 vereq(hasattr(m, "foo"), 0)
3239 vereq(m.__dict__, None)
3240 m.foo = 1
3241 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003242
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003243def dictproxyiterkeys():
3244 class C(object):
3245 def meth(self):
3246 pass
3247 if verbose: print "Testing dict-proxy iterkeys..."
3248 keys = [ key for key in C.__dict__.iterkeys() ]
3249 keys.sort()
3250 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3251
3252def dictproxyitervalues():
3253 class C(object):
3254 def meth(self):
3255 pass
3256 if verbose: print "Testing dict-proxy itervalues..."
3257 values = [ values for values in C.__dict__.itervalues() ]
3258 vereq(len(values), 5)
3259
3260def dictproxyiteritems():
3261 class C(object):
3262 def meth(self):
3263 pass
3264 if verbose: print "Testing dict-proxy iteritems..."
3265 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3266 keys.sort()
3267 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3268
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003269def funnynew():
3270 if verbose: print "Testing __new__ returning something unexpected..."
3271 class C(object):
3272 def __new__(cls, arg):
3273 if isinstance(arg, str): return [1, 2, 3]
3274 elif isinstance(arg, int): return object.__new__(D)
3275 else: return object.__new__(cls)
3276 class D(C):
3277 def __init__(self, arg):
3278 self.foo = arg
3279 vereq(C("1"), [1, 2, 3])
3280 vereq(D("1"), [1, 2, 3])
3281 d = D(None)
3282 veris(d.foo, None)
3283 d = C(1)
3284 vereq(isinstance(d, D), True)
3285 vereq(d.foo, 1)
3286 d = D(1)
3287 vereq(isinstance(d, D), True)
3288 vereq(d.foo, 1)
3289
Guido van Rossume8fc6402002-04-16 16:44:51 +00003290def imulbug():
3291 # SF bug 544647
3292 if verbose: print "Testing for __imul__ problems..."
3293 class C(object):
3294 def __imul__(self, other):
3295 return (self, other)
3296 x = C()
3297 y = x
3298 y *= 1.0
3299 vereq(y, (x, 1.0))
3300 y = x
3301 y *= 2
3302 vereq(y, (x, 2))
3303 y = x
3304 y *= 3L
3305 vereq(y, (x, 3L))
3306 y = x
3307 y *= 1L<<100
3308 vereq(y, (x, 1L<<100))
3309 y = x
3310 y *= None
3311 vereq(y, (x, None))
3312 y = x
3313 y *= "foo"
3314 vereq(y, (x, "foo"))
3315
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003316def docdescriptor():
3317 # SF bug 542984
3318 if verbose: print "Testing __doc__ descriptor..."
3319 class DocDescr(object):
3320 def __get__(self, object, otype):
3321 if object:
3322 object = object.__class__.__name__ + ' instance'
3323 if otype:
3324 otype = otype.__name__
3325 return 'object=%s; type=%s' % (object, otype)
3326 class OldClass:
3327 __doc__ = DocDescr()
3328 class NewClass(object):
3329 __doc__ = DocDescr()
3330 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3331 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3332 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3333 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3334
Tim Petersafb2c802002-04-18 18:06:20 +00003335def string_exceptions():
3336 if verbose:
3337 print "Testing string exceptions ..."
3338
3339 # Ensure builtin strings work OK as exceptions.
3340 astring = "An exception string."
3341 try:
3342 raise astring
3343 except astring:
3344 pass
3345 else:
3346 raise TestFailed, "builtin string not usable as exception"
3347
3348 # Ensure string subclass instances do not.
3349 class MyStr(str):
3350 pass
3351
3352 newstring = MyStr("oops -- shouldn't work")
3353 try:
3354 raise newstring
3355 except TypeError:
3356 pass
3357 except:
3358 raise TestFailed, "string subclass allowed as exception"
3359
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003360def copy_setstate():
3361 if verbose:
3362 print "Testing that copy.*copy() correctly uses __setstate__..."
3363 import copy
3364 class C(object):
3365 def __init__(self, foo=None):
3366 self.foo = foo
3367 self.__foo = foo
3368 def setfoo(self, foo=None):
3369 self.foo = foo
3370 def getfoo(self):
3371 return self.__foo
3372 def __getstate__(self):
3373 return [self.foo]
3374 def __setstate__(self, lst):
3375 assert len(lst) == 1
3376 self.__foo = self.foo = lst[0]
3377 a = C(42)
3378 a.setfoo(24)
3379 vereq(a.foo, 24)
3380 vereq(a.getfoo(), 42)
3381 b = copy.copy(a)
3382 vereq(b.foo, 24)
3383 vereq(b.getfoo(), 24)
3384 b = copy.deepcopy(a)
3385 vereq(b.foo, 24)
3386 vereq(b.getfoo(), 24)
3387
Guido van Rossum09638c12002-06-13 19:17:46 +00003388def slices():
3389 if verbose:
3390 print "Testing cases with slices and overridden __getitem__ ..."
3391 # Strings
3392 vereq("hello"[:4], "hell")
3393 vereq("hello"[slice(4)], "hell")
3394 vereq(str.__getitem__("hello", slice(4)), "hell")
3395 class S(str):
3396 def __getitem__(self, x):
3397 return str.__getitem__(self, x)
3398 vereq(S("hello")[:4], "hell")
3399 vereq(S("hello")[slice(4)], "hell")
3400 vereq(S("hello").__getitem__(slice(4)), "hell")
3401 # Tuples
3402 vereq((1,2,3)[:2], (1,2))
3403 vereq((1,2,3)[slice(2)], (1,2))
3404 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3405 class T(tuple):
3406 def __getitem__(self, x):
3407 return tuple.__getitem__(self, x)
3408 vereq(T((1,2,3))[:2], (1,2))
3409 vereq(T((1,2,3))[slice(2)], (1,2))
3410 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3411 # Lists
3412 vereq([1,2,3][:2], [1,2])
3413 vereq([1,2,3][slice(2)], [1,2])
3414 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3415 class L(list):
3416 def __getitem__(self, x):
3417 return list.__getitem__(self, x)
3418 vereq(L([1,2,3])[:2], [1,2])
3419 vereq(L([1,2,3])[slice(2)], [1,2])
3420 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3421 # Now do lists and __setitem__
3422 a = L([1,2,3])
3423 a[slice(1, 3)] = [3,2]
3424 vereq(a, [1,3,2])
3425 a[slice(0, 2, 1)] = [3,1]
3426 vereq(a, [3,1,2])
3427 a.__setitem__(slice(1, 3), [2,1])
3428 vereq(a, [3,2,1])
3429 a.__setitem__(slice(0, 2, 1), [2,3])
3430 vereq(a, [2,3,1])
3431
Tim Peters2484aae2002-07-11 06:56:07 +00003432def subtype_resurrection():
3433 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003434 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003435
3436 class C(object):
3437 container = []
3438
3439 def __del__(self):
3440 # resurrect the instance
3441 C.container.append(self)
3442
3443 c = C()
3444 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003445 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003446 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003447 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003448
3449 # If that didn't blow up, it's also interesting to see whether clearing
3450 # the last container slot works: that will attempt to delete c again,
3451 # which will cause c to get appended back to the container again "during"
3452 # the del.
3453 del C.container[-1]
3454 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003455 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003456
Tim Peters14cb1e12002-07-11 18:26:21 +00003457 # Make c mortal again, so that the test framework with -l doesn't report
3458 # it as a leak.
3459 del C.__del__
3460
Guido van Rossum2d702462002-08-06 21:28:28 +00003461def slottrash():
3462 # Deallocating deeply nested slotted trash caused stack overflows
3463 if verbose:
3464 print "Testing slot trash..."
3465 class trash(object):
3466 __slots__ = ['x']
3467 def __init__(self, x):
3468 self.x = x
3469 o = None
3470 for i in xrange(50000):
3471 o = trash(o)
3472 del o
3473
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003474def slotmultipleinheritance():
3475 # SF bug 575229, multiple inheritance w/ slots dumps core
3476 class A(object):
3477 __slots__=()
3478 class B(object):
3479 pass
3480 class C(A,B) :
3481 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003482 vereq(C.__basicsize__, B.__basicsize__)
3483 verify(hasattr(C, '__dict__'))
3484 verify(hasattr(C, '__weakref__'))
3485 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003486
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003487def testrmul():
3488 # SF patch 592646
3489 if verbose:
3490 print "Testing correct invocation of __rmul__..."
3491 class C(object):
3492 def __mul__(self, other):
3493 return "mul"
3494 def __rmul__(self, other):
3495 return "rmul"
3496 a = C()
3497 vereq(a*2, "mul")
3498 vereq(a*2.2, "mul")
3499 vereq(2*a, "rmul")
3500 vereq(2.2*a, "rmul")
3501
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003502def testipow():
3503 # [SF bug 620179]
3504 if verbose:
3505 print "Testing correct invocation of __ipow__..."
3506 class C(object):
3507 def __ipow__(self, other):
3508 pass
3509 a = C()
3510 a **= 2
3511
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003512def do_this_first():
3513 if verbose:
3514 print "Testing SF bug 551412 ..."
3515 # This dumps core when SF bug 551412 isn't fixed --
3516 # but only when test_descr.py is run separately.
3517 # (That can't be helped -- as soon as PyType_Ready()
3518 # is called for PyLong_Type, the bug is gone.)
3519 class UserLong(object):
3520 def __pow__(self, *args):
3521 pass
3522 try:
3523 pow(0L, UserLong(), 0L)
3524 except:
3525 pass
3526
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003527 if verbose:
3528 print "Testing SF bug 570483..."
3529 # Another segfault only when run early
3530 # (before PyType_Ready(tuple) is called)
3531 type.mro(tuple)
3532
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003533def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003534 if verbose:
3535 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003536 # stuff that should work:
3537 class C(object):
3538 pass
3539 class C2(object):
3540 def __getattribute__(self, attr):
3541 if attr == 'a':
3542 return 2
3543 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003544 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003545 def meth(self):
3546 return 1
3547 class D(C):
3548 pass
3549 class E(D):
3550 pass
3551 d = D()
3552 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003553 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003554 D.__bases__ = (C2,)
3555 vereq(d.meth(), 1)
3556 vereq(e.meth(), 1)
3557 vereq(d.a, 2)
3558 vereq(e.a, 2)
3559 vereq(C2.__subclasses__(), [D])
3560
3561 # stuff that shouldn't:
3562 class L(list):
3563 pass
3564
3565 try:
3566 L.__bases__ = (dict,)
3567 except TypeError:
3568 pass
3569 else:
3570 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3571
3572 try:
3573 list.__bases__ = (dict,)
3574 except TypeError:
3575 pass
3576 else:
3577 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3578
3579 try:
3580 del D.__bases__
3581 except TypeError:
3582 pass
3583 else:
3584 raise TestFailed, "shouldn't be able to delete .__bases__"
3585
3586 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003587 D.__bases__ = ()
3588 except TypeError, msg:
3589 if str(msg) == "a new-style class can't have only classic bases":
3590 raise TestFailed, "wrong error message for .__bases__ = ()"
3591 else:
3592 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3593
3594 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003595 D.__bases__ = (D,)
3596 except TypeError:
3597 pass
3598 else:
3599 # actually, we'll have crashed by here...
3600 raise TestFailed, "shouldn't be able to create inheritance cycles"
3601
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003602 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003603 D.__bases__ = (C, C)
3604 except TypeError:
3605 pass
3606 else:
3607 raise TestFailed, "didn't detect repeated base classes"
3608
3609 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003610 D.__bases__ = (E,)
3611 except TypeError:
3612 pass
3613 else:
3614 raise TestFailed, "shouldn't be able to create inheritance cycles"
3615
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003616 # let's throw a classic class into the mix:
3617 class Classic:
3618 def meth2(self):
3619 return 3
3620
3621 D.__bases__ = (C, Classic)
3622
3623 vereq(d.meth2(), 3)
3624 vereq(e.meth2(), 3)
3625 try:
3626 d.a
3627 except AttributeError:
3628 pass
3629 else:
3630 raise TestFailed, "attribute should have vanished"
3631
3632 try:
3633 D.__bases__ = (Classic,)
3634 except TypeError:
3635 pass
3636 else:
3637 raise TestFailed, "new-style class must have a new-style base"
3638
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003639def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003640 if verbose:
3641 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003642 class WorkOnce(type):
3643 def __new__(self, name, bases, ns):
3644 self.flag = 0
3645 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3646 def mro(self):
3647 if self.flag > 0:
3648 raise RuntimeError, "bozo"
3649 else:
3650 self.flag += 1
3651 return type.mro(self)
3652
3653 class WorkAlways(type):
3654 def mro(self):
3655 # this is here to make sure that .mro()s aren't called
3656 # with an exception set (which was possible at one point).
3657 # An error message will be printed in a debug build.
3658 # What's a good way to test for this?
3659 return type.mro(self)
3660
3661 class C(object):
3662 pass
3663
3664 class C2(object):
3665 pass
3666
3667 class D(C):
3668 pass
3669
3670 class E(D):
3671 pass
3672
3673 class F(D):
3674 __metaclass__ = WorkOnce
3675
3676 class G(D):
3677 __metaclass__ = WorkAlways
3678
3679 # Immediate subclasses have their mro's adjusted in alphabetical
3680 # order, so E's will get adjusted before adjusting F's fails. We
3681 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003682
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003683 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003684 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003685
3686 try:
3687 D.__bases__ = (C2,)
3688 except RuntimeError:
3689 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003690 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003691 else:
3692 raise TestFailed, "exception not propagated"
3693
3694def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003695 if verbose:
3696 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003697 class A(object):
3698 pass
3699
3700 class B(object):
3701 pass
3702
3703 class C(A, B):
3704 pass
3705
3706 class D(A, B):
3707 pass
3708
3709 class E(C, D):
3710 pass
3711
3712 try:
3713 C.__bases__ = (B, A)
3714 except TypeError:
3715 pass
3716 else:
3717 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003718
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003719def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003720 if verbose:
3721 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003722 class C(object):
3723 pass
3724
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003725 # C.__module__ could be 'test_descr' or '__main__'
3726 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003727
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003728 C.__name__ = 'D'
3729 vereq((C.__module__, C.__name__), (mod, 'D'))
3730
3731 C.__name__ = 'D.E'
3732 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003733
Guido van Rossum613f24f2003-01-06 23:00:59 +00003734def subclass_right_op():
3735 if verbose:
3736 print "Testing correct dispatch of subclass overloading __r<op>__..."
3737
3738 # This code tests various cases where right-dispatch of a subclass
3739 # should be preferred over left-dispatch of a base class.
3740
3741 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3742
3743 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003744 def __floordiv__(self, other):
3745 return "B.__floordiv__"
3746 def __rfloordiv__(self, other):
3747 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003748
Guido van Rossumf389c772003-02-27 20:04:19 +00003749 vereq(B(1) // 1, "B.__floordiv__")
3750 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003751
3752 # Case 2: subclass of object; this is just the baseline for case 3
3753
3754 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003755 def __floordiv__(self, other):
3756 return "C.__floordiv__"
3757 def __rfloordiv__(self, other):
3758 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003759
Guido van Rossumf389c772003-02-27 20:04:19 +00003760 vereq(C() // 1, "C.__floordiv__")
3761 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003762
3763 # Case 3: subclass of new-style class; here it gets interesting
3764
3765 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003766 def __floordiv__(self, other):
3767 return "D.__floordiv__"
3768 def __rfloordiv__(self, other):
3769 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003770
Guido van Rossumf389c772003-02-27 20:04:19 +00003771 vereq(D() // C(), "D.__floordiv__")
3772 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003773
3774 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3775
3776 class E(C):
3777 pass
3778
Guido van Rossumf389c772003-02-27 20:04:19 +00003779 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003780
Guido van Rossumf389c772003-02-27 20:04:19 +00003781 vereq(E() // 1, "C.__floordiv__")
3782 vereq(1 // E(), "C.__rfloordiv__")
3783 vereq(E() // C(), "C.__floordiv__")
3784 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003785
Guido van Rossum373c7412003-01-07 13:41:37 +00003786def dict_type_with_metaclass():
3787 if verbose:
3788 print "Testing type of __dict__ when __metaclass__ set..."
3789
3790 class B(object):
3791 pass
3792 class M(type):
3793 pass
3794 class C:
3795 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3796 __metaclass__ = M
3797 veris(type(C.__dict__), type(B.__dict__))
3798
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003799def meth_class_get():
3800 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003801 if verbose:
3802 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003803 # Baseline
3804 arg = [1, 2, 3]
3805 res = {1: None, 2: None, 3: None}
3806 vereq(dict.fromkeys(arg), res)
3807 vereq({}.fromkeys(arg), res)
3808 # Now get the descriptor
3809 descr = dict.__dict__["fromkeys"]
3810 # More baseline using the descriptor directly
3811 vereq(descr.__get__(None, dict)(arg), res)
3812 vereq(descr.__get__({})(arg), res)
3813 # Now check various error cases
3814 try:
3815 descr.__get__(None, None)
3816 except TypeError:
3817 pass
3818 else:
3819 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3820 try:
3821 descr.__get__(42)
3822 except TypeError:
3823 pass
3824 else:
3825 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3826 try:
3827 descr.__get__(None, 42)
3828 except TypeError:
3829 pass
3830 else:
3831 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3832 try:
3833 descr.__get__(None, int)
3834 except TypeError:
3835 pass
3836 else:
3837 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3838
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003839def isinst_isclass():
3840 if verbose:
3841 print "Testing proxy isinstance() and isclass()..."
3842 class Proxy(object):
3843 def __init__(self, obj):
3844 self.__obj = obj
3845 def __getattribute__(self, name):
3846 if name.startswith("_Proxy__"):
3847 return object.__getattribute__(self, name)
3848 else:
3849 return getattr(self.__obj, name)
3850 # Test with a classic class
3851 class C:
3852 pass
3853 a = C()
3854 pa = Proxy(a)
3855 verify(isinstance(a, C)) # Baseline
3856 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003857 # Test with a classic subclass
3858 class D(C):
3859 pass
3860 a = D()
3861 pa = Proxy(a)
3862 verify(isinstance(a, C)) # Baseline
3863 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003864 # Test with a new-style class
3865 class C(object):
3866 pass
3867 a = C()
3868 pa = Proxy(a)
3869 verify(isinstance(a, C)) # Baseline
3870 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003871 # Test with a new-style subclass
3872 class D(C):
3873 pass
3874 a = D()
3875 pa = Proxy(a)
3876 verify(isinstance(a, C)) # Baseline
3877 verify(isinstance(pa, C)) # Test
3878
3879def proxysuper():
3880 if verbose:
3881 print "Testing super() for a proxy object..."
3882 class Proxy(object):
3883 def __init__(self, obj):
3884 self.__obj = obj
3885 def __getattribute__(self, name):
3886 if name.startswith("_Proxy__"):
3887 return object.__getattribute__(self, name)
3888 else:
3889 return getattr(self.__obj, name)
3890
3891 class B(object):
3892 def f(self):
3893 return "B.f"
3894
3895 class C(B):
3896 def f(self):
3897 return super(C, self).f() + "->C.f"
3898
3899 obj = C()
3900 p = Proxy(obj)
3901 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003902
Guido van Rossum52b27052003-04-15 20:05:10 +00003903def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003904 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00003905 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003906 try:
3907 object.__setattr__(str, "foo", 42)
3908 except TypeError:
3909 pass
3910 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003911 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003912 try:
3913 object.__delattr__(str, "lower")
3914 except TypeError:
3915 pass
3916 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003917 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003918
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003919def weakref_segfault():
3920 # SF 742911
3921 if verbose:
3922 print "Testing weakref segfault..."
3923
3924 import weakref
3925
3926 class Provoker:
3927 def __init__(self, referrent):
3928 self.ref = weakref.ref(referrent)
3929
3930 def __del__(self):
3931 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003932
3933 class Oops(object):
3934 pass
3935
3936 o = Oops()
3937 o.whatever = Provoker(o)
3938 del o
3939
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003940# Fix SF #762455, segfault when sys.stdout is changed in getattr
3941def filefault():
3942 if verbose:
3943 print "Testing sys.stdout is changed in getattr..."
3944 import sys
3945 class StdoutGuard:
3946 def __getattr__(self, attr):
3947 sys.stdout = sys.__stdout__
3948 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3949 sys.stdout = StdoutGuard()
3950 try:
3951 print "Oops!"
3952 except RuntimeError:
3953 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003954
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003955def vicious_descriptor_nonsense():
3956 # A potential segfault spotted by Thomas Wouters in mail to
3957 # python-dev 2003-04-17, turned into an example & fixed by Michael
3958 # Hudson just less than four months later...
3959 if verbose:
3960 print "Testing vicious_descriptor_nonsense..."
3961
3962 class Evil(object):
3963 def __hash__(self):
3964 return hash('attr')
3965 def __eq__(self, other):
3966 del C.attr
3967 return 0
3968
3969 class Descr(object):
3970 def __get__(self, ob, type=None):
3971 return 1
3972
3973 class C(object):
3974 attr = Descr()
3975
3976 c = C()
3977 c.__dict__[Evil()] = 0
3978
3979 vereq(c.attr, 1)
3980 # this makes a crash more likely:
3981 import gc; gc.collect()
3982 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00003983
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003984
Guido van Rossuma56b42b2001-09-20 21:39:07 +00003985def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003986 weakref_segfault() # Must be first, somehow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003987 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00003988 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003989 lists()
3990 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00003991 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00003992 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00003993 ints()
3994 longs()
3995 floats()
3996 complexes()
3997 spamlists()
3998 spamdicts()
3999 pydicts()
4000 pylists()
4001 metaclass()
4002 pymods()
4003 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004004 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004005 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004006 ex5()
4007 monotonicity()
4008 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004009 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004010 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004011 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004012 dynamics()
4013 errors()
4014 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004015 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004016 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004017 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004018 classic()
4019 compattr()
4020 newslot()
4021 altmro()
4022 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004023 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004024 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004025 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004026 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004027 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004028 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004029 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004030 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004031 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004032 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004033 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00004034 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004035 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004036 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004037 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004038 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004039 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004040 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004041 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004042 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004043 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004044 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004045 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004046 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004047 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004048 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004049 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004050 dictproxyiterkeys()
4051 dictproxyitervalues()
4052 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004053 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004054 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004055 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004056 docdescriptor()
Tim Petersafb2c802002-04-18 18:06:20 +00004057 string_exceptions()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004058 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004059 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004060 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004061 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004062 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004063 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004064 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004065 test_mutable_bases()
4066 test_mutable_bases_with_failing_mro()
4067 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004068 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004069 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004070 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004071 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004072 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004073 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004074 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004075 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004076 vicious_descriptor_nonsense()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004077
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004078 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004079
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004080if __name__ == "__main__":
4081 test_main()