blob: bc95226cd3d898a64552fee52d7a75fb072ffea7 [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
Guido van Rossum45704552001-10-08 16:35:45 +000032 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000033 t = type(a)
34 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000035 while meth not in t.__dict__:
36 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000037 vereq(m, t.__dict__[meth])
38 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000040 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000041
42def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
43 if verbose: print "checking", expr
44 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000045 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046 t = type(a)
47 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000048 while meth not in t.__dict__:
49 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000050 vereq(m, t.__dict__[meth])
51 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000053 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054
55def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
56 if verbose: print "checking", stmt
57 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000058 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000059 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000060 t = type(a)
61 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000062 while meth not in t.__dict__:
63 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000064 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000065 dict['a'] = deepcopy(a)
66 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000067 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000068 dict['a'] = deepcopy(a)
69 bm = getattr(dict['a'], meth)
70 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072
73def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
74 if verbose: print "checking", stmt
75 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000076 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000077 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000078 t = type(a)
79 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000080 while meth not in t.__dict__:
81 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000082 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000083 dict['a'] = deepcopy(a)
84 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000085 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000086 dict['a'] = deepcopy(a)
87 bm = getattr(dict['a'], meth)
88 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090
91def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
92 if verbose: print "checking", stmt
93 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000094 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000095 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000096 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000097 while meth not in t.__dict__:
98 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000099 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000100 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101 dict['a'] = deepcopy(a)
102 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000103 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000104 dict['a'] = deepcopy(a)
105 bm = getattr(dict['a'], meth)
106 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108
Tim Peters2f93e282001-10-04 05:27:00 +0000109def class_docstrings():
110 class Classic:
111 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000112 vereq(Classic.__doc__, "A classic docstring.")
113 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000114
115 class Classic2:
116 pass
117 verify(Classic2.__doc__ is None)
118
Tim Peters4fb1fe82001-10-04 05:48:13 +0000119 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000120 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000121 vereq(NewStatic.__doc__, "Another docstring.")
122 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000123
Tim Peters4fb1fe82001-10-04 05:48:13 +0000124 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000125 pass
126 verify(NewStatic2.__doc__ is None)
127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000130 vereq(NewDynamic.__doc__, "Another docstring.")
131 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000132
Tim Peters4fb1fe82001-10-04 05:48:13 +0000133 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000134 pass
135 verify(NewDynamic2.__doc__ is None)
136
Tim Peters6d6c1a32001-08-02 04:15:00 +0000137def lists():
138 if verbose: print "Testing list operations..."
139 testbinop([1], [2], [1,2], "a+b", "__add__")
140 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
141 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
142 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
143 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
144 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
145 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
146 testunop([1,2,3], 3, "len(a)", "__len__")
147 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
148 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
149 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
150 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
151
152def dicts():
153 if verbose: print "Testing dict operations..."
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000154 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000155 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
156 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
157 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
158 d = {1:2,3:4}
159 l1 = []
160 for i in d.keys(): l1.append(i)
161 l = []
162 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000163 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 l = []
165 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000166 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000167 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000168 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000169 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 d = {1:2, 3:4}
171 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000172 vereq(eval(repr(d), {}), d)
173 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
175
Tim Peters25786c02001-09-02 08:22:48 +0000176def dict_constructor():
177 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000178 print "Testing dict constructor ..."
179 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000180 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000181 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000186 vereq(d, dict(d.iteritems()))
187 d = dict({'one':1, 'two':2})
188 vereq(d, dict(one=1, two=2))
189 vereq(d, dict(**d))
190 vereq(d, dict({"one": 1}, two=2))
191 vereq(d, dict([("two", 2)], one=1))
192 vereq(d, dict([("one", 100), ("two", 200)], **d))
193 verify(d is not dict(**d))
Tim Peters25786c02001-09-02 08:22:48 +0000194 for badarg in 0, 0L, 0j, "0", [0], (0,):
195 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000196 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000197 except TypeError:
198 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000199 except ValueError:
200 if badarg == "0":
201 # It's a sequence, and its elements are also sequences (gotta
202 # love strings <wink>), but they aren't of length 2, so this
203 # one seemed better as a ValueError than a TypeError.
204 pass
205 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000206 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000207 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000208 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000209
210 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000211 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000212 except TypeError:
213 pass
214 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000216
217 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000218 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000219 dict = {1:2, 3:4, 'a':1j}
220
Tim Peters25786c02001-09-02 08:22:48 +0000221 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000222 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000223 except TypeError:
224 pass
225 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000226 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000227
228 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000229 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000230 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000231 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000232
Tim Peters1fc240e2001-10-26 05:06:50 +0000233 # Init from sequence of iterable objects, each producing a 2-sequence.
234 class AddressBookEntry:
235 def __init__(self, first, last):
236 self.first = first
237 self.last = last
238 def __iter__(self):
239 return iter([self.first, self.last])
240
Tim Petersa427a2b2001-10-29 22:25:45 +0000241 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000242 AddressBookEntry('Barry', 'Peters'),
243 AddressBookEntry('Tim', 'Peters'),
244 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000245 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
246
Tim Petersa427a2b2001-10-29 22:25:45 +0000247 d = dict(zip(range(4), range(1, 5)))
248 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000249
250 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000251 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000252 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000253 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000254 except ValueError:
255 pass
256 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000257 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000258
Tim Peters5d2b77c2001-09-03 05:47:38 +0000259def test_dir():
260 if verbose:
261 print "Testing dir() ..."
262 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000263 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264 del junk
265
266 # Just make sure these don't blow up!
267 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
268 dir(arg)
269
Thomas Wouters0725cf22006-04-15 09:04:57 +0000270 # Test dir on custom classes. Since these have object as a
271 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000272 def interesting(strings):
273 return [s for s in strings if not s.startswith('_')]
274
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275 class C(object):
276 Cdata = 1
277 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000278
279 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000281
282 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000284 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000285
286 c.cdata = 2
287 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000288 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000289 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000290
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291 class A(C):
292 Adata = 1
293 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000294
295 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000296 vereq(interesting(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(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000300 a.adata = 42
301 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000302 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000303 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000304
Tim Peterscaaff8d2001-09-10 23:12:14 +0000305 # Try a module subclass.
306 import sys
307 class M(type(sys)):
308 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000309 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000310 minstance.b = 2
311 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000312 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
313 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000314
315 class M2(M):
316 def getdict(self):
317 return "Not a dict!"
318 __dict__ = property(getdict)
319
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000320 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000321 m2instance.b = 2
322 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000323 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000324 try:
325 dir(m2instance)
326 except TypeError:
327 pass
328
Tim Peters9e6a3992001-10-30 05:45:26 +0000329 # Two essentially featureless objects, just inheriting stuff from
330 # object.
331 vereq(dir(None), dir(Ellipsis))
332
Guido van Rossum44022412002-05-13 18:29:46 +0000333 # Nasty test case for proxied objects
334 class Wrapper(object):
335 def __init__(self, obj):
336 self.__obj = obj
337 def __repr__(self):
338 return "Wrapper(%s)" % repr(self.__obj)
339 def __getitem__(self, key):
340 return Wrapper(self.__obj[key])
341 def __len__(self):
342 return len(self.__obj)
343 def __getattr__(self, name):
344 return Wrapper(getattr(self.__obj, name))
345
346 class C(object):
347 def __getclass(self):
348 return Wrapper(type(self))
349 __class__ = property(__getclass)
350
351 dir(C()) # This used to segfault
352
Tim Peters6d6c1a32001-08-02 04:15:00 +0000353binops = {
354 'add': '+',
355 'sub': '-',
356 'mul': '*',
357 'div': '/',
358 'mod': '%',
359 'divmod': 'divmod',
360 'pow': '**',
361 'lshift': '<<',
362 'rshift': '>>',
363 'and': '&',
364 'xor': '^',
365 'or': '|',
366 'cmp': 'cmp',
367 'lt': '<',
368 'le': '<=',
369 'eq': '==',
370 'ne': '!=',
371 'gt': '>',
372 'ge': '>=',
373 }
374
375for name, expr in binops.items():
376 if expr.islower():
377 expr = expr + "(a, b)"
378 else:
379 expr = 'a %s b' % expr
380 binops[name] = expr
381
382unops = {
383 'pos': '+',
384 'neg': '-',
385 'abs': 'abs',
386 'invert': '~',
387 'int': 'int',
388 'long': 'long',
389 'float': 'float',
390 'oct': 'oct',
391 'hex': 'hex',
392 }
393
394for name, expr in unops.items():
395 if expr.islower():
396 expr = expr + "(a)"
397 else:
398 expr = '%s a' % expr
399 unops[name] = expr
400
401def numops(a, b, skip=[]):
402 dict = {'a': a, 'b': b}
403 for name, expr in binops.items():
404 if name not in skip:
405 name = "__%s__" % name
406 if hasattr(a, name):
407 res = eval(expr, dict)
408 testbinop(a, b, res, expr, name)
409 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000410 if name not in skip:
411 name = "__%s__" % name
412 if hasattr(a, name):
413 res = eval(expr, dict)
414 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000415
416def ints():
417 if verbose: print "Testing int operations..."
418 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000419 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000420 vereq((1).__bool__(), True)
421 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000422 # This returns 'NotImplemented' in Python 2.2
423 class C(int):
424 def __add__(self, other):
425 return NotImplemented
Neal Norwitzde8b94c2003-02-10 02:12:43 +0000426 vereq(C(5L), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000427 try:
428 C() + ""
429 except TypeError:
430 pass
431 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000432 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000433
434def longs():
435 if verbose: print "Testing long operations..."
436 numops(100L, 3L)
437
438def floats():
439 if verbose: print "Testing float operations..."
440 numops(100.0, 3.0)
441
442def complexes():
443 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000444 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000445 class Number(complex):
446 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000447 def __new__(cls, *args, **kwds):
448 result = complex.__new__(cls, *args)
449 result.prec = kwds.get('prec', 12)
450 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451 def __repr__(self):
452 prec = self.prec
453 if self.imag == 0.0:
454 return "%.*g" % (prec, self.real)
455 if self.real == 0.0:
456 return "%.*gj" % (prec, self.imag)
457 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
458 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000459
Tim Peters6d6c1a32001-08-02 04:15:00 +0000460 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000461 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000462 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463
Tim Peters3f996e72001-09-13 19:18:27 +0000464 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000465 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000466 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000467
468 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000469 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000470 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000471
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472def spamlists():
473 if verbose: print "Testing spamlist operations..."
474 import copy, xxsubtype as spam
475 def spamlist(l, memo=None):
476 import xxsubtype as spam
477 return spam.spamlist(l)
478 # This is an ugly hack:
479 copy._deepcopy_dispatch[spam.spamlist] = spamlist
480
481 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
482 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
483 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
484 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
485 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
486 "a[b:c]", "__getslice__")
487 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
488 "a+=b", "__iadd__")
489 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
490 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
491 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
492 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
493 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
494 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
495 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
496 # Test subclassing
497 class C(spam.spamlist):
498 def foo(self): return 1
499 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000500 vereq(a, [])
501 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000502 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000503 vereq(a, [100])
504 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000505 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000506 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000507
508def spamdicts():
509 if verbose: print "Testing spamdict operations..."
510 import copy, xxsubtype as spam
511 def spamdict(d, memo=None):
512 import xxsubtype as spam
513 sd = spam.spamdict()
514 for k, v in d.items(): sd[k] = v
515 return sd
516 # This is an ugly hack:
517 copy._deepcopy_dispatch[spam.spamdict] = spamdict
518
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000519 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000520 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
521 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
522 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
523 d = spamdict({1:2,3:4})
524 l1 = []
525 for i in d.keys(): l1.append(i)
526 l = []
527 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000528 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000529 l = []
530 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000531 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000532 l = []
533 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000534 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000535 straightd = {1:2, 3:4}
536 spamd = spamdict(straightd)
537 testunop(spamd, 2, "len(a)", "__len__")
538 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
539 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
540 "a[b]=c", "__setitem__")
541 # Test subclassing
542 class C(spam.spamdict):
543 def foo(self): return 1
544 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000545 vereq(a.items(), [])
546 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000548 vereq(a.items(), [('foo', 'bar')])
549 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000550 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000551 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000552
553def pydicts():
554 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000555 verify(issubclass(dict, dict))
556 verify(isinstance({}, dict))
557 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000558 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000559 verify(d.__class__ is dict)
560 verify(isinstance(d, dict))
561 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562 state = -1
563 def __init__(self, *a, **kw):
564 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000565 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566 self.state = a[0]
567 if kw:
568 for k, v in kw.items(): self[v] = k
569 def __getitem__(self, key):
570 return self.get(key, 0)
571 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000572 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000573 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 def setstate(self, state):
575 self.state = state
576 def getstate(self):
577 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000578 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000579 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000581 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000582 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000584 vereq(a.state, -1)
585 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000586 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000587 vereq(a.state, 0)
588 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a.state, 10)
591 vereq(a.getstate(), 10)
592 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000593 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000594 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 if verbose: print "pydict stress test ..."
596 N = 50
597 for i in range(N):
598 a[i] = C()
599 for j in range(N):
600 a[i][j] = i*j
601 for i in range(N):
602 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000603 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604
605def pylists():
606 if verbose: print "Testing Python subclass of list..."
607 class C(list):
608 def __getitem__(self, i):
609 return list.__getitem__(self, i) + 100
610 def __getslice__(self, i, j):
611 return (i, j)
612 a = C()
613 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000614 vereq(a[0], 100)
615 vereq(a[1], 101)
616 vereq(a[2], 102)
617 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000618
619def metaclass():
620 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 class C:
622 __metaclass__ = type
623 def __init__(self):
624 self.__state = 0
625 def getstate(self):
626 return self.__state
627 def setstate(self, state):
628 self.__state = state
629 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000630 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.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000633 class D:
634 class __metaclass__(type):
635 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000636 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000637 d = D()
638 verify(d.__class__ is D)
639 class M1(type):
640 def __new__(cls, name, bases, dict):
641 dict['__spam__'] = 1
642 return type.__new__(cls, name, bases, dict)
643 class C:
644 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000645 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000646 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000647 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000648
Guido van Rossum309b5662001-08-17 11:43:17 +0000649 class _instance(object):
650 pass
651 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000652 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000653 def __new__(cls, name, bases, dict):
654 self = object.__new__(cls)
655 self.name = name
656 self.bases = bases
657 self.dict = dict
658 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000659 def __call__(self):
660 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000661 # Early binding of methods
662 for key in self.dict:
663 if key.startswith("__"):
664 continue
665 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000666 return it
667 class C:
668 __metaclass__ = M2
669 def spam(self):
670 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000671 vereq(C.name, 'C')
672 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000673 verify('spam' in C.dict)
674 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000675 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000676
Guido van Rossum91ee7982001-08-30 20:52:40 +0000677 # More metaclass examples
678
679 class autosuper(type):
680 # Automatically add __super to the class
681 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000683 cls = super(autosuper, metaclass).__new__(metaclass,
684 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000685 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000686 while name[:1] == "_":
687 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000688 if name:
689 name = "_%s__super" % name
690 else:
691 name = "__super"
692 setattr(cls, name, super(cls))
693 return cls
694 class A:
695 __metaclass__ = autosuper
696 def meth(self):
697 return "A"
698 class B(A):
699 def meth(self):
700 return "B" + self.__super.meth()
701 class C(A):
702 def meth(self):
703 return "C" + self.__super.meth()
704 class D(C, B):
705 def meth(self):
706 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000707 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000708 class E(B, C):
709 def meth(self):
710 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000711 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000712
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000713 class autoproperty(type):
714 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000715 # named _get_x and/or _set_x are found
716 def __new__(metaclass, name, bases, dict):
717 hits = {}
718 for key, val in dict.iteritems():
719 if key.startswith("_get_"):
720 key = key[5:]
721 get, set = hits.get(key, (None, None))
722 get = val
723 hits[key] = get, set
724 elif key.startswith("_set_"):
725 key = key[5:]
726 get, set = hits.get(key, (None, None))
727 set = val
728 hits[key] = get, set
729 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000730 dict[key] = property(get, set)
731 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000732 name, bases, dict)
733 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000734 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000735 def _get_x(self):
736 return -self.__x
737 def _set_x(self, x):
738 self.__x = -x
739 a = A()
740 verify(not hasattr(a, "x"))
741 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000742 vereq(a.x, 12)
743 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000744
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000745 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000746 # Merge of multiple cooperating metaclasses
747 pass
748 class A:
749 __metaclass__ = multimetaclass
750 def _get_x(self):
751 return "A"
752 class B(A):
753 def _get_x(self):
754 return "B" + self.__super._get_x()
755 class C(A):
756 def _get_x(self):
757 return "C" + self.__super._get_x()
758 class D(C, B):
759 def _get_x(self):
760 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000761 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000762
Guido van Rossumf76de622001-10-18 15:49:21 +0000763 # Make sure type(x) doesn't call x.__class__.__init__
764 class T(type):
765 counter = 0
766 def __init__(self, *args):
767 T.counter += 1
768 class C:
769 __metaclass__ = T
770 vereq(T.counter, 1)
771 a = C()
772 vereq(type(a), C)
773 vereq(T.counter, 1)
774
Guido van Rossum29d26062001-12-11 04:37:34 +0000775 class C(object): pass
776 c = C()
777 try: c()
778 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000779 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000780
Tim Peters6d6c1a32001-08-02 04:15:00 +0000781def pymods():
782 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000783 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000784 import sys
785 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000786 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000787 def __init__(self, name):
788 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000789 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000791 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000792 def __setattr__(self, name, value):
793 log.append(("setattr", name, value))
794 MT.__setattr__(self, name, value)
795 def __delattr__(self, name):
796 log.append(("delattr", name))
797 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000798 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 a.foo = 12
800 x = a.foo
801 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000802 vereq(log, [("setattr", "foo", 12),
803 ("getattr", "foo"),
804 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000805
806def multi():
807 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000808 class C(object):
809 def __init__(self):
810 self.__state = 0
811 def getstate(self):
812 return self.__state
813 def setstate(self, state):
814 self.__state = state
815 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000816 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000818 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000819 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000820 def __init__(self):
821 type({}).__init__(self)
822 C.__init__(self)
823 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000824 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000826 vereq(d.items(), [("hello", "world")])
827 vereq(d["hello"], "world")
828 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000829 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000830 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000831 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000832
Guido van Rossume45763a2001-08-10 21:28:46 +0000833 # SF bug #442833
834 class Node(object):
835 def __int__(self):
836 return int(self.foo())
837 def foo(self):
838 return "23"
839 class Frag(Node, list):
840 def foo(self):
841 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000842 vereq(Node().__int__(), 23)
843 vereq(int(Node()), 23)
844 vereq(Frag().__int__(), 42)
845 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000846
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847def diamond():
848 if verbose: print "Testing multiple inheritance special cases..."
849 class A(object):
850 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000851 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000852 class B(A):
853 def boo(self): return "B"
854 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000855 vereq(B().spam(), "B")
856 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000857 class C(A):
858 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000859 vereq(C().spam(), "A")
860 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000861 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000862 vereq(D().spam(), "B")
863 vereq(D().boo(), "B")
864 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000865 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000866 vereq(E().spam(), "B")
867 vereq(E().boo(), "C")
868 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000869 # MRO order disagreement
870 try:
871 class F(D, E): pass
872 except TypeError:
873 pass
874 else:
875 raise TestFailed, "expected MRO order disagreement (F)"
876 try:
877 class G(E, D): pass
878 except TypeError:
879 pass
880 else:
881 raise TestFailed, "expected MRO order disagreement (G)"
882
883
884# see thread python-dev/2002-October/029035.html
885def ex5():
886 if verbose: print "Testing ex5 from C3 switch discussion..."
887 class A(object): pass
888 class B(object): pass
889 class C(object): pass
890 class X(A): pass
891 class Y(A): pass
892 class Z(X,B,Y,C): pass
893 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
894
895# see "A Monotonic Superclass Linearization for Dylan",
896# by Kim Barrett et al. (OOPSLA 1996)
897def monotonicity():
898 if verbose: print "Testing MRO monotonicity..."
899 class Boat(object): pass
900 class DayBoat(Boat): pass
901 class WheelBoat(Boat): pass
902 class EngineLess(DayBoat): pass
903 class SmallMultihull(DayBoat): pass
904 class PedalWheelBoat(EngineLess,WheelBoat): pass
905 class SmallCatamaran(SmallMultihull): pass
906 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
907
908 vereq(PedalWheelBoat.__mro__,
909 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
910 object))
911 vereq(SmallCatamaran.__mro__,
912 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
913
914 vereq(Pedalo.__mro__,
915 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
916 SmallMultihull, DayBoat, WheelBoat, Boat, object))
917
918# see "A Monotonic Superclass Linearization for Dylan",
919# by Kim Barrett et al. (OOPSLA 1996)
920def consistency_with_epg():
921 if verbose: print "Testing consistentcy with EPG..."
922 class Pane(object): pass
923 class ScrollingMixin(object): pass
924 class EditingMixin(object): pass
925 class ScrollablePane(Pane,ScrollingMixin): pass
926 class EditablePane(Pane,EditingMixin): pass
927 class EditableScrollablePane(ScrollablePane,EditablePane): pass
928
929 vereq(EditableScrollablePane.__mro__,
930 (EditableScrollablePane, ScrollablePane, EditablePane,
931 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000932
Raymond Hettingerf394df42003-04-06 19:13:41 +0000933mro_err_msg = """Cannot create a consistent method resolution
934order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000935
Guido van Rossumd32047f2002-11-25 21:38:52 +0000936def mro_disagreement():
937 if verbose: print "Testing error messages for MRO disagreement..."
938 def raises(exc, expected, callable, *args):
939 try:
940 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000941 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000942 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +0000943 raise TestFailed, "Message %r, expected %r" % (str(msg),
944 expected)
945 else:
946 raise TestFailed, "Expected %s" % exc
947 class A(object): pass
948 class B(A): pass
949 class C(object): pass
950 # Test some very simple errors
951 raises(TypeError, "duplicate base class A",
952 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000953 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000954 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000955 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000956 type, "X", (A, C, B), {})
957 # Test a slightly more complex error
958 class GridLayout(object): pass
959 class HorizontalGrid(GridLayout): pass
960 class VerticalGrid(GridLayout): pass
961 class HVGrid(HorizontalGrid, VerticalGrid): pass
962 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000963 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000964 type, "ConfusedGrid", (HVGrid, VHGrid), {})
965
Guido van Rossum37202612001-08-09 19:45:21 +0000966def objects():
967 if verbose: print "Testing object class..."
968 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000969 vereq(a.__class__, object)
970 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000971 b = object()
972 verify(a is not b)
973 verify(not hasattr(a, "foo"))
974 try:
975 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000976 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000977 pass
978 else:
979 verify(0, "object() should not allow setting a foo attribute")
980 verify(not hasattr(object(), "__dict__"))
981
982 class Cdict(object):
983 pass
984 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000985 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000986 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000987 vereq(x.foo, 1)
988 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000989
Tim Peters6d6c1a32001-08-02 04:15:00 +0000990def slots():
991 if verbose: print "Testing __slots__..."
992 class C0(object):
993 __slots__ = []
994 x = C0()
995 verify(not hasattr(x, "__dict__"))
996 verify(not hasattr(x, "foo"))
997
998 class C1(object):
999 __slots__ = ['a']
1000 x = C1()
1001 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001002 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001004 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001005 x.a = None
1006 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001007 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001008 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001009
1010 class C3(object):
1011 __slots__ = ['a', 'b', 'c']
1012 x = C3()
1013 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001014 verify(not hasattr(x, 'a'))
1015 verify(not hasattr(x, 'b'))
1016 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 x.a = 1
1018 x.b = 2
1019 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001020 vereq(x.a, 1)
1021 vereq(x.b, 2)
1022 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001023
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001024 class C4(object):
1025 """Validate name mangling"""
1026 __slots__ = ['__a']
1027 def __init__(self, value):
1028 self.__a = value
1029 def get(self):
1030 return self.__a
1031 x = C4(5)
1032 verify(not hasattr(x, '__dict__'))
1033 verify(not hasattr(x, '__a'))
1034 vereq(x.get(), 5)
1035 try:
1036 x.__a = 6
1037 except AttributeError:
1038 pass
1039 else:
1040 raise TestFailed, "Double underscored names not mangled"
1041
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001042 # Make sure slot names are proper identifiers
1043 try:
1044 class C(object):
1045 __slots__ = [None]
1046 except TypeError:
1047 pass
1048 else:
1049 raise TestFailed, "[None] slots not caught"
1050 try:
1051 class C(object):
1052 __slots__ = ["foo bar"]
1053 except TypeError:
1054 pass
1055 else:
1056 raise TestFailed, "['foo bar'] slots not caught"
1057 try:
1058 class C(object):
1059 __slots__ = ["foo\0bar"]
1060 except TypeError:
1061 pass
1062 else:
1063 raise TestFailed, "['foo\\0bar'] slots not caught"
1064 try:
1065 class C(object):
1066 __slots__ = ["1"]
1067 except TypeError:
1068 pass
1069 else:
1070 raise TestFailed, "['1'] slots not caught"
1071 try:
1072 class C(object):
1073 __slots__ = [""]
1074 except TypeError:
1075 pass
1076 else:
1077 raise TestFailed, "[''] slots not caught"
1078 class C(object):
1079 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1080
Guido van Rossum33bab012001-12-05 22:45:48 +00001081 # Test leaks
1082 class Counted(object):
1083 counter = 0 # counts the number of instances alive
1084 def __init__(self):
1085 Counted.counter += 1
1086 def __del__(self):
1087 Counted.counter -= 1
1088 class C(object):
1089 __slots__ = ['a', 'b', 'c']
1090 x = C()
1091 x.a = Counted()
1092 x.b = Counted()
1093 x.c = Counted()
1094 vereq(Counted.counter, 3)
1095 del x
1096 vereq(Counted.counter, 0)
1097 class D(C):
1098 pass
1099 x = D()
1100 x.a = Counted()
1101 x.z = Counted()
1102 vereq(Counted.counter, 2)
1103 del x
1104 vereq(Counted.counter, 0)
1105 class E(D):
1106 __slots__ = ['e']
1107 x = E()
1108 x.a = Counted()
1109 x.z = Counted()
1110 x.e = Counted()
1111 vereq(Counted.counter, 3)
1112 del x
1113 vereq(Counted.counter, 0)
1114
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001115 # Test cyclical leaks [SF bug 519621]
1116 class F(object):
1117 __slots__ = ['a', 'b']
1118 log = []
1119 s = F()
1120 s.a = [Counted(), s]
1121 vereq(Counted.counter, 1)
1122 s = None
1123 import gc
1124 gc.collect()
1125 vereq(Counted.counter, 0)
1126
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001127 # Test lookup leaks [SF bug 572567]
1128 import sys,gc
1129 class G(object):
1130 def __cmp__(self, other):
1131 return 0
1132 g = G()
1133 orig_objects = len(gc.get_objects())
1134 for i in xrange(10):
1135 g==g
1136 new_objects = len(gc.get_objects())
1137 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001138 class H(object):
1139 __slots__ = ['a', 'b']
1140 def __init__(self):
1141 self.a = 1
1142 self.b = 2
1143 def __del__(self):
1144 assert self.a == 1
1145 assert self.b == 2
1146
1147 save_stderr = sys.stderr
1148 sys.stderr = sys.stdout
1149 h = H()
1150 try:
1151 del h
1152 finally:
1153 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001154
Guido van Rossum8b056da2002-08-13 18:26:26 +00001155def slotspecials():
1156 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1157
1158 class D(object):
1159 __slots__ = ["__dict__"]
1160 a = D()
1161 verify(hasattr(a, "__dict__"))
1162 verify(not hasattr(a, "__weakref__"))
1163 a.foo = 42
1164 vereq(a.__dict__, {"foo": 42})
1165
1166 class W(object):
1167 __slots__ = ["__weakref__"]
1168 a = W()
1169 verify(hasattr(a, "__weakref__"))
1170 verify(not hasattr(a, "__dict__"))
1171 try:
1172 a.foo = 42
1173 except AttributeError:
1174 pass
1175 else:
1176 raise TestFailed, "shouldn't be allowed to set a.foo"
1177
1178 class C1(W, D):
1179 __slots__ = []
1180 a = C1()
1181 verify(hasattr(a, "__dict__"))
1182 verify(hasattr(a, "__weakref__"))
1183 a.foo = 42
1184 vereq(a.__dict__, {"foo": 42})
1185
1186 class C2(D, W):
1187 __slots__ = []
1188 a = C2()
1189 verify(hasattr(a, "__dict__"))
1190 verify(hasattr(a, "__weakref__"))
1191 a.foo = 42
1192 vereq(a.__dict__, {"foo": 42})
1193
Guido van Rossum9a818922002-11-14 19:50:14 +00001194# MRO order disagreement
1195#
1196# class C3(C1, C2):
1197# __slots__ = []
1198#
1199# class C4(C2, C1):
1200# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001201
Tim Peters6d6c1a32001-08-02 04:15:00 +00001202def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001203 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001206 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001207 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001208 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001209 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001210 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001211 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001212 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001213 vereq(E.foo, 1)
1214 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001215 # Test dynamic instances
1216 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001217 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001218 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001219 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001220 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001221 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001222 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001223 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001224 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001225 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001226 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001227 vereq(int(a), 100)
1228 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001229 verify(not hasattr(a, "spam"))
1230 def mygetattr(self, name):
1231 if name == "spam":
1232 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001233 raise AttributeError
1234 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001235 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001236 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001237 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001238 def mysetattr(self, name, value):
1239 if name == "spam":
1240 raise AttributeError
1241 return object.__setattr__(self, name, value)
1242 C.__setattr__ = mysetattr
1243 try:
1244 a.spam = "not spam"
1245 except AttributeError:
1246 pass
1247 else:
1248 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001249 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001250 class D(C):
1251 pass
1252 d = D()
1253 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001254 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001255
Guido van Rossum7e35d572001-09-15 03:14:32 +00001256 # Test handling of int*seq and seq*int
1257 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001258 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001259 vereq("a"*I(2), "aa")
1260 vereq(I(2)*"a", "aa")
1261 vereq(2*I(3), 6)
1262 vereq(I(3)*2, 6)
1263 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001264
1265 # Test handling of long*seq and seq*long
1266 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001267 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001268 vereq("a"*L(2L), "aa")
1269 vereq(L(2L)*"a", "aa")
1270 vereq(2*L(3), 6)
1271 vereq(L(3)*2, 6)
1272 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001273
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001274 # Test comparison of classes with dynamic metaclasses
1275 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001276 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001277 class someclass:
1278 __metaclass__ = dynamicmetaclass
1279 verify(someclass != object)
1280
Tim Peters6d6c1a32001-08-02 04:15:00 +00001281def errors():
1282 if verbose: print "Testing errors..."
1283
1284 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001285 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001286 pass
1287 except TypeError:
1288 pass
1289 else:
1290 verify(0, "inheritance from both list and dict should be illegal")
1291
1292 try:
1293 class C(object, None):
1294 pass
1295 except TypeError:
1296 pass
1297 else:
1298 verify(0, "inheritance from non-type should be illegal")
1299 class Classic:
1300 pass
1301
1302 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001303 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001304 pass
1305 except TypeError:
1306 pass
1307 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001308 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001309
1310 try:
1311 class C(object):
1312 __slots__ = 1
1313 except TypeError:
1314 pass
1315 else:
1316 verify(0, "__slots__ = 1 should be illegal")
1317
1318 try:
1319 class C(object):
1320 __slots__ = [1]
1321 except TypeError:
1322 pass
1323 else:
1324 verify(0, "__slots__ = [1] should be illegal")
1325
1326def classmethods():
1327 if verbose: print "Testing class methods..."
1328 class C(object):
1329 def foo(*a): return a
1330 goo = classmethod(foo)
1331 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001332 vereq(C.goo(1), (C, 1))
1333 vereq(c.goo(1), (C, 1))
1334 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001335 class D(C):
1336 pass
1337 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001338 vereq(D.goo(1), (D, 1))
1339 vereq(d.goo(1), (D, 1))
1340 vereq(d.foo(1), (d, 1))
1341 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001342 # Test for a specific crash (SF bug 528132)
1343 def f(cls, arg): return (cls, arg)
1344 ff = classmethod(f)
1345 vereq(ff.__get__(0, int)(42), (int, 42))
1346 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001347
Guido van Rossum155db9a2002-04-02 17:53:47 +00001348 # Test super() with classmethods (SF bug 535444)
1349 veris(C.goo.im_self, C)
1350 veris(D.goo.im_self, D)
1351 veris(super(D,D).goo.im_self, D)
1352 veris(super(D,d).goo.im_self, D)
1353 vereq(super(D,D).goo(), (D,))
1354 vereq(super(D,d).goo(), (D,))
1355
Raymond Hettingerbe971532003-06-18 01:13:41 +00001356 # Verify that argument is checked for callability (SF bug 753451)
1357 try:
1358 classmethod(1).__get__(1)
1359 except TypeError:
1360 pass
1361 else:
1362 raise TestFailed, "classmethod should check for callability"
1363
Georg Brandl6a29c322006-02-21 22:17:46 +00001364 # Verify that classmethod() doesn't allow keyword args
1365 try:
1366 classmethod(f, kw=1)
1367 except TypeError:
1368 pass
1369 else:
1370 raise TestFailed, "classmethod shouldn't accept keyword args"
1371
Fred Drakef841aa62002-03-28 15:49:54 +00001372def classmethods_in_c():
1373 if verbose: print "Testing C-based class methods..."
1374 import xxsubtype as spam
1375 a = (1, 2, 3)
1376 d = {'abc': 123}
1377 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001378 veris(x, spam.spamlist)
1379 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001380 vereq(d, d1)
1381 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001382 veris(x, spam.spamlist)
1383 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001384 vereq(d, d1)
1385
Tim Peters6d6c1a32001-08-02 04:15:00 +00001386def staticmethods():
1387 if verbose: print "Testing static methods..."
1388 class C(object):
1389 def foo(*a): return a
1390 goo = staticmethod(foo)
1391 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001392 vereq(C.goo(1), (1,))
1393 vereq(c.goo(1), (1,))
1394 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001395 class D(C):
1396 pass
1397 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001398 vereq(D.goo(1), (1,))
1399 vereq(d.goo(1), (1,))
1400 vereq(d.foo(1), (d, 1))
1401 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001402
Fred Drakef841aa62002-03-28 15:49:54 +00001403def staticmethods_in_c():
1404 if verbose: print "Testing C-based static methods..."
1405 import xxsubtype as spam
1406 a = (1, 2, 3)
1407 d = {"abc": 123}
1408 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1409 veris(x, None)
1410 vereq(a, a1)
1411 vereq(d, d1)
1412 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1413 veris(x, None)
1414 vereq(a, a1)
1415 vereq(d, d1)
1416
Tim Peters6d6c1a32001-08-02 04:15:00 +00001417def classic():
1418 if verbose: print "Testing classic classes..."
1419 class C:
1420 def foo(*a): return a
1421 goo = classmethod(foo)
1422 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001423 vereq(C.goo(1), (C, 1))
1424 vereq(c.goo(1), (C, 1))
1425 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001426 class D(C):
1427 pass
1428 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001429 vereq(D.goo(1), (D, 1))
1430 vereq(d.goo(1), (D, 1))
1431 vereq(d.foo(1), (d, 1))
1432 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001433 class E: # *not* subclassing from C
1434 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001435 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001436 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001437
1438def compattr():
1439 if verbose: print "Testing computed attributes..."
1440 class C(object):
1441 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001442 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001443 self.__get = get
1444 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001445 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001446 def __get__(self, obj, type=None):
1447 return self.__get(obj)
1448 def __set__(self, obj, value):
1449 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001450 def __delete__(self, obj):
1451 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001452 def __init__(self):
1453 self.__x = 0
1454 def __get_x(self):
1455 x = self.__x
1456 self.__x = x+1
1457 return x
1458 def __set_x(self, x):
1459 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001460 def __delete_x(self):
1461 del self.__x
1462 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001463 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001464 vereq(a.x, 0)
1465 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001466 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001467 vereq(a.x, 10)
1468 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001469 del a.x
1470 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001471
1472def newslot():
1473 if verbose: print "Testing __new__ slot override..."
1474 class C(list):
1475 def __new__(cls):
1476 self = list.__new__(cls)
1477 self.foo = 1
1478 return self
1479 def __init__(self):
1480 self.foo = self.foo + 2
1481 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001482 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001483 verify(a.__class__ is C)
1484 class D(C):
1485 pass
1486 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001487 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001488 verify(b.__class__ is D)
1489
Tim Peters6d6c1a32001-08-02 04:15:00 +00001490def altmro():
1491 if verbose: print "Testing mro() and overriding it..."
1492 class A(object):
1493 def f(self): return "A"
1494 class B(A):
1495 pass
1496 class C(A):
1497 def f(self): return "C"
1498 class D(B, C):
1499 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001500 vereq(D.mro(), [D, B, C, A, object])
1501 vereq(D.__mro__, (D, B, C, A, object))
1502 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001503
Guido van Rossumd3077402001-08-12 05:24:18 +00001504 class PerverseMetaType(type):
1505 def mro(cls):
1506 L = type.mro(cls)
1507 L.reverse()
1508 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001509 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001510 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001511 vereq(X.__mro__, (object, A, C, B, D, X))
1512 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513
Armin Rigo037d1e02005-12-29 17:07:39 +00001514 try:
1515 class X(object):
1516 class __metaclass__(type):
1517 def mro(self):
1518 return [self, dict, object]
1519 except TypeError:
1520 pass
1521 else:
1522 raise TestFailed, "devious mro() return not caught"
1523
1524 try:
1525 class X(object):
1526 class __metaclass__(type):
1527 def mro(self):
1528 return [1]
1529 except TypeError:
1530 pass
1531 else:
1532 raise TestFailed, "non-class mro() return not caught"
1533
1534 try:
1535 class X(object):
1536 class __metaclass__(type):
1537 def mro(self):
1538 return 1
1539 except TypeError:
1540 pass
1541 else:
1542 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001543
Armin Rigo037d1e02005-12-29 17:07:39 +00001544
Tim Peters6d6c1a32001-08-02 04:15:00 +00001545def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001546 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001547
1548 class B(object):
1549 "Intermediate class because object doesn't have a __setattr__"
1550
1551 class C(B):
1552
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001553 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001554 if name == "foo":
1555 return ("getattr", name)
1556 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001557 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001558 def __setattr__(self, name, value):
1559 if name == "foo":
1560 self.setattr = (name, value)
1561 else:
1562 return B.__setattr__(self, name, value)
1563 def __delattr__(self, name):
1564 if name == "foo":
1565 self.delattr = name
1566 else:
1567 return B.__delattr__(self, name)
1568
1569 def __getitem__(self, key):
1570 return ("getitem", key)
1571 def __setitem__(self, key, value):
1572 self.setitem = (key, value)
1573 def __delitem__(self, key):
1574 self.delitem = key
1575
1576 def __getslice__(self, i, j):
1577 return ("getslice", i, j)
1578 def __setslice__(self, i, j, value):
1579 self.setslice = (i, j, value)
1580 def __delslice__(self, i, j):
1581 self.delslice = (i, j)
1582
1583 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001584 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001585 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001586 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001588 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001589
Guido van Rossum45704552001-10-08 16:35:45 +00001590 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001591 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001592 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001593 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001594 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001595
Guido van Rossum45704552001-10-08 16:35:45 +00001596 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001597 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001598 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001599 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001600 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001601
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001602def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001603 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001604 class C(object):
1605 def __init__(self, x):
1606 self.x = x
1607 def foo(self):
1608 return self.x
1609 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001610 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001611 class D(C):
1612 boo = C.foo
1613 goo = c1.foo
1614 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001615 vereq(d2.foo(), 2)
1616 vereq(d2.boo(), 2)
1617 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001618 class E(object):
1619 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001620 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001621 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001622
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001623def specials():
1624 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001625 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001626 # Test the default behavior for static classes
1627 class C(object):
1628 def __getitem__(self, i):
1629 if 0 <= i < 10: return i
1630 raise IndexError
1631 c1 = C()
1632 c2 = C()
1633 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001634 verify(id(c1) != id(c2))
1635 hash(c1)
1636 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001637 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001638 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001639 verify(c1 != c2)
1640 verify(not c1 != c1)
1641 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001642 # Note that the module name appears in str/repr, and that varies
1643 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001644 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001645 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001646 verify(-1 not in c1)
1647 for i in range(10):
1648 verify(i in c1)
1649 verify(10 not in c1)
1650 # Test the default behavior for dynamic classes
1651 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001652 def __getitem__(self, i):
1653 if 0 <= i < 10: return i
1654 raise IndexError
1655 d1 = D()
1656 d2 = D()
1657 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001658 verify(id(d1) != id(d2))
1659 hash(d1)
1660 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001661 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001663 verify(d1 != d2)
1664 verify(not d1 != d1)
1665 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001666 # Note that the module name appears in str/repr, and that varies
1667 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001668 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001669 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001670 verify(-1 not in d1)
1671 for i in range(10):
1672 verify(i in d1)
1673 verify(10 not in d1)
1674 # Test overridden behavior for static classes
1675 class Proxy(object):
1676 def __init__(self, x):
1677 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001678 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001679 return not not self.x
1680 def __hash__(self):
1681 return hash(self.x)
1682 def __eq__(self, other):
1683 return self.x == other
1684 def __ne__(self, other):
1685 return self.x != other
1686 def __cmp__(self, other):
1687 return cmp(self.x, other.x)
1688 def __str__(self):
1689 return "Proxy:%s" % self.x
1690 def __repr__(self):
1691 return "Proxy(%r)" % self.x
1692 def __contains__(self, value):
1693 return value in self.x
1694 p0 = Proxy(0)
1695 p1 = Proxy(1)
1696 p_1 = Proxy(-1)
1697 verify(not p0)
1698 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001699 vereq(hash(p0), hash(0))
1700 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001701 verify(p0 != p1)
1702 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001703 vereq(not p0, p1)
1704 vereq(cmp(p0, p1), -1)
1705 vereq(cmp(p0, p0), 0)
1706 vereq(cmp(p0, p_1), 1)
1707 vereq(str(p0), "Proxy:0")
1708 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001709 p10 = Proxy(range(10))
1710 verify(-1 not in p10)
1711 for i in range(10):
1712 verify(i in p10)
1713 verify(10 not in p10)
1714 # Test overridden behavior for dynamic classes
1715 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001716 def __init__(self, x):
1717 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001718 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001719 return not not self.x
1720 def __hash__(self):
1721 return hash(self.x)
1722 def __eq__(self, other):
1723 return self.x == other
1724 def __ne__(self, other):
1725 return self.x != other
1726 def __cmp__(self, other):
1727 return cmp(self.x, other.x)
1728 def __str__(self):
1729 return "DProxy:%s" % self.x
1730 def __repr__(self):
1731 return "DProxy(%r)" % self.x
1732 def __contains__(self, value):
1733 return value in self.x
1734 p0 = DProxy(0)
1735 p1 = DProxy(1)
1736 p_1 = DProxy(-1)
1737 verify(not p0)
1738 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001739 vereq(hash(p0), hash(0))
1740 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001741 verify(p0 != p1)
1742 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001743 vereq(not p0, p1)
1744 vereq(cmp(p0, p1), -1)
1745 vereq(cmp(p0, p0), 0)
1746 vereq(cmp(p0, p_1), 1)
1747 vereq(str(p0), "DProxy:0")
1748 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001749 p10 = DProxy(range(10))
1750 verify(-1 not in p10)
1751 for i in range(10):
1752 verify(i in p10)
1753 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001754## # Safety test for __cmp__
1755## def unsafecmp(a, b):
1756## try:
1757## a.__class__.__cmp__(a, b)
1758## except TypeError:
1759## pass
1760## else:
1761## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1762## a.__class__, a, b)
1763## unsafecmp(u"123", "123")
1764## unsafecmp("123", u"123")
1765## unsafecmp(1, 1.0)
1766## unsafecmp(1.0, 1)
1767## unsafecmp(1, 1L)
1768## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001769
Neal Norwitz1a997502003-01-13 20:13:12 +00001770 class Letter(str):
1771 def __new__(cls, letter):
1772 if letter == 'EPS':
1773 return str.__new__(cls)
1774 return str.__new__(cls, letter)
1775 def __str__(self):
1776 if not self:
1777 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001778 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001779
1780 # sys.stdout needs to be the original to trigger the recursion bug
1781 import sys
1782 test_stdout = sys.stdout
1783 sys.stdout = get_original_stdout()
1784 try:
1785 # nothing should actually be printed, this should raise an exception
1786 print Letter('w')
1787 except RuntimeError:
1788 pass
1789 else:
1790 raise TestFailed, "expected a RuntimeError for print recursion"
1791 sys.stdout = test_stdout
1792
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001793def weakrefs():
1794 if verbose: print "Testing weak references..."
1795 import weakref
1796 class C(object):
1797 pass
1798 c = C()
1799 r = weakref.ref(c)
1800 verify(r() is c)
1801 del c
1802 verify(r() is None)
1803 del r
1804 class NoWeak(object):
1805 __slots__ = ['foo']
1806 no = NoWeak()
1807 try:
1808 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001809 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001810 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001811 else:
1812 verify(0, "weakref.ref(no) should be illegal")
1813 class Weak(object):
1814 __slots__ = ['foo', '__weakref__']
1815 yes = Weak()
1816 r = weakref.ref(yes)
1817 verify(r() is yes)
1818 del yes
1819 verify(r() is None)
1820 del r
1821
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001822def properties():
1823 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001824 class C(object):
1825 def getx(self):
1826 return self.__x
1827 def setx(self, value):
1828 self.__x = value
1829 def delx(self):
1830 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001831 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001832 a = C()
1833 verify(not hasattr(a, "x"))
1834 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001835 vereq(a._C__x, 42)
1836 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001837 del a.x
1838 verify(not hasattr(a, "x"))
1839 verify(not hasattr(a, "_C__x"))
1840 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001841 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001842 C.x.__delete__(a)
1843 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001844
Tim Peters66c1a522001-09-24 21:17:50 +00001845 raw = C.__dict__['x']
1846 verify(isinstance(raw, property))
1847
1848 attrs = dir(raw)
1849 verify("__doc__" in attrs)
1850 verify("fget" in attrs)
1851 verify("fset" in attrs)
1852 verify("fdel" in attrs)
1853
Guido van Rossum45704552001-10-08 16:35:45 +00001854 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001855 verify(raw.fget is C.__dict__['getx'])
1856 verify(raw.fset is C.__dict__['setx'])
1857 verify(raw.fdel is C.__dict__['delx'])
1858
1859 for attr in "__doc__", "fget", "fset", "fdel":
1860 try:
1861 setattr(raw, attr, 42)
Guido van Rossumb940e112007-01-10 16:19:56 +00001862 except TypeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001863 if str(msg).find('readonly') < 0:
1864 raise TestFailed("when setting readonly attr %r on a "
1865 "property, got unexpected TypeError "
1866 "msg %r" % (attr, str(msg)))
1867 else:
1868 raise TestFailed("expected TypeError from trying to set "
1869 "readonly %r attr on a property" % attr)
1870
Neal Norwitz673cd822002-10-18 16:33:13 +00001871 class D(object):
1872 __getitem__ = property(lambda s: 1/0)
1873
1874 d = D()
1875 try:
1876 for i in d:
1877 str(i)
1878 except ZeroDivisionError:
1879 pass
1880 else:
1881 raise TestFailed, "expected ZeroDivisionError from bad property"
1882
Georg Brandl533ff6f2006-03-08 18:09:27 +00001883 class E(object):
1884 def getter(self):
1885 "getter method"
1886 return 0
1887 def setter(self, value):
1888 "setter method"
1889 pass
1890 prop = property(getter)
1891 vereq(prop.__doc__, "getter method")
1892 prop2 = property(fset=setter)
1893 vereq(prop2.__doc__, None)
1894
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001895 # this segfaulted in 2.5b2
1896 try:
1897 import _testcapi
1898 except ImportError:
1899 pass
1900 else:
1901 class X(object):
1902 p = property(_testcapi.test_with_docstring)
1903
1904
Guido van Rossumc4a18802001-08-24 16:55:27 +00001905def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001906 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001907
1908 class A(object):
1909 def meth(self, a):
1910 return "A(%r)" % a
1911
Guido van Rossum45704552001-10-08 16:35:45 +00001912 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001913
1914 class B(A):
1915 def __init__(self):
1916 self.__super = super(B, self)
1917 def meth(self, a):
1918 return "B(%r)" % a + self.__super.meth(a)
1919
Guido van Rossum45704552001-10-08 16:35:45 +00001920 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001921
1922 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001923 def meth(self, a):
1924 return "C(%r)" % a + self.__super.meth(a)
1925 C._C__super = super(C)
1926
Guido van Rossum45704552001-10-08 16:35:45 +00001927 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001928
1929 class D(C, B):
1930 def meth(self, a):
1931 return "D(%r)" % a + super(D, self).meth(a)
1932
Guido van Rossum5b443c62001-12-03 15:38:28 +00001933 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1934
1935 # Test for subclassing super
1936
1937 class mysuper(super):
1938 def __init__(self, *args):
1939 return super(mysuper, self).__init__(*args)
1940
1941 class E(D):
1942 def meth(self, a):
1943 return "E(%r)" % a + mysuper(E, self).meth(a)
1944
1945 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1946
1947 class F(E):
1948 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00001949 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00001950 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1951 F._F__super = mysuper(F)
1952
1953 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1954
1955 # Make sure certain errors are raised
1956
1957 try:
1958 super(D, 42)
1959 except TypeError:
1960 pass
1961 else:
1962 raise TestFailed, "shouldn't allow super(D, 42)"
1963
1964 try:
1965 super(D, C())
1966 except TypeError:
1967 pass
1968 else:
1969 raise TestFailed, "shouldn't allow super(D, C())"
1970
1971 try:
1972 super(D).__get__(12)
1973 except TypeError:
1974 pass
1975 else:
1976 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1977
1978 try:
1979 super(D).__get__(C())
1980 except TypeError:
1981 pass
1982 else:
1983 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001984
Guido van Rossuma4541a32003-04-16 20:02:22 +00001985 # Make sure data descriptors can be overridden and accessed via super
1986 # (new feature in Python 2.3)
1987
1988 class DDbase(object):
1989 def getx(self): return 42
1990 x = property(getx)
1991
1992 class DDsub(DDbase):
1993 def getx(self): return "hello"
1994 x = property(getx)
1995
1996 dd = DDsub()
1997 vereq(dd.x, "hello")
1998 vereq(super(DDsub, dd).x, 42)
1999
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002000 # Ensure that super() lookup of descriptor from classmethod
2001 # works (SF ID# 743627)
2002
2003 class Base(object):
2004 aProp = property(lambda self: "foo")
2005
2006 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002007 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002008 def test(klass):
2009 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002010
2011 veris(Sub.test(), Base.aProp)
2012
Thomas Wouters89f507f2006-12-13 04:49:30 +00002013 # Verify that super() doesn't allow keyword args
2014 try:
2015 super(Base, kw=1)
2016 except TypeError:
2017 pass
2018 else:
2019 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002020
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002021def inherits():
2022 if verbose: print "Testing inheritance from basic types..."
2023
2024 class hexint(int):
2025 def __repr__(self):
2026 return hex(self)
2027 def __add__(self, other):
2028 return hexint(int.__add__(self, other))
2029 # (Note that overriding __radd__ doesn't work,
2030 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002031 vereq(repr(hexint(7) + 9), "0x10")
2032 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002033 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002034 vereq(a, 12345)
2035 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002036 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002037 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002038 verify((+a).__class__ is int)
2039 verify((a >> 0).__class__ is int)
2040 verify((a << 0).__class__ is int)
2041 verify((hexint(0) << 12).__class__ is int)
2042 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002043
2044 class octlong(long):
2045 __slots__ = []
2046 def __str__(self):
2047 s = oct(self)
2048 if s[-1] == 'L':
2049 s = s[:-1]
2050 return s
2051 def __add__(self, other):
2052 return self.__class__(super(octlong, self).__add__(other))
2053 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002054 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002055 # (Note that overriding __radd__ here only seems to work
2056 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002057 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002058 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002059 vereq(a, 12345L)
2060 vereq(long(a), 12345L)
2061 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00002062 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00002063 verify((+a).__class__ is long)
2064 verify((-a).__class__ is long)
2065 verify((-octlong(0)).__class__ is long)
2066 verify((a >> 0).__class__ is long)
2067 verify((a << 0).__class__ is long)
2068 verify((a - 0).__class__ is long)
2069 verify((a * 1).__class__ is long)
2070 verify((a ** 1).__class__ is long)
2071 verify((a // 1).__class__ is long)
2072 verify((1 * a).__class__ is long)
2073 verify((a | 0).__class__ is long)
2074 verify((a ^ 0).__class__ is long)
2075 verify((a & -1L).__class__ is long)
2076 verify((octlong(0) << 12).__class__ is long)
2077 verify((octlong(0) >> 12).__class__ is long)
2078 verify(abs(octlong(0)).__class__ is long)
2079
2080 # Because octlong overrides __add__, we can't check the absence of +0
2081 # optimizations using octlong.
2082 class longclone(long):
2083 pass
2084 a = longclone(1)
2085 verify((a + 0).__class__ is long)
2086 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002087
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002088 # Check that negative clones don't segfault
2089 a = longclone(-1)
2090 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00002091 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002092
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002093 class precfloat(float):
2094 __slots__ = ['prec']
2095 def __init__(self, value=0.0, prec=12):
2096 self.prec = int(prec)
2097 float.__init__(value)
2098 def __repr__(self):
2099 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002100 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002101 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002102 vereq(a, 12345.0)
2103 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002104 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002105 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002106 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002107
Tim Peters2400fa42001-09-12 19:12:49 +00002108 class madcomplex(complex):
2109 def __repr__(self):
2110 return "%.17gj%+.17g" % (self.imag, self.real)
2111 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002112 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002113 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002114 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002115 vereq(a, base)
2116 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002117 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002118 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002119 vereq(repr(a), "4j-3")
2120 vereq(a, base)
2121 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002122 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002123 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002124 veris((+a).__class__, complex)
2125 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002126 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002127 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002128 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002129 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002130 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002131 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002132 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002133
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002134 class madtuple(tuple):
2135 _rev = None
2136 def rev(self):
2137 if self._rev is not None:
2138 return self._rev
2139 L = list(self)
2140 L.reverse()
2141 self._rev = self.__class__(L)
2142 return self._rev
2143 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002144 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2145 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2146 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002147 for i in range(512):
2148 t = madtuple(range(i))
2149 u = t.rev()
2150 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002151 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002152 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002153 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002154 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002155 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002156 verify(a[:].__class__ is tuple)
2157 verify((a * 1).__class__ is tuple)
2158 verify((a * 0).__class__ is tuple)
2159 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002160 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002161 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002162 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002163 verify((a + a).__class__ is tuple)
2164 verify((a * 0).__class__ is tuple)
2165 verify((a * 1).__class__ is tuple)
2166 verify((a * 2).__class__ is tuple)
2167 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002168
2169 class madstring(str):
2170 _rev = None
2171 def rev(self):
2172 if self._rev is not None:
2173 return self._rev
2174 L = list(self)
2175 L.reverse()
2176 self._rev = self.__class__("".join(L))
2177 return self._rev
2178 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002179 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2180 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2181 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002182 for i in range(256):
2183 s = madstring("".join(map(chr, range(i))))
2184 t = s.rev()
2185 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002186 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002187 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002188 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002189 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002190
Tim Peters8fa5dd02001-09-12 02:18:30 +00002191 base = "\x00" * 5
2192 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002193 vereq(s, base)
2194 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002195 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002196 vereq(hash(s), hash(base))
2197 vereq({s: 1}[base], 1)
2198 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002199 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002201 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002202 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002203 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002204 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002205 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002206 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002207 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002208 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002209 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002210 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002211 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002212 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002213 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002215 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002216 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002217 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002218 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002219 identitytab = ''.join([chr(i) for i in range(256)])
2220 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002222 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002223 vereq(s.translate(identitytab, "x"), base)
2224 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002225 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002226 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002227 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002228 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002229 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002230 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002231 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002232 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002233 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002235
Guido van Rossum91ee7982001-08-30 20:52:40 +00002236 class madunicode(unicode):
2237 _rev = None
2238 def rev(self):
2239 if self._rev is not None:
2240 return self._rev
2241 L = list(self)
2242 L.reverse()
2243 self._rev = self.__class__(u"".join(L))
2244 return self._rev
2245 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002246 vereq(u, u"ABCDEF")
2247 vereq(u.rev(), madunicode(u"FEDCBA"))
2248 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002249 base = u"12345"
2250 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002251 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002252 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002253 vereq(hash(u), hash(base))
2254 vereq({u: 1}[base], 1)
2255 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002256 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002257 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002258 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002259 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002260 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002261 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002262 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002263 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002264 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002265 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002266 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002267 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002268 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002269 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002270 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002272 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002273 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002274 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002275 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002276 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002277 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002278 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002279 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002280 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002282 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002284 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002285 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002286 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002288 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002290 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002291 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002292 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002293 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002294
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002295 class sublist(list):
2296 pass
2297 a = sublist(range(5))
2298 vereq(a, range(5))
2299 a.append("hello")
2300 vereq(a, range(5) + ["hello"])
2301 a[5] = 5
2302 vereq(a, range(6))
2303 a.extend(range(6, 20))
2304 vereq(a, range(20))
2305 a[-5:] = []
2306 vereq(a, range(15))
2307 del a[10:15]
2308 vereq(len(a), 10)
2309 vereq(a, range(10))
2310 vereq(list(a), range(10))
2311 vereq(a[0], 0)
2312 vereq(a[9], 9)
2313 vereq(a[-10], 0)
2314 vereq(a[-1], 9)
2315 vereq(a[:5], range(5))
2316
Tim Peters59c9a642001-09-13 05:38:56 +00002317 class CountedInput(file):
2318 """Counts lines read by self.readline().
2319
2320 self.lineno is the 0-based ordinal of the last line read, up to
2321 a maximum of one greater than the number of lines in the file.
2322
2323 self.ateof is true if and only if the final "" line has been read,
2324 at which point self.lineno stops incrementing, and further calls
2325 to readline() continue to return "".
2326 """
2327
2328 lineno = 0
2329 ateof = 0
2330 def readline(self):
2331 if self.ateof:
2332 return ""
2333 s = file.readline(self)
2334 # Next line works too.
2335 # s = super(CountedInput, self).readline()
2336 self.lineno += 1
2337 if s == "":
2338 self.ateof = 1
2339 return s
2340
Alex Martelli01c77c62006-08-24 02:58:11 +00002341 f = open(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002342 lines = ['a\n', 'b\n', 'c\n']
2343 try:
2344 f.writelines(lines)
2345 f.close()
2346 f = CountedInput(TESTFN)
2347 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2348 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002349 vereq(expected, got)
2350 vereq(f.lineno, i)
2351 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002352 f.close()
2353 finally:
2354 try:
2355 f.close()
2356 except:
2357 pass
2358 try:
2359 import os
2360 os.unlink(TESTFN)
2361 except:
2362 pass
2363
Tim Peters808b94e2001-09-13 19:33:07 +00002364def keywords():
2365 if verbose:
2366 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002367 vereq(int(x=1), 1)
2368 vereq(float(x=2), 2.0)
2369 vereq(long(x=3), 3L)
2370 vereq(complex(imag=42, real=666), complex(666, 42))
2371 vereq(str(object=500), '500')
2372 vereq(unicode(string='abc', errors='strict'), u'abc')
2373 vereq(tuple(sequence=range(3)), (0, 1, 2))
2374 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002375 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002376
2377 for constructor in (int, float, long, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002378 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002379 try:
2380 constructor(bogus_keyword_arg=1)
2381 except TypeError:
2382 pass
2383 else:
2384 raise TestFailed("expected TypeError from bogus keyword "
2385 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002386
Tim Peters8fa45672001-09-13 21:01:29 +00002387def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002388 # XXX This test is disabled because rexec is not deemed safe
2389 return
Tim Peters8fa45672001-09-13 21:01:29 +00002390 import rexec
2391 if verbose:
2392 print "Testing interaction with restricted execution ..."
2393
2394 sandbox = rexec.RExec()
2395
2396 code1 = """f = open(%r, 'w')""" % TESTFN
Alex Martelli01c77c62006-08-24 02:58:11 +00002397 code2 = """f = open(%r, 'w')""" % TESTFN
Tim Peters8fa45672001-09-13 21:01:29 +00002398 code3 = """\
2399f = open(%r)
2400t = type(f) # a sneaky way to get the file() constructor
2401f.close()
2402f = t(%r, 'w') # rexec can't catch this by itself
2403""" % (TESTFN, TESTFN)
2404
2405 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2406 f.close()
2407
2408 try:
2409 for code in code1, code2, code3:
2410 try:
2411 sandbox.r_exec(code)
Guido van Rossumb940e112007-01-10 16:19:56 +00002412 except IOError as msg:
Tim Peters8fa45672001-09-13 21:01:29 +00002413 if str(msg).find("restricted") >= 0:
2414 outcome = "OK"
2415 else:
2416 outcome = "got an exception, but not an expected one"
2417 else:
2418 outcome = "expected a restricted-execution exception"
2419
2420 if outcome != "OK":
2421 raise TestFailed("%s, in %r" % (outcome, code))
2422
2423 finally:
2424 try:
2425 import os
2426 os.unlink(TESTFN)
2427 except:
2428 pass
2429
Tim Peters0ab085c2001-09-14 00:25:33 +00002430def str_subclass_as_dict_key():
2431 if verbose:
2432 print "Testing a str subclass used as dict key .."
2433
2434 class cistr(str):
2435 """Sublcass of str that computes __eq__ case-insensitively.
2436
2437 Also computes a hash code of the string in canonical form.
2438 """
2439
2440 def __init__(self, value):
2441 self.canonical = value.lower()
2442 self.hashcode = hash(self.canonical)
2443
2444 def __eq__(self, other):
2445 if not isinstance(other, cistr):
2446 other = cistr(other)
2447 return self.canonical == other.canonical
2448
2449 def __hash__(self):
2450 return self.hashcode
2451
Guido van Rossum45704552001-10-08 16:35:45 +00002452 vereq(cistr('ABC'), 'abc')
2453 vereq('aBc', cistr('ABC'))
2454 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002455
2456 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002457 vereq(d[cistr('one')], 1)
2458 vereq(d[cistr('tWo')], 2)
2459 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002460 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002461 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002462
Guido van Rossumab3b0342001-09-18 20:38:53 +00002463def classic_comparisons():
2464 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002465 class classic:
2466 pass
2467 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002468 if verbose: print " (base = %s)" % base
2469 class C(base):
2470 def __init__(self, value):
2471 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002472 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002473 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002474 return self.value == other.value
Guido van Rossumab3b0342001-09-18 20:38:53 +00002475 if isinstance(other, int) or isinstance(other, long):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002476 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002477 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002478 def __ne__(self, other):
2479 if isinstance(other, C):
2480 return self.value != other.value
2481 if isinstance(other, int) or isinstance(other, long):
2482 return self.value != other
2483 return NotImplemented
2484 def __lt__(self, other):
2485 if isinstance(other, C):
2486 return self.value < other.value
2487 if isinstance(other, int) or isinstance(other, long):
2488 return self.value < other
2489 return NotImplemented
2490 def __le__(self, other):
2491 if isinstance(other, C):
2492 return self.value <= other.value
2493 if isinstance(other, int) or isinstance(other, long):
2494 return self.value <= other
2495 return NotImplemented
2496 def __gt__(self, other):
2497 if isinstance(other, C):
2498 return self.value > other.value
2499 if isinstance(other, int) or isinstance(other, long):
2500 return self.value > other
2501 return NotImplemented
2502 def __ge__(self, other):
2503 if isinstance(other, C):
2504 return self.value >= other.value
2505 if isinstance(other, int) or isinstance(other, long):
2506 return self.value >= other
2507 return NotImplemented
2508
Guido van Rossumab3b0342001-09-18 20:38:53 +00002509 c1 = C(1)
2510 c2 = C(2)
2511 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002512 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002513 c = {1: c1, 2: c2, 3: c3}
2514 for x in 1, 2, 3:
2515 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002516 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002517 for op in "<", "<=", "==", "!=", ">", ">=":
2518 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2519 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002520 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2521 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002522
Guido van Rossum0639f592001-09-18 21:06:04 +00002523def rich_comparisons():
2524 if verbose:
2525 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002526 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002527 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002528 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002529 vereq(z, 1+0j)
2530 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002531 class ZZ(complex):
2532 def __eq__(self, other):
2533 try:
2534 return abs(self - other) <= 1e-6
2535 except:
2536 return NotImplemented
2537 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002538 vereq(zz, 1+0j)
2539 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002540
Guido van Rossum0639f592001-09-18 21:06:04 +00002541 class classic:
2542 pass
2543 for base in (classic, int, object, list):
2544 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 raise TestFailed, "shouldn't call __cmp__"
2550 def __eq__(self, other):
2551 if isinstance(other, C):
2552 return self.value == other.value
2553 if isinstance(other, int) or isinstance(other, long):
2554 return self.value == other
2555 return NotImplemented
2556 def __ne__(self, other):
2557 if isinstance(other, C):
2558 return self.value != other.value
2559 if isinstance(other, int) or isinstance(other, long):
2560 return self.value != other
2561 return NotImplemented
2562 def __lt__(self, other):
2563 if isinstance(other, C):
2564 return self.value < other.value
2565 if isinstance(other, int) or isinstance(other, long):
2566 return self.value < other
2567 return NotImplemented
2568 def __le__(self, other):
2569 if isinstance(other, C):
2570 return self.value <= other.value
2571 if isinstance(other, int) or isinstance(other, long):
2572 return self.value <= other
2573 return NotImplemented
2574 def __gt__(self, other):
2575 if isinstance(other, C):
2576 return self.value > other.value
2577 if isinstance(other, int) or isinstance(other, long):
2578 return self.value > other
2579 return NotImplemented
2580 def __ge__(self, other):
2581 if isinstance(other, C):
2582 return self.value >= other.value
2583 if isinstance(other, int) or isinstance(other, long):
2584 return self.value >= other
2585 return NotImplemented
2586 c1 = C(1)
2587 c2 = C(2)
2588 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002589 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002590 c = {1: c1, 2: c2, 3: c3}
2591 for x in 1, 2, 3:
2592 for y in 1, 2, 3:
2593 for op in "<", "<=", "==", "!=", ">", ">=":
2594 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2595 "x=%d, y=%d" % (x, y))
2596 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2597 "x=%d, y=%d" % (x, y))
2598 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2599 "x=%d, y=%d" % (x, y))
2600
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002601def descrdoc():
2602 if verbose: print "Testing descriptor doc strings..."
2603 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002604 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002605 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002606 check(file.name, "file name") # member descriptor
2607
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002608def setclass():
2609 if verbose: print "Testing __class__ assignment..."
2610 class C(object): pass
2611 class D(object): pass
2612 class E(object): pass
2613 class F(D, E): pass
2614 for cls in C, D, E, F:
2615 for cls2 in C, D, E, F:
2616 x = cls()
2617 x.__class__ = cls2
2618 verify(x.__class__ is cls2)
2619 x.__class__ = cls
2620 verify(x.__class__ is cls)
2621 def cant(x, C):
2622 try:
2623 x.__class__ = C
2624 except TypeError:
2625 pass
2626 else:
2627 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002628 try:
2629 delattr(x, "__class__")
2630 except TypeError:
2631 pass
2632 else:
2633 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002634 cant(C(), list)
2635 cant(list(), C)
2636 cant(C(), 1)
2637 cant(C(), object)
2638 cant(object(), list)
2639 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002640 class Int(int): __slots__ = []
2641 cant(2, Int)
2642 cant(Int(), int)
2643 cant(True, int)
2644 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002645 o = object()
2646 cant(o, type(1))
2647 cant(o, type(None))
2648 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002649
Guido van Rossum6661be32001-10-26 04:26:12 +00002650def setdict():
2651 if verbose: print "Testing __dict__ assignment..."
2652 class C(object): pass
2653 a = C()
2654 a.__dict__ = {'b': 1}
2655 vereq(a.b, 1)
2656 def cant(x, dict):
2657 try:
2658 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002659 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002660 pass
2661 else:
2662 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2663 cant(a, None)
2664 cant(a, [])
2665 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002666 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002667 # Classes don't allow __dict__ assignment
2668 cant(C, {})
2669
Guido van Rossum3926a632001-09-25 16:25:58 +00002670def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002671 if verbose:
2672 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002673 import pickle
2674 try:
2675 import cPickle
2676 except ImportError:
2677 cPickle = None
Guido van Rossum3926a632001-09-25 16:25:58 +00002678
2679 def sorteditems(d):
2680 L = d.items()
2681 L.sort()
2682 return L
2683
2684 global C
2685 class C(object):
2686 def __init__(self, a, b):
2687 super(C, self).__init__()
2688 self.a = a
2689 self.b = b
2690 def __repr__(self):
2691 return "C(%r, %r)" % (self.a, self.b)
2692
2693 global C1
2694 class C1(list):
2695 def __new__(cls, a, b):
2696 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002697 def __getnewargs__(self):
2698 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002699 def __init__(self, a, b):
2700 self.a = a
2701 self.b = b
2702 def __repr__(self):
2703 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2704
2705 global C2
2706 class C2(int):
2707 def __new__(cls, a, b, val=0):
2708 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002709 def __getnewargs__(self):
2710 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002711 def __init__(self, a, b, val=0):
2712 self.a = a
2713 self.b = b
2714 def __repr__(self):
2715 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2716
Guido van Rossum90c45142001-11-24 21:07:01 +00002717 global C3
2718 class C3(object):
2719 def __init__(self, foo):
2720 self.foo = foo
2721 def __getstate__(self):
2722 return self.foo
2723 def __setstate__(self, foo):
2724 self.foo = foo
2725
2726 global C4classic, C4
2727 class C4classic: # classic
2728 pass
2729 class C4(C4classic, object): # mixed inheritance
2730 pass
2731
Guido van Rossum3926a632001-09-25 16:25:58 +00002732 for p in pickle, cPickle:
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002733 if p is None:
2734 continue # cPickle not found -- skip it
Guido van Rossum3926a632001-09-25 16:25:58 +00002735 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002736 if verbose:
2737 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002738
2739 for cls in C, C1, C2:
2740 s = p.dumps(cls, bin)
2741 cls2 = p.loads(s)
2742 verify(cls2 is cls)
2743
2744 a = C1(1, 2); a.append(42); a.append(24)
2745 b = C2("hello", "world", 42)
2746 s = p.dumps((a, b), bin)
2747 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002748 vereq(x.__class__, a.__class__)
2749 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2750 vereq(y.__class__, b.__class__)
2751 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002752 vereq(repr(x), repr(a))
2753 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002754 if verbose:
2755 print "a = x =", a
2756 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002757 # Test for __getstate__ and __setstate__ on new style class
2758 u = C3(42)
2759 s = p.dumps(u, bin)
2760 v = p.loads(s)
2761 veris(u.__class__, v.__class__)
2762 vereq(u.foo, v.foo)
2763 # Test for picklability of hybrid class
2764 u = C4()
2765 u.foo = 42
2766 s = p.dumps(u, bin)
2767 v = p.loads(s)
2768 veris(u.__class__, v.__class__)
2769 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002770
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002771 # Testing copy.deepcopy()
2772 if verbose:
2773 print "deepcopy"
2774 import copy
2775 for cls in C, C1, C2:
2776 cls2 = copy.deepcopy(cls)
2777 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002778
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002779 a = C1(1, 2); a.append(42); a.append(24)
2780 b = C2("hello", "world", 42)
2781 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002782 vereq(x.__class__, a.__class__)
2783 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2784 vereq(y.__class__, b.__class__)
2785 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002786 vereq(repr(x), repr(a))
2787 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002788 if verbose:
2789 print "a = x =", a
2790 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002791
Guido van Rossum8c842552002-03-14 23:05:54 +00002792def pickleslots():
2793 if verbose: print "Testing pickling of classes with __slots__ ..."
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002794 import pickle, pickle as cPickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002795 # Pickling of classes with __slots__ but without __getstate__ should fail
2796 global B, C, D, E
2797 class B(object):
2798 pass
2799 for base in [object, B]:
2800 class C(base):
2801 __slots__ = ['a']
2802 class D(C):
2803 pass
2804 try:
2805 pickle.dumps(C())
2806 except TypeError:
2807 pass
2808 else:
2809 raise TestFailed, "should fail: pickle C instance - %s" % base
2810 try:
2811 cPickle.dumps(C())
2812 except TypeError:
2813 pass
2814 else:
2815 raise TestFailed, "should fail: cPickle C instance - %s" % base
2816 try:
2817 pickle.dumps(C())
2818 except TypeError:
2819 pass
2820 else:
2821 raise TestFailed, "should fail: pickle D instance - %s" % base
2822 try:
2823 cPickle.dumps(D())
2824 except TypeError:
2825 pass
2826 else:
2827 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002828 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002829 class C(base):
2830 __slots__ = ['a']
2831 def __getstate__(self):
2832 try:
2833 d = self.__dict__.copy()
2834 except AttributeError:
2835 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002836 for cls in self.__class__.__mro__:
2837 for sn in cls.__dict__.get('__slots__', ()):
2838 try:
2839 d[sn] = getattr(self, sn)
2840 except AttributeError:
2841 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002842 return d
2843 def __setstate__(self, d):
2844 for k, v in d.items():
2845 setattr(self, k, v)
2846 class D(C):
2847 pass
2848 # Now it should work
2849 x = C()
2850 y = pickle.loads(pickle.dumps(x))
2851 vereq(hasattr(y, 'a'), 0)
2852 y = cPickle.loads(cPickle.dumps(x))
2853 vereq(hasattr(y, 'a'), 0)
2854 x.a = 42
2855 y = pickle.loads(pickle.dumps(x))
2856 vereq(y.a, 42)
2857 y = cPickle.loads(cPickle.dumps(x))
2858 vereq(y.a, 42)
2859 x = D()
2860 x.a = 42
2861 x.b = 100
2862 y = pickle.loads(pickle.dumps(x))
2863 vereq(y.a + y.b, 142)
2864 y = cPickle.loads(cPickle.dumps(x))
2865 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002866 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002867 class E(C):
2868 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002869 x = E()
2870 x.a = 42
2871 x.b = "foo"
2872 y = pickle.loads(pickle.dumps(x))
2873 vereq(y.a, x.a)
2874 vereq(y.b, x.b)
2875 y = cPickle.loads(cPickle.dumps(x))
2876 vereq(y.a, x.a)
2877 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002878
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002879def copies():
2880 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2881 import copy
2882 class C(object):
2883 pass
2884
2885 a = C()
2886 a.foo = 12
2887 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002888 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002889
2890 a.bar = [1,2,3]
2891 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002892 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002893 verify(c.bar is a.bar)
2894
2895 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002896 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002897 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002898 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002899
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002900def binopoverride():
2901 if verbose: print "Testing overrides of binary operations..."
2902 class I(int):
2903 def __repr__(self):
2904 return "I(%r)" % int(self)
2905 def __add__(self, other):
2906 return I(int(self) + int(other))
2907 __radd__ = __add__
2908 def __pow__(self, other, mod=None):
2909 if mod is None:
2910 return I(pow(int(self), int(other)))
2911 else:
2912 return I(pow(int(self), int(other), int(mod)))
2913 def __rpow__(self, other, mod=None):
2914 if mod is None:
2915 return I(pow(int(other), int(self), mod))
2916 else:
2917 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002918
Walter Dörwald70a6b492004-02-12 17:35:32 +00002919 vereq(repr(I(1) + I(2)), "I(3)")
2920 vereq(repr(I(1) + 2), "I(3)")
2921 vereq(repr(1 + I(2)), "I(3)")
2922 vereq(repr(I(2) ** I(3)), "I(8)")
2923 vereq(repr(2 ** I(3)), "I(8)")
2924 vereq(repr(I(2) ** 3), "I(8)")
2925 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002926 class S(str):
2927 def __eq__(self, other):
2928 return self.lower() == other.lower()
2929
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002930def subclasspropagation():
2931 if verbose: print "Testing propagation of slot functions to subclasses..."
2932 class A(object):
2933 pass
2934 class B(A):
2935 pass
2936 class C(A):
2937 pass
2938 class D(B, C):
2939 pass
2940 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002941 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002942 A.__hash__ = lambda self: 42
2943 vereq(hash(d), 42)
2944 C.__hash__ = lambda self: 314
2945 vereq(hash(d), 314)
2946 B.__hash__ = lambda self: 144
2947 vereq(hash(d), 144)
2948 D.__hash__ = lambda self: 100
2949 vereq(hash(d), 100)
2950 del D.__hash__
2951 vereq(hash(d), 144)
2952 del B.__hash__
2953 vereq(hash(d), 314)
2954 del C.__hash__
2955 vereq(hash(d), 42)
2956 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002957 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002958 d.foo = 42
2959 d.bar = 42
2960 vereq(d.foo, 42)
2961 vereq(d.bar, 42)
2962 def __getattribute__(self, name):
2963 if name == "foo":
2964 return 24
2965 return object.__getattribute__(self, name)
2966 A.__getattribute__ = __getattribute__
2967 vereq(d.foo, 24)
2968 vereq(d.bar, 42)
2969 def __getattr__(self, name):
2970 if name in ("spam", "foo", "bar"):
2971 return "hello"
2972 raise AttributeError, name
2973 B.__getattr__ = __getattr__
2974 vereq(d.spam, "hello")
2975 vereq(d.foo, 24)
2976 vereq(d.bar, 42)
2977 del A.__getattribute__
2978 vereq(d.foo, 42)
2979 del d.foo
2980 vereq(d.foo, "hello")
2981 vereq(d.bar, 42)
2982 del B.__getattr__
2983 try:
2984 d.foo
2985 except AttributeError:
2986 pass
2987 else:
2988 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002989
Guido van Rossume7f3e242002-06-14 02:35:45 +00002990 # Test a nasty bug in recurse_down_subclasses()
2991 import gc
2992 class A(object):
2993 pass
2994 class B(A):
2995 pass
2996 del B
2997 gc.collect()
2998 A.__setitem__ = lambda *a: None # crash
2999
Tim Petersfc57ccb2001-10-12 02:38:24 +00003000def buffer_inherit():
3001 import binascii
3002 # SF bug [#470040] ParseTuple t# vs subclasses.
3003 if verbose:
3004 print "Testing that buffer interface is inherited ..."
3005
3006 class MyStr(str):
3007 pass
3008 base = 'abc'
3009 m = MyStr(base)
3010 # b2a_hex uses the buffer interface to get its argument's value, via
3011 # PyArg_ParseTuple 't#' code.
3012 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3013
3014 # It's not clear that unicode will continue to support the character
3015 # buffer interface, and this test will fail if that's taken away.
3016 class MyUni(unicode):
3017 pass
3018 base = u'abc'
3019 m = MyUni(base)
3020 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3021
3022 class MyInt(int):
3023 pass
3024 m = MyInt(42)
3025 try:
3026 binascii.b2a_hex(m)
3027 raise TestFailed('subclass of int should not have a buffer interface')
3028 except TypeError:
3029 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003030
Tim Petersc9933152001-10-16 20:18:24 +00003031def str_of_str_subclass():
3032 import binascii
3033 import cStringIO
3034
3035 if verbose:
3036 print "Testing __str__ defined in subclass of str ..."
3037
3038 class octetstring(str):
3039 def __str__(self):
3040 return binascii.b2a_hex(self)
3041 def __repr__(self):
3042 return self + " repr"
3043
3044 o = octetstring('A')
3045 vereq(type(o), octetstring)
3046 vereq(type(str(o)), str)
3047 vereq(type(repr(o)), str)
3048 vereq(ord(o), 0x41)
3049 vereq(str(o), '41')
3050 vereq(repr(o), 'A repr')
3051 vereq(o.__str__(), '41')
3052 vereq(o.__repr__(), 'A repr')
3053
3054 capture = cStringIO.StringIO()
3055 # Calling str() or not exercises different internal paths.
3056 print >> capture, o
3057 print >> capture, str(o)
3058 vereq(capture.getvalue(), '41\n41\n')
3059 capture.close()
3060
Guido van Rossumc8e56452001-10-22 00:43:43 +00003061def kwdargs():
3062 if verbose: print "Testing keyword arguments to __init__, __call__..."
3063 def f(a): return a
3064 vereq(f.__call__(a=42), 42)
3065 a = []
3066 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003067 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003068
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003069def recursive__call__():
3070 if verbose: print ("Testing recursive __call__() by setting to instance of "
3071 "class ...")
3072 class A(object):
3073 pass
3074
3075 A.__call__ = A()
3076 try:
3077 A()()
3078 except RuntimeError:
3079 pass
3080 else:
3081 raise TestFailed("Recursion limit should have been reached for "
3082 "__call__()")
3083
Guido van Rossumed87ad82001-10-30 02:33:02 +00003084def delhook():
3085 if verbose: print "Testing __del__ hook..."
3086 log = []
3087 class C(object):
3088 def __del__(self):
3089 log.append(1)
3090 c = C()
3091 vereq(log, [])
3092 del c
3093 vereq(log, [1])
3094
Guido van Rossum29d26062001-12-11 04:37:34 +00003095 class D(object): pass
3096 d = D()
3097 try: del d[0]
3098 except TypeError: pass
3099 else: raise TestFailed, "invalid del() didn't raise TypeError"
3100
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003101def hashinherit():
3102 if verbose: print "Testing hash of mutable subclasses..."
3103
3104 class mydict(dict):
3105 pass
3106 d = mydict()
3107 try:
3108 hash(d)
3109 except TypeError:
3110 pass
3111 else:
3112 raise TestFailed, "hash() of dict subclass should fail"
3113
3114 class mylist(list):
3115 pass
3116 d = mylist()
3117 try:
3118 hash(d)
3119 except TypeError:
3120 pass
3121 else:
3122 raise TestFailed, "hash() of list subclass should fail"
3123
Guido van Rossum29d26062001-12-11 04:37:34 +00003124def strops():
3125 try: 'a' + 5
3126 except TypeError: pass
3127 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3128
3129 try: ''.split('')
3130 except ValueError: pass
3131 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3132
3133 try: ''.join([0])
3134 except TypeError: pass
3135 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3136
3137 try: ''.rindex('5')
3138 except ValueError: pass
3139 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3140
Guido van Rossum29d26062001-12-11 04:37:34 +00003141 try: '%(n)s' % None
3142 except TypeError: pass
3143 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3144
3145 try: '%(n' % {}
3146 except ValueError: pass
3147 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3148
3149 try: '%*s' % ('abc')
3150 except TypeError: pass
3151 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3152
3153 try: '%*.*s' % ('abc', 5)
3154 except TypeError: pass
3155 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3156
3157 try: '%s' % (1, 2)
3158 except TypeError: pass
3159 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3160
3161 try: '%' % None
3162 except ValueError: pass
3163 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3164
3165 vereq('534253'.isdigit(), 1)
3166 vereq('534253x'.isdigit(), 0)
3167 vereq('%c' % 5, '\x05')
3168 vereq('%c' % '5', '5')
3169
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003170def deepcopyrecursive():
3171 if verbose: print "Testing deepcopy of recursive objects..."
3172 class Node:
3173 pass
3174 a = Node()
3175 b = Node()
3176 a.b = b
3177 b.a = a
3178 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003179
Guido van Rossumd7035672002-03-12 20:43:31 +00003180def modules():
3181 if verbose: print "Testing uninitialized module objects..."
3182 from types import ModuleType as M
3183 m = M.__new__(M)
3184 str(m)
3185 vereq(hasattr(m, "__name__"), 0)
3186 vereq(hasattr(m, "__file__"), 0)
3187 vereq(hasattr(m, "foo"), 0)
3188 vereq(m.__dict__, None)
3189 m.foo = 1
3190 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003191
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003192def dictproxyiterkeys():
3193 class C(object):
3194 def meth(self):
3195 pass
3196 if verbose: print "Testing dict-proxy iterkeys..."
3197 keys = [ key for key in C.__dict__.iterkeys() ]
3198 keys.sort()
3199 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3200
3201def dictproxyitervalues():
3202 class C(object):
3203 def meth(self):
3204 pass
3205 if verbose: print "Testing dict-proxy itervalues..."
3206 values = [ values for values in C.__dict__.itervalues() ]
3207 vereq(len(values), 5)
3208
3209def dictproxyiteritems():
3210 class C(object):
3211 def meth(self):
3212 pass
3213 if verbose: print "Testing dict-proxy iteritems..."
3214 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3215 keys.sort()
3216 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3217
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003218def funnynew():
3219 if verbose: print "Testing __new__ returning something unexpected..."
3220 class C(object):
3221 def __new__(cls, arg):
3222 if isinstance(arg, str): return [1, 2, 3]
3223 elif isinstance(arg, int): return object.__new__(D)
3224 else: return object.__new__(cls)
3225 class D(C):
3226 def __init__(self, arg):
3227 self.foo = arg
3228 vereq(C("1"), [1, 2, 3])
3229 vereq(D("1"), [1, 2, 3])
3230 d = D(None)
3231 veris(d.foo, None)
3232 d = C(1)
3233 vereq(isinstance(d, D), True)
3234 vereq(d.foo, 1)
3235 d = D(1)
3236 vereq(isinstance(d, D), True)
3237 vereq(d.foo, 1)
3238
Guido van Rossume8fc6402002-04-16 16:44:51 +00003239def imulbug():
3240 # SF bug 544647
3241 if verbose: print "Testing for __imul__ problems..."
3242 class C(object):
3243 def __imul__(self, other):
3244 return (self, other)
3245 x = C()
3246 y = x
3247 y *= 1.0
3248 vereq(y, (x, 1.0))
3249 y = x
3250 y *= 2
3251 vereq(y, (x, 2))
3252 y = x
3253 y *= 3L
3254 vereq(y, (x, 3L))
3255 y = x
3256 y *= 1L<<100
3257 vereq(y, (x, 1L<<100))
3258 y = x
3259 y *= None
3260 vereq(y, (x, None))
3261 y = x
3262 y *= "foo"
3263 vereq(y, (x, "foo"))
3264
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003265def docdescriptor():
3266 # SF bug 542984
3267 if verbose: print "Testing __doc__ descriptor..."
3268 class DocDescr(object):
3269 def __get__(self, object, otype):
3270 if object:
3271 object = object.__class__.__name__ + ' instance'
3272 if otype:
3273 otype = otype.__name__
3274 return 'object=%s; type=%s' % (object, otype)
3275 class OldClass:
3276 __doc__ = DocDescr()
3277 class NewClass(object):
3278 __doc__ = DocDescr()
3279 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3280 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3281 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3282 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3283
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003284def copy_setstate():
3285 if verbose:
3286 print "Testing that copy.*copy() correctly uses __setstate__..."
3287 import copy
3288 class C(object):
3289 def __init__(self, foo=None):
3290 self.foo = foo
3291 self.__foo = foo
3292 def setfoo(self, foo=None):
3293 self.foo = foo
3294 def getfoo(self):
3295 return self.__foo
3296 def __getstate__(self):
3297 return [self.foo]
3298 def __setstate__(self, lst):
3299 assert len(lst) == 1
3300 self.__foo = self.foo = lst[0]
3301 a = C(42)
3302 a.setfoo(24)
3303 vereq(a.foo, 24)
3304 vereq(a.getfoo(), 42)
3305 b = copy.copy(a)
3306 vereq(b.foo, 24)
3307 vereq(b.getfoo(), 24)
3308 b = copy.deepcopy(a)
3309 vereq(b.foo, 24)
3310 vereq(b.getfoo(), 24)
3311
Guido van Rossum09638c12002-06-13 19:17:46 +00003312def slices():
3313 if verbose:
3314 print "Testing cases with slices and overridden __getitem__ ..."
3315 # Strings
3316 vereq("hello"[:4], "hell")
3317 vereq("hello"[slice(4)], "hell")
3318 vereq(str.__getitem__("hello", slice(4)), "hell")
3319 class S(str):
3320 def __getitem__(self, x):
3321 return str.__getitem__(self, x)
3322 vereq(S("hello")[:4], "hell")
3323 vereq(S("hello")[slice(4)], "hell")
3324 vereq(S("hello").__getitem__(slice(4)), "hell")
3325 # Tuples
3326 vereq((1,2,3)[:2], (1,2))
3327 vereq((1,2,3)[slice(2)], (1,2))
3328 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3329 class T(tuple):
3330 def __getitem__(self, x):
3331 return tuple.__getitem__(self, x)
3332 vereq(T((1,2,3))[:2], (1,2))
3333 vereq(T((1,2,3))[slice(2)], (1,2))
3334 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3335 # Lists
3336 vereq([1,2,3][:2], [1,2])
3337 vereq([1,2,3][slice(2)], [1,2])
3338 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3339 class L(list):
3340 def __getitem__(self, x):
3341 return list.__getitem__(self, x)
3342 vereq(L([1,2,3])[:2], [1,2])
3343 vereq(L([1,2,3])[slice(2)], [1,2])
3344 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3345 # Now do lists and __setitem__
3346 a = L([1,2,3])
3347 a[slice(1, 3)] = [3,2]
3348 vereq(a, [1,3,2])
3349 a[slice(0, 2, 1)] = [3,1]
3350 vereq(a, [3,1,2])
3351 a.__setitem__(slice(1, 3), [2,1])
3352 vereq(a, [3,2,1])
3353 a.__setitem__(slice(0, 2, 1), [2,3])
3354 vereq(a, [2,3,1])
3355
Tim Peters2484aae2002-07-11 06:56:07 +00003356def subtype_resurrection():
3357 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003358 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003359
3360 class C(object):
3361 container = []
3362
3363 def __del__(self):
3364 # resurrect the instance
3365 C.container.append(self)
3366
3367 c = C()
3368 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003369 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003370 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003371 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003372
3373 # If that didn't blow up, it's also interesting to see whether clearing
3374 # the last container slot works: that will attempt to delete c again,
3375 # which will cause c to get appended back to the container again "during"
3376 # the del.
3377 del C.container[-1]
3378 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003379 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003380
Tim Peters14cb1e12002-07-11 18:26:21 +00003381 # Make c mortal again, so that the test framework with -l doesn't report
3382 # it as a leak.
3383 del C.__del__
3384
Guido van Rossum2d702462002-08-06 21:28:28 +00003385def slottrash():
3386 # Deallocating deeply nested slotted trash caused stack overflows
3387 if verbose:
3388 print "Testing slot trash..."
3389 class trash(object):
3390 __slots__ = ['x']
3391 def __init__(self, x):
3392 self.x = x
3393 o = None
3394 for i in xrange(50000):
3395 o = trash(o)
3396 del o
3397
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003398def slotmultipleinheritance():
3399 # SF bug 575229, multiple inheritance w/ slots dumps core
3400 class A(object):
3401 __slots__=()
3402 class B(object):
3403 pass
3404 class C(A,B) :
3405 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003406 vereq(C.__basicsize__, B.__basicsize__)
3407 verify(hasattr(C, '__dict__'))
3408 verify(hasattr(C, '__weakref__'))
3409 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003410
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003411def testrmul():
3412 # SF patch 592646
3413 if verbose:
3414 print "Testing correct invocation of __rmul__..."
3415 class C(object):
3416 def __mul__(self, other):
3417 return "mul"
3418 def __rmul__(self, other):
3419 return "rmul"
3420 a = C()
3421 vereq(a*2, "mul")
3422 vereq(a*2.2, "mul")
3423 vereq(2*a, "rmul")
3424 vereq(2.2*a, "rmul")
3425
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003426def testipow():
3427 # [SF bug 620179]
3428 if verbose:
3429 print "Testing correct invocation of __ipow__..."
3430 class C(object):
3431 def __ipow__(self, other):
3432 pass
3433 a = C()
3434 a **= 2
3435
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003436def do_this_first():
3437 if verbose:
3438 print "Testing SF bug 551412 ..."
3439 # This dumps core when SF bug 551412 isn't fixed --
3440 # but only when test_descr.py is run separately.
3441 # (That can't be helped -- as soon as PyType_Ready()
3442 # is called for PyLong_Type, the bug is gone.)
3443 class UserLong(object):
3444 def __pow__(self, *args):
3445 pass
3446 try:
3447 pow(0L, UserLong(), 0L)
3448 except:
3449 pass
3450
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003451 if verbose:
3452 print "Testing SF bug 570483..."
3453 # Another segfault only when run early
3454 # (before PyType_Ready(tuple) is called)
3455 type.mro(tuple)
3456
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003457def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003458 if verbose:
3459 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003460 # stuff that should work:
3461 class C(object):
3462 pass
3463 class C2(object):
3464 def __getattribute__(self, attr):
3465 if attr == 'a':
3466 return 2
3467 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003468 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003469 def meth(self):
3470 return 1
3471 class D(C):
3472 pass
3473 class E(D):
3474 pass
3475 d = D()
3476 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003477 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003478 D.__bases__ = (C2,)
3479 vereq(d.meth(), 1)
3480 vereq(e.meth(), 1)
3481 vereq(d.a, 2)
3482 vereq(e.a, 2)
3483 vereq(C2.__subclasses__(), [D])
3484
3485 # stuff that shouldn't:
3486 class L(list):
3487 pass
3488
3489 try:
3490 L.__bases__ = (dict,)
3491 except TypeError:
3492 pass
3493 else:
3494 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3495
3496 try:
3497 list.__bases__ = (dict,)
3498 except TypeError:
3499 pass
3500 else:
3501 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3502
3503 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003504 D.__bases__ = (C2, list)
3505 except TypeError:
3506 pass
3507 else:
3508 assert 0, "best_base calculation found wanting"
3509
3510 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003511 del D.__bases__
3512 except TypeError:
3513 pass
3514 else:
3515 raise TestFailed, "shouldn't be able to delete .__bases__"
3516
3517 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003518 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003519 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003520 if str(msg) == "a new-style class can't have only classic bases":
3521 raise TestFailed, "wrong error message for .__bases__ = ()"
3522 else:
3523 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3524
3525 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003526 D.__bases__ = (D,)
3527 except TypeError:
3528 pass
3529 else:
3530 # actually, we'll have crashed by here...
3531 raise TestFailed, "shouldn't be able to create inheritance cycles"
3532
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003533 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003534 D.__bases__ = (C, C)
3535 except TypeError:
3536 pass
3537 else:
3538 raise TestFailed, "didn't detect repeated base classes"
3539
3540 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003541 D.__bases__ = (E,)
3542 except TypeError:
3543 pass
3544 else:
3545 raise TestFailed, "shouldn't be able to create inheritance cycles"
3546
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003547def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003548 if verbose:
3549 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003550 class WorkOnce(type):
3551 def __new__(self, name, bases, ns):
3552 self.flag = 0
3553 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3554 def mro(self):
3555 if self.flag > 0:
3556 raise RuntimeError, "bozo"
3557 else:
3558 self.flag += 1
3559 return type.mro(self)
3560
3561 class WorkAlways(type):
3562 def mro(self):
3563 # this is here to make sure that .mro()s aren't called
3564 # with an exception set (which was possible at one point).
3565 # An error message will be printed in a debug build.
3566 # What's a good way to test for this?
3567 return type.mro(self)
3568
3569 class C(object):
3570 pass
3571
3572 class C2(object):
3573 pass
3574
3575 class D(C):
3576 pass
3577
3578 class E(D):
3579 pass
3580
3581 class F(D):
3582 __metaclass__ = WorkOnce
3583
3584 class G(D):
3585 __metaclass__ = WorkAlways
3586
3587 # Immediate subclasses have their mro's adjusted in alphabetical
3588 # order, so E's will get adjusted before adjusting F's fails. We
3589 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003590
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003591 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003592 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003593
3594 try:
3595 D.__bases__ = (C2,)
3596 except RuntimeError:
3597 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003598 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003599 else:
3600 raise TestFailed, "exception not propagated"
3601
3602def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003603 if verbose:
3604 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003605 class A(object):
3606 pass
3607
3608 class B(object):
3609 pass
3610
3611 class C(A, B):
3612 pass
3613
3614 class D(A, B):
3615 pass
3616
3617 class E(C, D):
3618 pass
3619
3620 try:
3621 C.__bases__ = (B, A)
3622 except TypeError:
3623 pass
3624 else:
3625 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003626
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003627def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003628 if verbose:
3629 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003630 class C(object):
3631 pass
3632
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003633 # C.__module__ could be 'test_descr' or '__main__'
3634 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003635
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003636 C.__name__ = 'D'
3637 vereq((C.__module__, C.__name__), (mod, 'D'))
3638
3639 C.__name__ = 'D.E'
3640 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003641
Guido van Rossum613f24f2003-01-06 23:00:59 +00003642def subclass_right_op():
3643 if verbose:
3644 print "Testing correct dispatch of subclass overloading __r<op>__..."
3645
3646 # This code tests various cases where right-dispatch of a subclass
3647 # should be preferred over left-dispatch of a base class.
3648
3649 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3650
3651 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003652 def __floordiv__(self, other):
3653 return "B.__floordiv__"
3654 def __rfloordiv__(self, other):
3655 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003656
Guido van Rossumf389c772003-02-27 20:04:19 +00003657 vereq(B(1) // 1, "B.__floordiv__")
3658 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003659
3660 # Case 2: subclass of object; this is just the baseline for case 3
3661
3662 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003663 def __floordiv__(self, other):
3664 return "C.__floordiv__"
3665 def __rfloordiv__(self, other):
3666 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003667
Guido van Rossumf389c772003-02-27 20:04:19 +00003668 vereq(C() // 1, "C.__floordiv__")
3669 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003670
3671 # Case 3: subclass of new-style class; here it gets interesting
3672
3673 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003674 def __floordiv__(self, other):
3675 return "D.__floordiv__"
3676 def __rfloordiv__(self, other):
3677 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003678
Guido van Rossumf389c772003-02-27 20:04:19 +00003679 vereq(D() // C(), "D.__floordiv__")
3680 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003681
3682 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3683
3684 class E(C):
3685 pass
3686
Guido van Rossumf389c772003-02-27 20:04:19 +00003687 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003688
Guido van Rossumf389c772003-02-27 20:04:19 +00003689 vereq(E() // 1, "C.__floordiv__")
3690 vereq(1 // E(), "C.__rfloordiv__")
3691 vereq(E() // C(), "C.__floordiv__")
3692 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003693
Guido van Rossum373c7412003-01-07 13:41:37 +00003694def dict_type_with_metaclass():
3695 if verbose:
3696 print "Testing type of __dict__ when __metaclass__ set..."
3697
3698 class B(object):
3699 pass
3700 class M(type):
3701 pass
3702 class C:
3703 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3704 __metaclass__ = M
3705 veris(type(C.__dict__), type(B.__dict__))
3706
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003707def meth_class_get():
3708 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003709 if verbose:
3710 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003711 # Baseline
3712 arg = [1, 2, 3]
3713 res = {1: None, 2: None, 3: None}
3714 vereq(dict.fromkeys(arg), res)
3715 vereq({}.fromkeys(arg), res)
3716 # Now get the descriptor
3717 descr = dict.__dict__["fromkeys"]
3718 # More baseline using the descriptor directly
3719 vereq(descr.__get__(None, dict)(arg), res)
3720 vereq(descr.__get__({})(arg), res)
3721 # Now check various error cases
3722 try:
3723 descr.__get__(None, None)
3724 except TypeError:
3725 pass
3726 else:
3727 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3728 try:
3729 descr.__get__(42)
3730 except TypeError:
3731 pass
3732 else:
3733 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3734 try:
3735 descr.__get__(None, 42)
3736 except TypeError:
3737 pass
3738 else:
3739 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3740 try:
3741 descr.__get__(None, int)
3742 except TypeError:
3743 pass
3744 else:
3745 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3746
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003747def isinst_isclass():
3748 if verbose:
3749 print "Testing proxy isinstance() and isclass()..."
3750 class Proxy(object):
3751 def __init__(self, obj):
3752 self.__obj = obj
3753 def __getattribute__(self, name):
3754 if name.startswith("_Proxy__"):
3755 return object.__getattribute__(self, name)
3756 else:
3757 return getattr(self.__obj, name)
3758 # Test with a classic class
3759 class C:
3760 pass
3761 a = C()
3762 pa = Proxy(a)
3763 verify(isinstance(a, C)) # Baseline
3764 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003765 # Test with a classic subclass
3766 class D(C):
3767 pass
3768 a = D()
3769 pa = Proxy(a)
3770 verify(isinstance(a, C)) # Baseline
3771 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003772 # Test with a new-style class
3773 class C(object):
3774 pass
3775 a = C()
3776 pa = Proxy(a)
3777 verify(isinstance(a, C)) # Baseline
3778 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003779 # Test with a new-style subclass
3780 class D(C):
3781 pass
3782 a = D()
3783 pa = Proxy(a)
3784 verify(isinstance(a, C)) # Baseline
3785 verify(isinstance(pa, C)) # Test
3786
3787def proxysuper():
3788 if verbose:
3789 print "Testing super() for a proxy object..."
3790 class Proxy(object):
3791 def __init__(self, obj):
3792 self.__obj = obj
3793 def __getattribute__(self, name):
3794 if name.startswith("_Proxy__"):
3795 return object.__getattribute__(self, name)
3796 else:
3797 return getattr(self.__obj, name)
3798
3799 class B(object):
3800 def f(self):
3801 return "B.f"
3802
3803 class C(B):
3804 def f(self):
3805 return super(C, self).f() + "->C.f"
3806
3807 obj = C()
3808 p = Proxy(obj)
3809 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003810
Guido van Rossum52b27052003-04-15 20:05:10 +00003811def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003812 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00003813 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003814 try:
3815 object.__setattr__(str, "foo", 42)
3816 except TypeError:
3817 pass
3818 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003819 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003820 try:
3821 object.__delattr__(str, "lower")
3822 except TypeError:
3823 pass
3824 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003825 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003826
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003827def weakref_segfault():
3828 # SF 742911
3829 if verbose:
3830 print "Testing weakref segfault..."
3831
3832 import weakref
3833
3834 class Provoker:
3835 def __init__(self, referrent):
3836 self.ref = weakref.ref(referrent)
3837
3838 def __del__(self):
3839 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003840
3841 class Oops(object):
3842 pass
3843
3844 o = Oops()
3845 o.whatever = Provoker(o)
3846 del o
3847
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003848def wrapper_segfault():
3849 # SF 927248: deeply nested wrappers could cause stack overflow
3850 f = lambda:None
3851 for i in xrange(1000000):
3852 f = f.__call__
3853 f = None
3854
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003855# Fix SF #762455, segfault when sys.stdout is changed in getattr
3856def filefault():
3857 if verbose:
3858 print "Testing sys.stdout is changed in getattr..."
3859 import sys
3860 class StdoutGuard:
3861 def __getattr__(self, attr):
3862 sys.stdout = sys.__stdout__
3863 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3864 sys.stdout = StdoutGuard()
3865 try:
3866 print "Oops!"
3867 except RuntimeError:
3868 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003869
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003870def vicious_descriptor_nonsense():
3871 # A potential segfault spotted by Thomas Wouters in mail to
3872 # python-dev 2003-04-17, turned into an example & fixed by Michael
3873 # Hudson just less than four months later...
3874 if verbose:
3875 print "Testing vicious_descriptor_nonsense..."
3876
3877 class Evil(object):
3878 def __hash__(self):
3879 return hash('attr')
3880 def __eq__(self, other):
3881 del C.attr
3882 return 0
3883
3884 class Descr(object):
3885 def __get__(self, ob, type=None):
3886 return 1
3887
3888 class C(object):
3889 attr = Descr()
3890
3891 c = C()
3892 c.__dict__[Evil()] = 0
3893
3894 vereq(c.attr, 1)
3895 # this makes a crash more likely:
3896 import gc; gc.collect()
3897 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00003898
Raymond Hettingerb67cc802005-03-03 16:45:19 +00003899def test_init():
3900 # SF 1155938
3901 class Foo(object):
3902 def __init__(self):
3903 return 10
3904 try:
3905 Foo()
3906 except TypeError:
3907 pass
3908 else:
3909 raise TestFailed, "did not test __init__() for None return"
3910
Armin Rigoc6686b72005-11-07 08:38:00 +00003911def methodwrapper():
3912 # <type 'method-wrapper'> did not support any reflection before 2.5
3913 if verbose:
3914 print "Testing method-wrapper objects..."
3915
Guido van Rossum47b9ff62006-08-24 00:41:19 +00003916 return # XXX should methods really support __eq__?
3917
Armin Rigoc6686b72005-11-07 08:38:00 +00003918 l = []
3919 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003920 vereq(l.__add__, [].__add__)
3921 verify(l.__add__ != [5].__add__)
3922 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00003923 verify(l.__add__.__name__ == '__add__')
3924 verify(l.__add__.__self__ is l)
3925 verify(l.__add__.__objclass__ is list)
3926 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003927 try:
3928 hash(l.__add__)
3929 except TypeError:
3930 pass
3931 else:
3932 raise TestFailed("no TypeError from hash([].__add__)")
3933
3934 t = ()
3935 t += (7,)
3936 vereq(t.__add__, (7,).__add__)
3937 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003938
Armin Rigofd163f92005-12-29 15:59:19 +00003939def notimplemented():
3940 # all binary methods should be able to return a NotImplemented
3941 if verbose:
3942 print "Testing NotImplemented..."
3943
3944 import sys
3945 import types
3946 import operator
3947
3948 def specialmethod(self, other):
3949 return NotImplemented
3950
3951 def check(expr, x, y):
3952 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00003953 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00003954 except TypeError:
3955 pass
3956 else:
3957 raise TestFailed("no TypeError from %r" % (expr,))
3958
3959 N1 = sys.maxint + 1L # might trigger OverflowErrors instead of TypeErrors
3960 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
3961 # ValueErrors instead of TypeErrors
3962 for metaclass in [type, types.ClassType]:
3963 for name, expr, iexpr in [
3964 ('__add__', 'x + y', 'x += y'),
3965 ('__sub__', 'x - y', 'x -= y'),
3966 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00003967 ('__truediv__', 'x / y', None),
3968 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00003969 ('__mod__', 'x % y', 'x %= y'),
3970 ('__divmod__', 'divmod(x, y)', None),
3971 ('__pow__', 'x ** y', 'x **= y'),
3972 ('__lshift__', 'x << y', 'x <<= y'),
3973 ('__rshift__', 'x >> y', 'x >>= y'),
3974 ('__and__', 'x & y', 'x &= y'),
3975 ('__or__', 'x | y', 'x |= y'),
3976 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00003977 ]:
3978 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00003979 A = metaclass('A', (), {name: specialmethod})
3980 B = metaclass('B', (), {rname: specialmethod})
3981 a = A()
3982 b = B()
3983 check(expr, a, a)
3984 check(expr, a, b)
3985 check(expr, b, a)
3986 check(expr, b, b)
3987 check(expr, a, N1)
3988 check(expr, a, N2)
3989 check(expr, N1, b)
3990 check(expr, N2, b)
3991 if iexpr:
3992 check(iexpr, a, a)
3993 check(iexpr, a, b)
3994 check(iexpr, b, a)
3995 check(iexpr, b, b)
3996 check(iexpr, a, N1)
3997 check(iexpr, a, N2)
3998 iname = '__i' + name[2:]
3999 C = metaclass('C', (), {iname: specialmethod})
4000 c = C()
4001 check(iexpr, c, a)
4002 check(iexpr, c, b)
4003 check(iexpr, c, N1)
4004 check(iexpr, c, N2)
4005
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004006def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004007 weakref_segfault() # Must be first, somehow
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004008 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004009 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004010 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004011 lists()
4012 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004013 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004014 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004015 ints()
4016 longs()
4017 floats()
4018 complexes()
4019 spamlists()
4020 spamdicts()
4021 pydicts()
4022 pylists()
4023 metaclass()
4024 pymods()
4025 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004026 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004027 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004028 ex5()
4029 monotonicity()
4030 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004031 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004032 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004033 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004034 dynamics()
4035 errors()
4036 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004037 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004038 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004039 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004040 classic()
4041 compattr()
4042 newslot()
4043 altmro()
4044 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004045 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004046 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004047 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004048 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004049 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004050 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004051 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004052 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004053 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004054 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004055 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004056 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004057 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004058 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004059 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004060 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004061 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004062 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004063 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004064 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004065 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004066 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004067 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004068 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004069 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004070 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004071 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004072 dictproxyiterkeys()
4073 dictproxyitervalues()
4074 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004075 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004076 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004077 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004078 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004079 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004080 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004081 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004082 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004083 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004084 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004085 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004086 test_mutable_bases()
4087 test_mutable_bases_with_failing_mro()
4088 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004089 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004090 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004091 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004092 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004093 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004094 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004095 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004096 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004097 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004098 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004099 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004100 notimplemented()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004101
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004102 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004103
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004104if __name__ == "__main__":
4105 test_main()