blob: 961369f757cc23c7922aaa3ab41cbc9799fe4771 [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
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
4from test.test_support import get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00005from copy import deepcopy
Guido van Rossum360e4b82007-05-14 22:51:27 +00006import types
Thomas Wouters89d996e2007-09-08 17:39:28 +00007import new
Tim Peters4d9b4662002-04-16 01:59:17 +00008
Guido van Rossum875eeaa2001-10-11 18:33:53 +00009def veris(a, b):
10 if a is not b:
Collin Winter3add4d72007-08-29 23:37:32 +000011 raise TestFailed("%r is %r" % (a, b))
Guido van Rossum875eeaa2001-10-11 18:33:53 +000012
Tim Peters6d6c1a32001-08-02 04:15:00 +000013def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000014 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000015 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000016 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000017 t = type(a)
18 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000019 while meth not in t.__dict__:
20 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000021 vereq(m, t.__dict__[meth])
22 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000023 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000024 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025
26def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000027 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000028 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000029
Guido van Rossum45704552001-10-08 16:35:45 +000030 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000031 t = type(a)
32 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000033 while meth not in t.__dict__:
34 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000035 vereq(m, t.__dict__[meth])
36 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000038 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000040def testsliceop(a, b, c, res, expr="a[b:c]", meth="__getitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000041 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000042 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000043 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 t = type(a)
45 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000046 while meth not in t.__dict__:
47 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000048 vereq(m, t.__dict__[meth])
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000049 vereq(m(a, slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 bm = getattr(a, meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000051 vereq(bm(slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052
53def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000054 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000055 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000056 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058 t = type(a)
59 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000060 while meth not in t.__dict__:
61 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000062 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000063 dict['a'] = deepcopy(a)
64 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000065 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066 dict['a'] = deepcopy(a)
67 bm = getattr(dict['a'], meth)
68 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000069 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000070
71def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000072 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000073 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000074 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076 t = type(a)
77 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000078 while meth not in t.__dict__:
79 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000080 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000081 dict['a'] = deepcopy(a)
82 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000083 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000084 dict['a'] = deepcopy(a)
85 bm = getattr(dict['a'], meth)
86 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000087 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000088
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000089def testsetsliceop(a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000090 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000091 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000092 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000095 while meth not in t.__dict__:
96 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000097 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000098 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000099 dict['a'] = deepcopy(a)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000100 m(dict['a'], slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000101 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000102 dict['a'] = deepcopy(a)
103 bm = getattr(dict['a'], meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000104 bm(slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000105 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106
Tim Peters2f93e282001-10-04 05:27:00 +0000107def class_docstrings():
108 class Classic:
109 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000110 vereq(Classic.__doc__, "A classic docstring.")
111 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000112
113 class Classic2:
114 pass
115 verify(Classic2.__doc__ is None)
116
Tim Peters4fb1fe82001-10-04 05:48:13 +0000117 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000118 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000119 vereq(NewStatic.__doc__, "Another docstring.")
120 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000121
Tim Peters4fb1fe82001-10-04 05:48:13 +0000122 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000123 pass
124 verify(NewStatic2.__doc__ is None)
125
Tim Peters4fb1fe82001-10-04 05:48:13 +0000126 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000127 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000128 vereq(NewDynamic.__doc__, "Another docstring.")
129 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000130
Tim Peters4fb1fe82001-10-04 05:48:13 +0000131 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000132 pass
133 verify(NewDynamic2.__doc__ is None)
134
Tim Peters6d6c1a32001-08-02 04:15:00 +0000135def lists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000136 if verbose: print("Testing list operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000137 testbinop([1], [2], [1,2], "a+b", "__add__")
138 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
139 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
140 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000141 testsliceop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000142 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
143 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
144 testunop([1,2,3], 3, "len(a)", "__len__")
145 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
146 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
147 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000148 testsetsliceop([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
149 "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000150
151def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000152 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000153 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000154 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
155 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
156 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
157 d = {1:2,3:4}
158 l1 = []
159 for i in d.keys(): l1.append(i)
160 l = []
161 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000162 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000163 l = []
164 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000165 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000166 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000167 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000168 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000169 d = {1:2, 3:4}
170 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000171 vereq(eval(repr(d), {}), d)
172 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000173 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
174
Tim Peters25786c02001-09-02 08:22:48 +0000175def dict_constructor():
176 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000177 print("Testing dict constructor ...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000178 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000179 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000180 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000181 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000183 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000184 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000185 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000186 d = dict({'one':1, 'two':2})
187 vereq(d, dict(one=1, two=2))
188 vereq(d, dict(**d))
189 vereq(d, dict({"one": 1}, two=2))
190 vereq(d, dict([("two", 2)], one=1))
191 vereq(d, dict([("one", 100), ("two", 200)], **d))
192 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000193 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000194 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000195 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000196 except TypeError:
197 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000198 except ValueError:
199 if badarg == "0":
200 # It's a sequence, and its elements are also sequences (gotta
201 # love strings <wink>), but they aren't of length 2, so this
202 # one seemed better as a ValueError than a TypeError.
203 pass
204 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000205 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000206 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000207 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000208
209 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000210 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000211 except TypeError:
212 pass
213 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000214 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000215
216 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000217 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000218 dict = {1:2, 3:4, 'a':1j}
219
Tim Peters25786c02001-09-02 08:22:48 +0000220 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000221 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000222 except TypeError:
223 pass
224 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000225 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000226
227 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000228 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000229 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000230 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000231
Tim Peters1fc240e2001-10-26 05:06:50 +0000232 # Init from sequence of iterable objects, each producing a 2-sequence.
233 class AddressBookEntry:
234 def __init__(self, first, last):
235 self.first = first
236 self.last = last
237 def __iter__(self):
238 return iter([self.first, self.last])
239
Tim Petersa427a2b2001-10-29 22:25:45 +0000240 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000241 AddressBookEntry('Barry', 'Peters'),
242 AddressBookEntry('Tim', 'Peters'),
243 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000244 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
245
Tim Petersa427a2b2001-10-29 22:25:45 +0000246 d = dict(zip(range(4), range(1, 5)))
247 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000248
249 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000250 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000251 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000252 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000253 except ValueError:
254 pass
255 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000256 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000257
Tim Peters5d2b77c2001-09-03 05:47:38 +0000258def test_dir():
259 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000260 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000261 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000262 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000263 del junk
264
265 # Just make sure these don't blow up!
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000266 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000267 dir(arg)
268
Thomas Wouters0725cf22006-04-15 09:04:57 +0000269 # Test dir on custom classes. Since these have object as a
270 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000271 def interesting(strings):
272 return [s for s in strings if not s.startswith('_')]
273
Tim Peters5d2b77c2001-09-03 05:47:38 +0000274 class C(object):
275 Cdata = 1
276 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000277
278 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000279 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000280
281 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000282 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000283 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000284
285 c.cdata = 2
286 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000287 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000288 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000289
Tim Peters5d2b77c2001-09-03 05:47:38 +0000290 class A(C):
291 Adata = 1
292 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000293
294 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000295 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000296 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000297 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000298 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000299 a.adata = 42
300 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000301 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000302 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000303
Tim Peterscaaff8d2001-09-10 23:12:14 +0000304 # Try a module subclass.
305 import sys
306 class M(type(sys)):
307 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000308 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000309 minstance.b = 2
310 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000311 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
312 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000313
314 class M2(M):
315 def getdict(self):
316 return "Not a dict!"
317 __dict__ = property(getdict)
318
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000319 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000320 m2instance.b = 2
321 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000322 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000323 try:
324 dir(m2instance)
325 except TypeError:
326 pass
327
Tim Peters9e6a3992001-10-30 05:45:26 +0000328 # Two essentially featureless objects, just inheriting stuff from
329 # object.
330 vereq(dir(None), dir(Ellipsis))
331
Guido van Rossum44022412002-05-13 18:29:46 +0000332 # Nasty test case for proxied objects
333 class Wrapper(object):
334 def __init__(self, obj):
335 self.__obj = obj
336 def __repr__(self):
337 return "Wrapper(%s)" % repr(self.__obj)
338 def __getitem__(self, key):
339 return Wrapper(self.__obj[key])
340 def __len__(self):
341 return len(self.__obj)
342 def __getattr__(self, name):
343 return Wrapper(getattr(self.__obj, name))
344
345 class C(object):
346 def __getclass(self):
347 return Wrapper(type(self))
348 __class__ = property(__getclass)
349
350 dir(C()) # This used to segfault
351
Tim Peters6d6c1a32001-08-02 04:15:00 +0000352binops = {
353 'add': '+',
354 'sub': '-',
355 'mul': '*',
356 'div': '/',
357 'mod': '%',
358 'divmod': 'divmod',
359 'pow': '**',
360 'lshift': '<<',
361 'rshift': '>>',
362 'and': '&',
363 'xor': '^',
364 'or': '|',
365 'cmp': 'cmp',
366 'lt': '<',
367 'le': '<=',
368 'eq': '==',
369 'ne': '!=',
370 'gt': '>',
371 'ge': '>=',
372 }
373
374for name, expr in binops.items():
375 if expr.islower():
376 expr = expr + "(a, b)"
377 else:
378 expr = 'a %s b' % expr
379 binops[name] = expr
380
381unops = {
382 'pos': '+',
383 'neg': '-',
384 'abs': 'abs',
385 'invert': '~',
386 'int': 'int',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000387 'float': 'float',
388 'oct': 'oct',
389 'hex': 'hex',
390 }
391
392for name, expr in unops.items():
393 if expr.islower():
394 expr = expr + "(a)"
395 else:
396 expr = '%s a' % expr
397 unops[name] = expr
398
399def numops(a, b, skip=[]):
400 dict = {'a': a, 'b': b}
401 for name, expr in binops.items():
402 if name not in skip:
403 name = "__%s__" % name
404 if hasattr(a, name):
405 res = eval(expr, dict)
406 testbinop(a, b, res, expr, name)
407 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000408 if name not in skip:
409 name = "__%s__" % name
410 if hasattr(a, name):
411 res = eval(expr, dict)
412 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000413
414def ints():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000415 if verbose: print("Testing int operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000416 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000417 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000418 vereq((1).__bool__(), True)
419 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000420 # This returns 'NotImplemented' in Python 2.2
421 class C(int):
422 def __add__(self, other):
423 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000424 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000425 try:
426 C() + ""
427 except TypeError:
428 pass
429 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000430 raise TestFailed("NotImplemented should have caused TypeError")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000431
432def longs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000433 if verbose: print("Testing long operations...")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000434 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000435
436def floats():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000437 if verbose: print("Testing float operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000438 numops(100.0, 3.0)
439
440def complexes():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000441 if verbose: print("Testing complex operations...")
Guido van Rossum4a7fd902007-08-03 21:15:23 +0000442 numops(100.0j, 3.0j,
443 skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float',
444 'divmod', 'mod'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000445 class Number(complex):
446 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000447 def __new__(cls, *args, **kwds):
448 result = complex.__new__(cls, *args)
449 result.prec = kwds.get('prec', 12)
450 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451 def __repr__(self):
452 prec = self.prec
453 if self.imag == 0.0:
454 return "%.*g" % (prec, self.real)
455 if self.real == 0.0:
456 return "%.*gj" % (prec, self.imag)
457 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
458 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000459
Tim Peters6d6c1a32001-08-02 04:15:00 +0000460 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000461 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000462 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463
Tim Peters3f996e72001-09-13 19:18:27 +0000464 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000465 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000466 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000467
468 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000469 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000470 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000471
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472def spamlists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000473 if verbose: print("Testing spamlist operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000474 import copy, xxsubtype as spam
475 def spamlist(l, memo=None):
476 import xxsubtype as spam
477 return spam.spamlist(l)
478 # This is an ugly hack:
479 copy._deepcopy_dispatch[spam.spamlist] = spamlist
480
481 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
482 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
483 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
484 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000485 testsliceop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
486 "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000487 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
488 "a+=b", "__iadd__")
489 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
490 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
491 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
492 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
493 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000494 testsetsliceop(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
495 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000496 # Test subclassing
497 class C(spam.spamlist):
498 def foo(self): return 1
499 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000500 vereq(a, [])
501 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000502 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000503 vereq(a, [100])
504 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000505 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000506 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000507
508def spamdicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000509 if verbose: print("Testing spamdict operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000510 import copy, xxsubtype as spam
511 def spamdict(d, memo=None):
512 import xxsubtype as spam
513 sd = spam.spamdict()
514 for k, v in d.items(): sd[k] = v
515 return sd
516 # This is an ugly hack:
517 copy._deepcopy_dispatch[spam.spamdict] = spamdict
518
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000519 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000520 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
521 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
522 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
523 d = spamdict({1:2,3:4})
524 l1 = []
525 for i in d.keys(): l1.append(i)
526 l = []
527 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000528 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000529 l = []
530 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000531 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000532 l = []
533 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000534 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000535 straightd = {1:2, 3:4}
536 spamd = spamdict(straightd)
537 testunop(spamd, 2, "len(a)", "__len__")
538 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
539 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
540 "a[b]=c", "__setitem__")
541 # Test subclassing
542 class C(spam.spamdict):
543 def foo(self): return 1
544 a = C()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000545 vereq(list(a.items()), [])
Guido van Rossum45704552001-10-08 16:35:45 +0000546 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547 a['foo'] = 'bar'
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000548 vereq(list(a.items()), [('foo', 'bar')])
Guido van Rossum45704552001-10-08 16:35:45 +0000549 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000550 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000551 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000552
553def pydicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000554 if verbose: print("Testing Python subclass of dict...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000555 verify(issubclass(dict, dict))
556 verify(isinstance({}, dict))
557 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000558 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000559 verify(d.__class__ is dict)
560 verify(isinstance(d, dict))
561 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562 state = -1
563 def __init__(self, *a, **kw):
564 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000565 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566 self.state = a[0]
567 if kw:
568 for k, v in kw.items(): self[v] = k
569 def __getitem__(self, key):
570 return self.get(key, 0)
571 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000572 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000573 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 def setstate(self, state):
575 self.state = state
576 def getstate(self):
577 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000578 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000579 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000581 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000582 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000584 vereq(a.state, -1)
585 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000586 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000587 vereq(a.state, 0)
588 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a.state, 10)
591 vereq(a.getstate(), 10)
592 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000593 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000594 vereq(a[42], 24)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000595 if verbose: print("pydict stress test ...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596 N = 50
597 for i in range(N):
598 a[i] = C()
599 for j in range(N):
600 a[i][j] = i*j
601 for i in range(N):
602 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000603 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604
605def pylists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000606 if verbose: print("Testing Python subclass of list...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000607 class C(list):
608 def __getitem__(self, i):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000609 if isinstance(i, slice):
610 return (i.start, i.stop)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000611 return list.__getitem__(self, i) + 100
Tim Peters6d6c1a32001-08-02 04:15:00 +0000612 a = C()
613 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000614 vereq(a[0], 100)
615 vereq(a[1], 101)
616 vereq(a[2], 102)
617 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000618
619def metaclass():
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000620 if verbose: print("Testing metaclass...")
621 class C(metaclass=type):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000622 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)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000632 class _metaclass(type):
633 def myself(cls): return cls
634 class D(metaclass=_metaclass):
635 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000636 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000637 d = D()
638 verify(d.__class__ is D)
639 class M1(type):
640 def __new__(cls, name, bases, dict):
641 dict['__spam__'] = 1
642 return type.__new__(cls, name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000643 class C(metaclass=M1):
644 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000645 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000646 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000647 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000648
Guido van Rossum309b5662001-08-17 11:43:17 +0000649 class _instance(object):
650 pass
651 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000652 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000653 def __new__(cls, name, bases, dict):
654 self = object.__new__(cls)
655 self.name = name
656 self.bases = bases
657 self.dict = dict
658 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000659 def __call__(self):
660 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000661 # Early binding of methods
662 for key in self.dict:
663 if key.startswith("__"):
664 continue
665 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000666 return it
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000667 class C(metaclass=M2):
Guido van Rossum309b5662001-08-17 11:43:17 +0000668 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
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000693 class A(metaclass=autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000694 def meth(self):
695 return "A"
696 class B(A):
697 def meth(self):
698 return "B" + self.__super.meth()
699 class C(A):
700 def meth(self):
701 return "C" + self.__super.meth()
702 class D(C, B):
703 def meth(self):
704 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000705 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000706 class E(B, C):
707 def meth(self):
708 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000709 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000710
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000711 class autoproperty(type):
712 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000713 # named _get_x and/or _set_x are found
714 def __new__(metaclass, name, bases, dict):
715 hits = {}
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000716 for key, val in dict.items():
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 if key.startswith("_get_"):
718 key = key[5:]
719 get, set = hits.get(key, (None, None))
720 get = val
721 hits[key] = get, set
722 elif key.startswith("_set_"):
723 key = key[5:]
724 get, set = hits.get(key, (None, None))
725 set = val
726 hits[key] = get, set
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000727 for key, (get, set) in hits.items():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000728 dict[key] = property(get, set)
729 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000730 name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000731 class A(metaclass=autoproperty):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000732 def _get_x(self):
733 return -self.__x
734 def _set_x(self, x):
735 self.__x = -x
736 a = A()
737 verify(not hasattr(a, "x"))
738 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000739 vereq(a.x, 12)
740 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000741
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000742 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000743 # Merge of multiple cooperating metaclasses
744 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000745 class A(metaclass=multimetaclass):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000746 def _get_x(self):
747 return "A"
748 class B(A):
749 def _get_x(self):
750 return "B" + self.__super._get_x()
751 class C(A):
752 def _get_x(self):
753 return "C" + self.__super._get_x()
754 class D(C, B):
755 def _get_x(self):
756 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000757 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000758
Guido van Rossumf76de622001-10-18 15:49:21 +0000759 # Make sure type(x) doesn't call x.__class__.__init__
760 class T(type):
761 counter = 0
762 def __init__(self, *args):
763 T.counter += 1
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000764 class C(metaclass=T):
765 pass
Guido van Rossumf76de622001-10-18 15:49:21 +0000766 vereq(T.counter, 1)
767 a = C()
768 vereq(type(a), C)
769 vereq(T.counter, 1)
770
Guido van Rossum29d26062001-12-11 04:37:34 +0000771 class C(object): pass
772 c = C()
773 try: c()
774 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +0000775 else: raise TestFailed("calling object w/o call method should raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +0000776
Guido van Rossumd8faa362007-04-27 19:54:29 +0000777 # Testing code to find most derived baseclass
778 class A(type):
779 def __new__(*args, **kwargs):
780 return type.__new__(*args, **kwargs)
781
782 class B(object):
783 pass
784
785 class C(object, metaclass=A):
786 pass
787
788 # The most derived metaclass of D is A rather than type.
789 class D(B, C):
790 pass
791
792
Tim Peters6d6c1a32001-08-02 04:15:00 +0000793def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000794 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000796 import sys
797 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000799 def __init__(self, name):
800 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000801 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000803 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804 def __setattr__(self, name, value):
805 log.append(("setattr", name, value))
806 MT.__setattr__(self, name, value)
807 def __delattr__(self, name):
808 log.append(("delattr", name))
809 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000810 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000811 a.foo = 12
812 x = a.foo
813 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000814 vereq(log, [("setattr", "foo", 12),
815 ("getattr", "foo"),
816 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817
Guido van Rossum360e4b82007-05-14 22:51:27 +0000818 # http://python.org/sf/1174712
819 try:
820 class Module(types.ModuleType, str):
821 pass
822 except TypeError:
823 pass
824 else:
825 raise TestFailed("inheriting from ModuleType and str at the "
826 "same time should fail")
827
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000829 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000830 class C(object):
831 def __init__(self):
832 self.__state = 0
833 def getstate(self):
834 return self.__state
835 def setstate(self, state):
836 self.__state = state
837 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000838 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000839 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000840 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000841 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842 def __init__(self):
843 type({}).__init__(self)
844 C.__init__(self)
845 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000846 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000848 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000849 vereq(d["hello"], "world")
850 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000851 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000852 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000853 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854
Guido van Rossume45763a2001-08-10 21:28:46 +0000855 # SF bug #442833
856 class Node(object):
857 def __int__(self):
858 return int(self.foo())
859 def foo(self):
860 return "23"
861 class Frag(Node, list):
862 def foo(self):
863 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000864 vereq(Node().__int__(), 23)
865 vereq(int(Node()), 23)
866 vereq(Frag().__int__(), 42)
867 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000868
Tim Peters6d6c1a32001-08-02 04:15:00 +0000869def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000870 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000871 class A(object):
872 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000873 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874 class B(A):
875 def boo(self): return "B"
876 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(B().spam(), "B")
878 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879 class C(A):
880 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000881 vereq(C().spam(), "A")
882 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000883 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000884 vereq(D().spam(), "B")
885 vereq(D().boo(), "B")
886 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000888 vereq(E().spam(), "B")
889 vereq(E().boo(), "C")
890 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000891 # MRO order disagreement
892 try:
893 class F(D, E): pass
894 except TypeError:
895 pass
896 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000897 raise TestFailed("expected MRO order disagreement (F)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000898 try:
899 class G(E, D): pass
900 except TypeError:
901 pass
902 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000903 raise TestFailed("expected MRO order disagreement (G)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000904
905
906# see thread python-dev/2002-October/029035.html
907def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000908 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000909 class A(object): pass
910 class B(object): pass
911 class C(object): pass
912 class X(A): pass
913 class Y(A): pass
914 class Z(X,B,Y,C): pass
915 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
916
917# see "A Monotonic Superclass Linearization for Dylan",
918# by Kim Barrett et al. (OOPSLA 1996)
919def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000920 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000921 class Boat(object): pass
922 class DayBoat(Boat): pass
923 class WheelBoat(Boat): pass
924 class EngineLess(DayBoat): pass
925 class SmallMultihull(DayBoat): pass
926 class PedalWheelBoat(EngineLess,WheelBoat): pass
927 class SmallCatamaran(SmallMultihull): pass
928 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
929
930 vereq(PedalWheelBoat.__mro__,
931 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
932 object))
933 vereq(SmallCatamaran.__mro__,
934 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
935
936 vereq(Pedalo.__mro__,
937 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
938 SmallMultihull, DayBoat, WheelBoat, Boat, object))
939
940# see "A Monotonic Superclass Linearization for Dylan",
941# by Kim Barrett et al. (OOPSLA 1996)
942def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000943 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000944 class Pane(object): pass
945 class ScrollingMixin(object): pass
946 class EditingMixin(object): pass
947 class ScrollablePane(Pane,ScrollingMixin): pass
948 class EditablePane(Pane,EditingMixin): pass
949 class EditableScrollablePane(ScrollablePane,EditablePane): pass
950
951 vereq(EditableScrollablePane.__mro__,
952 (EditableScrollablePane, ScrollablePane, EditablePane,
953 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000954
Raymond Hettingerf394df42003-04-06 19:13:41 +0000955mro_err_msg = """Cannot create a consistent method resolution
956order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000957
Guido van Rossumd32047f2002-11-25 21:38:52 +0000958def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000959 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000960 def raises(exc, expected, callable, *args):
961 try:
962 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000963 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000964 if not str(msg).startswith(expected):
Collin Winter3add4d72007-08-29 23:37:32 +0000965 raise TestFailed("Message %r, expected %r" % (str(msg),
966 expected))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000967 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000968 raise TestFailed("Expected %s" % exc)
Guido van Rossumd32047f2002-11-25 21:38:52 +0000969 class A(object): pass
970 class B(A): pass
971 class C(object): pass
972 # Test some very simple errors
973 raises(TypeError, "duplicate base class A",
974 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000975 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000976 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000977 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000978 type, "X", (A, C, B), {})
979 # Test a slightly more complex error
980 class GridLayout(object): pass
981 class HorizontalGrid(GridLayout): pass
982 class VerticalGrid(GridLayout): pass
983 class HVGrid(HorizontalGrid, VerticalGrid): pass
984 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000985 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000986 type, "ConfusedGrid", (HVGrid, VHGrid), {})
987
Guido van Rossum37202612001-08-09 19:45:21 +0000988def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000989 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000990 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000991 vereq(a.__class__, object)
992 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000993 b = object()
994 verify(a is not b)
995 verify(not hasattr(a, "foo"))
996 try:
997 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000998 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000999 pass
1000 else:
1001 verify(0, "object() should not allow setting a foo attribute")
1002 verify(not hasattr(object(), "__dict__"))
1003
1004 class Cdict(object):
1005 pass
1006 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001007 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001008 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001009 vereq(x.foo, 1)
1010 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001011
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001013 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001014 class C0(object):
1015 __slots__ = []
1016 x = C0()
1017 verify(not hasattr(x, "__dict__"))
1018 verify(not hasattr(x, "foo"))
1019
1020 class C1(object):
1021 __slots__ = ['a']
1022 x = C1()
1023 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001024 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001025 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001026 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001027 x.a = None
1028 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001030 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001031
1032 class C3(object):
1033 __slots__ = ['a', 'b', 'c']
1034 x = C3()
1035 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001036 verify(not hasattr(x, 'a'))
1037 verify(not hasattr(x, 'b'))
1038 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001039 x.a = 1
1040 x.b = 2
1041 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001042 vereq(x.a, 1)
1043 vereq(x.b, 2)
1044 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001045
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001046 class C4(object):
1047 """Validate name mangling"""
1048 __slots__ = ['__a']
1049 def __init__(self, value):
1050 self.__a = value
1051 def get(self):
1052 return self.__a
1053 x = C4(5)
1054 verify(not hasattr(x, '__dict__'))
1055 verify(not hasattr(x, '__a'))
1056 vereq(x.get(), 5)
1057 try:
1058 x.__a = 6
1059 except AttributeError:
1060 pass
1061 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001062 raise TestFailed("Double underscored names not mangled")
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001063
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001064 # Make sure slot names are proper identifiers
1065 try:
1066 class C(object):
1067 __slots__ = [None]
1068 except TypeError:
1069 pass
1070 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001071 raise TestFailed("[None] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001072 try:
1073 class C(object):
1074 __slots__ = ["foo bar"]
1075 except TypeError:
1076 pass
1077 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001078 raise TestFailed("['foo bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001079 try:
1080 class C(object):
1081 __slots__ = ["foo\0bar"]
1082 except TypeError:
1083 pass
1084 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001085 raise TestFailed("['foo\\0bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001086 try:
1087 class C(object):
1088 __slots__ = ["1"]
1089 except TypeError:
1090 pass
1091 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001092 raise TestFailed("['1'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001093 try:
1094 class C(object):
1095 __slots__ = [""]
1096 except TypeError:
1097 pass
1098 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001099 raise TestFailed("[''] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001100 class C(object):
1101 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001102 # XXX(nnorwitz): was there supposed to be something tested
1103 # from the class above?
1104
1105 # Test a single string is not expanded as a sequence.
1106 class C(object):
1107 __slots__ = "abc"
1108 c = C()
1109 c.abc = 5
1110 vereq(c.abc, 5)
1111
1112 # Test unicode slot names
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001113 # Test a single unicode string is not expanded as a sequence.
1114 class C(object):
1115 __slots__ = "abc"
1116 c = C()
1117 c.abc = 5
1118 vereq(c.abc, 5)
1119
1120 # _unicode_to_string used to modify slots in certain circumstances
1121 slots = ("foo", "bar")
1122 class C(object):
1123 __slots__ = slots
1124 x = C()
1125 x.foo = 5
1126 vereq(x.foo, 5)
1127 veris(type(slots[0]), str)
1128 # this used to leak references
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 try:
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001130 class C(object):
1131 __slots__ = [chr(128)]
1132 except (TypeError, UnicodeEncodeError):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001133 pass
1134 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001135 raise TestFailed("[unichr(128)] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001136
Guido van Rossum33bab012001-12-05 22:45:48 +00001137 # Test leaks
1138 class Counted(object):
1139 counter = 0 # counts the number of instances alive
1140 def __init__(self):
1141 Counted.counter += 1
1142 def __del__(self):
1143 Counted.counter -= 1
1144 class C(object):
1145 __slots__ = ['a', 'b', 'c']
1146 x = C()
1147 x.a = Counted()
1148 x.b = Counted()
1149 x.c = Counted()
1150 vereq(Counted.counter, 3)
1151 del x
1152 vereq(Counted.counter, 0)
1153 class D(C):
1154 pass
1155 x = D()
1156 x.a = Counted()
1157 x.z = Counted()
1158 vereq(Counted.counter, 2)
1159 del x
1160 vereq(Counted.counter, 0)
1161 class E(D):
1162 __slots__ = ['e']
1163 x = E()
1164 x.a = Counted()
1165 x.z = Counted()
1166 x.e = Counted()
1167 vereq(Counted.counter, 3)
1168 del x
1169 vereq(Counted.counter, 0)
1170
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001171 # Test cyclical leaks [SF bug 519621]
1172 class F(object):
1173 __slots__ = ['a', 'b']
1174 log = []
1175 s = F()
1176 s.a = [Counted(), s]
1177 vereq(Counted.counter, 1)
1178 s = None
1179 import gc
1180 gc.collect()
1181 vereq(Counted.counter, 0)
1182
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001183 # Test lookup leaks [SF bug 572567]
1184 import sys,gc
1185 class G(object):
1186 def __cmp__(self, other):
1187 return 0
1188 g = G()
1189 orig_objects = len(gc.get_objects())
Guido van Rossum805365e2007-05-07 22:24:25 +00001190 for i in range(10):
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001191 g==g
1192 new_objects = len(gc.get_objects())
1193 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001194 class H(object):
1195 __slots__ = ['a', 'b']
1196 def __init__(self):
1197 self.a = 1
1198 self.b = 2
1199 def __del__(self):
1200 assert self.a == 1
1201 assert self.b == 2
1202
1203 save_stderr = sys.stderr
1204 sys.stderr = sys.stdout
1205 h = H()
1206 try:
1207 del h
1208 finally:
1209 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001210
Guido van Rossum8b056da2002-08-13 18:26:26 +00001211def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001212 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001213
1214 class D(object):
1215 __slots__ = ["__dict__"]
1216 a = D()
1217 verify(hasattr(a, "__dict__"))
1218 verify(not hasattr(a, "__weakref__"))
1219 a.foo = 42
1220 vereq(a.__dict__, {"foo": 42})
1221
1222 class W(object):
1223 __slots__ = ["__weakref__"]
1224 a = W()
1225 verify(hasattr(a, "__weakref__"))
1226 verify(not hasattr(a, "__dict__"))
1227 try:
1228 a.foo = 42
1229 except AttributeError:
1230 pass
1231 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001232 raise TestFailed("shouldn't be allowed to set a.foo")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001233
1234 class C1(W, D):
1235 __slots__ = []
1236 a = C1()
1237 verify(hasattr(a, "__dict__"))
1238 verify(hasattr(a, "__weakref__"))
1239 a.foo = 42
1240 vereq(a.__dict__, {"foo": 42})
1241
1242 class C2(D, W):
1243 __slots__ = []
1244 a = C2()
1245 verify(hasattr(a, "__dict__"))
1246 verify(hasattr(a, "__weakref__"))
1247 a.foo = 42
1248 vereq(a.__dict__, {"foo": 42})
1249
Guido van Rossum9a818922002-11-14 19:50:14 +00001250# MRO order disagreement
1251#
1252# class C3(C1, C2):
1253# __slots__ = []
1254#
1255# class C4(C2, C1):
1256# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001257
Tim Peters6d6c1a32001-08-02 04:15:00 +00001258def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001259 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001260 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001261 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001262 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001263 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001264 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001265 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001267 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001269 vereq(E.foo, 1)
1270 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001271 # Test dynamic instances
1272 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001273 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001274 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001275 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001276 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001277 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001278 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001279 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001280 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001281 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001282 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001283 vereq(int(a), 100)
1284 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001285 verify(not hasattr(a, "spam"))
1286 def mygetattr(self, name):
1287 if name == "spam":
1288 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001289 raise AttributeError
1290 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001291 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001292 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001293 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001294 def mysetattr(self, name, value):
1295 if name == "spam":
1296 raise AttributeError
1297 return object.__setattr__(self, name, value)
1298 C.__setattr__ = mysetattr
1299 try:
1300 a.spam = "not spam"
1301 except AttributeError:
1302 pass
1303 else:
1304 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001305 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001306 class D(C):
1307 pass
1308 d = D()
1309 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001310 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001311
Guido van Rossum7e35d572001-09-15 03:14:32 +00001312 # Test handling of int*seq and seq*int
1313 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001314 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001315 vereq("a"*I(2), "aa")
1316 vereq(I(2)*"a", "aa")
1317 vereq(2*I(3), 6)
1318 vereq(I(3)*2, 6)
1319 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001320
1321 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001322 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001323 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001324 vereq("a"*L(2), "aa")
1325 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001326 vereq(2*L(3), 6)
1327 vereq(L(3)*2, 6)
1328 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001329
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001330 # Test comparison of classes with dynamic metaclasses
1331 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001332 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001333 class someclass(metaclass=dynamicmetaclass):
1334 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001335 verify(someclass != object)
1336
Tim Peters6d6c1a32001-08-02 04:15:00 +00001337def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001338 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001339
1340 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001341 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342 pass
1343 except TypeError:
1344 pass
1345 else:
1346 verify(0, "inheritance from both list and dict should be illegal")
1347
1348 try:
1349 class C(object, None):
1350 pass
1351 except TypeError:
1352 pass
1353 else:
1354 verify(0, "inheritance from non-type should be illegal")
1355 class Classic:
1356 pass
1357
1358 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001359 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 pass
1361 except TypeError:
1362 pass
1363 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001364 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001365
1366 try:
1367 class C(object):
1368 __slots__ = 1
1369 except TypeError:
1370 pass
1371 else:
1372 verify(0, "__slots__ = 1 should be illegal")
1373
1374 try:
1375 class C(object):
1376 __slots__ = [1]
1377 except TypeError:
1378 pass
1379 else:
1380 verify(0, "__slots__ = [1] should be illegal")
1381
Guido van Rossumd8faa362007-04-27 19:54:29 +00001382 class M1(type):
1383 pass
1384 class M2(type):
1385 pass
1386 class A1(object, metaclass=M1):
1387 pass
1388 class A2(object, metaclass=M2):
1389 pass
1390 try:
1391 class B(A1, A2):
1392 pass
1393 except TypeError:
1394 pass
1395 else:
1396 verify(0, "finding the most derived metaclass should have failed")
1397
Tim Peters6d6c1a32001-08-02 04:15:00 +00001398def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001399 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001400 class C(object):
1401 def foo(*a): return a
1402 goo = classmethod(foo)
1403 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001404 vereq(C.goo(1), (C, 1))
1405 vereq(c.goo(1), (C, 1))
1406 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001407 class D(C):
1408 pass
1409 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001410 vereq(D.goo(1), (D, 1))
1411 vereq(d.goo(1), (D, 1))
1412 vereq(d.foo(1), (d, 1))
1413 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001414 # Test for a specific crash (SF bug 528132)
1415 def f(cls, arg): return (cls, arg)
1416 ff = classmethod(f)
1417 vereq(ff.__get__(0, int)(42), (int, 42))
1418 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001419
Guido van Rossum155db9a2002-04-02 17:53:47 +00001420 # Test super() with classmethods (SF bug 535444)
1421 veris(C.goo.im_self, C)
1422 veris(D.goo.im_self, D)
1423 veris(super(D,D).goo.im_self, D)
1424 veris(super(D,d).goo.im_self, D)
1425 vereq(super(D,D).goo(), (D,))
1426 vereq(super(D,d).goo(), (D,))
1427
Raymond Hettingerbe971532003-06-18 01:13:41 +00001428 # Verify that argument is checked for callability (SF bug 753451)
1429 try:
1430 classmethod(1).__get__(1)
1431 except TypeError:
1432 pass
1433 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001434 raise TestFailed("classmethod should check for callability")
Raymond Hettingerbe971532003-06-18 01:13:41 +00001435
Georg Brandl6a29c322006-02-21 22:17:46 +00001436 # Verify that classmethod() doesn't allow keyword args
1437 try:
1438 classmethod(f, kw=1)
1439 except TypeError:
1440 pass
1441 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001442 raise TestFailed("classmethod shouldn't accept keyword args")
Georg Brandl6a29c322006-02-21 22:17:46 +00001443
Fred Drakef841aa62002-03-28 15:49:54 +00001444def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001445 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001446 import xxsubtype as spam
1447 a = (1, 2, 3)
1448 d = {'abc': 123}
1449 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001450 veris(x, spam.spamlist)
1451 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001452 vereq(d, d1)
1453 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001454 veris(x, spam.spamlist)
1455 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001456 vereq(d, d1)
1457
Tim Peters6d6c1a32001-08-02 04:15:00 +00001458def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001459 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001460 class C(object):
1461 def foo(*a): return a
1462 goo = staticmethod(foo)
1463 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001464 vereq(C.goo(1), (1,))
1465 vereq(c.goo(1), (1,))
1466 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001467 class D(C):
1468 pass
1469 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001470 vereq(D.goo(1), (1,))
1471 vereq(d.goo(1), (1,))
1472 vereq(d.foo(1), (d, 1))
1473 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001474
Fred Drakef841aa62002-03-28 15:49:54 +00001475def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001476 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001477 import xxsubtype as spam
1478 a = (1, 2, 3)
1479 d = {"abc": 123}
1480 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1481 veris(x, None)
1482 vereq(a, a1)
1483 vereq(d, d1)
1484 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1485 veris(x, None)
1486 vereq(a, a1)
1487 vereq(d, d1)
1488
Tim Peters6d6c1a32001-08-02 04:15:00 +00001489def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001490 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001491 class C:
1492 def foo(*a): return a
1493 goo = classmethod(foo)
1494 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(C.goo(1), (C, 1))
1496 vereq(c.goo(1), (C, 1))
1497 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001498 class D(C):
1499 pass
1500 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001501 vereq(D.goo(1), (D, 1))
1502 vereq(d.goo(1), (D, 1))
1503 vereq(d.foo(1), (d, 1))
1504 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001505 class E: # *not* subclassing from C
1506 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001507 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001508 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509
1510def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001511 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512 class C(object):
1513 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001514 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001515 self.__get = get
1516 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001517 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001518 def __get__(self, obj, type=None):
1519 return self.__get(obj)
1520 def __set__(self, obj, value):
1521 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001522 def __delete__(self, obj):
1523 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001524 def __init__(self):
1525 self.__x = 0
1526 def __get_x(self):
1527 x = self.__x
1528 self.__x = x+1
1529 return x
1530 def __set_x(self, x):
1531 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001532 def __delete_x(self):
1533 del self.__x
1534 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001535 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001536 vereq(a.x, 0)
1537 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001538 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001539 vereq(a.x, 10)
1540 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001541 del a.x
1542 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001543
1544def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001545 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001546 class C(list):
1547 def __new__(cls):
1548 self = list.__new__(cls)
1549 self.foo = 1
1550 return self
1551 def __init__(self):
1552 self.foo = self.foo + 2
1553 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001554 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001555 verify(a.__class__ is C)
1556 class D(C):
1557 pass
1558 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001559 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001560 verify(b.__class__ is D)
1561
Tim Peters6d6c1a32001-08-02 04:15:00 +00001562def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001563 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001564 class A(object):
1565 def f(self): return "A"
1566 class B(A):
1567 pass
1568 class C(A):
1569 def f(self): return "C"
1570 class D(B, C):
1571 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001572 vereq(D.mro(), [D, B, C, A, object])
1573 vereq(D.__mro__, (D, B, C, A, object))
1574 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001575
Guido van Rossumd3077402001-08-12 05:24:18 +00001576 class PerverseMetaType(type):
1577 def mro(cls):
1578 L = type.mro(cls)
1579 L.reverse()
1580 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001581 class X(D,B,C,A, metaclass=PerverseMetaType):
1582 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(X.__mro__, (object, A, C, B, D, X))
1584 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001585
Armin Rigo037d1e02005-12-29 17:07:39 +00001586 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001587 class _metaclass(type):
1588 def mro(self):
1589 return [self, dict, object]
1590 class X(object, metaclass=_metaclass):
1591 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001592 except TypeError:
1593 pass
1594 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001595 raise TestFailed("devious mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001596
1597 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001598 class _metaclass(type):
1599 def mro(self):
1600 return [1]
1601 class X(object, metaclass=_metaclass):
1602 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001603 except TypeError:
1604 pass
1605 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001606 raise TestFailed("non-class mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001607
1608 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001609 class _metaclass(type):
1610 def mro(self):
1611 return 1
1612 class X(object, metaclass=_metaclass):
1613 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001614 except TypeError:
1615 pass
1616 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001617 raise TestFailed("non-sequence mro() return not caught")
Tim Peters1b27f862005-12-30 18:42:42 +00001618
Armin Rigo037d1e02005-12-29 17:07:39 +00001619
Tim Peters6d6c1a32001-08-02 04:15:00 +00001620def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001621 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001622
1623 class B(object):
1624 "Intermediate class because object doesn't have a __setattr__"
1625
1626 class C(B):
1627
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001628 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001629 if name == "foo":
1630 return ("getattr", name)
1631 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001632 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001633 def __setattr__(self, name, value):
1634 if name == "foo":
1635 self.setattr = (name, value)
1636 else:
1637 return B.__setattr__(self, name, value)
1638 def __delattr__(self, name):
1639 if name == "foo":
1640 self.delattr = name
1641 else:
1642 return B.__delattr__(self, name)
1643
1644 def __getitem__(self, key):
1645 return ("getitem", key)
1646 def __setitem__(self, key, value):
1647 self.setitem = (key, value)
1648 def __delitem__(self, key):
1649 self.delitem = key
1650
Tim Peters6d6c1a32001-08-02 04:15:00 +00001651 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001652 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001653 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001654 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001655 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001656 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001657
Guido van Rossum45704552001-10-08 16:35:45 +00001658 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001659 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001661 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001663
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001664 vereq(a[0:10], ("getitem", slice(0, 10)))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665 a[0:10] = "foo"
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001666 vereq(a.setitem, (slice(0, 10), "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667 del a[0:10]
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001668 vereq(a.delitem, slice(0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001669
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001670def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001671 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001672 class C(object):
1673 def __init__(self, x):
1674 self.x = x
1675 def foo(self):
1676 return self.x
1677 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001678 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001679 class D(C):
1680 boo = C.foo
1681 goo = c1.foo
1682 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq(d2.foo(), 2)
1684 vereq(d2.boo(), 2)
1685 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001686 class E(object):
1687 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001688 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001689 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001690
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001691def specials():
1692 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001693 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001694 # Test the default behavior for static classes
1695 class C(object):
1696 def __getitem__(self, i):
1697 if 0 <= i < 10: return i
1698 raise IndexError
1699 c1 = C()
1700 c2 = C()
1701 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001702 verify(id(c1) != id(c2))
1703 hash(c1)
1704 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001705 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001706 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001707 verify(c1 != c2)
1708 verify(not c1 != c1)
1709 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001710 # Note that the module name appears in str/repr, and that varies
1711 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001712 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001713 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001714 verify(-1 not in c1)
1715 for i in range(10):
1716 verify(i in c1)
1717 verify(10 not in c1)
1718 # Test the default behavior for dynamic classes
1719 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001720 def __getitem__(self, i):
1721 if 0 <= i < 10: return i
1722 raise IndexError
1723 d1 = D()
1724 d2 = D()
1725 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001726 verify(id(d1) != id(d2))
1727 hash(d1)
1728 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001729 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001730 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001731 verify(d1 != d2)
1732 verify(not d1 != d1)
1733 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001734 # Note that the module name appears in str/repr, and that varies
1735 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001736 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001737 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001738 verify(-1 not in d1)
1739 for i in range(10):
1740 verify(i in d1)
1741 verify(10 not in d1)
1742 # Test overridden behavior for static classes
1743 class Proxy(object):
1744 def __init__(self, x):
1745 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001746 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001747 return not not self.x
1748 def __hash__(self):
1749 return hash(self.x)
1750 def __eq__(self, other):
1751 return self.x == other
1752 def __ne__(self, other):
1753 return self.x != other
1754 def __cmp__(self, other):
1755 return cmp(self.x, other.x)
1756 def __str__(self):
1757 return "Proxy:%s" % self.x
1758 def __repr__(self):
1759 return "Proxy(%r)" % self.x
1760 def __contains__(self, value):
1761 return value in self.x
1762 p0 = Proxy(0)
1763 p1 = Proxy(1)
1764 p_1 = Proxy(-1)
1765 verify(not p0)
1766 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001767 vereq(hash(p0), hash(0))
1768 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001769 verify(p0 != p1)
1770 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001771 vereq(not p0, p1)
1772 vereq(cmp(p0, p1), -1)
1773 vereq(cmp(p0, p0), 0)
1774 vereq(cmp(p0, p_1), 1)
1775 vereq(str(p0), "Proxy:0")
1776 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001777 p10 = Proxy(range(10))
1778 verify(-1 not in p10)
1779 for i in range(10):
1780 verify(i in p10)
1781 verify(10 not in p10)
1782 # Test overridden behavior for dynamic classes
1783 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001784 def __init__(self, x):
1785 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001786 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001787 return not not self.x
1788 def __hash__(self):
1789 return hash(self.x)
1790 def __eq__(self, other):
1791 return self.x == other
1792 def __ne__(self, other):
1793 return self.x != other
1794 def __cmp__(self, other):
1795 return cmp(self.x, other.x)
1796 def __str__(self):
1797 return "DProxy:%s" % self.x
1798 def __repr__(self):
1799 return "DProxy(%r)" % self.x
1800 def __contains__(self, value):
1801 return value in self.x
1802 p0 = DProxy(0)
1803 p1 = DProxy(1)
1804 p_1 = DProxy(-1)
1805 verify(not p0)
1806 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001807 vereq(hash(p0), hash(0))
1808 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001809 verify(p0 != p1)
1810 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(not p0, p1)
1812 vereq(cmp(p0, p1), -1)
1813 vereq(cmp(p0, p0), 0)
1814 vereq(cmp(p0, p_1), 1)
1815 vereq(str(p0), "DProxy:0")
1816 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001817 p10 = DProxy(range(10))
1818 verify(-1 not in p10)
1819 for i in range(10):
1820 verify(i in p10)
1821 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001822## # Safety test for __cmp__
1823## def unsafecmp(a, b):
1824## try:
1825## a.__class__.__cmp__(a, b)
1826## except TypeError:
1827## pass
1828## else:
1829## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1830## a.__class__, a, b)
1831## unsafecmp(u"123", "123")
1832## unsafecmp("123", u"123")
1833## unsafecmp(1, 1.0)
1834## unsafecmp(1.0, 1)
1835## unsafecmp(1, 1L)
1836## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001837
Thomas Wouters89d996e2007-09-08 17:39:28 +00001838def recursions():
1839 if verbose:
1840 print("Testing recursion checks ...")
1841
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001842## class Letter(str):
1843## def __new__(cls, letter):
1844## if letter == 'EPS':
1845## return str.__new__(cls)
1846## return str.__new__(cls, letter)
1847## def __str__(self):
1848## if not self:
1849## return 'EPS'
1850## return self
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001851## # sys.stdout needs to be the original to trigger the recursion bug
1852## import sys
1853## test_stdout = sys.stdout
1854## sys.stdout = get_original_stdout()
1855## try:
1856## # nothing should actually be printed, this should raise an exception
1857## print(Letter('w'))
1858## except RuntimeError:
1859## pass
1860## else:
1861## raise TestFailed, "expected a RuntimeError for print recursion"
1862## sys.stdout = test_stdout
Neal Norwitz1a997502003-01-13 20:13:12 +00001863
Thomas Wouters89d996e2007-09-08 17:39:28 +00001864 # Bug #1202533.
1865 class A(object):
1866 pass
1867 A.__mul__ = new.instancemethod(lambda self, x: self * x, None, A)
1868 try:
1869 A()*2
1870 except RuntimeError:
1871 pass
1872 else:
1873 raise TestFailed("expected a RuntimeError")
1874
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001875def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001876 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001877 import weakref
1878 class C(object):
1879 pass
1880 c = C()
1881 r = weakref.ref(c)
1882 verify(r() is c)
1883 del c
1884 verify(r() is None)
1885 del r
1886 class NoWeak(object):
1887 __slots__ = ['foo']
1888 no = NoWeak()
1889 try:
1890 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001891 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001892 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001893 else:
1894 verify(0, "weakref.ref(no) should be illegal")
1895 class Weak(object):
1896 __slots__ = ['foo', '__weakref__']
1897 yes = Weak()
1898 r = weakref.ref(yes)
1899 verify(r() is yes)
1900 del yes
1901 verify(r() is None)
1902 del r
1903
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001904def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001905 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001906 class C(object):
1907 def getx(self):
1908 return self.__x
1909 def setx(self, value):
1910 self.__x = value
1911 def delx(self):
1912 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001913 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001914 a = C()
1915 verify(not hasattr(a, "x"))
1916 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001917 vereq(a._C__x, 42)
1918 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001919 del a.x
1920 verify(not hasattr(a, "x"))
1921 verify(not hasattr(a, "_C__x"))
1922 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001923 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001924 C.x.__delete__(a)
1925 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001926
Tim Peters66c1a522001-09-24 21:17:50 +00001927 raw = C.__dict__['x']
1928 verify(isinstance(raw, property))
1929
1930 attrs = dir(raw)
1931 verify("__doc__" in attrs)
1932 verify("fget" in attrs)
1933 verify("fset" in attrs)
1934 verify("fdel" in attrs)
1935
Guido van Rossum45704552001-10-08 16:35:45 +00001936 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001937 verify(raw.fget is C.__dict__['getx'])
1938 verify(raw.fset is C.__dict__['setx'])
1939 verify(raw.fdel is C.__dict__['delx'])
1940
1941 for attr in "__doc__", "fget", "fset", "fdel":
1942 try:
1943 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001944 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001945 if str(msg).find('readonly') < 0:
1946 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001947 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001948 "msg %r" % (attr, str(msg)))
1949 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001950 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001951 "readonly %r attr on a property" % attr)
1952
Neal Norwitz673cd822002-10-18 16:33:13 +00001953 class D(object):
1954 __getitem__ = property(lambda s: 1/0)
1955
1956 d = D()
1957 try:
1958 for i in d:
1959 str(i)
1960 except ZeroDivisionError:
1961 pass
1962 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001963 raise TestFailed("expected ZeroDivisionError from bad property")
Neal Norwitz673cd822002-10-18 16:33:13 +00001964
Georg Brandl533ff6f2006-03-08 18:09:27 +00001965 class E(object):
1966 def getter(self):
1967 "getter method"
1968 return 0
1969 def setter(self, value):
1970 "setter method"
1971 pass
1972 prop = property(getter)
1973 vereq(prop.__doc__, "getter method")
1974 prop2 = property(fset=setter)
1975 vereq(prop2.__doc__, None)
1976
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001977 # this segfaulted in 2.5b2
1978 try:
1979 import _testcapi
1980 except ImportError:
1981 pass
1982 else:
1983 class X(object):
1984 p = property(_testcapi.test_with_docstring)
1985
1986
Guido van Rossumc4a18802001-08-24 16:55:27 +00001987def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001988 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001989
1990 class A(object):
1991 def meth(self, a):
1992 return "A(%r)" % a
1993
Guido van Rossum45704552001-10-08 16:35:45 +00001994 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001995
1996 class B(A):
1997 def __init__(self):
1998 self.__super = super(B, self)
1999 def meth(self, a):
2000 return "B(%r)" % a + self.__super.meth(a)
2001
Guido van Rossum45704552001-10-08 16:35:45 +00002002 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002003
2004 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002005 def meth(self, a):
2006 return "C(%r)" % a + self.__super.meth(a)
2007 C._C__super = super(C)
2008
Guido van Rossum45704552001-10-08 16:35:45 +00002009 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002010
2011 class D(C, B):
2012 def meth(self, a):
2013 return "D(%r)" % a + super(D, self).meth(a)
2014
Guido van Rossum5b443c62001-12-03 15:38:28 +00002015 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2016
2017 # Test for subclassing super
2018
2019 class mysuper(super):
2020 def __init__(self, *args):
2021 return super(mysuper, self).__init__(*args)
2022
2023 class E(D):
2024 def meth(self, a):
2025 return "E(%r)" % a + mysuper(E, self).meth(a)
2026
2027 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2028
2029 class F(E):
2030 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002031 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002032 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2033 F._F__super = mysuper(F)
2034
2035 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2036
2037 # Make sure certain errors are raised
2038
2039 try:
2040 super(D, 42)
2041 except TypeError:
2042 pass
2043 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002044 raise TestFailed("shouldn't allow super(D, 42)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002045
2046 try:
2047 super(D, C())
2048 except TypeError:
2049 pass
2050 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002051 raise TestFailed("shouldn't allow super(D, C())")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002052
2053 try:
2054 super(D).__get__(12)
2055 except TypeError:
2056 pass
2057 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002058 raise TestFailed("shouldn't allow super(D).__get__(12)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002059
2060 try:
2061 super(D).__get__(C())
2062 except TypeError:
2063 pass
2064 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002065 raise TestFailed("shouldn't allow super(D).__get__(C())")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002066
Guido van Rossuma4541a32003-04-16 20:02:22 +00002067 # Make sure data descriptors can be overridden and accessed via super
2068 # (new feature in Python 2.3)
2069
2070 class DDbase(object):
2071 def getx(self): return 42
2072 x = property(getx)
2073
2074 class DDsub(DDbase):
2075 def getx(self): return "hello"
2076 x = property(getx)
2077
2078 dd = DDsub()
2079 vereq(dd.x, "hello")
2080 vereq(super(DDsub, dd).x, 42)
2081
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002082 # Ensure that super() lookup of descriptor from classmethod
2083 # works (SF ID# 743627)
2084
2085 class Base(object):
2086 aProp = property(lambda self: "foo")
2087
2088 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002089 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002090 def test(klass):
2091 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002092
2093 veris(Sub.test(), Base.aProp)
2094
Thomas Wouters89f507f2006-12-13 04:49:30 +00002095 # Verify that super() doesn't allow keyword args
2096 try:
2097 super(Base, kw=1)
2098 except TypeError:
2099 pass
2100 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002101 raise TestFailed("super shouldn't accept keyword args")
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002102
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002103def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002104 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002105
2106 class hexint(int):
2107 def __repr__(self):
2108 return hex(self)
2109 def __add__(self, other):
2110 return hexint(int.__add__(self, other))
2111 # (Note that overriding __radd__ doesn't work,
2112 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002113 vereq(repr(hexint(7) + 9), "0x10")
2114 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002115 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002116 vereq(a, 12345)
2117 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002118 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002119 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002120 verify((+a).__class__ is int)
2121 verify((a >> 0).__class__ is int)
2122 verify((a << 0).__class__ is int)
2123 verify((hexint(0) << 12).__class__ is int)
2124 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002125
Guido van Rossume2a383d2007-01-15 16:59:06 +00002126 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002127 __slots__ = []
2128 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002129 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002130 def __add__(self, other):
2131 return self.__class__(super(octlong, self).__add__(other))
2132 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002133 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002134 # (Note that overriding __radd__ here only seems to work
2135 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002136 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002137 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002138 vereq(a, 12345)
2139 vereq(int(a), 12345)
2140 vereq(hash(a), hash(12345))
2141 verify(int(a).__class__ is int)
2142 verify((+a).__class__ is int)
2143 verify((-a).__class__ is int)
2144 verify((-octlong(0)).__class__ is int)
2145 verify((a >> 0).__class__ is int)
2146 verify((a << 0).__class__ is int)
2147 verify((a - 0).__class__ is int)
2148 verify((a * 1).__class__ is int)
2149 verify((a ** 1).__class__ is int)
2150 verify((a // 1).__class__ is int)
2151 verify((1 * a).__class__ is int)
2152 verify((a | 0).__class__ is int)
2153 verify((a ^ 0).__class__ is int)
2154 verify((a & -1).__class__ is int)
2155 verify((octlong(0) << 12).__class__ is int)
2156 verify((octlong(0) >> 12).__class__ is int)
2157 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002158
2159 # Because octlong overrides __add__, we can't check the absence of +0
2160 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002161 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002162 pass
2163 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002164 verify((a + 0).__class__ is int)
2165 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002166
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002167 # Check that negative clones don't segfault
2168 a = longclone(-1)
2169 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002170 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002171
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002172 class precfloat(float):
2173 __slots__ = ['prec']
2174 def __init__(self, value=0.0, prec=12):
2175 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002176 def __repr__(self):
2177 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002179 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002180 vereq(a, 12345.0)
2181 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002182 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002184 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002185
Tim Peters2400fa42001-09-12 19:12:49 +00002186 class madcomplex(complex):
2187 def __repr__(self):
2188 return "%.17gj%+.17g" % (self.imag, self.real)
2189 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002190 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002191 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002192 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002193 vereq(a, base)
2194 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002195 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002196 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002197 vereq(repr(a), "4j-3")
2198 vereq(a, base)
2199 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002200 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002201 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002202 veris((+a).__class__, complex)
2203 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002204 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002205 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002206 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002207 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002208 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002209 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002210 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002211
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002212 class madtuple(tuple):
2213 _rev = None
2214 def rev(self):
2215 if self._rev is not None:
2216 return self._rev
2217 L = list(self)
2218 L.reverse()
2219 self._rev = self.__class__(L)
2220 return self._rev
2221 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002222 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2223 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2224 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002225 for i in range(512):
2226 t = madtuple(range(i))
2227 u = t.rev()
2228 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002229 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002230 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002231 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002232 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002233 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002234 verify(a[:].__class__ is tuple)
2235 verify((a * 1).__class__ is tuple)
2236 verify((a * 0).__class__ is tuple)
2237 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002238 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002239 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002240 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002241 verify((a + a).__class__ is tuple)
2242 verify((a * 0).__class__ is tuple)
2243 verify((a * 1).__class__ is tuple)
2244 verify((a * 2).__class__ is tuple)
2245 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002246
2247 class madstring(str):
2248 _rev = None
2249 def rev(self):
2250 if self._rev is not None:
2251 return self._rev
2252 L = list(self)
2253 L.reverse()
2254 self._rev = self.__class__("".join(L))
2255 return self._rev
2256 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002257 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2258 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2259 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002260 for i in range(256):
2261 s = madstring("".join(map(chr, range(i))))
2262 t = s.rev()
2263 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002265 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002267 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002268
Tim Peters8fa5dd02001-09-12 02:18:30 +00002269 base = "\x00" * 5
2270 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(s, base)
2272 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002273 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(hash(s), hash(base))
2275 vereq({s: 1}[base], 1)
2276 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002277 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002279 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002281 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002283 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002285 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002287 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002289 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002291 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002292 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002293 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002294 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002295 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002296 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002297 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002298 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002299 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002300 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002301 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002302 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002303 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002304 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002305 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002306 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002307 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002308 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002309 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002310
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002311 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002312 _rev = None
2313 def rev(self):
2314 if self._rev is not None:
2315 return self._rev
2316 L = list(self)
2317 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002318 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002319 return self._rev
2320 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002321 vereq(u, "ABCDEF")
2322 vereq(u.rev(), madunicode("FEDCBA"))
2323 vereq(u.rev().rev(), madunicode("ABCDEF"))
2324 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002325 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002326 vereq(str(u), base)
2327 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002328 vereq(hash(u), hash(base))
2329 vereq({u: 1}[base], 1)
2330 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002331 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002332 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002333 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002334 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002335 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002336 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002337 verify(u.replace("x", "x").__class__ is str)
2338 vereq(u.replace("x", "x"), base)
2339 verify(u.replace("xy", "xy").__class__ is str)
2340 vereq(u.replace("xy", "xy"), base)
2341 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002342 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002343 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002344 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002345 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002346 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002347 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002349 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002350 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002351 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002352 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002353 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002354 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002355 verify((u + "").__class__ is str)
2356 vereq(u + "", base)
2357 verify(("" + u).__class__ is str)
2358 vereq("" + u, base)
2359 verify((u * 0).__class__ is str)
2360 vereq(u * 0, "")
2361 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002362 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002363 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002364 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002365 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002366 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002367 verify(u[0:0].__class__ is str)
2368 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002369
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002370 class sublist(list):
2371 pass
2372 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002373 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002374 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002375 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002376 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002377 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002378 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002379 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002380 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002381 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002382 del a[10:15]
2383 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002384 vereq(a, list(range(10)))
2385 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002386 vereq(a[0], 0)
2387 vereq(a[9], 9)
2388 vereq(a[-10], 0)
2389 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002390 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002391
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002392## class CountedInput(file):
2393## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002394
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002395## self.lineno is the 0-based ordinal of the last line read, up to
2396## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002397
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002398## self.ateof is true if and only if the final "" line has been read,
2399## at which point self.lineno stops incrementing, and further calls
2400## to readline() continue to return "".
2401## """
Tim Peters59c9a642001-09-13 05:38:56 +00002402
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002403## lineno = 0
2404## ateof = 0
2405## def readline(self):
2406## if self.ateof:
2407## return ""
2408## s = file.readline(self)
2409## # Next line works too.
2410## # s = super(CountedInput, self).readline()
2411## self.lineno += 1
2412## if s == "":
2413## self.ateof = 1
2414## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002415
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002416## f = open(name=TESTFN, mode='w')
2417## lines = ['a\n', 'b\n', 'c\n']
2418## try:
2419## f.writelines(lines)
2420## f.close()
2421## f = CountedInput(TESTFN)
2422## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2423## got = f.readline()
2424## vereq(expected, got)
2425## vereq(f.lineno, i)
2426## vereq(f.ateof, (i > len(lines)))
2427## f.close()
2428## finally:
2429## try:
2430## f.close()
2431## except:
2432## pass
2433## try:
2434## import os
2435## os.unlink(TESTFN)
2436## except:
2437## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002438
Tim Peters808b94e2001-09-13 19:33:07 +00002439def keywords():
2440 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002441 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002442 vereq(int(x=1), 1)
2443 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002444 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002445 vereq(complex(imag=42, real=666), complex(666, 42))
2446 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002447 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002448 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002449 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002450 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002451
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002452 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002453 try:
2454 constructor(bogus_keyword_arg=1)
2455 except TypeError:
2456 pass
2457 else:
2458 raise TestFailed("expected TypeError from bogus keyword "
2459 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002460
Tim Peters0ab085c2001-09-14 00:25:33 +00002461def str_subclass_as_dict_key():
2462 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002463 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002464
2465 class cistr(str):
2466 """Sublcass of str that computes __eq__ case-insensitively.
2467
2468 Also computes a hash code of the string in canonical form.
2469 """
2470
2471 def __init__(self, value):
2472 self.canonical = value.lower()
2473 self.hashcode = hash(self.canonical)
2474
2475 def __eq__(self, other):
2476 if not isinstance(other, cistr):
2477 other = cistr(other)
2478 return self.canonical == other.canonical
2479
2480 def __hash__(self):
2481 return self.hashcode
2482
Guido van Rossum45704552001-10-08 16:35:45 +00002483 vereq(cistr('ABC'), 'abc')
2484 vereq('aBc', cistr('ABC'))
2485 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002486
2487 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002488 vereq(d[cistr('one')], 1)
2489 vereq(d[cistr('tWo')], 2)
2490 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002491 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002492 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002493
Guido van Rossumab3b0342001-09-18 20:38:53 +00002494def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002495 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002496 class classic:
2497 pass
2498 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002499 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002500 class C(base):
2501 def __init__(self, value):
2502 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002503 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002504 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002505 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002506 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002507 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002508 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002509 def __ne__(self, other):
2510 if isinstance(other, C):
2511 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002512 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002513 return self.value != other
2514 return NotImplemented
2515 def __lt__(self, other):
2516 if isinstance(other, C):
2517 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002518 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002519 return self.value < other
2520 return NotImplemented
2521 def __le__(self, other):
2522 if isinstance(other, C):
2523 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002524 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002525 return self.value <= other
2526 return NotImplemented
2527 def __gt__(self, other):
2528 if isinstance(other, C):
2529 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002530 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002531 return self.value > other
2532 return NotImplemented
2533 def __ge__(self, other):
2534 if isinstance(other, C):
2535 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002536 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002537 return self.value >= other
2538 return NotImplemented
2539
Guido van Rossumab3b0342001-09-18 20:38:53 +00002540 c1 = C(1)
2541 c2 = C(2)
2542 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002543 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002544 c = {1: c1, 2: c2, 3: c3}
2545 for x in 1, 2, 3:
2546 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002547 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002548 for op in "<", "<=", "==", "!=", ">", ">=":
2549 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2550 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002551 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2552 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002553
Guido van Rossum0639f592001-09-18 21:06:04 +00002554def rich_comparisons():
2555 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002556 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002557 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002558 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002559 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002560 vereq(z, 1+0j)
2561 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002562 class ZZ(complex):
2563 def __eq__(self, other):
2564 try:
2565 return abs(self - other) <= 1e-6
2566 except:
2567 return NotImplemented
2568 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002569 vereq(zz, 1+0j)
2570 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002571
Guido van Rossum0639f592001-09-18 21:06:04 +00002572 class classic:
2573 pass
2574 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002575 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002576 class C(base):
2577 def __init__(self, value):
2578 self.value = int(value)
2579 def __cmp__(self, other):
Collin Winter3add4d72007-08-29 23:37:32 +00002580 raise TestFailed("shouldn't call __cmp__")
Guido van Rossum0639f592001-09-18 21:06:04 +00002581 def __eq__(self, other):
2582 if isinstance(other, C):
2583 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002584 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002585 return self.value == other
2586 return NotImplemented
2587 def __ne__(self, other):
2588 if isinstance(other, C):
2589 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002590 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002591 return self.value != other
2592 return NotImplemented
2593 def __lt__(self, other):
2594 if isinstance(other, C):
2595 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002596 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002597 return self.value < other
2598 return NotImplemented
2599 def __le__(self, other):
2600 if isinstance(other, C):
2601 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002602 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002603 return self.value <= other
2604 return NotImplemented
2605 def __gt__(self, other):
2606 if isinstance(other, C):
2607 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002608 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002609 return self.value > other
2610 return NotImplemented
2611 def __ge__(self, other):
2612 if isinstance(other, C):
2613 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002614 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002615 return self.value >= other
2616 return NotImplemented
2617 c1 = C(1)
2618 c2 = C(2)
2619 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002620 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002621 c = {1: c1, 2: c2, 3: c3}
2622 for x in 1, 2, 3:
2623 for y in 1, 2, 3:
2624 for op in "<", "<=", "==", "!=", ">", ">=":
2625 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2626 "x=%d, y=%d" % (x, y))
2627 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2628 "x=%d, y=%d" % (x, y))
2629 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2630 "x=%d, y=%d" % (x, y))
2631
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002632def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002633 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002634 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002635 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002636 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002637 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2638 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002639
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002640def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002641 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002642 class C(object): pass
2643 class D(object): pass
2644 class E(object): pass
2645 class F(D, E): pass
2646 for cls in C, D, E, F:
2647 for cls2 in C, D, E, F:
2648 x = cls()
2649 x.__class__ = cls2
2650 verify(x.__class__ is cls2)
2651 x.__class__ = cls
2652 verify(x.__class__ is cls)
2653 def cant(x, C):
2654 try:
2655 x.__class__ = C
2656 except TypeError:
2657 pass
2658 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002659 raise TestFailed("shouldn't allow %r.__class__ = %r" % (x, C))
Guido van Rossumb6b89422002-04-15 01:03:30 +00002660 try:
2661 delattr(x, "__class__")
2662 except TypeError:
2663 pass
2664 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002665 raise TestFailed("shouldn't allow del %r.__class__" % x)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002666 cant(C(), list)
2667 cant(list(), C)
2668 cant(C(), 1)
2669 cant(C(), object)
2670 cant(object(), list)
2671 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002672 class Int(int): __slots__ = []
2673 cant(2, Int)
2674 cant(Int(), int)
2675 cant(True, int)
2676 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002677 o = object()
2678 cant(o, type(1))
2679 cant(o, type(None))
2680 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002681 class G(object):
2682 __slots__ = ["a", "b"]
2683 class H(object):
2684 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002685 class I(object):
2686 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002687 class J(object):
2688 __slots__ = ["c", "b"]
2689 class K(object):
2690 __slots__ = ["a", "b", "d"]
2691 class L(H):
2692 __slots__ = ["e"]
2693 class M(I):
2694 __slots__ = ["e"]
2695 class N(J):
2696 __slots__ = ["__weakref__"]
2697 class P(J):
2698 __slots__ = ["__dict__"]
2699 class Q(J):
2700 pass
2701 class R(J):
2702 __slots__ = ["__dict__", "__weakref__"]
2703
2704 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2705 x = cls()
2706 x.a = 1
2707 x.__class__ = cls2
2708 verify(x.__class__ is cls2,
2709 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2710 vereq(x.a, 1)
2711 x.__class__ = cls
2712 verify(x.__class__ is cls,
2713 "assigning %r as __class__ for %r silently failed" % (cls, x))
2714 vereq(x.a, 1)
2715 for cls in G, J, K, L, M, N, P, R, list, Int:
2716 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2717 if cls is cls2:
2718 continue
2719 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002720
Guido van Rossum6661be32001-10-26 04:26:12 +00002721def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002722 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002723 class C(object): pass
2724 a = C()
2725 a.__dict__ = {'b': 1}
2726 vereq(a.b, 1)
2727 def cant(x, dict):
2728 try:
2729 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002730 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002731 pass
2732 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002733 raise TestFailed("shouldn't allow %r.__dict__ = %r" % (x, dict))
Guido van Rossum6661be32001-10-26 04:26:12 +00002734 cant(a, None)
2735 cant(a, [])
2736 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002737 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002738
2739 class Base(object):
2740 pass
2741 def verify_dict_readonly(x):
2742 """
2743 x has to be an instance of a class inheriting from Base.
2744 """
2745 cant(x, {})
2746 try:
2747 del x.__dict__
2748 except (AttributeError, TypeError):
2749 pass
2750 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002751 raise TestFailed("shouldn't allow del %r.__dict__" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002752 dict_descr = Base.__dict__["__dict__"]
2753 try:
2754 dict_descr.__set__(x, {})
2755 except (AttributeError, TypeError):
2756 pass
2757 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002758 raise TestFailed("dict_descr allowed access to %r's dict" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002759
2760 # Classes don't allow __dict__ assignment and have readonly dicts
2761 class Meta1(type, Base):
2762 pass
2763 class Meta2(Base, type):
2764 pass
2765 class D(object):
2766 __metaclass__ = Meta1
2767 class E(object):
2768 __metaclass__ = Meta2
2769 for cls in C, D, E:
2770 verify_dict_readonly(cls)
2771 class_dict = cls.__dict__
2772 try:
2773 class_dict["spam"] = "eggs"
2774 except TypeError:
2775 pass
2776 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002777 raise TestFailed("%r's __dict__ can be modified" % cls)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002778
2779 # Modules also disallow __dict__ assignment
2780 class Module1(types.ModuleType, Base):
2781 pass
2782 class Module2(Base, types.ModuleType):
2783 pass
2784 for ModuleType in Module1, Module2:
2785 mod = ModuleType("spam")
2786 verify_dict_readonly(mod)
2787 mod.__dict__["spam"] = "eggs"
2788
2789 # Exception's __dict__ can be replaced, but not deleted
2790 class Exception1(Exception, Base):
2791 pass
2792 class Exception2(Base, Exception):
2793 pass
2794 for ExceptionType in Exception, Exception1, Exception2:
2795 e = ExceptionType()
2796 e.__dict__ = {"a": 1}
2797 vereq(e.a, 1)
2798 try:
2799 del e.__dict__
2800 except (TypeError, AttributeError):
2801 pass
2802 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002803 raise TestFaied("%r's __dict__ can be deleted" % e)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002804
Guido van Rossum6661be32001-10-26 04:26:12 +00002805
Guido van Rossum3926a632001-09-25 16:25:58 +00002806def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002807 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002808 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002809 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002810
2811 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002812 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002813
2814 global C
2815 class C(object):
2816 def __init__(self, a, b):
2817 super(C, self).__init__()
2818 self.a = a
2819 self.b = b
2820 def __repr__(self):
2821 return "C(%r, %r)" % (self.a, self.b)
2822
2823 global C1
2824 class C1(list):
2825 def __new__(cls, a, b):
2826 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002827 def __getnewargs__(self):
2828 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002829 def __init__(self, a, b):
2830 self.a = a
2831 self.b = b
2832 def __repr__(self):
2833 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2834
2835 global C2
2836 class C2(int):
2837 def __new__(cls, a, b, val=0):
2838 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002839 def __getnewargs__(self):
2840 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002841 def __init__(self, a, b, val=0):
2842 self.a = a
2843 self.b = b
2844 def __repr__(self):
2845 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2846
Guido van Rossum90c45142001-11-24 21:07:01 +00002847 global C3
2848 class C3(object):
2849 def __init__(self, foo):
2850 self.foo = foo
2851 def __getstate__(self):
2852 return self.foo
2853 def __setstate__(self, foo):
2854 self.foo = foo
2855
2856 global C4classic, C4
2857 class C4classic: # classic
2858 pass
2859 class C4(C4classic, object): # mixed inheritance
2860 pass
2861
Guido van Rossum99603b02007-07-20 00:22:32 +00002862 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002863 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002864 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002865 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002866
2867 for cls in C, C1, C2:
2868 s = p.dumps(cls, bin)
2869 cls2 = p.loads(s)
2870 verify(cls2 is cls)
2871
2872 a = C1(1, 2); a.append(42); a.append(24)
2873 b = C2("hello", "world", 42)
2874 s = p.dumps((a, b), bin)
2875 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002876 vereq(x.__class__, a.__class__)
2877 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2878 vereq(y.__class__, b.__class__)
2879 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002880 vereq(repr(x), repr(a))
2881 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002882 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002883 print("a = x =", a)
2884 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002885 # Test for __getstate__ and __setstate__ on new style class
2886 u = C3(42)
2887 s = p.dumps(u, bin)
2888 v = p.loads(s)
2889 veris(u.__class__, v.__class__)
2890 vereq(u.foo, v.foo)
2891 # Test for picklability of hybrid class
2892 u = C4()
2893 u.foo = 42
2894 s = p.dumps(u, bin)
2895 v = p.loads(s)
2896 veris(u.__class__, v.__class__)
2897 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002898
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002899 # Testing copy.deepcopy()
2900 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002901 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002902 import copy
2903 for cls in C, C1, C2:
2904 cls2 = copy.deepcopy(cls)
2905 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002906
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002907 a = C1(1, 2); a.append(42); a.append(24)
2908 b = C2("hello", "world", 42)
2909 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002910 vereq(x.__class__, a.__class__)
2911 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2912 vereq(y.__class__, b.__class__)
2913 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002914 vereq(repr(x), repr(a))
2915 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002916 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002917 print("a = x =", a)
2918 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002919
Guido van Rossum8c842552002-03-14 23:05:54 +00002920def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002921 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002922 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002923 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002924 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002925 global B, C, D, E
2926 class B(object):
2927 pass
2928 for base in [object, B]:
2929 class C(base):
2930 __slots__ = ['a']
2931 class D(C):
2932 pass
2933 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002934 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002935 except TypeError:
2936 pass
2937 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002938 raise TestFailed("should fail: pickle C instance - %s" % base)
Guido van Rossum8c842552002-03-14 23:05:54 +00002939 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002940 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002941 except TypeError:
2942 pass
2943 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002944 raise TestFailed("should fail: pickle D instance - %s" % base)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002945 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002946 class C(base):
2947 __slots__ = ['a']
2948 def __getstate__(self):
2949 try:
2950 d = self.__dict__.copy()
2951 except AttributeError:
2952 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002953 for cls in self.__class__.__mro__:
2954 for sn in cls.__dict__.get('__slots__', ()):
2955 try:
2956 d[sn] = getattr(self, sn)
2957 except AttributeError:
2958 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002959 return d
2960 def __setstate__(self, d):
2961 for k, v in d.items():
2962 setattr(self, k, v)
2963 class D(C):
2964 pass
2965 # Now it should work
2966 x = C()
2967 y = pickle.loads(pickle.dumps(x))
2968 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002969 x.a = 42
2970 y = pickle.loads(pickle.dumps(x))
2971 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00002972 x = D()
2973 x.a = 42
2974 x.b = 100
2975 y = pickle.loads(pickle.dumps(x))
2976 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002977 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002978 class E(C):
2979 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002980 x = E()
2981 x.a = 42
2982 x.b = "foo"
2983 y = pickle.loads(pickle.dumps(x))
2984 vereq(y.a, x.a)
2985 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002986
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002987def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002988 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002989 import copy
2990 class C(object):
2991 pass
2992
2993 a = C()
2994 a.foo = 12
2995 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002996 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002997
2998 a.bar = [1,2,3]
2999 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003000 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003001 verify(c.bar is a.bar)
3002
3003 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003004 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003005 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003006 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003007
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003008def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003009 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003010 class I(int):
3011 def __repr__(self):
3012 return "I(%r)" % int(self)
3013 def __add__(self, other):
3014 return I(int(self) + int(other))
3015 __radd__ = __add__
3016 def __pow__(self, other, mod=None):
3017 if mod is None:
3018 return I(pow(int(self), int(other)))
3019 else:
3020 return I(pow(int(self), int(other), int(mod)))
3021 def __rpow__(self, other, mod=None):
3022 if mod is None:
3023 return I(pow(int(other), int(self), mod))
3024 else:
3025 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003026
Walter Dörwald70a6b492004-02-12 17:35:32 +00003027 vereq(repr(I(1) + I(2)), "I(3)")
3028 vereq(repr(I(1) + 2), "I(3)")
3029 vereq(repr(1 + I(2)), "I(3)")
3030 vereq(repr(I(2) ** I(3)), "I(8)")
3031 vereq(repr(2 ** I(3)), "I(8)")
3032 vereq(repr(I(2) ** 3), "I(8)")
3033 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003034 class S(str):
3035 def __eq__(self, other):
3036 return self.lower() == other.lower()
3037
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003038def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003039 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003040 class A(object):
3041 pass
3042 class B(A):
3043 pass
3044 class C(A):
3045 pass
3046 class D(B, C):
3047 pass
3048 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003049 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003050 A.__hash__ = lambda self: 42
3051 vereq(hash(d), 42)
3052 C.__hash__ = lambda self: 314
3053 vereq(hash(d), 314)
3054 B.__hash__ = lambda self: 144
3055 vereq(hash(d), 144)
3056 D.__hash__ = lambda self: 100
3057 vereq(hash(d), 100)
3058 del D.__hash__
3059 vereq(hash(d), 144)
3060 del B.__hash__
3061 vereq(hash(d), 314)
3062 del C.__hash__
3063 vereq(hash(d), 42)
3064 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003065 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003066 d.foo = 42
3067 d.bar = 42
3068 vereq(d.foo, 42)
3069 vereq(d.bar, 42)
3070 def __getattribute__(self, name):
3071 if name == "foo":
3072 return 24
3073 return object.__getattribute__(self, name)
3074 A.__getattribute__ = __getattribute__
3075 vereq(d.foo, 24)
3076 vereq(d.bar, 42)
3077 def __getattr__(self, name):
3078 if name in ("spam", "foo", "bar"):
3079 return "hello"
Collin Winter3add4d72007-08-29 23:37:32 +00003080 raise AttributeError(name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003081 B.__getattr__ = __getattr__
3082 vereq(d.spam, "hello")
3083 vereq(d.foo, 24)
3084 vereq(d.bar, 42)
3085 del A.__getattribute__
3086 vereq(d.foo, 42)
3087 del d.foo
3088 vereq(d.foo, "hello")
3089 vereq(d.bar, 42)
3090 del B.__getattr__
3091 try:
3092 d.foo
3093 except AttributeError:
3094 pass
3095 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003096 raise TestFailed("d.foo should be undefined now")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003097
Guido van Rossume7f3e242002-06-14 02:35:45 +00003098 # Test a nasty bug in recurse_down_subclasses()
3099 import gc
3100 class A(object):
3101 pass
3102 class B(A):
3103 pass
3104 del B
3105 gc.collect()
3106 A.__setitem__ = lambda *a: None # crash
3107
Tim Petersfc57ccb2001-10-12 02:38:24 +00003108def buffer_inherit():
3109 import binascii
3110 # SF bug [#470040] ParseTuple t# vs subclasses.
3111 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003112 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003113
3114 class MyStr(str):
3115 pass
3116 base = 'abc'
3117 m = MyStr(base)
3118 # b2a_hex uses the buffer interface to get its argument's value, via
3119 # PyArg_ParseTuple 't#' code.
3120 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3121
3122 # It's not clear that unicode will continue to support the character
3123 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003124 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003125 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003126 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003127 m = MyUni(base)
3128 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3129
3130 class MyInt(int):
3131 pass
3132 m = MyInt(42)
3133 try:
3134 binascii.b2a_hex(m)
3135 raise TestFailed('subclass of int should not have a buffer interface')
3136 except TypeError:
3137 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003138
Tim Petersc9933152001-10-16 20:18:24 +00003139def str_of_str_subclass():
3140 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003141 import io
Tim Petersc9933152001-10-16 20:18:24 +00003142
3143 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003144 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003145
3146 class octetstring(str):
3147 def __str__(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +00003148 return binascii.b2a_hex(self).decode("ascii")
Tim Petersc9933152001-10-16 20:18:24 +00003149 def __repr__(self):
3150 return self + " repr"
3151
3152 o = octetstring('A')
3153 vereq(type(o), octetstring)
3154 vereq(type(str(o)), str)
3155 vereq(type(repr(o)), str)
3156 vereq(ord(o), 0x41)
3157 vereq(str(o), '41')
3158 vereq(repr(o), 'A repr')
3159 vereq(o.__str__(), '41')
3160 vereq(o.__repr__(), 'A repr')
3161
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003162 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003163 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003164 print(o, file=capture)
3165 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003166 vereq(capture.getvalue(), '41\n41\n')
3167 capture.close()
3168
Guido van Rossumc8e56452001-10-22 00:43:43 +00003169def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003170 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003171 def f(a): return a
3172 vereq(f.__call__(a=42), 42)
3173 a = []
3174 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003175 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003176
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003177def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003178 if verbose: print(("Testing recursive __call__() by setting to instance of "
3179 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003180 class A(object):
3181 pass
3182
3183 A.__call__ = A()
3184 try:
3185 A()()
3186 except RuntimeError:
3187 pass
3188 else:
3189 raise TestFailed("Recursion limit should have been reached for "
3190 "__call__()")
3191
Guido van Rossumed87ad82001-10-30 02:33:02 +00003192def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003193 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003194 log = []
3195 class C(object):
3196 def __del__(self):
3197 log.append(1)
3198 c = C()
3199 vereq(log, [])
3200 del c
3201 vereq(log, [1])
3202
Guido van Rossum29d26062001-12-11 04:37:34 +00003203 class D(object): pass
3204 d = D()
3205 try: del d[0]
3206 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003207 else: raise TestFailed("invalid del() didn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003208
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003209def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003210 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003211
3212 class mydict(dict):
3213 pass
3214 d = mydict()
3215 try:
3216 hash(d)
3217 except TypeError:
3218 pass
3219 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003220 raise TestFailed("hash() of dict subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003221
3222 class mylist(list):
3223 pass
3224 d = mylist()
3225 try:
3226 hash(d)
3227 except TypeError:
3228 pass
3229 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003230 raise TestFailed("hash() of list subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003231
Guido van Rossum29d26062001-12-11 04:37:34 +00003232def strops():
3233 try: 'a' + 5
3234 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003235 else: raise TestFailed("'' + 5 doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003236
3237 try: ''.split('')
3238 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003239 else: raise TestFailed("''.split('') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003240
Guido van Rossum29d26062001-12-11 04:37:34 +00003241 try: ''.rindex('5')
3242 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003243 else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003244
Guido van Rossum29d26062001-12-11 04:37:34 +00003245 try: '%(n)s' % None
3246 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003247 else: raise TestFailed("'%(n)s' % None doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003248
3249 try: '%(n' % {}
3250 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003251 else: raise TestFailed("'%(n' % {} '' doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003252
3253 try: '%*s' % ('abc')
3254 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003255 else: raise TestFailed("'%*s' % ('abc') doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003256
3257 try: '%*.*s' % ('abc', 5)
3258 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003259 else: raise TestFailed("'%*.*s' % ('abc', 5) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003260
3261 try: '%s' % (1, 2)
3262 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003263 else: raise TestFailed("'%s' % (1, 2) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003264
3265 try: '%' % None
3266 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003267 else: raise TestFailed("'%' % None doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003268
3269 vereq('534253'.isdigit(), 1)
3270 vereq('534253x'.isdigit(), 0)
3271 vereq('%c' % 5, '\x05')
3272 vereq('%c' % '5', '5')
3273
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003274def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003275 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003276 class Node:
3277 pass
3278 a = Node()
3279 b = Node()
3280 a.b = b
3281 b.a = a
3282 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003283
Guido van Rossumd7035672002-03-12 20:43:31 +00003284def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003285 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003286 from types import ModuleType as M
3287 m = M.__new__(M)
3288 str(m)
3289 vereq(hasattr(m, "__name__"), 0)
3290 vereq(hasattr(m, "__file__"), 0)
3291 vereq(hasattr(m, "foo"), 0)
3292 vereq(m.__dict__, None)
3293 m.foo = 1
3294 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003295
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003296def dictproxyiterkeys():
3297 class C(object):
3298 def meth(self):
3299 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003300 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003301 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003302 keys.sort()
3303 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3304
3305def dictproxyitervalues():
3306 class C(object):
3307 def meth(self):
3308 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003309 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003310 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003311 vereq(len(values), 5)
3312
3313def dictproxyiteritems():
3314 class C(object):
3315 def meth(self):
3316 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003317 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003318 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003319 keys.sort()
3320 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3321
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003322def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003323 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003324 class C(object):
3325 def __new__(cls, arg):
3326 if isinstance(arg, str): return [1, 2, 3]
3327 elif isinstance(arg, int): return object.__new__(D)
3328 else: return object.__new__(cls)
3329 class D(C):
3330 def __init__(self, arg):
3331 self.foo = arg
3332 vereq(C("1"), [1, 2, 3])
3333 vereq(D("1"), [1, 2, 3])
3334 d = D(None)
3335 veris(d.foo, None)
3336 d = C(1)
3337 vereq(isinstance(d, D), True)
3338 vereq(d.foo, 1)
3339 d = D(1)
3340 vereq(isinstance(d, D), True)
3341 vereq(d.foo, 1)
3342
Guido van Rossume8fc6402002-04-16 16:44:51 +00003343def imulbug():
3344 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003345 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003346 class C(object):
3347 def __imul__(self, other):
3348 return (self, other)
3349 x = C()
3350 y = x
3351 y *= 1.0
3352 vereq(y, (x, 1.0))
3353 y = x
3354 y *= 2
3355 vereq(y, (x, 2))
3356 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003357 y *= 3
3358 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003359 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003360 y *= 1<<100
3361 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003362 y = x
3363 y *= None
3364 vereq(y, (x, None))
3365 y = x
3366 y *= "foo"
3367 vereq(y, (x, "foo"))
3368
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003369def docdescriptor():
3370 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003371 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003372 class DocDescr(object):
3373 def __get__(self, object, otype):
3374 if object:
3375 object = object.__class__.__name__ + ' instance'
3376 if otype:
3377 otype = otype.__name__
3378 return 'object=%s; type=%s' % (object, otype)
3379 class OldClass:
3380 __doc__ = DocDescr()
3381 class NewClass(object):
3382 __doc__ = DocDescr()
3383 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3384 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3385 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3386 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3387
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003388def copy_setstate():
3389 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003390 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003391 import copy
3392 class C(object):
3393 def __init__(self, foo=None):
3394 self.foo = foo
3395 self.__foo = foo
3396 def setfoo(self, foo=None):
3397 self.foo = foo
3398 def getfoo(self):
3399 return self.__foo
3400 def __getstate__(self):
3401 return [self.foo]
3402 def __setstate__(self, lst):
3403 assert len(lst) == 1
3404 self.__foo = self.foo = lst[0]
3405 a = C(42)
3406 a.setfoo(24)
3407 vereq(a.foo, 24)
3408 vereq(a.getfoo(), 42)
3409 b = copy.copy(a)
3410 vereq(b.foo, 24)
3411 vereq(b.getfoo(), 24)
3412 b = copy.deepcopy(a)
3413 vereq(b.foo, 24)
3414 vereq(b.getfoo(), 24)
3415
Guido van Rossum09638c12002-06-13 19:17:46 +00003416def slices():
3417 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003418 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003419 # Strings
3420 vereq("hello"[:4], "hell")
3421 vereq("hello"[slice(4)], "hell")
3422 vereq(str.__getitem__("hello", slice(4)), "hell")
3423 class S(str):
3424 def __getitem__(self, x):
3425 return str.__getitem__(self, x)
3426 vereq(S("hello")[:4], "hell")
3427 vereq(S("hello")[slice(4)], "hell")
3428 vereq(S("hello").__getitem__(slice(4)), "hell")
3429 # Tuples
3430 vereq((1,2,3)[:2], (1,2))
3431 vereq((1,2,3)[slice(2)], (1,2))
3432 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3433 class T(tuple):
3434 def __getitem__(self, x):
3435 return tuple.__getitem__(self, x)
3436 vereq(T((1,2,3))[:2], (1,2))
3437 vereq(T((1,2,3))[slice(2)], (1,2))
3438 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3439 # Lists
3440 vereq([1,2,3][:2], [1,2])
3441 vereq([1,2,3][slice(2)], [1,2])
3442 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3443 class L(list):
3444 def __getitem__(self, x):
3445 return list.__getitem__(self, x)
3446 vereq(L([1,2,3])[:2], [1,2])
3447 vereq(L([1,2,3])[slice(2)], [1,2])
3448 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3449 # Now do lists and __setitem__
3450 a = L([1,2,3])
3451 a[slice(1, 3)] = [3,2]
3452 vereq(a, [1,3,2])
3453 a[slice(0, 2, 1)] = [3,1]
3454 vereq(a, [3,1,2])
3455 a.__setitem__(slice(1, 3), [2,1])
3456 vereq(a, [3,2,1])
3457 a.__setitem__(slice(0, 2, 1), [2,3])
3458 vereq(a, [2,3,1])
3459
Tim Peters2484aae2002-07-11 06:56:07 +00003460def subtype_resurrection():
3461 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003462 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003463
3464 class C(object):
3465 container = []
3466
3467 def __del__(self):
3468 # resurrect the instance
3469 C.container.append(self)
3470
3471 c = C()
3472 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003473 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003474 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003475 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003476
3477 # If that didn't blow up, it's also interesting to see whether clearing
3478 # the last container slot works: that will attempt to delete c again,
3479 # which will cause c to get appended back to the container again "during"
3480 # the del.
3481 del C.container[-1]
3482 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003483 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003484
Tim Peters14cb1e12002-07-11 18:26:21 +00003485 # Make c mortal again, so that the test framework with -l doesn't report
3486 # it as a leak.
3487 del C.__del__
3488
Guido van Rossum2d702462002-08-06 21:28:28 +00003489def slottrash():
3490 # Deallocating deeply nested slotted trash caused stack overflows
3491 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003492 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003493 class trash(object):
3494 __slots__ = ['x']
3495 def __init__(self, x):
3496 self.x = x
3497 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003498 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003499 o = trash(o)
3500 del o
3501
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003502def slotmultipleinheritance():
3503 # SF bug 575229, multiple inheritance w/ slots dumps core
3504 class A(object):
3505 __slots__=()
3506 class B(object):
3507 pass
3508 class C(A,B) :
3509 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003510 vereq(C.__basicsize__, B.__basicsize__)
3511 verify(hasattr(C, '__dict__'))
3512 verify(hasattr(C, '__weakref__'))
3513 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003514
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003515def testrmul():
3516 # SF patch 592646
3517 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003518 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003519 class C(object):
3520 def __mul__(self, other):
3521 return "mul"
3522 def __rmul__(self, other):
3523 return "rmul"
3524 a = C()
3525 vereq(a*2, "mul")
3526 vereq(a*2.2, "mul")
3527 vereq(2*a, "rmul")
3528 vereq(2.2*a, "rmul")
3529
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003530def testipow():
3531 # [SF bug 620179]
3532 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003533 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003534 class C(object):
3535 def __ipow__(self, other):
3536 pass
3537 a = C()
3538 a **= 2
3539
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003540def do_this_first():
3541 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003542 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003543 # This dumps core when SF bug 551412 isn't fixed --
3544 # but only when test_descr.py is run separately.
3545 # (That can't be helped -- as soon as PyType_Ready()
3546 # is called for PyLong_Type, the bug is gone.)
3547 class UserLong(object):
3548 def __pow__(self, *args):
3549 pass
3550 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003551 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003552 except:
3553 pass
3554
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003555 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003556 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003557 # Another segfault only when run early
3558 # (before PyType_Ready(tuple) is called)
3559 type.mro(tuple)
3560
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003561def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003562 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003563 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003564 # stuff that should work:
3565 class C(object):
3566 pass
3567 class C2(object):
3568 def __getattribute__(self, attr):
3569 if attr == 'a':
3570 return 2
3571 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003572 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003573 def meth(self):
3574 return 1
3575 class D(C):
3576 pass
3577 class E(D):
3578 pass
3579 d = D()
3580 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003581 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003582 D.__bases__ = (C2,)
3583 vereq(d.meth(), 1)
3584 vereq(e.meth(), 1)
3585 vereq(d.a, 2)
3586 vereq(e.a, 2)
3587 vereq(C2.__subclasses__(), [D])
3588
3589 # stuff that shouldn't:
3590 class L(list):
3591 pass
3592
3593 try:
3594 L.__bases__ = (dict,)
3595 except TypeError:
3596 pass
3597 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003598 raise TestFailed("shouldn't turn list subclass into dict subclass")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003599
3600 try:
3601 list.__bases__ = (dict,)
3602 except TypeError:
3603 pass
3604 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003605 raise TestFailed("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003606
3607 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003608 D.__bases__ = (C2, list)
3609 except TypeError:
3610 pass
3611 else:
3612 assert 0, "best_base calculation found wanting"
3613
3614 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003615 del D.__bases__
3616 except TypeError:
3617 pass
3618 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003619 raise TestFailed("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003620
3621 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003622 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003623 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003624 if str(msg) == "a new-style class can't have only classic bases":
Collin Winter3add4d72007-08-29 23:37:32 +00003625 raise TestFailed("wrong error message for .__bases__ = ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003626 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003627 raise TestFailed("shouldn't be able to set .__bases__ to ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003628
3629 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003630 D.__bases__ = (D,)
3631 except TypeError:
3632 pass
3633 else:
3634 # actually, we'll have crashed by here...
Collin Winter3add4d72007-08-29 23:37:32 +00003635 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003636
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003637 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003638 D.__bases__ = (C, C)
3639 except TypeError:
3640 pass
3641 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003642 raise TestFailed("didn't detect repeated base classes")
Michael W. Hudsone723e452003-08-07 14:58:10 +00003643
3644 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003645 D.__bases__ = (E,)
3646 except TypeError:
3647 pass
3648 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003649 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003650
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003651def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003652 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003653 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003654 class WorkOnce(type):
3655 def __new__(self, name, bases, ns):
3656 self.flag = 0
3657 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3658 def mro(self):
3659 if self.flag > 0:
Collin Winter3add4d72007-08-29 23:37:32 +00003660 raise RuntimeError("bozo")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003661 else:
3662 self.flag += 1
3663 return type.mro(self)
3664
3665 class WorkAlways(type):
3666 def mro(self):
3667 # this is here to make sure that .mro()s aren't called
3668 # with an exception set (which was possible at one point).
3669 # An error message will be printed in a debug build.
3670 # What's a good way to test for this?
3671 return type.mro(self)
3672
3673 class C(object):
3674 pass
3675
3676 class C2(object):
3677 pass
3678
3679 class D(C):
3680 pass
3681
3682 class E(D):
3683 pass
3684
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003685 class F(D, metaclass=WorkOnce):
3686 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003687
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003688 class G(D, metaclass=WorkAlways):
3689 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003690
3691 # Immediate subclasses have their mro's adjusted in alphabetical
3692 # order, so E's will get adjusted before adjusting F's fails. We
3693 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003694
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003695 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003696 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003697
3698 try:
3699 D.__bases__ = (C2,)
3700 except RuntimeError:
3701 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003702 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003703 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003704 raise TestFailed("exception not propagated")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003705
3706def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003707 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003708 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003709 class A(object):
3710 pass
3711
3712 class B(object):
3713 pass
3714
3715 class C(A, B):
3716 pass
3717
3718 class D(A, B):
3719 pass
3720
3721 class E(C, D):
3722 pass
3723
3724 try:
3725 C.__bases__ = (B, A)
3726 except TypeError:
3727 pass
3728 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003729 raise TestFailed("didn't catch MRO conflict")
Tim Peters6578dc92002-12-24 18:31:27 +00003730
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003731def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003732 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003733 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003734 class C(object):
3735 pass
3736
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003737 # C.__module__ could be 'test_descr' or '__main__'
3738 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003739
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003740 C.__name__ = 'D'
3741 vereq((C.__module__, C.__name__), (mod, 'D'))
3742
3743 C.__name__ = 'D.E'
3744 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003745
Guido van Rossum613f24f2003-01-06 23:00:59 +00003746def subclass_right_op():
3747 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003748 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003749
3750 # This code tests various cases where right-dispatch of a subclass
3751 # should be preferred over left-dispatch of a base class.
3752
3753 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3754
3755 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003756 def __floordiv__(self, other):
3757 return "B.__floordiv__"
3758 def __rfloordiv__(self, other):
3759 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003760
Guido van Rossumf389c772003-02-27 20:04:19 +00003761 vereq(B(1) // 1, "B.__floordiv__")
3762 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003763
3764 # Case 2: subclass of object; this is just the baseline for case 3
3765
3766 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003767 def __floordiv__(self, other):
3768 return "C.__floordiv__"
3769 def __rfloordiv__(self, other):
3770 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003771
Guido van Rossumf389c772003-02-27 20:04:19 +00003772 vereq(C() // 1, "C.__floordiv__")
3773 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003774
3775 # Case 3: subclass of new-style class; here it gets interesting
3776
3777 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003778 def __floordiv__(self, other):
3779 return "D.__floordiv__"
3780 def __rfloordiv__(self, other):
3781 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003782
Guido van Rossumf389c772003-02-27 20:04:19 +00003783 vereq(D() // C(), "D.__floordiv__")
3784 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003785
3786 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3787
3788 class E(C):
3789 pass
3790
Guido van Rossumf389c772003-02-27 20:04:19 +00003791 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003792
Guido van Rossumf389c772003-02-27 20:04:19 +00003793 vereq(E() // 1, "C.__floordiv__")
3794 vereq(1 // E(), "C.__rfloordiv__")
3795 vereq(E() // C(), "C.__floordiv__")
3796 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003797
Guido van Rossum373c7412003-01-07 13:41:37 +00003798def dict_type_with_metaclass():
3799 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003800 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003801
3802 class B(object):
3803 pass
3804 class M(type):
3805 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003806 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003807 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003808 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003809 veris(type(C.__dict__), type(B.__dict__))
3810
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003811def meth_class_get():
3812 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003813 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003814 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003815 # Baseline
3816 arg = [1, 2, 3]
3817 res = {1: None, 2: None, 3: None}
3818 vereq(dict.fromkeys(arg), res)
3819 vereq({}.fromkeys(arg), res)
3820 # Now get the descriptor
3821 descr = dict.__dict__["fromkeys"]
3822 # More baseline using the descriptor directly
3823 vereq(descr.__get__(None, dict)(arg), res)
3824 vereq(descr.__get__({})(arg), res)
3825 # Now check various error cases
3826 try:
3827 descr.__get__(None, None)
3828 except TypeError:
3829 pass
3830 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003831 raise TestFailed("shouldn't have allowed descr.__get__(None, None)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003832 try:
3833 descr.__get__(42)
3834 except TypeError:
3835 pass
3836 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003837 raise TestFailed("shouldn't have allowed descr.__get__(42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003838 try:
3839 descr.__get__(None, 42)
3840 except TypeError:
3841 pass
3842 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003843 raise TestFailed("shouldn't have allowed descr.__get__(None, 42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003844 try:
3845 descr.__get__(None, int)
3846 except TypeError:
3847 pass
3848 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003849 raise TestFailed("shouldn't have allowed descr.__get__(None, int)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003850
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003851def isinst_isclass():
3852 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003853 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003854 class Proxy(object):
3855 def __init__(self, obj):
3856 self.__obj = obj
3857 def __getattribute__(self, name):
3858 if name.startswith("_Proxy__"):
3859 return object.__getattribute__(self, name)
3860 else:
3861 return getattr(self.__obj, name)
3862 # Test with a classic class
3863 class C:
3864 pass
3865 a = C()
3866 pa = Proxy(a)
3867 verify(isinstance(a, C)) # Baseline
3868 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003869 # Test with a classic subclass
3870 class D(C):
3871 pass
3872 a = D()
3873 pa = Proxy(a)
3874 verify(isinstance(a, C)) # Baseline
3875 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003876 # Test with a new-style class
3877 class C(object):
3878 pass
3879 a = C()
3880 pa = Proxy(a)
3881 verify(isinstance(a, C)) # Baseline
3882 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003883 # Test with a new-style subclass
3884 class D(C):
3885 pass
3886 a = D()
3887 pa = Proxy(a)
3888 verify(isinstance(a, C)) # Baseline
3889 verify(isinstance(pa, C)) # Test
3890
3891def proxysuper():
3892 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003893 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003894 class Proxy(object):
3895 def __init__(self, obj):
3896 self.__obj = obj
3897 def __getattribute__(self, name):
3898 if name.startswith("_Proxy__"):
3899 return object.__getattribute__(self, name)
3900 else:
3901 return getattr(self.__obj, name)
3902
3903 class B(object):
3904 def f(self):
3905 return "B.f"
3906
3907 class C(B):
3908 def f(self):
3909 return super(C, self).f() + "->C.f"
3910
3911 obj = C()
3912 p = Proxy(obj)
3913 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003914
Guido van Rossum52b27052003-04-15 20:05:10 +00003915def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003916 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003917 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003918 try:
3919 object.__setattr__(str, "foo", 42)
3920 except TypeError:
3921 pass
3922 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003923 raise TestFailed("Carlo Verre __setattr__ suceeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003924 try:
3925 object.__delattr__(str, "lower")
3926 except TypeError:
3927 pass
3928 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003929 raise TestFailed("Carlo Verre __delattr__ succeeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003930
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003931def weakref_segfault():
3932 # SF 742911
3933 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003934 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003935
3936 import weakref
3937
3938 class Provoker:
3939 def __init__(self, referrent):
3940 self.ref = weakref.ref(referrent)
3941
3942 def __del__(self):
3943 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003944
3945 class Oops(object):
3946 pass
3947
3948 o = Oops()
3949 o.whatever = Provoker(o)
3950 del o
3951
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003952def wrapper_segfault():
3953 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003954 if verbose:
3955 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003956 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00003957 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003958 f = f.__call__
3959 f = None
3960
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003961# Fix SF #762455, segfault when sys.stdout is changed in getattr
3962def filefault():
3963 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003964 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003965 import sys
3966 class StdoutGuard:
3967 def __getattr__(self, attr):
3968 sys.stdout = sys.__stdout__
3969 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3970 sys.stdout = StdoutGuard()
3971 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003972 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003973 except RuntimeError:
3974 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003975
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003976def vicious_descriptor_nonsense():
3977 # A potential segfault spotted by Thomas Wouters in mail to
3978 # python-dev 2003-04-17, turned into an example & fixed by Michael
3979 # Hudson just less than four months later...
3980 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003981 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003982
3983 class Evil(object):
3984 def __hash__(self):
3985 return hash('attr')
3986 def __eq__(self, other):
3987 del C.attr
3988 return 0
3989
3990 class Descr(object):
3991 def __get__(self, ob, type=None):
3992 return 1
3993
3994 class C(object):
3995 attr = Descr()
3996
3997 c = C()
3998 c.__dict__[Evil()] = 0
3999
4000 vereq(c.attr, 1)
4001 # this makes a crash more likely:
4002 import gc; gc.collect()
4003 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004004
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004005def test_init():
4006 # SF 1155938
4007 class Foo(object):
4008 def __init__(self):
4009 return 10
4010 try:
4011 Foo()
4012 except TypeError:
4013 pass
4014 else:
Collin Winter3add4d72007-08-29 23:37:32 +00004015 raise TestFailed("did not test __init__() for None return")
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004016
Armin Rigoc6686b72005-11-07 08:38:00 +00004017def methodwrapper():
4018 # <type 'method-wrapper'> did not support any reflection before 2.5
4019 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004020 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004021
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004022 return # XXX should methods really support __eq__?
4023
Armin Rigoc6686b72005-11-07 08:38:00 +00004024 l = []
4025 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004026 vereq(l.__add__, [].__add__)
4027 verify(l.__add__ != [5].__add__)
4028 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004029 verify(l.__add__.__name__ == '__add__')
4030 verify(l.__add__.__self__ is l)
4031 verify(l.__add__.__objclass__ is list)
4032 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004033 try:
4034 hash(l.__add__)
4035 except TypeError:
4036 pass
4037 else:
4038 raise TestFailed("no TypeError from hash([].__add__)")
4039
4040 t = ()
4041 t += (7,)
4042 vereq(t.__add__, (7,).__add__)
4043 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004044
Armin Rigofd163f92005-12-29 15:59:19 +00004045def notimplemented():
4046 # all binary methods should be able to return a NotImplemented
4047 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004048 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004049
4050 import sys
4051 import types
4052 import operator
4053
4054 def specialmethod(self, other):
4055 return NotImplemented
4056
4057 def check(expr, x, y):
4058 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004059 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004060 except TypeError:
4061 pass
4062 else:
4063 raise TestFailed("no TypeError from %r" % (expr,))
4064
Guido van Rossume2a383d2007-01-15 16:59:06 +00004065 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004066 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4067 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004068 if 1:
4069 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004070 for name, expr, iexpr in [
4071 ('__add__', 'x + y', 'x += y'),
4072 ('__sub__', 'x - y', 'x -= y'),
4073 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004074 ('__truediv__', 'x / y', None),
4075 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004076 ('__mod__', 'x % y', 'x %= y'),
4077 ('__divmod__', 'divmod(x, y)', None),
4078 ('__pow__', 'x ** y', 'x **= y'),
4079 ('__lshift__', 'x << y', 'x <<= y'),
4080 ('__rshift__', 'x >> y', 'x >>= y'),
4081 ('__and__', 'x & y', 'x &= y'),
4082 ('__or__', 'x | y', 'x |= y'),
4083 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004084 ]:
4085 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004086 A = metaclass('A', (), {name: specialmethod})
4087 B = metaclass('B', (), {rname: specialmethod})
4088 a = A()
4089 b = B()
4090 check(expr, a, a)
4091 check(expr, a, b)
4092 check(expr, b, a)
4093 check(expr, b, b)
4094 check(expr, a, N1)
4095 check(expr, a, N2)
4096 check(expr, N1, b)
4097 check(expr, N2, b)
4098 if iexpr:
4099 check(iexpr, a, a)
4100 check(iexpr, a, b)
4101 check(iexpr, b, a)
4102 check(iexpr, b, b)
4103 check(iexpr, a, N1)
4104 check(iexpr, a, N2)
4105 iname = '__i' + name[2:]
4106 C = metaclass('C', (), {iname: specialmethod})
4107 c = C()
4108 check(iexpr, c, a)
4109 check(iexpr, c, b)
4110 check(iexpr, c, N1)
4111 check(iexpr, c, N2)
4112
Guido van Rossumd8faa362007-04-27 19:54:29 +00004113def test_assign_slice():
4114 # ceval.c's assign_slice used to check for
4115 # tp->tp_as_sequence->sq_slice instead of
4116 # tp->tp_as_sequence->sq_ass_slice
4117
4118 class C(object):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00004119 def __setitem__(self, idx, value):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004120 self.value = value
4121
4122 c = C()
4123 c[1:2] = 3
4124 vereq(c.value, 3)
4125
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004126def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004127 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004128 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004129 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004130 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004131 lists()
4132 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004133 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004134 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004135 ints()
4136 longs()
4137 floats()
4138 complexes()
4139 spamlists()
4140 spamdicts()
4141 pydicts()
4142 pylists()
4143 metaclass()
4144 pymods()
4145 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004146 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004147 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004148 ex5()
4149 monotonicity()
4150 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004151 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004152 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004153 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004154 dynamics()
4155 errors()
4156 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004157 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004158 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004159 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004160 classic()
4161 compattr()
4162 newslot()
4163 altmro()
4164 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004165 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004166 specials()
Thomas Wouters89d996e2007-09-08 17:39:28 +00004167 recursions()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004168 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004169 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004170 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004171 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004172 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004173 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004174 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004175 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004176 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004177 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004178 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004179 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004180 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004181 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004182 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004183 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004184 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004185 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004186 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004187 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004188 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004189 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004190 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004191 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004192 dictproxyiterkeys()
4193 dictproxyitervalues()
4194 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004195 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004196 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004197 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004198 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004199 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004200 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004201 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004202 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004203 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004204 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004205 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004206 test_mutable_bases()
4207 test_mutable_bases_with_failing_mro()
4208 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004209 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004210 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004211 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004212 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004213 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004214 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004215 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004216 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004217 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004218 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004219 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004220 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004221 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004222
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004223 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004224
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004225if __name__ == "__main__":
4226 test_main()