blob: bcfadf77151547045e873b0258aa8b47cc9d0319 [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))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000194 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000195 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!
Guido van Rossume2a383d2007-01-15 16:59:06 +0000267 for arg in 2, 2, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000268 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',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000388 'float': 'float',
389 'oct': 'oct',
390 'hex': 'hex',
391 }
392
393for name, expr in unops.items():
394 if expr.islower():
395 expr = expr + "(a)"
396 else:
397 expr = '%s a' % expr
398 unops[name] = expr
399
400def numops(a, b, skip=[]):
401 dict = {'a': a, 'b': b}
402 for name, expr in binops.items():
403 if name not in skip:
404 name = "__%s__" % name
405 if hasattr(a, name):
406 res = eval(expr, dict)
407 testbinop(a, b, res, expr, name)
408 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000409 if name not in skip:
410 name = "__%s__" % name
411 if hasattr(a, name):
412 res = eval(expr, dict)
413 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000414
415def ints():
416 if verbose: print "Testing int operations..."
417 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000418 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000419 vereq((1).__bool__(), True)
420 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000421 # This returns 'NotImplemented' in Python 2.2
422 class C(int):
423 def __add__(self, other):
424 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000425 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000426 try:
427 C() + ""
428 except TypeError:
429 pass
430 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000431 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000432
433def longs():
434 if verbose: print "Testing long operations..."
Guido van Rossume2a383d2007-01-15 16:59:06 +0000435 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000436
437def floats():
438 if verbose: print "Testing float operations..."
439 numops(100.0, 3.0)
440
441def complexes():
442 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000443 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000444 class Number(complex):
445 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000446 def __new__(cls, *args, **kwds):
447 result = complex.__new__(cls, *args)
448 result.prec = kwds.get('prec', 12)
449 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 def __repr__(self):
451 prec = self.prec
452 if self.imag == 0.0:
453 return "%.*g" % (prec, self.real)
454 if self.real == 0.0:
455 return "%.*gj" % (prec, self.imag)
456 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
457 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000458
Tim Peters6d6c1a32001-08-02 04:15:00 +0000459 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000460 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000461 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000462
Tim Peters3f996e72001-09-13 19:18:27 +0000463 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000464 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000465 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000466
467 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000468 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000469 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000470
Tim Peters6d6c1a32001-08-02 04:15:00 +0000471def spamlists():
472 if verbose: print "Testing spamlist operations..."
473 import copy, xxsubtype as spam
474 def spamlist(l, memo=None):
475 import xxsubtype as spam
476 return spam.spamlist(l)
477 # This is an ugly hack:
478 copy._deepcopy_dispatch[spam.spamlist] = spamlist
479
480 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
481 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
482 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
483 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
484 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
485 "a[b:c]", "__getslice__")
486 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
487 "a+=b", "__iadd__")
488 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
489 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
490 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
491 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
492 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
493 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
494 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
495 # Test subclassing
496 class C(spam.spamlist):
497 def foo(self): return 1
498 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(a, [])
500 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000502 vereq(a, [100])
503 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000504 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000505 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506
507def spamdicts():
508 if verbose: print "Testing spamdict operations..."
509 import copy, xxsubtype as spam
510 def spamdict(d, memo=None):
511 import xxsubtype as spam
512 sd = spam.spamdict()
513 for k, v in d.items(): sd[k] = v
514 return sd
515 # This is an ugly hack:
516 copy._deepcopy_dispatch[spam.spamdict] = spamdict
517
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000518 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000519 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
520 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
521 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
522 d = spamdict({1:2,3:4})
523 l1 = []
524 for i in d.keys(): l1.append(i)
525 l = []
526 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000527 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000528 l = []
529 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 l = []
532 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000533 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000534 straightd = {1:2, 3:4}
535 spamd = spamdict(straightd)
536 testunop(spamd, 2, "len(a)", "__len__")
537 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
538 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
539 "a[b]=c", "__setitem__")
540 # Test subclassing
541 class C(spam.spamdict):
542 def foo(self): return 1
543 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000544 vereq(a.items(), [])
545 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000547 vereq(a.items(), [('foo', 'bar')])
548 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551
552def pydicts():
553 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000554 verify(issubclass(dict, dict))
555 verify(isinstance({}, dict))
556 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000557 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000558 verify(d.__class__ is dict)
559 verify(isinstance(d, dict))
560 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561 state = -1
562 def __init__(self, *a, **kw):
563 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000564 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565 self.state = a[0]
566 if kw:
567 for k, v in kw.items(): self[v] = k
568 def __getitem__(self, key):
569 return self.get(key, 0)
570 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000571 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000572 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000573 def setstate(self, state):
574 self.state = state
575 def getstate(self):
576 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000577 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000581 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.state, -1)
584 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.state, 0)
587 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000588 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a.state, 10)
590 vereq(a.getstate(), 10)
591 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000594 if verbose: print "pydict stress test ..."
595 N = 50
596 for i in range(N):
597 a[i] = C()
598 for j in range(N):
599 a[i][j] = i*j
600 for i in range(N):
601 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000602 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603
604def pylists():
605 if verbose: print "Testing Python subclass of list..."
606 class C(list):
607 def __getitem__(self, i):
608 return list.__getitem__(self, i) + 100
609 def __getslice__(self, i, j):
610 return (i, j)
611 a = C()
612 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000613 vereq(a[0], 100)
614 vereq(a[1], 101)
615 vereq(a[2], 102)
616 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617
618def metaclass():
619 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000620 class C:
621 __metaclass__ = type
622 def __init__(self):
623 self.__state = 0
624 def getstate(self):
625 return self.__state
626 def setstate(self, state):
627 self.__state = state
628 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000631 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000632 class D:
633 class __metaclass__(type):
634 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000635 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000636 d = D()
637 verify(d.__class__ is D)
638 class M1(type):
639 def __new__(cls, name, bases, dict):
640 dict['__spam__'] = 1
641 return type.__new__(cls, name, bases, dict)
642 class C:
643 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000644 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000645 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000646 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000647
Guido van Rossum309b5662001-08-17 11:43:17 +0000648 class _instance(object):
649 pass
650 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000651 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000652 def __new__(cls, name, bases, dict):
653 self = object.__new__(cls)
654 self.name = name
655 self.bases = bases
656 self.dict = dict
657 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000658 def __call__(self):
659 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000660 # Early binding of methods
661 for key in self.dict:
662 if key.startswith("__"):
663 continue
664 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000665 return it
666 class C:
667 __metaclass__ = M2
668 def spam(self):
669 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000670 vereq(C.name, 'C')
671 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000672 verify('spam' in C.dict)
673 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675
Guido van Rossum91ee7982001-08-30 20:52:40 +0000676 # More metaclass examples
677
678 class autosuper(type):
679 # Automatically add __super to the class
680 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 cls = super(autosuper, metaclass).__new__(metaclass,
683 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000684 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000685 while name[:1] == "_":
686 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000687 if name:
688 name = "_%s__super" % name
689 else:
690 name = "__super"
691 setattr(cls, name, super(cls))
692 return cls
693 class A:
694 __metaclass__ = autosuper
695 def meth(self):
696 return "A"
697 class B(A):
698 def meth(self):
699 return "B" + self.__super.meth()
700 class C(A):
701 def meth(self):
702 return "C" + self.__super.meth()
703 class D(C, B):
704 def meth(self):
705 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000706 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000707 class E(B, C):
708 def meth(self):
709 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000710 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000711
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000712 class autoproperty(type):
713 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000714 # named _get_x and/or _set_x are found
715 def __new__(metaclass, name, bases, dict):
716 hits = {}
717 for key, val in dict.iteritems():
718 if key.startswith("_get_"):
719 key = key[5:]
720 get, set = hits.get(key, (None, None))
721 get = val
722 hits[key] = get, set
723 elif key.startswith("_set_"):
724 key = key[5:]
725 get, set = hits.get(key, (None, None))
726 set = val
727 hits[key] = get, set
728 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000729 dict[key] = property(get, set)
730 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 name, bases, dict)
732 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000733 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000734 def _get_x(self):
735 return -self.__x
736 def _set_x(self, x):
737 self.__x = -x
738 a = A()
739 verify(not hasattr(a, "x"))
740 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000741 vereq(a.x, 12)
742 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000743
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000744 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000745 # Merge of multiple cooperating metaclasses
746 pass
747 class A:
748 __metaclass__ = multimetaclass
749 def _get_x(self):
750 return "A"
751 class B(A):
752 def _get_x(self):
753 return "B" + self.__super._get_x()
754 class C(A):
755 def _get_x(self):
756 return "C" + self.__super._get_x()
757 class D(C, B):
758 def _get_x(self):
759 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000760 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000761
Guido van Rossumf76de622001-10-18 15:49:21 +0000762 # Make sure type(x) doesn't call x.__class__.__init__
763 class T(type):
764 counter = 0
765 def __init__(self, *args):
766 T.counter += 1
767 class C:
768 __metaclass__ = T
769 vereq(T.counter, 1)
770 a = C()
771 vereq(type(a), C)
772 vereq(T.counter, 1)
773
Guido van Rossum29d26062001-12-11 04:37:34 +0000774 class C(object): pass
775 c = C()
776 try: c()
777 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000778 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000779
Tim Peters6d6c1a32001-08-02 04:15:00 +0000780def pymods():
781 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000782 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000783 import sys
784 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000785 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000786 def __init__(self, name):
787 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000788 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000789 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000790 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000791 def __setattr__(self, name, value):
792 log.append(("setattr", name, value))
793 MT.__setattr__(self, name, value)
794 def __delattr__(self, name):
795 log.append(("delattr", name))
796 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000797 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798 a.foo = 12
799 x = a.foo
800 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000801 vereq(log, [("setattr", "foo", 12),
802 ("getattr", "foo"),
803 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804
805def multi():
806 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 class C(object):
808 def __init__(self):
809 self.__state = 0
810 def getstate(self):
811 return self.__state
812 def setstate(self, state):
813 self.__state = state
814 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000815 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000817 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000818 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819 def __init__(self):
820 type({}).__init__(self)
821 C.__init__(self)
822 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000823 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000824 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000825 vereq(d.items(), [("hello", "world")])
826 vereq(d["hello"], "world")
827 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000829 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000830 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831
Guido van Rossume45763a2001-08-10 21:28:46 +0000832 # SF bug #442833
833 class Node(object):
834 def __int__(self):
835 return int(self.foo())
836 def foo(self):
837 return "23"
838 class Frag(Node, list):
839 def foo(self):
840 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000841 vereq(Node().__int__(), 23)
842 vereq(int(Node()), 23)
843 vereq(Frag().__int__(), 42)
844 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000845
Tim Peters6d6c1a32001-08-02 04:15:00 +0000846def diamond():
847 if verbose: print "Testing multiple inheritance special cases..."
848 class A(object):
849 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000850 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000851 class B(A):
852 def boo(self): return "B"
853 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000854 vereq(B().spam(), "B")
855 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000856 class C(A):
857 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000858 vereq(C().spam(), "A")
859 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000861 vereq(D().spam(), "B")
862 vereq(D().boo(), "B")
863 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000865 vereq(E().spam(), "B")
866 vereq(E().boo(), "C")
867 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000868 # MRO order disagreement
869 try:
870 class F(D, E): pass
871 except TypeError:
872 pass
873 else:
874 raise TestFailed, "expected MRO order disagreement (F)"
875 try:
876 class G(E, D): pass
877 except TypeError:
878 pass
879 else:
880 raise TestFailed, "expected MRO order disagreement (G)"
881
882
883# see thread python-dev/2002-October/029035.html
884def ex5():
885 if verbose: print "Testing ex5 from C3 switch discussion..."
886 class A(object): pass
887 class B(object): pass
888 class C(object): pass
889 class X(A): pass
890 class Y(A): pass
891 class Z(X,B,Y,C): pass
892 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
893
894# see "A Monotonic Superclass Linearization for Dylan",
895# by Kim Barrett et al. (OOPSLA 1996)
896def monotonicity():
897 if verbose: print "Testing MRO monotonicity..."
898 class Boat(object): pass
899 class DayBoat(Boat): pass
900 class WheelBoat(Boat): pass
901 class EngineLess(DayBoat): pass
902 class SmallMultihull(DayBoat): pass
903 class PedalWheelBoat(EngineLess,WheelBoat): pass
904 class SmallCatamaran(SmallMultihull): pass
905 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
906
907 vereq(PedalWheelBoat.__mro__,
908 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
909 object))
910 vereq(SmallCatamaran.__mro__,
911 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
912
913 vereq(Pedalo.__mro__,
914 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
915 SmallMultihull, DayBoat, WheelBoat, Boat, object))
916
917# see "A Monotonic Superclass Linearization for Dylan",
918# by Kim Barrett et al. (OOPSLA 1996)
919def consistency_with_epg():
920 if verbose: print "Testing consistentcy with EPG..."
921 class Pane(object): pass
922 class ScrollingMixin(object): pass
923 class EditingMixin(object): pass
924 class ScrollablePane(Pane,ScrollingMixin): pass
925 class EditablePane(Pane,EditingMixin): pass
926 class EditableScrollablePane(ScrollablePane,EditablePane): pass
927
928 vereq(EditableScrollablePane.__mro__,
929 (EditableScrollablePane, ScrollablePane, EditablePane,
930 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931
Raymond Hettingerf394df42003-04-06 19:13:41 +0000932mro_err_msg = """Cannot create a consistent method resolution
933order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000934
Guido van Rossumd32047f2002-11-25 21:38:52 +0000935def mro_disagreement():
936 if verbose: print "Testing error messages for MRO disagreement..."
937 def raises(exc, expected, callable, *args):
938 try:
939 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000940 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000941 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +0000942 raise TestFailed, "Message %r, expected %r" % (str(msg),
943 expected)
944 else:
945 raise TestFailed, "Expected %s" % exc
946 class A(object): pass
947 class B(A): pass
948 class C(object): pass
949 # Test some very simple errors
950 raises(TypeError, "duplicate base class A",
951 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000952 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000953 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000954 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000955 type, "X", (A, C, B), {})
956 # Test a slightly more complex error
957 class GridLayout(object): pass
958 class HorizontalGrid(GridLayout): pass
959 class VerticalGrid(GridLayout): pass
960 class HVGrid(HorizontalGrid, VerticalGrid): pass
961 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000962 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000963 type, "ConfusedGrid", (HVGrid, VHGrid), {})
964
Guido van Rossum37202612001-08-09 19:45:21 +0000965def objects():
966 if verbose: print "Testing object class..."
967 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000968 vereq(a.__class__, object)
969 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000970 b = object()
971 verify(a is not b)
972 verify(not hasattr(a, "foo"))
973 try:
974 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000975 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000976 pass
977 else:
978 verify(0, "object() should not allow setting a foo attribute")
979 verify(not hasattr(object(), "__dict__"))
980
981 class Cdict(object):
982 pass
983 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000984 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000985 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000986 vereq(x.foo, 1)
987 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000988
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989def slots():
990 if verbose: print "Testing __slots__..."
991 class C0(object):
992 __slots__ = []
993 x = C0()
994 verify(not hasattr(x, "__dict__"))
995 verify(not hasattr(x, "foo"))
996
997 class C1(object):
998 __slots__ = ['a']
999 x = C1()
1000 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001001 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001002 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001003 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001004 x.a = None
1005 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001006 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001007 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008
1009 class C3(object):
1010 __slots__ = ['a', 'b', 'c']
1011 x = C3()
1012 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001013 verify(not hasattr(x, 'a'))
1014 verify(not hasattr(x, 'b'))
1015 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 x.a = 1
1017 x.b = 2
1018 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001019 vereq(x.a, 1)
1020 vereq(x.b, 2)
1021 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001022
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001023 class C4(object):
1024 """Validate name mangling"""
1025 __slots__ = ['__a']
1026 def __init__(self, value):
1027 self.__a = value
1028 def get(self):
1029 return self.__a
1030 x = C4(5)
1031 verify(not hasattr(x, '__dict__'))
1032 verify(not hasattr(x, '__a'))
1033 vereq(x.get(), 5)
1034 try:
1035 x.__a = 6
1036 except AttributeError:
1037 pass
1038 else:
1039 raise TestFailed, "Double underscored names not mangled"
1040
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001041 # Make sure slot names are proper identifiers
1042 try:
1043 class C(object):
1044 __slots__ = [None]
1045 except TypeError:
1046 pass
1047 else:
1048 raise TestFailed, "[None] slots not caught"
1049 try:
1050 class C(object):
1051 __slots__ = ["foo bar"]
1052 except TypeError:
1053 pass
1054 else:
1055 raise TestFailed, "['foo bar'] slots not caught"
1056 try:
1057 class C(object):
1058 __slots__ = ["foo\0bar"]
1059 except TypeError:
1060 pass
1061 else:
1062 raise TestFailed, "['foo\\0bar'] slots not caught"
1063 try:
1064 class C(object):
1065 __slots__ = ["1"]
1066 except TypeError:
1067 pass
1068 else:
1069 raise TestFailed, "['1'] slots not caught"
1070 try:
1071 class C(object):
1072 __slots__ = [""]
1073 except TypeError:
1074 pass
1075 else:
1076 raise TestFailed, "[''] slots not caught"
1077 class C(object):
1078 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1079
Guido van Rossum33bab012001-12-05 22:45:48 +00001080 # Test leaks
1081 class Counted(object):
1082 counter = 0 # counts the number of instances alive
1083 def __init__(self):
1084 Counted.counter += 1
1085 def __del__(self):
1086 Counted.counter -= 1
1087 class C(object):
1088 __slots__ = ['a', 'b', 'c']
1089 x = C()
1090 x.a = Counted()
1091 x.b = Counted()
1092 x.c = Counted()
1093 vereq(Counted.counter, 3)
1094 del x
1095 vereq(Counted.counter, 0)
1096 class D(C):
1097 pass
1098 x = D()
1099 x.a = Counted()
1100 x.z = Counted()
1101 vereq(Counted.counter, 2)
1102 del x
1103 vereq(Counted.counter, 0)
1104 class E(D):
1105 __slots__ = ['e']
1106 x = E()
1107 x.a = Counted()
1108 x.z = Counted()
1109 x.e = Counted()
1110 vereq(Counted.counter, 3)
1111 del x
1112 vereq(Counted.counter, 0)
1113
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001114 # Test cyclical leaks [SF bug 519621]
1115 class F(object):
1116 __slots__ = ['a', 'b']
1117 log = []
1118 s = F()
1119 s.a = [Counted(), s]
1120 vereq(Counted.counter, 1)
1121 s = None
1122 import gc
1123 gc.collect()
1124 vereq(Counted.counter, 0)
1125
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001126 # Test lookup leaks [SF bug 572567]
1127 import sys,gc
1128 class G(object):
1129 def __cmp__(self, other):
1130 return 0
1131 g = G()
1132 orig_objects = len(gc.get_objects())
1133 for i in xrange(10):
1134 g==g
1135 new_objects = len(gc.get_objects())
1136 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001137 class H(object):
1138 __slots__ = ['a', 'b']
1139 def __init__(self):
1140 self.a = 1
1141 self.b = 2
1142 def __del__(self):
1143 assert self.a == 1
1144 assert self.b == 2
1145
1146 save_stderr = sys.stderr
1147 sys.stderr = sys.stdout
1148 h = H()
1149 try:
1150 del h
1151 finally:
1152 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001153
Guido van Rossum8b056da2002-08-13 18:26:26 +00001154def slotspecials():
1155 if verbose: print "Testing __dict__ and __weakref__ in __slots__..."
1156
1157 class D(object):
1158 __slots__ = ["__dict__"]
1159 a = D()
1160 verify(hasattr(a, "__dict__"))
1161 verify(not hasattr(a, "__weakref__"))
1162 a.foo = 42
1163 vereq(a.__dict__, {"foo": 42})
1164
1165 class W(object):
1166 __slots__ = ["__weakref__"]
1167 a = W()
1168 verify(hasattr(a, "__weakref__"))
1169 verify(not hasattr(a, "__dict__"))
1170 try:
1171 a.foo = 42
1172 except AttributeError:
1173 pass
1174 else:
1175 raise TestFailed, "shouldn't be allowed to set a.foo"
1176
1177 class C1(W, D):
1178 __slots__ = []
1179 a = C1()
1180 verify(hasattr(a, "__dict__"))
1181 verify(hasattr(a, "__weakref__"))
1182 a.foo = 42
1183 vereq(a.__dict__, {"foo": 42})
1184
1185 class C2(D, W):
1186 __slots__ = []
1187 a = C2()
1188 verify(hasattr(a, "__dict__"))
1189 verify(hasattr(a, "__weakref__"))
1190 a.foo = 42
1191 vereq(a.__dict__, {"foo": 42})
1192
Guido van Rossum9a818922002-11-14 19:50:14 +00001193# MRO order disagreement
1194#
1195# class C3(C1, C2):
1196# __slots__ = []
1197#
1198# class C4(C2, C1):
1199# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001200
Tim Peters6d6c1a32001-08-02 04:15:00 +00001201def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001202 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001203 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001205 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001206 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001207 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001208 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001209 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001210 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001211 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001212 vereq(E.foo, 1)
1213 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001214 # Test dynamic instances
1215 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001216 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001217 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001218 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001219 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001220 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001221 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001222 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001223 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001224 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001225 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001226 vereq(int(a), 100)
1227 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001228 verify(not hasattr(a, "spam"))
1229 def mygetattr(self, name):
1230 if name == "spam":
1231 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001232 raise AttributeError
1233 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001234 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001235 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001236 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001237 def mysetattr(self, name, value):
1238 if name == "spam":
1239 raise AttributeError
1240 return object.__setattr__(self, name, value)
1241 C.__setattr__ = mysetattr
1242 try:
1243 a.spam = "not spam"
1244 except AttributeError:
1245 pass
1246 else:
1247 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001248 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001249 class D(C):
1250 pass
1251 d = D()
1252 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001253 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001254
Guido van Rossum7e35d572001-09-15 03:14:32 +00001255 # Test handling of int*seq and seq*int
1256 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001257 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001258 vereq("a"*I(2), "aa")
1259 vereq(I(2)*"a", "aa")
1260 vereq(2*I(3), 6)
1261 vereq(I(3)*2, 6)
1262 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001263
1264 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001265 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001266 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001267 vereq("a"*L(2), "aa")
1268 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001269 vereq(2*L(3), 6)
1270 vereq(L(3)*2, 6)
1271 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001272
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001273 # Test comparison of classes with dynamic metaclasses
1274 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001275 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001276 class someclass:
1277 __metaclass__ = dynamicmetaclass
1278 verify(someclass != object)
1279
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280def errors():
1281 if verbose: print "Testing errors..."
1282
1283 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001284 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001285 pass
1286 except TypeError:
1287 pass
1288 else:
1289 verify(0, "inheritance from both list and dict should be illegal")
1290
1291 try:
1292 class C(object, None):
1293 pass
1294 except TypeError:
1295 pass
1296 else:
1297 verify(0, "inheritance from non-type should be illegal")
1298 class Classic:
1299 pass
1300
1301 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001302 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001303 pass
1304 except TypeError:
1305 pass
1306 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001307 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001308
1309 try:
1310 class C(object):
1311 __slots__ = 1
1312 except TypeError:
1313 pass
1314 else:
1315 verify(0, "__slots__ = 1 should be illegal")
1316
1317 try:
1318 class C(object):
1319 __slots__ = [1]
1320 except TypeError:
1321 pass
1322 else:
1323 verify(0, "__slots__ = [1] should be illegal")
1324
1325def classmethods():
1326 if verbose: print "Testing class methods..."
1327 class C(object):
1328 def foo(*a): return a
1329 goo = classmethod(foo)
1330 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001331 vereq(C.goo(1), (C, 1))
1332 vereq(c.goo(1), (C, 1))
1333 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001334 class D(C):
1335 pass
1336 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001337 vereq(D.goo(1), (D, 1))
1338 vereq(d.goo(1), (D, 1))
1339 vereq(d.foo(1), (d, 1))
1340 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001341 # Test for a specific crash (SF bug 528132)
1342 def f(cls, arg): return (cls, arg)
1343 ff = classmethod(f)
1344 vereq(ff.__get__(0, int)(42), (int, 42))
1345 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001346
Guido van Rossum155db9a2002-04-02 17:53:47 +00001347 # Test super() with classmethods (SF bug 535444)
1348 veris(C.goo.im_self, C)
1349 veris(D.goo.im_self, D)
1350 veris(super(D,D).goo.im_self, D)
1351 veris(super(D,d).goo.im_self, D)
1352 vereq(super(D,D).goo(), (D,))
1353 vereq(super(D,d).goo(), (D,))
1354
Raymond Hettingerbe971532003-06-18 01:13:41 +00001355 # Verify that argument is checked for callability (SF bug 753451)
1356 try:
1357 classmethod(1).__get__(1)
1358 except TypeError:
1359 pass
1360 else:
1361 raise TestFailed, "classmethod should check for callability"
1362
Georg Brandl6a29c322006-02-21 22:17:46 +00001363 # Verify that classmethod() doesn't allow keyword args
1364 try:
1365 classmethod(f, kw=1)
1366 except TypeError:
1367 pass
1368 else:
1369 raise TestFailed, "classmethod shouldn't accept keyword args"
1370
Fred Drakef841aa62002-03-28 15:49:54 +00001371def classmethods_in_c():
1372 if verbose: print "Testing C-based class methods..."
1373 import xxsubtype as spam
1374 a = (1, 2, 3)
1375 d = {'abc': 123}
1376 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001377 veris(x, spam.spamlist)
1378 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001379 vereq(d, d1)
1380 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001381 veris(x, spam.spamlist)
1382 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001383 vereq(d, d1)
1384
Tim Peters6d6c1a32001-08-02 04:15:00 +00001385def staticmethods():
1386 if verbose: print "Testing static methods..."
1387 class C(object):
1388 def foo(*a): return a
1389 goo = staticmethod(foo)
1390 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001391 vereq(C.goo(1), (1,))
1392 vereq(c.goo(1), (1,))
1393 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001394 class D(C):
1395 pass
1396 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001397 vereq(D.goo(1), (1,))
1398 vereq(d.goo(1), (1,))
1399 vereq(d.foo(1), (d, 1))
1400 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001401
Fred Drakef841aa62002-03-28 15:49:54 +00001402def staticmethods_in_c():
1403 if verbose: print "Testing C-based static methods..."
1404 import xxsubtype as spam
1405 a = (1, 2, 3)
1406 d = {"abc": 123}
1407 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1408 veris(x, None)
1409 vereq(a, a1)
1410 vereq(d, d1)
1411 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1412 veris(x, None)
1413 vereq(a, a1)
1414 vereq(d, d1)
1415
Tim Peters6d6c1a32001-08-02 04:15:00 +00001416def classic():
1417 if verbose: print "Testing classic classes..."
1418 class C:
1419 def foo(*a): return a
1420 goo = classmethod(foo)
1421 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001422 vereq(C.goo(1), (C, 1))
1423 vereq(c.goo(1), (C, 1))
1424 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001425 class D(C):
1426 pass
1427 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001428 vereq(D.goo(1), (D, 1))
1429 vereq(d.goo(1), (D, 1))
1430 vereq(d.foo(1), (d, 1))
1431 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001432 class E: # *not* subclassing from C
1433 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001435 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001436
1437def compattr():
1438 if verbose: print "Testing computed attributes..."
1439 class C(object):
1440 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001441 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001442 self.__get = get
1443 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001444 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001445 def __get__(self, obj, type=None):
1446 return self.__get(obj)
1447 def __set__(self, obj, value):
1448 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001449 def __delete__(self, obj):
1450 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001451 def __init__(self):
1452 self.__x = 0
1453 def __get_x(self):
1454 x = self.__x
1455 self.__x = x+1
1456 return x
1457 def __set_x(self, x):
1458 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001459 def __delete_x(self):
1460 del self.__x
1461 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001462 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001463 vereq(a.x, 0)
1464 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001465 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001466 vereq(a.x, 10)
1467 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001468 del a.x
1469 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001470
1471def newslot():
1472 if verbose: print "Testing __new__ slot override..."
1473 class C(list):
1474 def __new__(cls):
1475 self = list.__new__(cls)
1476 self.foo = 1
1477 return self
1478 def __init__(self):
1479 self.foo = self.foo + 2
1480 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001481 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001482 verify(a.__class__ is C)
1483 class D(C):
1484 pass
1485 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001486 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001487 verify(b.__class__ is D)
1488
Tim Peters6d6c1a32001-08-02 04:15:00 +00001489def altmro():
1490 if verbose: print "Testing mro() and overriding it..."
1491 class A(object):
1492 def f(self): return "A"
1493 class B(A):
1494 pass
1495 class C(A):
1496 def f(self): return "C"
1497 class D(B, C):
1498 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001499 vereq(D.mro(), [D, B, C, A, object])
1500 vereq(D.__mro__, (D, B, C, A, object))
1501 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001502
Guido van Rossumd3077402001-08-12 05:24:18 +00001503 class PerverseMetaType(type):
1504 def mro(cls):
1505 L = type.mro(cls)
1506 L.reverse()
1507 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001508 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001510 vereq(X.__mro__, (object, A, C, B, D, X))
1511 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512
Armin Rigo037d1e02005-12-29 17:07:39 +00001513 try:
1514 class X(object):
1515 class __metaclass__(type):
1516 def mro(self):
1517 return [self, dict, object]
1518 except TypeError:
1519 pass
1520 else:
1521 raise TestFailed, "devious mro() return not caught"
1522
1523 try:
1524 class X(object):
1525 class __metaclass__(type):
1526 def mro(self):
1527 return [1]
1528 except TypeError:
1529 pass
1530 else:
1531 raise TestFailed, "non-class mro() return not caught"
1532
1533 try:
1534 class X(object):
1535 class __metaclass__(type):
1536 def mro(self):
1537 return 1
1538 except TypeError:
1539 pass
1540 else:
1541 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001542
Armin Rigo037d1e02005-12-29 17:07:39 +00001543
Tim Peters6d6c1a32001-08-02 04:15:00 +00001544def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001545 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001546
1547 class B(object):
1548 "Intermediate class because object doesn't have a __setattr__"
1549
1550 class C(B):
1551
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001552 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001553 if name == "foo":
1554 return ("getattr", name)
1555 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001556 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001557 def __setattr__(self, name, value):
1558 if name == "foo":
1559 self.setattr = (name, value)
1560 else:
1561 return B.__setattr__(self, name, value)
1562 def __delattr__(self, name):
1563 if name == "foo":
1564 self.delattr = name
1565 else:
1566 return B.__delattr__(self, name)
1567
1568 def __getitem__(self, key):
1569 return ("getitem", key)
1570 def __setitem__(self, key, value):
1571 self.setitem = (key, value)
1572 def __delitem__(self, key):
1573 self.delitem = key
1574
1575 def __getslice__(self, i, j):
1576 return ("getslice", i, j)
1577 def __setslice__(self, i, j, value):
1578 self.setslice = (i, j, value)
1579 def __delslice__(self, i, j):
1580 self.delslice = (i, j)
1581
1582 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001584 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001585 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001586 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001587 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001588
Guido van Rossum45704552001-10-08 16:35:45 +00001589 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001590 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001591 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001592 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001593 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001594
Guido van Rossum45704552001-10-08 16:35:45 +00001595 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001596 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001597 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001598 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001599 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001600
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001601def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001602 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001603 class C(object):
1604 def __init__(self, x):
1605 self.x = x
1606 def foo(self):
1607 return self.x
1608 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001609 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001610 class D(C):
1611 boo = C.foo
1612 goo = c1.foo
1613 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001614 vereq(d2.foo(), 2)
1615 vereq(d2.boo(), 2)
1616 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001617 class E(object):
1618 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001619 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001620 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001621
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001622def specials():
1623 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001624 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001625 # Test the default behavior for static classes
1626 class C(object):
1627 def __getitem__(self, i):
1628 if 0 <= i < 10: return i
1629 raise IndexError
1630 c1 = C()
1631 c2 = C()
1632 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001633 verify(id(c1) != id(c2))
1634 hash(c1)
1635 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001636 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001637 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001638 verify(c1 != c2)
1639 verify(not c1 != c1)
1640 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001641 # Note that the module name appears in str/repr, and that varies
1642 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001643 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001645 verify(-1 not in c1)
1646 for i in range(10):
1647 verify(i in c1)
1648 verify(10 not in c1)
1649 # Test the default behavior for dynamic classes
1650 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001651 def __getitem__(self, i):
1652 if 0 <= i < 10: return i
1653 raise IndexError
1654 d1 = D()
1655 d2 = D()
1656 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001657 verify(id(d1) != id(d2))
1658 hash(d1)
1659 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001660 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001661 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001662 verify(d1 != d2)
1663 verify(not d1 != d1)
1664 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001665 # Note that the module name appears in str/repr, and that varies
1666 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001667 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001668 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001669 verify(-1 not in d1)
1670 for i in range(10):
1671 verify(i in d1)
1672 verify(10 not in d1)
1673 # Test overridden behavior for static classes
1674 class Proxy(object):
1675 def __init__(self, x):
1676 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001677 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001678 return not not self.x
1679 def __hash__(self):
1680 return hash(self.x)
1681 def __eq__(self, other):
1682 return self.x == other
1683 def __ne__(self, other):
1684 return self.x != other
1685 def __cmp__(self, other):
1686 return cmp(self.x, other.x)
1687 def __str__(self):
1688 return "Proxy:%s" % self.x
1689 def __repr__(self):
1690 return "Proxy(%r)" % self.x
1691 def __contains__(self, value):
1692 return value in self.x
1693 p0 = Proxy(0)
1694 p1 = Proxy(1)
1695 p_1 = Proxy(-1)
1696 verify(not p0)
1697 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001698 vereq(hash(p0), hash(0))
1699 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001700 verify(p0 != p1)
1701 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001702 vereq(not p0, p1)
1703 vereq(cmp(p0, p1), -1)
1704 vereq(cmp(p0, p0), 0)
1705 vereq(cmp(p0, p_1), 1)
1706 vereq(str(p0), "Proxy:0")
1707 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001708 p10 = Proxy(range(10))
1709 verify(-1 not in p10)
1710 for i in range(10):
1711 verify(i in p10)
1712 verify(10 not in p10)
1713 # Test overridden behavior for dynamic classes
1714 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001715 def __init__(self, x):
1716 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001717 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001718 return not not self.x
1719 def __hash__(self):
1720 return hash(self.x)
1721 def __eq__(self, other):
1722 return self.x == other
1723 def __ne__(self, other):
1724 return self.x != other
1725 def __cmp__(self, other):
1726 return cmp(self.x, other.x)
1727 def __str__(self):
1728 return "DProxy:%s" % self.x
1729 def __repr__(self):
1730 return "DProxy(%r)" % self.x
1731 def __contains__(self, value):
1732 return value in self.x
1733 p0 = DProxy(0)
1734 p1 = DProxy(1)
1735 p_1 = DProxy(-1)
1736 verify(not p0)
1737 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001738 vereq(hash(p0), hash(0))
1739 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001740 verify(p0 != p1)
1741 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001742 vereq(not p0, p1)
1743 vereq(cmp(p0, p1), -1)
1744 vereq(cmp(p0, p0), 0)
1745 vereq(cmp(p0, p_1), 1)
1746 vereq(str(p0), "DProxy:0")
1747 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001748 p10 = DProxy(range(10))
1749 verify(-1 not in p10)
1750 for i in range(10):
1751 verify(i in p10)
1752 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001753## # Safety test for __cmp__
1754## def unsafecmp(a, b):
1755## try:
1756## a.__class__.__cmp__(a, b)
1757## except TypeError:
1758## pass
1759## else:
1760## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1761## a.__class__, a, b)
1762## unsafecmp(u"123", "123")
1763## unsafecmp("123", u"123")
1764## unsafecmp(1, 1.0)
1765## unsafecmp(1.0, 1)
1766## unsafecmp(1, 1L)
1767## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001768
Neal Norwitz1a997502003-01-13 20:13:12 +00001769 class Letter(str):
1770 def __new__(cls, letter):
1771 if letter == 'EPS':
1772 return str.__new__(cls)
1773 return str.__new__(cls, letter)
1774 def __str__(self):
1775 if not self:
1776 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001777 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001778
1779 # sys.stdout needs to be the original to trigger the recursion bug
1780 import sys
1781 test_stdout = sys.stdout
1782 sys.stdout = get_original_stdout()
1783 try:
1784 # nothing should actually be printed, this should raise an exception
1785 print Letter('w')
1786 except RuntimeError:
1787 pass
1788 else:
1789 raise TestFailed, "expected a RuntimeError for print recursion"
1790 sys.stdout = test_stdout
1791
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001792def weakrefs():
1793 if verbose: print "Testing weak references..."
1794 import weakref
1795 class C(object):
1796 pass
1797 c = C()
1798 r = weakref.ref(c)
1799 verify(r() is c)
1800 del c
1801 verify(r() is None)
1802 del r
1803 class NoWeak(object):
1804 __slots__ = ['foo']
1805 no = NoWeak()
1806 try:
1807 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001808 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001809 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001810 else:
1811 verify(0, "weakref.ref(no) should be illegal")
1812 class Weak(object):
1813 __slots__ = ['foo', '__weakref__']
1814 yes = Weak()
1815 r = weakref.ref(yes)
1816 verify(r() is yes)
1817 del yes
1818 verify(r() is None)
1819 del r
1820
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001821def properties():
1822 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001823 class C(object):
1824 def getx(self):
1825 return self.__x
1826 def setx(self, value):
1827 self.__x = value
1828 def delx(self):
1829 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001830 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001831 a = C()
1832 verify(not hasattr(a, "x"))
1833 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001834 vereq(a._C__x, 42)
1835 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001836 del a.x
1837 verify(not hasattr(a, "x"))
1838 verify(not hasattr(a, "_C__x"))
1839 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001840 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001841 C.x.__delete__(a)
1842 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001843
Tim Peters66c1a522001-09-24 21:17:50 +00001844 raw = C.__dict__['x']
1845 verify(isinstance(raw, property))
1846
1847 attrs = dir(raw)
1848 verify("__doc__" in attrs)
1849 verify("fget" in attrs)
1850 verify("fset" in attrs)
1851 verify("fdel" in attrs)
1852
Guido van Rossum45704552001-10-08 16:35:45 +00001853 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001854 verify(raw.fget is C.__dict__['getx'])
1855 verify(raw.fset is C.__dict__['setx'])
1856 verify(raw.fdel is C.__dict__['delx'])
1857
1858 for attr in "__doc__", "fget", "fset", "fdel":
1859 try:
1860 setattr(raw, attr, 42)
Guido van Rossumb940e112007-01-10 16:19:56 +00001861 except TypeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001862 if str(msg).find('readonly') < 0:
1863 raise TestFailed("when setting readonly attr %r on a "
1864 "property, got unexpected TypeError "
1865 "msg %r" % (attr, str(msg)))
1866 else:
1867 raise TestFailed("expected TypeError from trying to set "
1868 "readonly %r attr on a property" % attr)
1869
Neal Norwitz673cd822002-10-18 16:33:13 +00001870 class D(object):
1871 __getitem__ = property(lambda s: 1/0)
1872
1873 d = D()
1874 try:
1875 for i in d:
1876 str(i)
1877 except ZeroDivisionError:
1878 pass
1879 else:
1880 raise TestFailed, "expected ZeroDivisionError from bad property"
1881
Georg Brandl533ff6f2006-03-08 18:09:27 +00001882 class E(object):
1883 def getter(self):
1884 "getter method"
1885 return 0
1886 def setter(self, value):
1887 "setter method"
1888 pass
1889 prop = property(getter)
1890 vereq(prop.__doc__, "getter method")
1891 prop2 = property(fset=setter)
1892 vereq(prop2.__doc__, None)
1893
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001894 # this segfaulted in 2.5b2
1895 try:
1896 import _testcapi
1897 except ImportError:
1898 pass
1899 else:
1900 class X(object):
1901 p = property(_testcapi.test_with_docstring)
1902
1903
Guido van Rossumc4a18802001-08-24 16:55:27 +00001904def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001905 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001906
1907 class A(object):
1908 def meth(self, a):
1909 return "A(%r)" % a
1910
Guido van Rossum45704552001-10-08 16:35:45 +00001911 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001912
1913 class B(A):
1914 def __init__(self):
1915 self.__super = super(B, self)
1916 def meth(self, a):
1917 return "B(%r)" % a + self.__super.meth(a)
1918
Guido van Rossum45704552001-10-08 16:35:45 +00001919 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001920
1921 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001922 def meth(self, a):
1923 return "C(%r)" % a + self.__super.meth(a)
1924 C._C__super = super(C)
1925
Guido van Rossum45704552001-10-08 16:35:45 +00001926 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001927
1928 class D(C, B):
1929 def meth(self, a):
1930 return "D(%r)" % a + super(D, self).meth(a)
1931
Guido van Rossum5b443c62001-12-03 15:38:28 +00001932 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1933
1934 # Test for subclassing super
1935
1936 class mysuper(super):
1937 def __init__(self, *args):
1938 return super(mysuper, self).__init__(*args)
1939
1940 class E(D):
1941 def meth(self, a):
1942 return "E(%r)" % a + mysuper(E, self).meth(a)
1943
1944 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1945
1946 class F(E):
1947 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00001948 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00001949 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1950 F._F__super = mysuper(F)
1951
1952 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1953
1954 # Make sure certain errors are raised
1955
1956 try:
1957 super(D, 42)
1958 except TypeError:
1959 pass
1960 else:
1961 raise TestFailed, "shouldn't allow super(D, 42)"
1962
1963 try:
1964 super(D, C())
1965 except TypeError:
1966 pass
1967 else:
1968 raise TestFailed, "shouldn't allow super(D, C())"
1969
1970 try:
1971 super(D).__get__(12)
1972 except TypeError:
1973 pass
1974 else:
1975 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1976
1977 try:
1978 super(D).__get__(C())
1979 except TypeError:
1980 pass
1981 else:
1982 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001983
Guido van Rossuma4541a32003-04-16 20:02:22 +00001984 # Make sure data descriptors can be overridden and accessed via super
1985 # (new feature in Python 2.3)
1986
1987 class DDbase(object):
1988 def getx(self): return 42
1989 x = property(getx)
1990
1991 class DDsub(DDbase):
1992 def getx(self): return "hello"
1993 x = property(getx)
1994
1995 dd = DDsub()
1996 vereq(dd.x, "hello")
1997 vereq(super(DDsub, dd).x, 42)
1998
Phillip J. Eby91a968a2004-03-25 02:19:34 +00001999 # Ensure that super() lookup of descriptor from classmethod
2000 # works (SF ID# 743627)
2001
2002 class Base(object):
2003 aProp = property(lambda self: "foo")
2004
2005 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002006 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002007 def test(klass):
2008 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002009
2010 veris(Sub.test(), Base.aProp)
2011
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 # Verify that super() doesn't allow keyword args
2013 try:
2014 super(Base, kw=1)
2015 except TypeError:
2016 pass
2017 else:
2018 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002019
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002020def inherits():
2021 if verbose: print "Testing inheritance from basic types..."
2022
2023 class hexint(int):
2024 def __repr__(self):
2025 return hex(self)
2026 def __add__(self, other):
2027 return hexint(int.__add__(self, other))
2028 # (Note that overriding __radd__ doesn't work,
2029 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002030 vereq(repr(hexint(7) + 9), "0x10")
2031 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002032 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002033 vereq(a, 12345)
2034 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002035 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002036 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002037 verify((+a).__class__ is int)
2038 verify((a >> 0).__class__ is int)
2039 verify((a << 0).__class__ is int)
2040 verify((hexint(0) << 12).__class__ is int)
2041 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002042
Guido van Rossume2a383d2007-01-15 16:59:06 +00002043 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002044 __slots__ = []
2045 def __str__(self):
2046 s = oct(self)
2047 if s[-1] == 'L':
2048 s = s[:-1]
2049 return s
2050 def __add__(self, other):
2051 return self.__class__(super(octlong, self).__add__(other))
2052 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002053 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002054 # (Note that overriding __radd__ here only seems to work
2055 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002056 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002057 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002058 vereq(a, 12345)
2059 vereq(int(a), 12345)
2060 vereq(hash(a), hash(12345))
2061 verify(int(a).__class__ is int)
2062 verify((+a).__class__ is int)
2063 verify((-a).__class__ is int)
2064 verify((-octlong(0)).__class__ is int)
2065 verify((a >> 0).__class__ is int)
2066 verify((a << 0).__class__ is int)
2067 verify((a - 0).__class__ is int)
2068 verify((a * 1).__class__ is int)
2069 verify((a ** 1).__class__ is int)
2070 verify((a // 1).__class__ is int)
2071 verify((1 * a).__class__ is int)
2072 verify((a | 0).__class__ is int)
2073 verify((a ^ 0).__class__ is int)
2074 verify((a & -1).__class__ is int)
2075 verify((octlong(0) << 12).__class__ is int)
2076 verify((octlong(0) >> 12).__class__ is int)
2077 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002078
2079 # Because octlong overrides __add__, we can't check the absence of +0
2080 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002081 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002082 pass
2083 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002084 verify((a + 0).__class__ is int)
2085 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002086
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002087 # Check that negative clones don't segfault
2088 a = longclone(-1)
2089 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002090 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002091
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002092 class precfloat(float):
2093 __slots__ = ['prec']
2094 def __init__(self, value=0.0, prec=12):
2095 self.prec = int(prec)
2096 float.__init__(value)
2097 def __repr__(self):
2098 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002099 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002100 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002101 vereq(a, 12345.0)
2102 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002103 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002104 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002105 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002106
Tim Peters2400fa42001-09-12 19:12:49 +00002107 class madcomplex(complex):
2108 def __repr__(self):
2109 return "%.17gj%+.17g" % (self.imag, self.real)
2110 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002111 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002112 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002113 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002114 vereq(a, base)
2115 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002116 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002117 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002118 vereq(repr(a), "4j-3")
2119 vereq(a, base)
2120 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002121 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002122 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002123 veris((+a).__class__, complex)
2124 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002125 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002126 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002127 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002128 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002129 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002130 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002131 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002132
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002133 class madtuple(tuple):
2134 _rev = None
2135 def rev(self):
2136 if self._rev is not None:
2137 return self._rev
2138 L = list(self)
2139 L.reverse()
2140 self._rev = self.__class__(L)
2141 return self._rev
2142 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002143 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2144 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2145 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002146 for i in range(512):
2147 t = madtuple(range(i))
2148 u = t.rev()
2149 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002150 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002151 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002152 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002153 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002154 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002155 verify(a[:].__class__ is tuple)
2156 verify((a * 1).__class__ is tuple)
2157 verify((a * 0).__class__ is tuple)
2158 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002159 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002160 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002161 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002162 verify((a + a).__class__ is tuple)
2163 verify((a * 0).__class__ is tuple)
2164 verify((a * 1).__class__ is tuple)
2165 verify((a * 2).__class__ is tuple)
2166 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002167
2168 class madstring(str):
2169 _rev = None
2170 def rev(self):
2171 if self._rev is not None:
2172 return self._rev
2173 L = list(self)
2174 L.reverse()
2175 self._rev = self.__class__("".join(L))
2176 return self._rev
2177 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2179 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2180 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002181 for i in range(256):
2182 s = madstring("".join(map(chr, range(i))))
2183 t = s.rev()
2184 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002185 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002186 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002188 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002189
Tim Peters8fa5dd02001-09-12 02:18:30 +00002190 base = "\x00" * 5
2191 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002192 vereq(s, base)
2193 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002194 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002195 vereq(hash(s), hash(base))
2196 vereq({s: 1}[base], 1)
2197 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002198 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002199 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002200 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002201 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002202 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002203 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002204 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002205 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002206 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002207 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002208 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002209 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002210 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002211 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002212 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002213 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002214 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002215 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002216 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002217 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002218 identitytab = ''.join([chr(i) for i in range(256)])
2219 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002220 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002221 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002222 vereq(s.translate(identitytab, "x"), base)
2223 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002224 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002225 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002226 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002227 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002228 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002229 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002230 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002231 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002232 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002233 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002234
Guido van Rossum91ee7982001-08-30 20:52:40 +00002235 class madunicode(unicode):
2236 _rev = None
2237 def rev(self):
2238 if self._rev is not None:
2239 return self._rev
2240 L = list(self)
2241 L.reverse()
2242 self._rev = self.__class__(u"".join(L))
2243 return self._rev
2244 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002245 vereq(u, u"ABCDEF")
2246 vereq(u.rev(), madunicode(u"FEDCBA"))
2247 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002248 base = u"12345"
2249 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002250 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002251 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002252 vereq(hash(u), hash(base))
2253 vereq({u: 1}[base], 1)
2254 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002255 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002257 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002258 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002259 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002261 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002263 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002265 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002267 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002269 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002271 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002273 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002275 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002277 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002279 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002281 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002283 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002285 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002287 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002289 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002291 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002292 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002293
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002294 class sublist(list):
2295 pass
2296 a = sublist(range(5))
2297 vereq(a, range(5))
2298 a.append("hello")
2299 vereq(a, range(5) + ["hello"])
2300 a[5] = 5
2301 vereq(a, range(6))
2302 a.extend(range(6, 20))
2303 vereq(a, range(20))
2304 a[-5:] = []
2305 vereq(a, range(15))
2306 del a[10:15]
2307 vereq(len(a), 10)
2308 vereq(a, range(10))
2309 vereq(list(a), range(10))
2310 vereq(a[0], 0)
2311 vereq(a[9], 9)
2312 vereq(a[-10], 0)
2313 vereq(a[-1], 9)
2314 vereq(a[:5], range(5))
2315
Tim Peters59c9a642001-09-13 05:38:56 +00002316 class CountedInput(file):
2317 """Counts lines read by self.readline().
2318
2319 self.lineno is the 0-based ordinal of the last line read, up to
2320 a maximum of one greater than the number of lines in the file.
2321
2322 self.ateof is true if and only if the final "" line has been read,
2323 at which point self.lineno stops incrementing, and further calls
2324 to readline() continue to return "".
2325 """
2326
2327 lineno = 0
2328 ateof = 0
2329 def readline(self):
2330 if self.ateof:
2331 return ""
2332 s = file.readline(self)
2333 # Next line works too.
2334 # s = super(CountedInput, self).readline()
2335 self.lineno += 1
2336 if s == "":
2337 self.ateof = 1
2338 return s
2339
Alex Martelli01c77c62006-08-24 02:58:11 +00002340 f = open(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002341 lines = ['a\n', 'b\n', 'c\n']
2342 try:
2343 f.writelines(lines)
2344 f.close()
2345 f = CountedInput(TESTFN)
2346 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2347 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(expected, got)
2349 vereq(f.lineno, i)
2350 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002351 f.close()
2352 finally:
2353 try:
2354 f.close()
2355 except:
2356 pass
2357 try:
2358 import os
2359 os.unlink(TESTFN)
2360 except:
2361 pass
2362
Tim Peters808b94e2001-09-13 19:33:07 +00002363def keywords():
2364 if verbose:
2365 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002366 vereq(int(x=1), 1)
2367 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002368 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002369 vereq(complex(imag=42, real=666), complex(666, 42))
2370 vereq(str(object=500), '500')
2371 vereq(unicode(string='abc', errors='strict'), u'abc')
2372 vereq(tuple(sequence=range(3)), (0, 1, 2))
2373 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002374 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002375
Guido van Rossume2a383d2007-01-15 16:59:06 +00002376 for constructor in (int, float, int, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002377 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002378 try:
2379 constructor(bogus_keyword_arg=1)
2380 except TypeError:
2381 pass
2382 else:
2383 raise TestFailed("expected TypeError from bogus keyword "
2384 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002385
Tim Peters8fa45672001-09-13 21:01:29 +00002386def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002387 # XXX This test is disabled because rexec is not deemed safe
2388 return
Tim Peters8fa45672001-09-13 21:01:29 +00002389 import rexec
2390 if verbose:
2391 print "Testing interaction with restricted execution ..."
2392
2393 sandbox = rexec.RExec()
2394
2395 code1 = """f = open(%r, 'w')""" % TESTFN
Alex Martelli01c77c62006-08-24 02:58:11 +00002396 code2 = """f = open(%r, 'w')""" % TESTFN
Tim Peters8fa45672001-09-13 21:01:29 +00002397 code3 = """\
2398f = open(%r)
2399t = type(f) # a sneaky way to get the file() constructor
2400f.close()
2401f = t(%r, 'w') # rexec can't catch this by itself
2402""" % (TESTFN, TESTFN)
2403
2404 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2405 f.close()
2406
2407 try:
2408 for code in code1, code2, code3:
2409 try:
2410 sandbox.r_exec(code)
Guido van Rossumb940e112007-01-10 16:19:56 +00002411 except IOError as msg:
Tim Peters8fa45672001-09-13 21:01:29 +00002412 if str(msg).find("restricted") >= 0:
2413 outcome = "OK"
2414 else:
2415 outcome = "got an exception, but not an expected one"
2416 else:
2417 outcome = "expected a restricted-execution exception"
2418
2419 if outcome != "OK":
2420 raise TestFailed("%s, in %r" % (outcome, code))
2421
2422 finally:
2423 try:
2424 import os
2425 os.unlink(TESTFN)
2426 except:
2427 pass
2428
Tim Peters0ab085c2001-09-14 00:25:33 +00002429def str_subclass_as_dict_key():
2430 if verbose:
2431 print "Testing a str subclass used as dict key .."
2432
2433 class cistr(str):
2434 """Sublcass of str that computes __eq__ case-insensitively.
2435
2436 Also computes a hash code of the string in canonical form.
2437 """
2438
2439 def __init__(self, value):
2440 self.canonical = value.lower()
2441 self.hashcode = hash(self.canonical)
2442
2443 def __eq__(self, other):
2444 if not isinstance(other, cistr):
2445 other = cistr(other)
2446 return self.canonical == other.canonical
2447
2448 def __hash__(self):
2449 return self.hashcode
2450
Guido van Rossum45704552001-10-08 16:35:45 +00002451 vereq(cistr('ABC'), 'abc')
2452 vereq('aBc', cistr('ABC'))
2453 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002454
2455 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002456 vereq(d[cistr('one')], 1)
2457 vereq(d[cistr('tWo')], 2)
2458 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002459 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002460 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002461
Guido van Rossumab3b0342001-09-18 20:38:53 +00002462def classic_comparisons():
2463 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002464 class classic:
2465 pass
2466 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002467 if verbose: print " (base = %s)" % base
2468 class C(base):
2469 def __init__(self, value):
2470 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002471 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002472 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002473 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002474 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002475 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002476 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002477 def __ne__(self, other):
2478 if isinstance(other, C):
2479 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002480 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002481 return self.value != other
2482 return NotImplemented
2483 def __lt__(self, other):
2484 if isinstance(other, C):
2485 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002486 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002487 return self.value < other
2488 return NotImplemented
2489 def __le__(self, other):
2490 if isinstance(other, C):
2491 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002492 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002493 return self.value <= other
2494 return NotImplemented
2495 def __gt__(self, other):
2496 if isinstance(other, C):
2497 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002498 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002499 return self.value > other
2500 return NotImplemented
2501 def __ge__(self, other):
2502 if isinstance(other, C):
2503 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002504 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002505 return self.value >= other
2506 return NotImplemented
2507
Guido van Rossumab3b0342001-09-18 20:38:53 +00002508 c1 = C(1)
2509 c2 = C(2)
2510 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002511 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002512 c = {1: c1, 2: c2, 3: c3}
2513 for x in 1, 2, 3:
2514 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002515 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002516 for op in "<", "<=", "==", "!=", ">", ">=":
2517 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2518 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002519 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2520 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002521
Guido van Rossum0639f592001-09-18 21:06:04 +00002522def rich_comparisons():
2523 if verbose:
2524 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002525 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002526 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002527 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002528 vereq(z, 1+0j)
2529 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002530 class ZZ(complex):
2531 def __eq__(self, other):
2532 try:
2533 return abs(self - other) <= 1e-6
2534 except:
2535 return NotImplemented
2536 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002537 vereq(zz, 1+0j)
2538 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002539
Guido van Rossum0639f592001-09-18 21:06:04 +00002540 class classic:
2541 pass
2542 for base in (classic, int, object, list):
2543 if verbose: print " (base = %s)" % base
2544 class C(base):
2545 def __init__(self, value):
2546 self.value = int(value)
2547 def __cmp__(self, other):
2548 raise TestFailed, "shouldn't call __cmp__"
2549 def __eq__(self, other):
2550 if isinstance(other, C):
2551 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002552 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002553 return self.value == other
2554 return NotImplemented
2555 def __ne__(self, other):
2556 if isinstance(other, C):
2557 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002558 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002559 return self.value != other
2560 return NotImplemented
2561 def __lt__(self, other):
2562 if isinstance(other, C):
2563 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002564 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002565 return self.value < other
2566 return NotImplemented
2567 def __le__(self, other):
2568 if isinstance(other, C):
2569 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002570 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002571 return self.value <= other
2572 return NotImplemented
2573 def __gt__(self, other):
2574 if isinstance(other, C):
2575 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002576 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002577 return self.value > other
2578 return NotImplemented
2579 def __ge__(self, other):
2580 if isinstance(other, C):
2581 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002582 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002583 return self.value >= other
2584 return NotImplemented
2585 c1 = C(1)
2586 c2 = C(2)
2587 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002588 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002589 c = {1: c1, 2: c2, 3: c3}
2590 for x in 1, 2, 3:
2591 for y in 1, 2, 3:
2592 for op in "<", "<=", "==", "!=", ">", ">=":
2593 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2594 "x=%d, y=%d" % (x, y))
2595 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2596 "x=%d, y=%d" % (x, y))
2597 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2598 "x=%d, y=%d" % (x, y))
2599
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002600def descrdoc():
2601 if verbose: print "Testing descriptor doc strings..."
2602 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002603 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002604 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002605 check(file.name, "file name") # member descriptor
2606
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002607def setclass():
2608 if verbose: print "Testing __class__ assignment..."
2609 class C(object): pass
2610 class D(object): pass
2611 class E(object): pass
2612 class F(D, E): pass
2613 for cls in C, D, E, F:
2614 for cls2 in C, D, E, F:
2615 x = cls()
2616 x.__class__ = cls2
2617 verify(x.__class__ is cls2)
2618 x.__class__ = cls
2619 verify(x.__class__ is cls)
2620 def cant(x, C):
2621 try:
2622 x.__class__ = C
2623 except TypeError:
2624 pass
2625 else:
2626 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002627 try:
2628 delattr(x, "__class__")
2629 except TypeError:
2630 pass
2631 else:
2632 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002633 cant(C(), list)
2634 cant(list(), C)
2635 cant(C(), 1)
2636 cant(C(), object)
2637 cant(object(), list)
2638 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002639 class Int(int): __slots__ = []
2640 cant(2, Int)
2641 cant(Int(), int)
2642 cant(True, int)
2643 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002644 o = object()
2645 cant(o, type(1))
2646 cant(o, type(None))
2647 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002648
Guido van Rossum6661be32001-10-26 04:26:12 +00002649def setdict():
2650 if verbose: print "Testing __dict__ assignment..."
2651 class C(object): pass
2652 a = C()
2653 a.__dict__ = {'b': 1}
2654 vereq(a.b, 1)
2655 def cant(x, dict):
2656 try:
2657 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002658 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002659 pass
2660 else:
2661 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2662 cant(a, None)
2663 cant(a, [])
2664 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002665 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002666 # Classes don't allow __dict__ assignment
2667 cant(C, {})
2668
Guido van Rossum3926a632001-09-25 16:25:58 +00002669def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002670 if verbose:
2671 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002672 import pickle
2673 try:
2674 import cPickle
2675 except ImportError:
2676 cPickle = None
Guido van Rossum3926a632001-09-25 16:25:58 +00002677
2678 def sorteditems(d):
2679 L = d.items()
2680 L.sort()
2681 return L
2682
2683 global C
2684 class C(object):
2685 def __init__(self, a, b):
2686 super(C, self).__init__()
2687 self.a = a
2688 self.b = b
2689 def __repr__(self):
2690 return "C(%r, %r)" % (self.a, self.b)
2691
2692 global C1
2693 class C1(list):
2694 def __new__(cls, a, b):
2695 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002696 def __getnewargs__(self):
2697 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002698 def __init__(self, a, b):
2699 self.a = a
2700 self.b = b
2701 def __repr__(self):
2702 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2703
2704 global C2
2705 class C2(int):
2706 def __new__(cls, a, b, val=0):
2707 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002708 def __getnewargs__(self):
2709 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002710 def __init__(self, a, b, val=0):
2711 self.a = a
2712 self.b = b
2713 def __repr__(self):
2714 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2715
Guido van Rossum90c45142001-11-24 21:07:01 +00002716 global C3
2717 class C3(object):
2718 def __init__(self, foo):
2719 self.foo = foo
2720 def __getstate__(self):
2721 return self.foo
2722 def __setstate__(self, foo):
2723 self.foo = foo
2724
2725 global C4classic, C4
2726 class C4classic: # classic
2727 pass
2728 class C4(C4classic, object): # mixed inheritance
2729 pass
2730
Guido van Rossum3926a632001-09-25 16:25:58 +00002731 for p in pickle, cPickle:
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002732 if p is None:
2733 continue # cPickle not found -- skip it
Guido van Rossum3926a632001-09-25 16:25:58 +00002734 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002735 if verbose:
2736 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002737
2738 for cls in C, C1, C2:
2739 s = p.dumps(cls, bin)
2740 cls2 = p.loads(s)
2741 verify(cls2 is cls)
2742
2743 a = C1(1, 2); a.append(42); a.append(24)
2744 b = C2("hello", "world", 42)
2745 s = p.dumps((a, b), bin)
2746 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002747 vereq(x.__class__, a.__class__)
2748 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2749 vereq(y.__class__, b.__class__)
2750 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002751 vereq(repr(x), repr(a))
2752 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002753 if verbose:
2754 print "a = x =", a
2755 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002756 # Test for __getstate__ and __setstate__ on new style class
2757 u = C3(42)
2758 s = p.dumps(u, bin)
2759 v = p.loads(s)
2760 veris(u.__class__, v.__class__)
2761 vereq(u.foo, v.foo)
2762 # Test for picklability of hybrid class
2763 u = C4()
2764 u.foo = 42
2765 s = p.dumps(u, bin)
2766 v = p.loads(s)
2767 veris(u.__class__, v.__class__)
2768 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002769
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002770 # Testing copy.deepcopy()
2771 if verbose:
2772 print "deepcopy"
2773 import copy
2774 for cls in C, C1, C2:
2775 cls2 = copy.deepcopy(cls)
2776 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002777
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002778 a = C1(1, 2); a.append(42); a.append(24)
2779 b = C2("hello", "world", 42)
2780 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002781 vereq(x.__class__, a.__class__)
2782 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2783 vereq(y.__class__, b.__class__)
2784 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002785 vereq(repr(x), repr(a))
2786 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002787 if verbose:
2788 print "a = x =", a
2789 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002790
Guido van Rossum8c842552002-03-14 23:05:54 +00002791def pickleslots():
2792 if verbose: print "Testing pickling of classes with __slots__ ..."
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002793 import pickle, pickle as cPickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002794 # Pickling of classes with __slots__ but without __getstate__ should fail
2795 global B, C, D, E
2796 class B(object):
2797 pass
2798 for base in [object, B]:
2799 class C(base):
2800 __slots__ = ['a']
2801 class D(C):
2802 pass
2803 try:
2804 pickle.dumps(C())
2805 except TypeError:
2806 pass
2807 else:
2808 raise TestFailed, "should fail: pickle C instance - %s" % base
2809 try:
2810 cPickle.dumps(C())
2811 except TypeError:
2812 pass
2813 else:
2814 raise TestFailed, "should fail: cPickle C instance - %s" % base
2815 try:
2816 pickle.dumps(C())
2817 except TypeError:
2818 pass
2819 else:
2820 raise TestFailed, "should fail: pickle D instance - %s" % base
2821 try:
2822 cPickle.dumps(D())
2823 except TypeError:
2824 pass
2825 else:
2826 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002827 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002828 class C(base):
2829 __slots__ = ['a']
2830 def __getstate__(self):
2831 try:
2832 d = self.__dict__.copy()
2833 except AttributeError:
2834 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002835 for cls in self.__class__.__mro__:
2836 for sn in cls.__dict__.get('__slots__', ()):
2837 try:
2838 d[sn] = getattr(self, sn)
2839 except AttributeError:
2840 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002841 return d
2842 def __setstate__(self, d):
2843 for k, v in d.items():
2844 setattr(self, k, v)
2845 class D(C):
2846 pass
2847 # Now it should work
2848 x = C()
2849 y = pickle.loads(pickle.dumps(x))
2850 vereq(hasattr(y, 'a'), 0)
2851 y = cPickle.loads(cPickle.dumps(x))
2852 vereq(hasattr(y, 'a'), 0)
2853 x.a = 42
2854 y = pickle.loads(pickle.dumps(x))
2855 vereq(y.a, 42)
2856 y = cPickle.loads(cPickle.dumps(x))
2857 vereq(y.a, 42)
2858 x = D()
2859 x.a = 42
2860 x.b = 100
2861 y = pickle.loads(pickle.dumps(x))
2862 vereq(y.a + y.b, 142)
2863 y = cPickle.loads(cPickle.dumps(x))
2864 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002865 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002866 class E(C):
2867 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002868 x = E()
2869 x.a = 42
2870 x.b = "foo"
2871 y = pickle.loads(pickle.dumps(x))
2872 vereq(y.a, x.a)
2873 vereq(y.b, x.b)
2874 y = cPickle.loads(cPickle.dumps(x))
2875 vereq(y.a, x.a)
2876 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002877
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002878def copies():
2879 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2880 import copy
2881 class C(object):
2882 pass
2883
2884 a = C()
2885 a.foo = 12
2886 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002887 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002888
2889 a.bar = [1,2,3]
2890 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002891 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002892 verify(c.bar is a.bar)
2893
2894 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002895 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002896 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002897 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002898
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002899def binopoverride():
2900 if verbose: print "Testing overrides of binary operations..."
2901 class I(int):
2902 def __repr__(self):
2903 return "I(%r)" % int(self)
2904 def __add__(self, other):
2905 return I(int(self) + int(other))
2906 __radd__ = __add__
2907 def __pow__(self, other, mod=None):
2908 if mod is None:
2909 return I(pow(int(self), int(other)))
2910 else:
2911 return I(pow(int(self), int(other), int(mod)))
2912 def __rpow__(self, other, mod=None):
2913 if mod is None:
2914 return I(pow(int(other), int(self), mod))
2915 else:
2916 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002917
Walter Dörwald70a6b492004-02-12 17:35:32 +00002918 vereq(repr(I(1) + I(2)), "I(3)")
2919 vereq(repr(I(1) + 2), "I(3)")
2920 vereq(repr(1 + I(2)), "I(3)")
2921 vereq(repr(I(2) ** I(3)), "I(8)")
2922 vereq(repr(2 ** I(3)), "I(8)")
2923 vereq(repr(I(2) ** 3), "I(8)")
2924 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002925 class S(str):
2926 def __eq__(self, other):
2927 return self.lower() == other.lower()
2928
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002929def subclasspropagation():
2930 if verbose: print "Testing propagation of slot functions to subclasses..."
2931 class A(object):
2932 pass
2933 class B(A):
2934 pass
2935 class C(A):
2936 pass
2937 class D(B, C):
2938 pass
2939 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002940 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002941 A.__hash__ = lambda self: 42
2942 vereq(hash(d), 42)
2943 C.__hash__ = lambda self: 314
2944 vereq(hash(d), 314)
2945 B.__hash__ = lambda self: 144
2946 vereq(hash(d), 144)
2947 D.__hash__ = lambda self: 100
2948 vereq(hash(d), 100)
2949 del D.__hash__
2950 vereq(hash(d), 144)
2951 del B.__hash__
2952 vereq(hash(d), 314)
2953 del C.__hash__
2954 vereq(hash(d), 42)
2955 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002956 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002957 d.foo = 42
2958 d.bar = 42
2959 vereq(d.foo, 42)
2960 vereq(d.bar, 42)
2961 def __getattribute__(self, name):
2962 if name == "foo":
2963 return 24
2964 return object.__getattribute__(self, name)
2965 A.__getattribute__ = __getattribute__
2966 vereq(d.foo, 24)
2967 vereq(d.bar, 42)
2968 def __getattr__(self, name):
2969 if name in ("spam", "foo", "bar"):
2970 return "hello"
2971 raise AttributeError, name
2972 B.__getattr__ = __getattr__
2973 vereq(d.spam, "hello")
2974 vereq(d.foo, 24)
2975 vereq(d.bar, 42)
2976 del A.__getattribute__
2977 vereq(d.foo, 42)
2978 del d.foo
2979 vereq(d.foo, "hello")
2980 vereq(d.bar, 42)
2981 del B.__getattr__
2982 try:
2983 d.foo
2984 except AttributeError:
2985 pass
2986 else:
2987 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002988
Guido van Rossume7f3e242002-06-14 02:35:45 +00002989 # Test a nasty bug in recurse_down_subclasses()
2990 import gc
2991 class A(object):
2992 pass
2993 class B(A):
2994 pass
2995 del B
2996 gc.collect()
2997 A.__setitem__ = lambda *a: None # crash
2998
Tim Petersfc57ccb2001-10-12 02:38:24 +00002999def buffer_inherit():
3000 import binascii
3001 # SF bug [#470040] ParseTuple t# vs subclasses.
3002 if verbose:
3003 print "Testing that buffer interface is inherited ..."
3004
3005 class MyStr(str):
3006 pass
3007 base = 'abc'
3008 m = MyStr(base)
3009 # b2a_hex uses the buffer interface to get its argument's value, via
3010 # PyArg_ParseTuple 't#' code.
3011 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3012
3013 # It's not clear that unicode will continue to support the character
3014 # buffer interface, and this test will fail if that's taken away.
3015 class MyUni(unicode):
3016 pass
3017 base = u'abc'
3018 m = MyUni(base)
3019 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3020
3021 class MyInt(int):
3022 pass
3023 m = MyInt(42)
3024 try:
3025 binascii.b2a_hex(m)
3026 raise TestFailed('subclass of int should not have a buffer interface')
3027 except TypeError:
3028 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003029
Tim Petersc9933152001-10-16 20:18:24 +00003030def str_of_str_subclass():
3031 import binascii
3032 import cStringIO
3033
3034 if verbose:
3035 print "Testing __str__ defined in subclass of str ..."
3036
3037 class octetstring(str):
3038 def __str__(self):
3039 return binascii.b2a_hex(self)
3040 def __repr__(self):
3041 return self + " repr"
3042
3043 o = octetstring('A')
3044 vereq(type(o), octetstring)
3045 vereq(type(str(o)), str)
3046 vereq(type(repr(o)), str)
3047 vereq(ord(o), 0x41)
3048 vereq(str(o), '41')
3049 vereq(repr(o), 'A repr')
3050 vereq(o.__str__(), '41')
3051 vereq(o.__repr__(), 'A repr')
3052
3053 capture = cStringIO.StringIO()
3054 # Calling str() or not exercises different internal paths.
3055 print >> capture, o
3056 print >> capture, str(o)
3057 vereq(capture.getvalue(), '41\n41\n')
3058 capture.close()
3059
Guido van Rossumc8e56452001-10-22 00:43:43 +00003060def kwdargs():
3061 if verbose: print "Testing keyword arguments to __init__, __call__..."
3062 def f(a): return a
3063 vereq(f.__call__(a=42), 42)
3064 a = []
3065 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003066 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003067
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003068def recursive__call__():
3069 if verbose: print ("Testing recursive __call__() by setting to instance of "
3070 "class ...")
3071 class A(object):
3072 pass
3073
3074 A.__call__ = A()
3075 try:
3076 A()()
3077 except RuntimeError:
3078 pass
3079 else:
3080 raise TestFailed("Recursion limit should have been reached for "
3081 "__call__()")
3082
Guido van Rossumed87ad82001-10-30 02:33:02 +00003083def delhook():
3084 if verbose: print "Testing __del__ hook..."
3085 log = []
3086 class C(object):
3087 def __del__(self):
3088 log.append(1)
3089 c = C()
3090 vereq(log, [])
3091 del c
3092 vereq(log, [1])
3093
Guido van Rossum29d26062001-12-11 04:37:34 +00003094 class D(object): pass
3095 d = D()
3096 try: del d[0]
3097 except TypeError: pass
3098 else: raise TestFailed, "invalid del() didn't raise TypeError"
3099
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003100def hashinherit():
3101 if verbose: print "Testing hash of mutable subclasses..."
3102
3103 class mydict(dict):
3104 pass
3105 d = mydict()
3106 try:
3107 hash(d)
3108 except TypeError:
3109 pass
3110 else:
3111 raise TestFailed, "hash() of dict subclass should fail"
3112
3113 class mylist(list):
3114 pass
3115 d = mylist()
3116 try:
3117 hash(d)
3118 except TypeError:
3119 pass
3120 else:
3121 raise TestFailed, "hash() of list subclass should fail"
3122
Guido van Rossum29d26062001-12-11 04:37:34 +00003123def strops():
3124 try: 'a' + 5
3125 except TypeError: pass
3126 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3127
3128 try: ''.split('')
3129 except ValueError: pass
3130 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3131
3132 try: ''.join([0])
3133 except TypeError: pass
3134 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3135
3136 try: ''.rindex('5')
3137 except ValueError: pass
3138 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3139
Guido van Rossum29d26062001-12-11 04:37:34 +00003140 try: '%(n)s' % None
3141 except TypeError: pass
3142 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3143
3144 try: '%(n' % {}
3145 except ValueError: pass
3146 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3147
3148 try: '%*s' % ('abc')
3149 except TypeError: pass
3150 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3151
3152 try: '%*.*s' % ('abc', 5)
3153 except TypeError: pass
3154 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3155
3156 try: '%s' % (1, 2)
3157 except TypeError: pass
3158 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3159
3160 try: '%' % None
3161 except ValueError: pass
3162 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3163
3164 vereq('534253'.isdigit(), 1)
3165 vereq('534253x'.isdigit(), 0)
3166 vereq('%c' % 5, '\x05')
3167 vereq('%c' % '5', '5')
3168
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003169def deepcopyrecursive():
3170 if verbose: print "Testing deepcopy of recursive objects..."
3171 class Node:
3172 pass
3173 a = Node()
3174 b = Node()
3175 a.b = b
3176 b.a = a
3177 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003178
Guido van Rossumd7035672002-03-12 20:43:31 +00003179def modules():
3180 if verbose: print "Testing uninitialized module objects..."
3181 from types import ModuleType as M
3182 m = M.__new__(M)
3183 str(m)
3184 vereq(hasattr(m, "__name__"), 0)
3185 vereq(hasattr(m, "__file__"), 0)
3186 vereq(hasattr(m, "foo"), 0)
3187 vereq(m.__dict__, None)
3188 m.foo = 1
3189 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003190
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003191def dictproxyiterkeys():
3192 class C(object):
3193 def meth(self):
3194 pass
3195 if verbose: print "Testing dict-proxy iterkeys..."
3196 keys = [ key for key in C.__dict__.iterkeys() ]
3197 keys.sort()
3198 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3199
3200def dictproxyitervalues():
3201 class C(object):
3202 def meth(self):
3203 pass
3204 if verbose: print "Testing dict-proxy itervalues..."
3205 values = [ values for values in C.__dict__.itervalues() ]
3206 vereq(len(values), 5)
3207
3208def dictproxyiteritems():
3209 class C(object):
3210 def meth(self):
3211 pass
3212 if verbose: print "Testing dict-proxy iteritems..."
3213 keys = [ key for (key, value) in C.__dict__.iteritems() ]
3214 keys.sort()
3215 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3216
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003217def funnynew():
3218 if verbose: print "Testing __new__ returning something unexpected..."
3219 class C(object):
3220 def __new__(cls, arg):
3221 if isinstance(arg, str): return [1, 2, 3]
3222 elif isinstance(arg, int): return object.__new__(D)
3223 else: return object.__new__(cls)
3224 class D(C):
3225 def __init__(self, arg):
3226 self.foo = arg
3227 vereq(C("1"), [1, 2, 3])
3228 vereq(D("1"), [1, 2, 3])
3229 d = D(None)
3230 veris(d.foo, None)
3231 d = C(1)
3232 vereq(isinstance(d, D), True)
3233 vereq(d.foo, 1)
3234 d = D(1)
3235 vereq(isinstance(d, D), True)
3236 vereq(d.foo, 1)
3237
Guido van Rossume8fc6402002-04-16 16:44:51 +00003238def imulbug():
3239 # SF bug 544647
3240 if verbose: print "Testing for __imul__ problems..."
3241 class C(object):
3242 def __imul__(self, other):
3243 return (self, other)
3244 x = C()
3245 y = x
3246 y *= 1.0
3247 vereq(y, (x, 1.0))
3248 y = x
3249 y *= 2
3250 vereq(y, (x, 2))
3251 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003252 y *= 3
3253 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003254 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003255 y *= 1<<100
3256 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003257 y = x
3258 y *= None
3259 vereq(y, (x, None))
3260 y = x
3261 y *= "foo"
3262 vereq(y, (x, "foo"))
3263
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003264def docdescriptor():
3265 # SF bug 542984
3266 if verbose: print "Testing __doc__ descriptor..."
3267 class DocDescr(object):
3268 def __get__(self, object, otype):
3269 if object:
3270 object = object.__class__.__name__ + ' instance'
3271 if otype:
3272 otype = otype.__name__
3273 return 'object=%s; type=%s' % (object, otype)
3274 class OldClass:
3275 __doc__ = DocDescr()
3276 class NewClass(object):
3277 __doc__ = DocDescr()
3278 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3279 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3280 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3281 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3282
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003283def copy_setstate():
3284 if verbose:
3285 print "Testing that copy.*copy() correctly uses __setstate__..."
3286 import copy
3287 class C(object):
3288 def __init__(self, foo=None):
3289 self.foo = foo
3290 self.__foo = foo
3291 def setfoo(self, foo=None):
3292 self.foo = foo
3293 def getfoo(self):
3294 return self.__foo
3295 def __getstate__(self):
3296 return [self.foo]
3297 def __setstate__(self, lst):
3298 assert len(lst) == 1
3299 self.__foo = self.foo = lst[0]
3300 a = C(42)
3301 a.setfoo(24)
3302 vereq(a.foo, 24)
3303 vereq(a.getfoo(), 42)
3304 b = copy.copy(a)
3305 vereq(b.foo, 24)
3306 vereq(b.getfoo(), 24)
3307 b = copy.deepcopy(a)
3308 vereq(b.foo, 24)
3309 vereq(b.getfoo(), 24)
3310
Guido van Rossum09638c12002-06-13 19:17:46 +00003311def slices():
3312 if verbose:
3313 print "Testing cases with slices and overridden __getitem__ ..."
3314 # Strings
3315 vereq("hello"[:4], "hell")
3316 vereq("hello"[slice(4)], "hell")
3317 vereq(str.__getitem__("hello", slice(4)), "hell")
3318 class S(str):
3319 def __getitem__(self, x):
3320 return str.__getitem__(self, x)
3321 vereq(S("hello")[:4], "hell")
3322 vereq(S("hello")[slice(4)], "hell")
3323 vereq(S("hello").__getitem__(slice(4)), "hell")
3324 # Tuples
3325 vereq((1,2,3)[:2], (1,2))
3326 vereq((1,2,3)[slice(2)], (1,2))
3327 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3328 class T(tuple):
3329 def __getitem__(self, x):
3330 return tuple.__getitem__(self, x)
3331 vereq(T((1,2,3))[:2], (1,2))
3332 vereq(T((1,2,3))[slice(2)], (1,2))
3333 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3334 # Lists
3335 vereq([1,2,3][:2], [1,2])
3336 vereq([1,2,3][slice(2)], [1,2])
3337 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3338 class L(list):
3339 def __getitem__(self, x):
3340 return list.__getitem__(self, x)
3341 vereq(L([1,2,3])[:2], [1,2])
3342 vereq(L([1,2,3])[slice(2)], [1,2])
3343 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3344 # Now do lists and __setitem__
3345 a = L([1,2,3])
3346 a[slice(1, 3)] = [3,2]
3347 vereq(a, [1,3,2])
3348 a[slice(0, 2, 1)] = [3,1]
3349 vereq(a, [3,1,2])
3350 a.__setitem__(slice(1, 3), [2,1])
3351 vereq(a, [3,2,1])
3352 a.__setitem__(slice(0, 2, 1), [2,3])
3353 vereq(a, [2,3,1])
3354
Tim Peters2484aae2002-07-11 06:56:07 +00003355def subtype_resurrection():
3356 if verbose:
Tim Peters45228ca2002-07-11 07:09:42 +00003357 print "Testing resurrection of new-style instance..."
Tim Peters2484aae2002-07-11 06:56:07 +00003358
3359 class C(object):
3360 container = []
3361
3362 def __del__(self):
3363 # resurrect the instance
3364 C.container.append(self)
3365
3366 c = C()
3367 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003368 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003369 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003370 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003371
3372 # If that didn't blow up, it's also interesting to see whether clearing
3373 # the last container slot works: that will attempt to delete c again,
3374 # which will cause c to get appended back to the container again "during"
3375 # the del.
3376 del C.container[-1]
3377 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003378 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003379
Tim Peters14cb1e12002-07-11 18:26:21 +00003380 # Make c mortal again, so that the test framework with -l doesn't report
3381 # it as a leak.
3382 del C.__del__
3383
Guido van Rossum2d702462002-08-06 21:28:28 +00003384def slottrash():
3385 # Deallocating deeply nested slotted trash caused stack overflows
3386 if verbose:
3387 print "Testing slot trash..."
3388 class trash(object):
3389 __slots__ = ['x']
3390 def __init__(self, x):
3391 self.x = x
3392 o = None
3393 for i in xrange(50000):
3394 o = trash(o)
3395 del o
3396
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003397def slotmultipleinheritance():
3398 # SF bug 575229, multiple inheritance w/ slots dumps core
3399 class A(object):
3400 __slots__=()
3401 class B(object):
3402 pass
3403 class C(A,B) :
3404 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003405 vereq(C.__basicsize__, B.__basicsize__)
3406 verify(hasattr(C, '__dict__'))
3407 verify(hasattr(C, '__weakref__'))
3408 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003409
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003410def testrmul():
3411 # SF patch 592646
3412 if verbose:
3413 print "Testing correct invocation of __rmul__..."
3414 class C(object):
3415 def __mul__(self, other):
3416 return "mul"
3417 def __rmul__(self, other):
3418 return "rmul"
3419 a = C()
3420 vereq(a*2, "mul")
3421 vereq(a*2.2, "mul")
3422 vereq(2*a, "rmul")
3423 vereq(2.2*a, "rmul")
3424
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003425def testipow():
3426 # [SF bug 620179]
3427 if verbose:
3428 print "Testing correct invocation of __ipow__..."
3429 class C(object):
3430 def __ipow__(self, other):
3431 pass
3432 a = C()
3433 a **= 2
3434
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003435def do_this_first():
3436 if verbose:
3437 print "Testing SF bug 551412 ..."
3438 # This dumps core when SF bug 551412 isn't fixed --
3439 # but only when test_descr.py is run separately.
3440 # (That can't be helped -- as soon as PyType_Ready()
3441 # is called for PyLong_Type, the bug is gone.)
3442 class UserLong(object):
3443 def __pow__(self, *args):
3444 pass
3445 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003446 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003447 except:
3448 pass
3449
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003450 if verbose:
3451 print "Testing SF bug 570483..."
3452 # Another segfault only when run early
3453 # (before PyType_Ready(tuple) is called)
3454 type.mro(tuple)
3455
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003456def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003457 if verbose:
3458 print "Testing mutable bases..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003459 # stuff that should work:
3460 class C(object):
3461 pass
3462 class C2(object):
3463 def __getattribute__(self, attr):
3464 if attr == 'a':
3465 return 2
3466 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003467 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003468 def meth(self):
3469 return 1
3470 class D(C):
3471 pass
3472 class E(D):
3473 pass
3474 d = D()
3475 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003476 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003477 D.__bases__ = (C2,)
3478 vereq(d.meth(), 1)
3479 vereq(e.meth(), 1)
3480 vereq(d.a, 2)
3481 vereq(e.a, 2)
3482 vereq(C2.__subclasses__(), [D])
3483
3484 # stuff that shouldn't:
3485 class L(list):
3486 pass
3487
3488 try:
3489 L.__bases__ = (dict,)
3490 except TypeError:
3491 pass
3492 else:
3493 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3494
3495 try:
3496 list.__bases__ = (dict,)
3497 except TypeError:
3498 pass
3499 else:
3500 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3501
3502 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003503 D.__bases__ = (C2, list)
3504 except TypeError:
3505 pass
3506 else:
3507 assert 0, "best_base calculation found wanting"
3508
3509 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003510 del D.__bases__
3511 except TypeError:
3512 pass
3513 else:
3514 raise TestFailed, "shouldn't be able to delete .__bases__"
3515
3516 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003517 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003518 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003519 if str(msg) == "a new-style class can't have only classic bases":
3520 raise TestFailed, "wrong error message for .__bases__ = ()"
3521 else:
3522 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3523
3524 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003525 D.__bases__ = (D,)
3526 except TypeError:
3527 pass
3528 else:
3529 # actually, we'll have crashed by here...
3530 raise TestFailed, "shouldn't be able to create inheritance cycles"
3531
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003532 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003533 D.__bases__ = (C, C)
3534 except TypeError:
3535 pass
3536 else:
3537 raise TestFailed, "didn't detect repeated base classes"
3538
3539 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003540 D.__bases__ = (E,)
3541 except TypeError:
3542 pass
3543 else:
3544 raise TestFailed, "shouldn't be able to create inheritance cycles"
3545
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003546def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003547 if verbose:
3548 print "Testing mutable bases with failing mro..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003549 class WorkOnce(type):
3550 def __new__(self, name, bases, ns):
3551 self.flag = 0
3552 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3553 def mro(self):
3554 if self.flag > 0:
3555 raise RuntimeError, "bozo"
3556 else:
3557 self.flag += 1
3558 return type.mro(self)
3559
3560 class WorkAlways(type):
3561 def mro(self):
3562 # this is here to make sure that .mro()s aren't called
3563 # with an exception set (which was possible at one point).
3564 # An error message will be printed in a debug build.
3565 # What's a good way to test for this?
3566 return type.mro(self)
3567
3568 class C(object):
3569 pass
3570
3571 class C2(object):
3572 pass
3573
3574 class D(C):
3575 pass
3576
3577 class E(D):
3578 pass
3579
3580 class F(D):
3581 __metaclass__ = WorkOnce
3582
3583 class G(D):
3584 __metaclass__ = WorkAlways
3585
3586 # Immediate subclasses have their mro's adjusted in alphabetical
3587 # order, so E's will get adjusted before adjusting F's fails. We
3588 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003589
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003590 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003591 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003592
3593 try:
3594 D.__bases__ = (C2,)
3595 except RuntimeError:
3596 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003597 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003598 else:
3599 raise TestFailed, "exception not propagated"
3600
3601def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003602 if verbose:
3603 print "Testing mutable bases catch mro conflict..."
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003604 class A(object):
3605 pass
3606
3607 class B(object):
3608 pass
3609
3610 class C(A, B):
3611 pass
3612
3613 class D(A, B):
3614 pass
3615
3616 class E(C, D):
3617 pass
3618
3619 try:
3620 C.__bases__ = (B, A)
3621 except TypeError:
3622 pass
3623 else:
3624 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003625
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003626def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003627 if verbose:
3628 print "Testing mutable names..."
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003629 class C(object):
3630 pass
3631
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003632 # C.__module__ could be 'test_descr' or '__main__'
3633 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003634
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003635 C.__name__ = 'D'
3636 vereq((C.__module__, C.__name__), (mod, 'D'))
3637
3638 C.__name__ = 'D.E'
3639 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003640
Guido van Rossum613f24f2003-01-06 23:00:59 +00003641def subclass_right_op():
3642 if verbose:
3643 print "Testing correct dispatch of subclass overloading __r<op>__..."
3644
3645 # This code tests various cases where right-dispatch of a subclass
3646 # should be preferred over left-dispatch of a base class.
3647
3648 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3649
3650 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003651 def __floordiv__(self, other):
3652 return "B.__floordiv__"
3653 def __rfloordiv__(self, other):
3654 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003655
Guido van Rossumf389c772003-02-27 20:04:19 +00003656 vereq(B(1) // 1, "B.__floordiv__")
3657 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003658
3659 # Case 2: subclass of object; this is just the baseline for case 3
3660
3661 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003662 def __floordiv__(self, other):
3663 return "C.__floordiv__"
3664 def __rfloordiv__(self, other):
3665 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003666
Guido van Rossumf389c772003-02-27 20:04:19 +00003667 vereq(C() // 1, "C.__floordiv__")
3668 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003669
3670 # Case 3: subclass of new-style class; here it gets interesting
3671
3672 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003673 def __floordiv__(self, other):
3674 return "D.__floordiv__"
3675 def __rfloordiv__(self, other):
3676 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003677
Guido van Rossumf389c772003-02-27 20:04:19 +00003678 vereq(D() // C(), "D.__floordiv__")
3679 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003680
3681 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3682
3683 class E(C):
3684 pass
3685
Guido van Rossumf389c772003-02-27 20:04:19 +00003686 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003687
Guido van Rossumf389c772003-02-27 20:04:19 +00003688 vereq(E() // 1, "C.__floordiv__")
3689 vereq(1 // E(), "C.__rfloordiv__")
3690 vereq(E() // C(), "C.__floordiv__")
3691 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003692
Guido van Rossum373c7412003-01-07 13:41:37 +00003693def dict_type_with_metaclass():
3694 if verbose:
3695 print "Testing type of __dict__ when __metaclass__ set..."
3696
3697 class B(object):
3698 pass
3699 class M(type):
3700 pass
3701 class C:
3702 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3703 __metaclass__ = M
3704 veris(type(C.__dict__), type(B.__dict__))
3705
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003706def meth_class_get():
3707 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003708 if verbose:
3709 print "Testing __get__ method of METH_CLASS C methods..."
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003710 # Baseline
3711 arg = [1, 2, 3]
3712 res = {1: None, 2: None, 3: None}
3713 vereq(dict.fromkeys(arg), res)
3714 vereq({}.fromkeys(arg), res)
3715 # Now get the descriptor
3716 descr = dict.__dict__["fromkeys"]
3717 # More baseline using the descriptor directly
3718 vereq(descr.__get__(None, dict)(arg), res)
3719 vereq(descr.__get__({})(arg), res)
3720 # Now check various error cases
3721 try:
3722 descr.__get__(None, None)
3723 except TypeError:
3724 pass
3725 else:
3726 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3727 try:
3728 descr.__get__(42)
3729 except TypeError:
3730 pass
3731 else:
3732 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3733 try:
3734 descr.__get__(None, 42)
3735 except TypeError:
3736 pass
3737 else:
3738 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3739 try:
3740 descr.__get__(None, int)
3741 except TypeError:
3742 pass
3743 else:
3744 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3745
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003746def isinst_isclass():
3747 if verbose:
3748 print "Testing proxy isinstance() and isclass()..."
3749 class Proxy(object):
3750 def __init__(self, obj):
3751 self.__obj = obj
3752 def __getattribute__(self, name):
3753 if name.startswith("_Proxy__"):
3754 return object.__getattribute__(self, name)
3755 else:
3756 return getattr(self.__obj, name)
3757 # Test with a classic class
3758 class C:
3759 pass
3760 a = C()
3761 pa = Proxy(a)
3762 verify(isinstance(a, C)) # Baseline
3763 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003764 # Test with a classic subclass
3765 class D(C):
3766 pass
3767 a = D()
3768 pa = Proxy(a)
3769 verify(isinstance(a, C)) # Baseline
3770 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003771 # Test with a new-style class
3772 class C(object):
3773 pass
3774 a = C()
3775 pa = Proxy(a)
3776 verify(isinstance(a, C)) # Baseline
3777 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003778 # Test with a new-style subclass
3779 class D(C):
3780 pass
3781 a = D()
3782 pa = Proxy(a)
3783 verify(isinstance(a, C)) # Baseline
3784 verify(isinstance(pa, C)) # Test
3785
3786def proxysuper():
3787 if verbose:
3788 print "Testing super() for a proxy object..."
3789 class Proxy(object):
3790 def __init__(self, obj):
3791 self.__obj = obj
3792 def __getattribute__(self, name):
3793 if name.startswith("_Proxy__"):
3794 return object.__getattribute__(self, name)
3795 else:
3796 return getattr(self.__obj, name)
3797
3798 class B(object):
3799 def f(self):
3800 return "B.f"
3801
3802 class C(B):
3803 def f(self):
3804 return super(C, self).f() + "->C.f"
3805
3806 obj = C()
3807 p = Proxy(obj)
3808 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003809
Guido van Rossum52b27052003-04-15 20:05:10 +00003810def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003811 if verbose:
Guido van Rossum52b27052003-04-15 20:05:10 +00003812 print "Testing prohibition of Carlo Verre's hack..."
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003813 try:
3814 object.__setattr__(str, "foo", 42)
3815 except TypeError:
3816 pass
3817 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003818 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003819 try:
3820 object.__delattr__(str, "lower")
3821 except TypeError:
3822 pass
3823 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003824 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003825
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003826def weakref_segfault():
3827 # SF 742911
3828 if verbose:
3829 print "Testing weakref segfault..."
3830
3831 import weakref
3832
3833 class Provoker:
3834 def __init__(self, referrent):
3835 self.ref = weakref.ref(referrent)
3836
3837 def __del__(self):
3838 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003839
3840 class Oops(object):
3841 pass
3842
3843 o = Oops()
3844 o.whatever = Provoker(o)
3845 del o
3846
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003847def wrapper_segfault():
3848 # SF 927248: deeply nested wrappers could cause stack overflow
3849 f = lambda:None
3850 for i in xrange(1000000):
3851 f = f.__call__
3852 f = None
3853
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003854# Fix SF #762455, segfault when sys.stdout is changed in getattr
3855def filefault():
3856 if verbose:
3857 print "Testing sys.stdout is changed in getattr..."
3858 import sys
3859 class StdoutGuard:
3860 def __getattr__(self, attr):
3861 sys.stdout = sys.__stdout__
3862 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3863 sys.stdout = StdoutGuard()
3864 try:
3865 print "Oops!"
3866 except RuntimeError:
3867 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003868
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003869def vicious_descriptor_nonsense():
3870 # A potential segfault spotted by Thomas Wouters in mail to
3871 # python-dev 2003-04-17, turned into an example & fixed by Michael
3872 # Hudson just less than four months later...
3873 if verbose:
3874 print "Testing vicious_descriptor_nonsense..."
3875
3876 class Evil(object):
3877 def __hash__(self):
3878 return hash('attr')
3879 def __eq__(self, other):
3880 del C.attr
3881 return 0
3882
3883 class Descr(object):
3884 def __get__(self, ob, type=None):
3885 return 1
3886
3887 class C(object):
3888 attr = Descr()
3889
3890 c = C()
3891 c.__dict__[Evil()] = 0
3892
3893 vereq(c.attr, 1)
3894 # this makes a crash more likely:
3895 import gc; gc.collect()
3896 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00003897
Raymond Hettingerb67cc802005-03-03 16:45:19 +00003898def test_init():
3899 # SF 1155938
3900 class Foo(object):
3901 def __init__(self):
3902 return 10
3903 try:
3904 Foo()
3905 except TypeError:
3906 pass
3907 else:
3908 raise TestFailed, "did not test __init__() for None return"
3909
Armin Rigoc6686b72005-11-07 08:38:00 +00003910def methodwrapper():
3911 # <type 'method-wrapper'> did not support any reflection before 2.5
3912 if verbose:
3913 print "Testing method-wrapper objects..."
3914
Guido van Rossum47b9ff62006-08-24 00:41:19 +00003915 return # XXX should methods really support __eq__?
3916
Armin Rigoc6686b72005-11-07 08:38:00 +00003917 l = []
3918 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003919 vereq(l.__add__, [].__add__)
3920 verify(l.__add__ != [5].__add__)
3921 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00003922 verify(l.__add__.__name__ == '__add__')
3923 verify(l.__add__.__self__ is l)
3924 verify(l.__add__.__objclass__ is list)
3925 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003926 try:
3927 hash(l.__add__)
3928 except TypeError:
3929 pass
3930 else:
3931 raise TestFailed("no TypeError from hash([].__add__)")
3932
3933 t = ()
3934 t += (7,)
3935 vereq(t.__add__, (7,).__add__)
3936 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003937
Armin Rigofd163f92005-12-29 15:59:19 +00003938def notimplemented():
3939 # all binary methods should be able to return a NotImplemented
3940 if verbose:
3941 print "Testing NotImplemented..."
3942
3943 import sys
3944 import types
3945 import operator
3946
3947 def specialmethod(self, other):
3948 return NotImplemented
3949
3950 def check(expr, x, y):
3951 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00003952 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00003953 except TypeError:
3954 pass
3955 else:
3956 raise TestFailed("no TypeError from %r" % (expr,))
3957
Guido van Rossume2a383d2007-01-15 16:59:06 +00003958 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00003959 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
3960 # ValueErrors instead of TypeErrors
3961 for metaclass in [type, types.ClassType]:
3962 for name, expr, iexpr in [
3963 ('__add__', 'x + y', 'x += y'),
3964 ('__sub__', 'x - y', 'x -= y'),
3965 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00003966 ('__truediv__', 'x / y', None),
3967 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00003968 ('__mod__', 'x % y', 'x %= y'),
3969 ('__divmod__', 'divmod(x, y)', None),
3970 ('__pow__', 'x ** y', 'x **= y'),
3971 ('__lshift__', 'x << y', 'x <<= y'),
3972 ('__rshift__', 'x >> y', 'x >>= y'),
3973 ('__and__', 'x & y', 'x &= y'),
3974 ('__or__', 'x | y', 'x |= y'),
3975 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00003976 ]:
3977 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00003978 A = metaclass('A', (), {name: specialmethod})
3979 B = metaclass('B', (), {rname: specialmethod})
3980 a = A()
3981 b = B()
3982 check(expr, a, a)
3983 check(expr, a, b)
3984 check(expr, b, a)
3985 check(expr, b, b)
3986 check(expr, a, N1)
3987 check(expr, a, N2)
3988 check(expr, N1, b)
3989 check(expr, N2, b)
3990 if iexpr:
3991 check(iexpr, a, a)
3992 check(iexpr, a, b)
3993 check(iexpr, b, a)
3994 check(iexpr, b, b)
3995 check(iexpr, a, N1)
3996 check(iexpr, a, N2)
3997 iname = '__i' + name[2:]
3998 C = metaclass('C', (), {iname: specialmethod})
3999 c = C()
4000 check(iexpr, c, a)
4001 check(iexpr, c, b)
4002 check(iexpr, c, N1)
4003 check(iexpr, c, N2)
4004
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004005def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004006 weakref_segfault() # Must be first, somehow
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004007 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004008 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004009 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004010 lists()
4011 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004012 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004013 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004014 ints()
4015 longs()
4016 floats()
4017 complexes()
4018 spamlists()
4019 spamdicts()
4020 pydicts()
4021 pylists()
4022 metaclass()
4023 pymods()
4024 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004025 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004026 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004027 ex5()
4028 monotonicity()
4029 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004030 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004031 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004032 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004033 dynamics()
4034 errors()
4035 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004036 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004037 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004038 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004039 classic()
4040 compattr()
4041 newslot()
4042 altmro()
4043 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004044 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004045 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004046 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004047 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004048 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004049 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004050 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004051 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004052 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004053 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004054 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004055 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004056 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004057 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004058 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004059 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004060 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004061 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004062 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004063 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004064 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004065 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004066 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004067 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004068 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004069 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004070 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004071 dictproxyiterkeys()
4072 dictproxyitervalues()
4073 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004074 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004075 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004076 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004077 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004078 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004079 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004080 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004081 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004082 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004083 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004084 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004085 test_mutable_bases()
4086 test_mutable_bases_with_failing_mro()
4087 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004088 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004089 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004090 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004091 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004092 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004093 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004094 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004095 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004096 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004097 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004098 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004099 notimplemented()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004100
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004101 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004102
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004103if __name__ == "__main__":
4104 test_main()