blob: e093ce8edfb689481a5a86885e2b7f8dd7d8e7bc [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)
Christian Heimes4a22b5d2007-11-25 09:39:14 +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'])
Christian Heimes4a22b5d2007-11-25 09:39:14 +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)
Christian Heimes4a22b5d2007-11-25 09:39:14 +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'])
Christian Heimes4a22b5d2007-11-25 09:39:14 +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
Christian Heimes4a22b5d2007-11-25 09:39:14 +00001507 r = repr(E().foo)
1508 verify(r.startswith("<bound method E.foo "), r)
1509 r = repr(C.foo.__get__(C()))
1510 verify(r.startswith("<bound method ?.foo "), r)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001511
1512def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001513 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001514 class C(object):
1515 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001516 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001517 self.__get = get
1518 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001519 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001520 def __get__(self, obj, type=None):
1521 return self.__get(obj)
1522 def __set__(self, obj, value):
1523 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001524 def __delete__(self, obj):
1525 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001526 def __init__(self):
1527 self.__x = 0
1528 def __get_x(self):
1529 x = self.__x
1530 self.__x = x+1
1531 return x
1532 def __set_x(self, x):
1533 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001534 def __delete_x(self):
1535 del self.__x
1536 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001537 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001538 vereq(a.x, 0)
1539 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001540 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001541 vereq(a.x, 10)
1542 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001543 del a.x
1544 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001545
1546def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001547 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001548 class C(list):
1549 def __new__(cls):
1550 self = list.__new__(cls)
1551 self.foo = 1
1552 return self
1553 def __init__(self):
1554 self.foo = self.foo + 2
1555 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001556 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001557 verify(a.__class__ is C)
1558 class D(C):
1559 pass
1560 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001561 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001562 verify(b.__class__ is D)
1563
Tim Peters6d6c1a32001-08-02 04:15:00 +00001564def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001565 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001566 class A(object):
1567 def f(self): return "A"
1568 class B(A):
1569 pass
1570 class C(A):
1571 def f(self): return "C"
1572 class D(B, C):
1573 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001574 vereq(D.mro(), [D, B, C, A, object])
1575 vereq(D.__mro__, (D, B, C, A, object))
1576 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001577
Guido van Rossumd3077402001-08-12 05:24:18 +00001578 class PerverseMetaType(type):
1579 def mro(cls):
1580 L = type.mro(cls)
1581 L.reverse()
1582 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001583 class X(D,B,C,A, metaclass=PerverseMetaType):
1584 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001585 vereq(X.__mro__, (object, A, C, B, D, X))
1586 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587
Armin Rigo037d1e02005-12-29 17:07:39 +00001588 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001589 class _metaclass(type):
1590 def mro(self):
1591 return [self, dict, object]
1592 class X(object, metaclass=_metaclass):
1593 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001594 except TypeError:
1595 pass
1596 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001597 raise TestFailed("devious mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001598
1599 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001600 class _metaclass(type):
1601 def mro(self):
1602 return [1]
1603 class X(object, metaclass=_metaclass):
1604 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001605 except TypeError:
1606 pass
1607 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001608 raise TestFailed("non-class mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001609
1610 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001611 class _metaclass(type):
1612 def mro(self):
1613 return 1
1614 class X(object, metaclass=_metaclass):
1615 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001616 except TypeError:
1617 pass
1618 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001619 raise TestFailed("non-sequence mro() return not caught")
Tim Peters1b27f862005-12-30 18:42:42 +00001620
Armin Rigo037d1e02005-12-29 17:07:39 +00001621
Tim Peters6d6c1a32001-08-02 04:15:00 +00001622def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001623 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001624
1625 class B(object):
1626 "Intermediate class because object doesn't have a __setattr__"
1627
1628 class C(B):
1629
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001630 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001631 if name == "foo":
1632 return ("getattr", name)
1633 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001634 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001635 def __setattr__(self, name, value):
1636 if name == "foo":
1637 self.setattr = (name, value)
1638 else:
1639 return B.__setattr__(self, name, value)
1640 def __delattr__(self, name):
1641 if name == "foo":
1642 self.delattr = name
1643 else:
1644 return B.__delattr__(self, name)
1645
1646 def __getitem__(self, key):
1647 return ("getitem", key)
1648 def __setitem__(self, key, value):
1649 self.setitem = (key, value)
1650 def __delitem__(self, key):
1651 self.delitem = key
1652
Tim Peters6d6c1a32001-08-02 04:15:00 +00001653 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001654 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001655 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001656 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001657 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001658 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001659
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001661 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001663 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001664 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001666 vereq(a[0:10], ("getitem", slice(0, 10)))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667 a[0:10] = "foo"
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001668 vereq(a.setitem, (slice(0, 10), "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001669 del a[0:10]
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001670 vereq(a.delitem, slice(0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001671
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001672def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001673 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001674 class C(object):
1675 def __init__(self, x):
1676 self.x = x
1677 def foo(self):
1678 return self.x
1679 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001680 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001681 class D(C):
1682 boo = C.foo
1683 goo = c1.foo
1684 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001685 vereq(d2.foo(), 2)
1686 vereq(d2.boo(), 2)
1687 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001688 class E(object):
1689 foo = C.foo
Christian Heimes4a22b5d2007-11-25 09:39:14 +00001690 vereq(E().foo.im_func, C.foo) # i.e., unbound
1691 r = repr(C.foo.__get__(C(1)))
1692 verify(r.startswith("<bound method "), r)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001693
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001694def specials():
1695 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001696 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001697 # Test the default behavior for static classes
1698 class C(object):
1699 def __getitem__(self, i):
1700 if 0 <= i < 10: return i
1701 raise IndexError
1702 c1 = C()
1703 c2 = C()
1704 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001705 verify(id(c1) != id(c2))
1706 hash(c1)
1707 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001708 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001709 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001710 verify(c1 != c2)
1711 verify(not c1 != c1)
1712 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001713 # Note that the module name appears in str/repr, and that varies
1714 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001715 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001716 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001717 verify(-1 not in c1)
1718 for i in range(10):
1719 verify(i in c1)
1720 verify(10 not in c1)
1721 # Test the default behavior for dynamic classes
1722 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001723 def __getitem__(self, i):
1724 if 0 <= i < 10: return i
1725 raise IndexError
1726 d1 = D()
1727 d2 = D()
1728 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001729 verify(id(d1) != id(d2))
1730 hash(d1)
1731 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001732 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001733 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001734 verify(d1 != d2)
1735 verify(not d1 != d1)
1736 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001737 # Note that the module name appears in str/repr, and that varies
1738 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001739 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001740 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001741 verify(-1 not in d1)
1742 for i in range(10):
1743 verify(i in d1)
1744 verify(10 not in d1)
1745 # Test overridden behavior for static classes
1746 class Proxy(object):
1747 def __init__(self, x):
1748 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001749 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001750 return not not self.x
1751 def __hash__(self):
1752 return hash(self.x)
1753 def __eq__(self, other):
1754 return self.x == other
1755 def __ne__(self, other):
1756 return self.x != other
1757 def __cmp__(self, other):
1758 return cmp(self.x, other.x)
1759 def __str__(self):
1760 return "Proxy:%s" % self.x
1761 def __repr__(self):
1762 return "Proxy(%r)" % self.x
1763 def __contains__(self, value):
1764 return value in self.x
1765 p0 = Proxy(0)
1766 p1 = Proxy(1)
1767 p_1 = Proxy(-1)
1768 verify(not p0)
1769 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001770 vereq(hash(p0), hash(0))
1771 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001772 verify(p0 != p1)
1773 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001774 vereq(not p0, p1)
1775 vereq(cmp(p0, p1), -1)
1776 vereq(cmp(p0, p0), 0)
1777 vereq(cmp(p0, p_1), 1)
1778 vereq(str(p0), "Proxy:0")
1779 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001780 p10 = Proxy(range(10))
1781 verify(-1 not in p10)
1782 for i in range(10):
1783 verify(i in p10)
1784 verify(10 not in p10)
1785 # Test overridden behavior for dynamic classes
1786 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001787 def __init__(self, x):
1788 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001789 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001790 return not not self.x
1791 def __hash__(self):
1792 return hash(self.x)
1793 def __eq__(self, other):
1794 return self.x == other
1795 def __ne__(self, other):
1796 return self.x != other
1797 def __cmp__(self, other):
1798 return cmp(self.x, other.x)
1799 def __str__(self):
1800 return "DProxy:%s" % self.x
1801 def __repr__(self):
1802 return "DProxy(%r)" % self.x
1803 def __contains__(self, value):
1804 return value in self.x
1805 p0 = DProxy(0)
1806 p1 = DProxy(1)
1807 p_1 = DProxy(-1)
1808 verify(not p0)
1809 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001810 vereq(hash(p0), hash(0))
1811 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001812 verify(p0 != p1)
1813 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001814 vereq(not p0, p1)
1815 vereq(cmp(p0, p1), -1)
1816 vereq(cmp(p0, p0), 0)
1817 vereq(cmp(p0, p_1), 1)
1818 vereq(str(p0), "DProxy:0")
1819 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001820 p10 = DProxy(range(10))
1821 verify(-1 not in p10)
1822 for i in range(10):
1823 verify(i in p10)
1824 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001825## # Safety test for __cmp__
1826## def unsafecmp(a, b):
1827## try:
1828## a.__class__.__cmp__(a, b)
1829## except TypeError:
1830## pass
1831## else:
1832## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1833## a.__class__, a, b)
1834## unsafecmp(u"123", "123")
1835## unsafecmp("123", u"123")
1836## unsafecmp(1, 1.0)
1837## unsafecmp(1.0, 1)
1838## unsafecmp(1, 1L)
1839## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001840
Thomas Wouters89d996e2007-09-08 17:39:28 +00001841def recursions():
1842 if verbose:
1843 print("Testing recursion checks ...")
1844
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001845## class Letter(str):
1846## def __new__(cls, letter):
1847## if letter == 'EPS':
1848## return str.__new__(cls)
1849## return str.__new__(cls, letter)
1850## def __str__(self):
1851## if not self:
1852## return 'EPS'
1853## return self
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001854## # sys.stdout needs to be the original to trigger the recursion bug
1855## import sys
1856## test_stdout = sys.stdout
1857## sys.stdout = get_original_stdout()
1858## try:
1859## # nothing should actually be printed, this should raise an exception
1860## print(Letter('w'))
1861## except RuntimeError:
1862## pass
1863## else:
1864## raise TestFailed, "expected a RuntimeError for print recursion"
1865## sys.stdout = test_stdout
Neal Norwitz1a997502003-01-13 20:13:12 +00001866
Thomas Wouters89d996e2007-09-08 17:39:28 +00001867 # Bug #1202533.
1868 class A(object):
1869 pass
1870 A.__mul__ = new.instancemethod(lambda self, x: self * x, None, A)
1871 try:
1872 A()*2
1873 except RuntimeError:
1874 pass
1875 else:
1876 raise TestFailed("expected a RuntimeError")
1877
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001878def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001879 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001880 import weakref
1881 class C(object):
1882 pass
1883 c = C()
1884 r = weakref.ref(c)
1885 verify(r() is c)
1886 del c
1887 verify(r() is None)
1888 del r
1889 class NoWeak(object):
1890 __slots__ = ['foo']
1891 no = NoWeak()
1892 try:
1893 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001894 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001895 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001896 else:
1897 verify(0, "weakref.ref(no) should be illegal")
1898 class Weak(object):
1899 __slots__ = ['foo', '__weakref__']
1900 yes = Weak()
1901 r = weakref.ref(yes)
1902 verify(r() is yes)
1903 del yes
1904 verify(r() is None)
1905 del r
1906
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001907def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001908 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001909 class C(object):
1910 def getx(self):
1911 return self.__x
1912 def setx(self, value):
1913 self.__x = value
1914 def delx(self):
1915 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001916 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001917 a = C()
1918 verify(not hasattr(a, "x"))
1919 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001920 vereq(a._C__x, 42)
1921 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001922 del a.x
1923 verify(not hasattr(a, "x"))
1924 verify(not hasattr(a, "_C__x"))
1925 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001926 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001927 C.x.__delete__(a)
1928 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001929
Tim Peters66c1a522001-09-24 21:17:50 +00001930 raw = C.__dict__['x']
1931 verify(isinstance(raw, property))
1932
1933 attrs = dir(raw)
1934 verify("__doc__" in attrs)
1935 verify("fget" in attrs)
1936 verify("fset" in attrs)
1937 verify("fdel" in attrs)
1938
Guido van Rossum45704552001-10-08 16:35:45 +00001939 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001940 verify(raw.fget is C.__dict__['getx'])
1941 verify(raw.fset is C.__dict__['setx'])
1942 verify(raw.fdel is C.__dict__['delx'])
1943
1944 for attr in "__doc__", "fget", "fset", "fdel":
1945 try:
1946 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001947 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001948 if str(msg).find('readonly') < 0:
1949 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001950 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001951 "msg %r" % (attr, str(msg)))
1952 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001953 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001954 "readonly %r attr on a property" % attr)
1955
Neal Norwitz673cd822002-10-18 16:33:13 +00001956 class D(object):
1957 __getitem__ = property(lambda s: 1/0)
1958
1959 d = D()
1960 try:
1961 for i in d:
1962 str(i)
1963 except ZeroDivisionError:
1964 pass
1965 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001966 raise TestFailed("expected ZeroDivisionError from bad property")
Neal Norwitz673cd822002-10-18 16:33:13 +00001967
Georg Brandl533ff6f2006-03-08 18:09:27 +00001968 class E(object):
1969 def getter(self):
1970 "getter method"
1971 return 0
1972 def setter(self, value):
1973 "setter method"
1974 pass
1975 prop = property(getter)
1976 vereq(prop.__doc__, "getter method")
1977 prop2 = property(fset=setter)
1978 vereq(prop2.__doc__, None)
1979
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001980 # this segfaulted in 2.5b2
1981 try:
1982 import _testcapi
1983 except ImportError:
1984 pass
1985 else:
1986 class X(object):
1987 p = property(_testcapi.test_with_docstring)
1988
1989
Guido van Rossum58da9312007-11-10 23:39:45 +00001990def properties_plus():
1991 class C:
1992 foo = property(doc="hello")
1993 @foo.getter
1994 def foo(self):
1995 return self._foo
1996 @foo.setter
1997 def foo(self, value):
1998 self._foo = abs(value)
1999 @foo.deleter
2000 def foo(self):
2001 del self._foo
2002 c = C()
2003 assert C.foo.__doc__ == "hello"
2004 assert not hasattr(c, "foo")
2005 c.foo = -42
2006 assert c.foo == 42
2007 del c.foo
2008 assert not hasattr(c, "foo")
2009
2010 class D(C):
2011 @C.foo.deleter
2012 def foo(self):
2013 try:
2014 del self._foo
2015 except AttributeError:
2016 pass
2017 d = D()
2018 d.foo = 24
2019 assert d.foo == 24
2020 del d.foo
2021 del d.foo
2022
2023 class E:
2024 @property
2025 def foo(self):
2026 return self._foo
2027 @foo.setter
2028 def foo (self, value):
2029 raise RuntimeError
2030 @foo.setter
2031 @foo.deleter
2032 def foo(self, value=None):
2033 if value is None:
2034 del self._foo
2035 else:
2036 self._foo = abs(value)
2037 e = E()
2038 e.foo = -42
2039 assert e.foo == 42
2040 del e.foo
2041
2042 class F(E):
2043 @E.foo.deleter
2044 def foo(self):
2045 del self._foo
2046 @foo.setter
2047 def foo(self, value):
2048 self._foo = max(0, value)
2049 f = F()
2050 f.foo = -10
2051 assert f.foo == 0
2052 del f.foo
2053
2054
Guido van Rossumc4a18802001-08-24 16:55:27 +00002055def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002056 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002057
2058 class A(object):
2059 def meth(self, a):
2060 return "A(%r)" % a
2061
Guido van Rossum45704552001-10-08 16:35:45 +00002062 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002063
2064 class B(A):
2065 def __init__(self):
2066 self.__super = super(B, self)
2067 def meth(self, a):
2068 return "B(%r)" % a + self.__super.meth(a)
2069
Guido van Rossum45704552001-10-08 16:35:45 +00002070 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002071
2072 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002073 def meth(self, a):
2074 return "C(%r)" % a + self.__super.meth(a)
2075 C._C__super = super(C)
2076
Guido van Rossum45704552001-10-08 16:35:45 +00002077 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002078
2079 class D(C, B):
2080 def meth(self, a):
2081 return "D(%r)" % a + super(D, self).meth(a)
2082
Guido van Rossum5b443c62001-12-03 15:38:28 +00002083 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2084
2085 # Test for subclassing super
2086
2087 class mysuper(super):
2088 def __init__(self, *args):
2089 return super(mysuper, self).__init__(*args)
2090
2091 class E(D):
2092 def meth(self, a):
2093 return "E(%r)" % a + mysuper(E, self).meth(a)
2094
2095 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2096
2097 class F(E):
2098 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002099 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002100 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2101 F._F__super = mysuper(F)
2102
2103 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2104
2105 # Make sure certain errors are raised
2106
2107 try:
2108 super(D, 42)
2109 except TypeError:
2110 pass
2111 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002112 raise TestFailed("shouldn't allow super(D, 42)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002113
2114 try:
2115 super(D, C())
2116 except TypeError:
2117 pass
2118 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002119 raise TestFailed("shouldn't allow super(D, C())")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002120
2121 try:
2122 super(D).__get__(12)
2123 except TypeError:
2124 pass
2125 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002126 raise TestFailed("shouldn't allow super(D).__get__(12)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002127
2128 try:
2129 super(D).__get__(C())
2130 except TypeError:
2131 pass
2132 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002133 raise TestFailed("shouldn't allow super(D).__get__(C())")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002134
Guido van Rossuma4541a32003-04-16 20:02:22 +00002135 # Make sure data descriptors can be overridden and accessed via super
2136 # (new feature in Python 2.3)
2137
2138 class DDbase(object):
2139 def getx(self): return 42
2140 x = property(getx)
2141
2142 class DDsub(DDbase):
2143 def getx(self): return "hello"
2144 x = property(getx)
2145
2146 dd = DDsub()
2147 vereq(dd.x, "hello")
2148 vereq(super(DDsub, dd).x, 42)
2149
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002150 # Ensure that super() lookup of descriptor from classmethod
2151 # works (SF ID# 743627)
2152
2153 class Base(object):
2154 aProp = property(lambda self: "foo")
2155
2156 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002157 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002158 def test(klass):
2159 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002160
2161 veris(Sub.test(), Base.aProp)
2162
Thomas Wouters89f507f2006-12-13 04:49:30 +00002163 # Verify that super() doesn't allow keyword args
2164 try:
2165 super(Base, kw=1)
2166 except TypeError:
2167 pass
2168 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002169 raise TestFailed("super shouldn't accept keyword args")
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002170
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002171def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002172 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002173
2174 class hexint(int):
2175 def __repr__(self):
2176 return hex(self)
2177 def __add__(self, other):
2178 return hexint(int.__add__(self, other))
2179 # (Note that overriding __radd__ doesn't work,
2180 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002181 vereq(repr(hexint(7) + 9), "0x10")
2182 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002183 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002184 vereq(a, 12345)
2185 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002186 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002188 verify((+a).__class__ is int)
2189 verify((a >> 0).__class__ is int)
2190 verify((a << 0).__class__ is int)
2191 verify((hexint(0) << 12).__class__ is int)
2192 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002193
Guido van Rossume2a383d2007-01-15 16:59:06 +00002194 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002195 __slots__ = []
2196 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002197 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002198 def __add__(self, other):
2199 return self.__class__(super(octlong, self).__add__(other))
2200 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002201 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002202 # (Note that overriding __radd__ here only seems to work
2203 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002204 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002205 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002206 vereq(a, 12345)
2207 vereq(int(a), 12345)
2208 vereq(hash(a), hash(12345))
2209 verify(int(a).__class__ is int)
2210 verify((+a).__class__ is int)
2211 verify((-a).__class__ is int)
2212 verify((-octlong(0)).__class__ is int)
2213 verify((a >> 0).__class__ is int)
2214 verify((a << 0).__class__ is int)
2215 verify((a - 0).__class__ is int)
2216 verify((a * 1).__class__ is int)
2217 verify((a ** 1).__class__ is int)
2218 verify((a // 1).__class__ is int)
2219 verify((1 * a).__class__ is int)
2220 verify((a | 0).__class__ is int)
2221 verify((a ^ 0).__class__ is int)
2222 verify((a & -1).__class__ is int)
2223 verify((octlong(0) << 12).__class__ is int)
2224 verify((octlong(0) >> 12).__class__ is int)
2225 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002226
2227 # Because octlong overrides __add__, we can't check the absence of +0
2228 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002229 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002230 pass
2231 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002232 verify((a + 0).__class__ is int)
2233 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002234
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002235 # Check that negative clones don't segfault
2236 a = longclone(-1)
2237 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002238 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002239
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002240 class precfloat(float):
2241 __slots__ = ['prec']
2242 def __init__(self, value=0.0, prec=12):
2243 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002244 def __repr__(self):
2245 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002246 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002247 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(a, 12345.0)
2249 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002250 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002251 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002252 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002253
Tim Peters2400fa42001-09-12 19:12:49 +00002254 class madcomplex(complex):
2255 def __repr__(self):
2256 return "%.17gj%+.17g" % (self.imag, self.real)
2257 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002258 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002259 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002260 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002261 vereq(a, base)
2262 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002263 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002264 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002265 vereq(repr(a), "4j-3")
2266 vereq(a, base)
2267 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002268 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002269 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002270 veris((+a).__class__, complex)
2271 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002273 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002275 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002277 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002279
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002280 class madtuple(tuple):
2281 _rev = None
2282 def rev(self):
2283 if self._rev is not None:
2284 return self._rev
2285 L = list(self)
2286 L.reverse()
2287 self._rev = self.__class__(L)
2288 return self._rev
2289 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2291 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2292 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002293 for i in range(512):
2294 t = madtuple(range(i))
2295 u = t.rev()
2296 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002297 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002298 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002299 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002300 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002301 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002302 verify(a[:].__class__ is tuple)
2303 verify((a * 1).__class__ is tuple)
2304 verify((a * 0).__class__ is tuple)
2305 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002306 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002307 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002308 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002309 verify((a + a).__class__ is tuple)
2310 verify((a * 0).__class__ is tuple)
2311 verify((a * 1).__class__ is tuple)
2312 verify((a * 2).__class__ is tuple)
2313 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002314
2315 class madstring(str):
2316 _rev = None
2317 def rev(self):
2318 if self._rev is not None:
2319 return self._rev
2320 L = list(self)
2321 L.reverse()
2322 self._rev = self.__class__("".join(L))
2323 return self._rev
2324 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2326 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2327 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002328 for i in range(256):
2329 s = madstring("".join(map(chr, range(i))))
2330 t = s.rev()
2331 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002332 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002333 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002334 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002335 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002336
Tim Peters8fa5dd02001-09-12 02:18:30 +00002337 base = "\x00" * 5
2338 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq(s, base)
2340 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002341 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002342 vereq(hash(s), hash(base))
2343 vereq({s: 1}[base], 1)
2344 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002345 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002346 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002347 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002349 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002350 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002351 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002352 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002353 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002354 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002355 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002356 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002357 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002358 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002359 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002360 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002361 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002362 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002363 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002364 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002365 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002366 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002367 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002368 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002369 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002370 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002371 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002372 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002373 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002374 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002375 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002376 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002377 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002378
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002379 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002380 _rev = None
2381 def rev(self):
2382 if self._rev is not None:
2383 return self._rev
2384 L = list(self)
2385 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002386 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002387 return self._rev
2388 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002389 vereq(u, "ABCDEF")
2390 vereq(u.rev(), madunicode("FEDCBA"))
2391 vereq(u.rev().rev(), madunicode("ABCDEF"))
2392 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002393 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002394 vereq(str(u), base)
2395 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002396 vereq(hash(u), hash(base))
2397 vereq({u: 1}[base], 1)
2398 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002399 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002400 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002401 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002402 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002403 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002404 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002405 verify(u.replace("x", "x").__class__ is str)
2406 vereq(u.replace("x", "x"), base)
2407 verify(u.replace("xy", "xy").__class__ is str)
2408 vereq(u.replace("xy", "xy"), base)
2409 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002410 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002411 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002412 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002413 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002414 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002415 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002416 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002417 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002418 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002419 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002420 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002421 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002422 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002423 verify((u + "").__class__ is str)
2424 vereq(u + "", base)
2425 verify(("" + u).__class__ is str)
2426 vereq("" + u, base)
2427 verify((u * 0).__class__ is str)
2428 vereq(u * 0, "")
2429 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002430 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002431 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002432 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002433 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002434 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002435 verify(u[0:0].__class__ is str)
2436 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002437
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002438 class sublist(list):
2439 pass
2440 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002441 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002442 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002443 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002444 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002445 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002446 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002447 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002448 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002449 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002450 del a[10:15]
2451 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002452 vereq(a, list(range(10)))
2453 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002454 vereq(a[0], 0)
2455 vereq(a[9], 9)
2456 vereq(a[-10], 0)
2457 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002458 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002459
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002460## class CountedInput(file):
2461## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002462
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002463## self.lineno is the 0-based ordinal of the last line read, up to
2464## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002465
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002466## self.ateof is true if and only if the final "" line has been read,
2467## at which point self.lineno stops incrementing, and further calls
2468## to readline() continue to return "".
2469## """
Tim Peters59c9a642001-09-13 05:38:56 +00002470
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002471## lineno = 0
2472## ateof = 0
2473## def readline(self):
2474## if self.ateof:
2475## return ""
2476## s = file.readline(self)
2477## # Next line works too.
2478## # s = super(CountedInput, self).readline()
2479## self.lineno += 1
2480## if s == "":
2481## self.ateof = 1
2482## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002483
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002484## f = open(name=TESTFN, mode='w')
2485## lines = ['a\n', 'b\n', 'c\n']
2486## try:
2487## f.writelines(lines)
2488## f.close()
2489## f = CountedInput(TESTFN)
2490## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2491## got = f.readline()
2492## vereq(expected, got)
2493## vereq(f.lineno, i)
2494## vereq(f.ateof, (i > len(lines)))
2495## f.close()
2496## finally:
2497## try:
2498## f.close()
2499## except:
2500## pass
2501## try:
2502## import os
2503## os.unlink(TESTFN)
2504## except:
2505## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002506
Tim Peters808b94e2001-09-13 19:33:07 +00002507def keywords():
2508 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002509 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002510 vereq(int(x=1), 1)
2511 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002512 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002513 vereq(complex(imag=42, real=666), complex(666, 42))
2514 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002515 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002516 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002517 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002518 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002519
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002520 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002521 try:
2522 constructor(bogus_keyword_arg=1)
2523 except TypeError:
2524 pass
2525 else:
2526 raise TestFailed("expected TypeError from bogus keyword "
2527 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002528
Tim Peters0ab085c2001-09-14 00:25:33 +00002529def str_subclass_as_dict_key():
2530 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002531 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002532
2533 class cistr(str):
2534 """Sublcass of str that computes __eq__ case-insensitively.
2535
2536 Also computes a hash code of the string in canonical form.
2537 """
2538
2539 def __init__(self, value):
2540 self.canonical = value.lower()
2541 self.hashcode = hash(self.canonical)
2542
2543 def __eq__(self, other):
2544 if not isinstance(other, cistr):
2545 other = cistr(other)
2546 return self.canonical == other.canonical
2547
2548 def __hash__(self):
2549 return self.hashcode
2550
Guido van Rossum45704552001-10-08 16:35:45 +00002551 vereq(cistr('ABC'), 'abc')
2552 vereq('aBc', cistr('ABC'))
2553 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002554
2555 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002556 vereq(d[cistr('one')], 1)
2557 vereq(d[cistr('tWo')], 2)
2558 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002559 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002560 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002561
Guido van Rossumab3b0342001-09-18 20:38:53 +00002562def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002563 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002564 class classic:
2565 pass
2566 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002567 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002568 class C(base):
2569 def __init__(self, value):
2570 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002571 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002572 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002573 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002574 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002575 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002576 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002577 def __ne__(self, other):
2578 if isinstance(other, C):
2579 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002580 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002581 return self.value != other
2582 return NotImplemented
2583 def __lt__(self, other):
2584 if isinstance(other, C):
2585 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002586 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002587 return self.value < other
2588 return NotImplemented
2589 def __le__(self, other):
2590 if isinstance(other, C):
2591 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002592 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002593 return self.value <= other
2594 return NotImplemented
2595 def __gt__(self, other):
2596 if isinstance(other, C):
2597 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002598 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002599 return self.value > other
2600 return NotImplemented
2601 def __ge__(self, other):
2602 if isinstance(other, C):
2603 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002604 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002605 return self.value >= other
2606 return NotImplemented
2607
Guido van Rossumab3b0342001-09-18 20:38:53 +00002608 c1 = C(1)
2609 c2 = C(2)
2610 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002611 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002612 c = {1: c1, 2: c2, 3: c3}
2613 for x in 1, 2, 3:
2614 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002615 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002616 for op in "<", "<=", "==", "!=", ">", ">=":
2617 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2618 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002619 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2620 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002621
Guido van Rossum0639f592001-09-18 21:06:04 +00002622def rich_comparisons():
2623 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002624 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002625 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002626 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002627 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002628 vereq(z, 1+0j)
2629 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002630 class ZZ(complex):
2631 def __eq__(self, other):
2632 try:
2633 return abs(self - other) <= 1e-6
2634 except:
2635 return NotImplemented
2636 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002637 vereq(zz, 1+0j)
2638 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002639
Guido van Rossum0639f592001-09-18 21:06:04 +00002640 class classic:
2641 pass
2642 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002643 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002644 class C(base):
2645 def __init__(self, value):
2646 self.value = int(value)
2647 def __cmp__(self, other):
Collin Winter3add4d72007-08-29 23:37:32 +00002648 raise TestFailed("shouldn't call __cmp__")
Guido van Rossum0639f592001-09-18 21:06:04 +00002649 def __eq__(self, other):
2650 if isinstance(other, C):
2651 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002652 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002653 return self.value == other
2654 return NotImplemented
2655 def __ne__(self, other):
2656 if isinstance(other, C):
2657 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002658 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002659 return self.value != other
2660 return NotImplemented
2661 def __lt__(self, other):
2662 if isinstance(other, C):
2663 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002664 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002665 return self.value < other
2666 return NotImplemented
2667 def __le__(self, other):
2668 if isinstance(other, C):
2669 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002670 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002671 return self.value <= other
2672 return NotImplemented
2673 def __gt__(self, other):
2674 if isinstance(other, C):
2675 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002676 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002677 return self.value > other
2678 return NotImplemented
2679 def __ge__(self, other):
2680 if isinstance(other, C):
2681 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002682 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002683 return self.value >= other
2684 return NotImplemented
2685 c1 = C(1)
2686 c2 = C(2)
2687 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002688 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002689 c = {1: c1, 2: c2, 3: c3}
2690 for x in 1, 2, 3:
2691 for y in 1, 2, 3:
2692 for op in "<", "<=", "==", "!=", ">", ">=":
2693 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2694 "x=%d, y=%d" % (x, y))
2695 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2696 "x=%d, y=%d" % (x, y))
2697 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2698 "x=%d, y=%d" % (x, y))
2699
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002700def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002701 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002702 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002703 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002704 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002705 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2706 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002707
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002708def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002709 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002710 class C(object): pass
2711 class D(object): pass
2712 class E(object): pass
2713 class F(D, E): pass
2714 for cls in C, D, E, F:
2715 for cls2 in C, D, E, F:
2716 x = cls()
2717 x.__class__ = cls2
2718 verify(x.__class__ is cls2)
2719 x.__class__ = cls
2720 verify(x.__class__ is cls)
2721 def cant(x, C):
2722 try:
2723 x.__class__ = C
2724 except TypeError:
2725 pass
2726 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002727 raise TestFailed("shouldn't allow %r.__class__ = %r" % (x, C))
Guido van Rossumb6b89422002-04-15 01:03:30 +00002728 try:
2729 delattr(x, "__class__")
2730 except TypeError:
2731 pass
2732 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002733 raise TestFailed("shouldn't allow del %r.__class__" % x)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002734 cant(C(), list)
2735 cant(list(), C)
2736 cant(C(), 1)
2737 cant(C(), object)
2738 cant(object(), list)
2739 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002740 class Int(int): __slots__ = []
2741 cant(2, Int)
2742 cant(Int(), int)
2743 cant(True, int)
2744 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002745 o = object()
2746 cant(o, type(1))
2747 cant(o, type(None))
2748 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002749 class G(object):
2750 __slots__ = ["a", "b"]
2751 class H(object):
2752 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002753 class I(object):
2754 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002755 class J(object):
2756 __slots__ = ["c", "b"]
2757 class K(object):
2758 __slots__ = ["a", "b", "d"]
2759 class L(H):
2760 __slots__ = ["e"]
2761 class M(I):
2762 __slots__ = ["e"]
2763 class N(J):
2764 __slots__ = ["__weakref__"]
2765 class P(J):
2766 __slots__ = ["__dict__"]
2767 class Q(J):
2768 pass
2769 class R(J):
2770 __slots__ = ["__dict__", "__weakref__"]
2771
2772 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2773 x = cls()
2774 x.a = 1
2775 x.__class__ = cls2
2776 verify(x.__class__ is cls2,
2777 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2778 vereq(x.a, 1)
2779 x.__class__ = cls
2780 verify(x.__class__ is cls,
2781 "assigning %r as __class__ for %r silently failed" % (cls, x))
2782 vereq(x.a, 1)
2783 for cls in G, J, K, L, M, N, P, R, list, Int:
2784 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2785 if cls is cls2:
2786 continue
2787 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002788
Guido van Rossum6661be32001-10-26 04:26:12 +00002789def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002790 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002791 class C(object): pass
2792 a = C()
2793 a.__dict__ = {'b': 1}
2794 vereq(a.b, 1)
2795 def cant(x, dict):
2796 try:
2797 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002798 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002799 pass
2800 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002801 raise TestFailed("shouldn't allow %r.__dict__ = %r" % (x, dict))
Guido van Rossum6661be32001-10-26 04:26:12 +00002802 cant(a, None)
2803 cant(a, [])
2804 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002805 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002806
2807 class Base(object):
2808 pass
2809 def verify_dict_readonly(x):
2810 """
2811 x has to be an instance of a class inheriting from Base.
2812 """
2813 cant(x, {})
2814 try:
2815 del x.__dict__
2816 except (AttributeError, TypeError):
2817 pass
2818 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002819 raise TestFailed("shouldn't allow del %r.__dict__" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002820 dict_descr = Base.__dict__["__dict__"]
2821 try:
2822 dict_descr.__set__(x, {})
2823 except (AttributeError, TypeError):
2824 pass
2825 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002826 raise TestFailed("dict_descr allowed access to %r's dict" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002827
2828 # Classes don't allow __dict__ assignment and have readonly dicts
2829 class Meta1(type, Base):
2830 pass
2831 class Meta2(Base, type):
2832 pass
2833 class D(object):
2834 __metaclass__ = Meta1
2835 class E(object):
2836 __metaclass__ = Meta2
2837 for cls in C, D, E:
2838 verify_dict_readonly(cls)
2839 class_dict = cls.__dict__
2840 try:
2841 class_dict["spam"] = "eggs"
2842 except TypeError:
2843 pass
2844 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002845 raise TestFailed("%r's __dict__ can be modified" % cls)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002846
2847 # Modules also disallow __dict__ assignment
2848 class Module1(types.ModuleType, Base):
2849 pass
2850 class Module2(Base, types.ModuleType):
2851 pass
2852 for ModuleType in Module1, Module2:
2853 mod = ModuleType("spam")
2854 verify_dict_readonly(mod)
2855 mod.__dict__["spam"] = "eggs"
2856
2857 # Exception's __dict__ can be replaced, but not deleted
2858 class Exception1(Exception, Base):
2859 pass
2860 class Exception2(Base, Exception):
2861 pass
2862 for ExceptionType in Exception, Exception1, Exception2:
2863 e = ExceptionType()
2864 e.__dict__ = {"a": 1}
2865 vereq(e.a, 1)
2866 try:
2867 del e.__dict__
2868 except (TypeError, AttributeError):
2869 pass
2870 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002871 raise TestFaied("%r's __dict__ can be deleted" % e)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002872
Guido van Rossum6661be32001-10-26 04:26:12 +00002873
Guido van Rossum3926a632001-09-25 16:25:58 +00002874def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002875 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002876 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002877 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002878
2879 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002880 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002881
2882 global C
2883 class C(object):
2884 def __init__(self, a, b):
2885 super(C, self).__init__()
2886 self.a = a
2887 self.b = b
2888 def __repr__(self):
2889 return "C(%r, %r)" % (self.a, self.b)
2890
2891 global C1
2892 class C1(list):
2893 def __new__(cls, a, b):
2894 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002895 def __getnewargs__(self):
2896 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002897 def __init__(self, a, b):
2898 self.a = a
2899 self.b = b
2900 def __repr__(self):
2901 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2902
2903 global C2
2904 class C2(int):
2905 def __new__(cls, a, b, val=0):
2906 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002907 def __getnewargs__(self):
2908 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002909 def __init__(self, a, b, val=0):
2910 self.a = a
2911 self.b = b
2912 def __repr__(self):
2913 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2914
Guido van Rossum90c45142001-11-24 21:07:01 +00002915 global C3
2916 class C3(object):
2917 def __init__(self, foo):
2918 self.foo = foo
2919 def __getstate__(self):
2920 return self.foo
2921 def __setstate__(self, foo):
2922 self.foo = foo
2923
2924 global C4classic, C4
2925 class C4classic: # classic
2926 pass
2927 class C4(C4classic, object): # mixed inheritance
2928 pass
2929
Guido van Rossum99603b02007-07-20 00:22:32 +00002930 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002931 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002932 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002933 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002934
2935 for cls in C, C1, C2:
2936 s = p.dumps(cls, bin)
2937 cls2 = p.loads(s)
2938 verify(cls2 is cls)
2939
2940 a = C1(1, 2); a.append(42); a.append(24)
2941 b = C2("hello", "world", 42)
2942 s = p.dumps((a, b), bin)
2943 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002944 vereq(x.__class__, a.__class__)
2945 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2946 vereq(y.__class__, b.__class__)
2947 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002948 vereq(repr(x), repr(a))
2949 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002950 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002951 print("a = x =", a)
2952 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002953 # Test for __getstate__ and __setstate__ on new style class
2954 u = C3(42)
2955 s = p.dumps(u, bin)
2956 v = p.loads(s)
2957 veris(u.__class__, v.__class__)
2958 vereq(u.foo, v.foo)
2959 # Test for picklability of hybrid class
2960 u = C4()
2961 u.foo = 42
2962 s = p.dumps(u, bin)
2963 v = p.loads(s)
2964 veris(u.__class__, v.__class__)
2965 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002966
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002967 # Testing copy.deepcopy()
2968 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002969 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002970 import copy
2971 for cls in C, C1, C2:
2972 cls2 = copy.deepcopy(cls)
2973 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002974
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002975 a = C1(1, 2); a.append(42); a.append(24)
2976 b = C2("hello", "world", 42)
2977 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002978 vereq(x.__class__, a.__class__)
2979 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2980 vereq(y.__class__, b.__class__)
2981 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002982 vereq(repr(x), repr(a))
2983 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002984 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002985 print("a = x =", a)
2986 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002987
Guido van Rossum8c842552002-03-14 23:05:54 +00002988def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002989 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002990 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002991 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002992 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002993 global B, C, D, E
2994 class B(object):
2995 pass
2996 for base in [object, B]:
2997 class C(base):
2998 __slots__ = ['a']
2999 class D(C):
3000 pass
3001 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003002 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003003 except TypeError:
3004 pass
3005 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003006 raise TestFailed("should fail: pickle C instance - %s" % base)
Guido van Rossum8c842552002-03-14 23:05:54 +00003007 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003008 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003009 except TypeError:
3010 pass
3011 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003012 raise TestFailed("should fail: pickle D instance - %s" % base)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003013 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003014 class C(base):
3015 __slots__ = ['a']
3016 def __getstate__(self):
3017 try:
3018 d = self.__dict__.copy()
3019 except AttributeError:
3020 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003021 for cls in self.__class__.__mro__:
3022 for sn in cls.__dict__.get('__slots__', ()):
3023 try:
3024 d[sn] = getattr(self, sn)
3025 except AttributeError:
3026 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003027 return d
3028 def __setstate__(self, d):
3029 for k, v in d.items():
3030 setattr(self, k, v)
3031 class D(C):
3032 pass
3033 # Now it should work
3034 x = C()
3035 y = pickle.loads(pickle.dumps(x))
3036 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003037 x.a = 42
3038 y = pickle.loads(pickle.dumps(x))
3039 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00003040 x = D()
3041 x.a = 42
3042 x.b = 100
3043 y = pickle.loads(pickle.dumps(x))
3044 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003045 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003046 class E(C):
3047 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003048 x = E()
3049 x.a = 42
3050 x.b = "foo"
3051 y = pickle.loads(pickle.dumps(x))
3052 vereq(y.a, x.a)
3053 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003054
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003055def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003056 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003057 import copy
3058 class C(object):
3059 pass
3060
3061 a = C()
3062 a.foo = 12
3063 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003064 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003065
3066 a.bar = [1,2,3]
3067 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003068 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003069 verify(c.bar is a.bar)
3070
3071 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003072 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003073 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003074 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003075
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003076def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003077 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003078 class I(int):
3079 def __repr__(self):
3080 return "I(%r)" % int(self)
3081 def __add__(self, other):
3082 return I(int(self) + int(other))
3083 __radd__ = __add__
3084 def __pow__(self, other, mod=None):
3085 if mod is None:
3086 return I(pow(int(self), int(other)))
3087 else:
3088 return I(pow(int(self), int(other), int(mod)))
3089 def __rpow__(self, other, mod=None):
3090 if mod is None:
3091 return I(pow(int(other), int(self), mod))
3092 else:
3093 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003094
Walter Dörwald70a6b492004-02-12 17:35:32 +00003095 vereq(repr(I(1) + I(2)), "I(3)")
3096 vereq(repr(I(1) + 2), "I(3)")
3097 vereq(repr(1 + I(2)), "I(3)")
3098 vereq(repr(I(2) ** I(3)), "I(8)")
3099 vereq(repr(2 ** I(3)), "I(8)")
3100 vereq(repr(I(2) ** 3), "I(8)")
3101 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003102 class S(str):
3103 def __eq__(self, other):
3104 return self.lower() == other.lower()
3105
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003106def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003107 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003108 class A(object):
3109 pass
3110 class B(A):
3111 pass
3112 class C(A):
3113 pass
3114 class D(B, C):
3115 pass
3116 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003117 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003118 A.__hash__ = lambda self: 42
3119 vereq(hash(d), 42)
3120 C.__hash__ = lambda self: 314
3121 vereq(hash(d), 314)
3122 B.__hash__ = lambda self: 144
3123 vereq(hash(d), 144)
3124 D.__hash__ = lambda self: 100
3125 vereq(hash(d), 100)
3126 del D.__hash__
3127 vereq(hash(d), 144)
3128 del B.__hash__
3129 vereq(hash(d), 314)
3130 del C.__hash__
3131 vereq(hash(d), 42)
3132 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003133 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003134 d.foo = 42
3135 d.bar = 42
3136 vereq(d.foo, 42)
3137 vereq(d.bar, 42)
3138 def __getattribute__(self, name):
3139 if name == "foo":
3140 return 24
3141 return object.__getattribute__(self, name)
3142 A.__getattribute__ = __getattribute__
3143 vereq(d.foo, 24)
3144 vereq(d.bar, 42)
3145 def __getattr__(self, name):
3146 if name in ("spam", "foo", "bar"):
3147 return "hello"
Collin Winter3add4d72007-08-29 23:37:32 +00003148 raise AttributeError(name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003149 B.__getattr__ = __getattr__
3150 vereq(d.spam, "hello")
3151 vereq(d.foo, 24)
3152 vereq(d.bar, 42)
3153 del A.__getattribute__
3154 vereq(d.foo, 42)
3155 del d.foo
3156 vereq(d.foo, "hello")
3157 vereq(d.bar, 42)
3158 del B.__getattr__
3159 try:
3160 d.foo
3161 except AttributeError:
3162 pass
3163 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003164 raise TestFailed("d.foo should be undefined now")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003165
Guido van Rossume7f3e242002-06-14 02:35:45 +00003166 # Test a nasty bug in recurse_down_subclasses()
3167 import gc
3168 class A(object):
3169 pass
3170 class B(A):
3171 pass
3172 del B
3173 gc.collect()
3174 A.__setitem__ = lambda *a: None # crash
3175
Tim Petersfc57ccb2001-10-12 02:38:24 +00003176def buffer_inherit():
3177 import binascii
3178 # SF bug [#470040] ParseTuple t# vs subclasses.
3179 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003180 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003181
3182 class MyStr(str):
3183 pass
3184 base = 'abc'
3185 m = MyStr(base)
3186 # b2a_hex uses the buffer interface to get its argument's value, via
3187 # PyArg_ParseTuple 't#' code.
3188 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3189
3190 # It's not clear that unicode will continue to support the character
3191 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003192 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003193 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003194 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003195 m = MyUni(base)
3196 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3197
3198 class MyInt(int):
3199 pass
3200 m = MyInt(42)
3201 try:
3202 binascii.b2a_hex(m)
3203 raise TestFailed('subclass of int should not have a buffer interface')
3204 except TypeError:
3205 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003206
Tim Petersc9933152001-10-16 20:18:24 +00003207def str_of_str_subclass():
3208 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003209 import io
Tim Petersc9933152001-10-16 20:18:24 +00003210
3211 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003212 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003213
3214 class octetstring(str):
3215 def __str__(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +00003216 return binascii.b2a_hex(self).decode("ascii")
Tim Petersc9933152001-10-16 20:18:24 +00003217 def __repr__(self):
3218 return self + " repr"
3219
3220 o = octetstring('A')
3221 vereq(type(o), octetstring)
3222 vereq(type(str(o)), str)
3223 vereq(type(repr(o)), str)
3224 vereq(ord(o), 0x41)
3225 vereq(str(o), '41')
3226 vereq(repr(o), 'A repr')
3227 vereq(o.__str__(), '41')
3228 vereq(o.__repr__(), 'A repr')
3229
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003230 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003231 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003232 print(o, file=capture)
3233 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003234 vereq(capture.getvalue(), '41\n41\n')
3235 capture.close()
3236
Guido van Rossumc8e56452001-10-22 00:43:43 +00003237def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003238 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003239 def f(a): return a
3240 vereq(f.__call__(a=42), 42)
3241 a = []
3242 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003243 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003244
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003245def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003246 if verbose: print(("Testing recursive __call__() by setting to instance of "
3247 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003248 class A(object):
3249 pass
3250
3251 A.__call__ = A()
3252 try:
3253 A()()
3254 except RuntimeError:
3255 pass
3256 else:
3257 raise TestFailed("Recursion limit should have been reached for "
3258 "__call__()")
3259
Guido van Rossumed87ad82001-10-30 02:33:02 +00003260def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003261 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003262 log = []
3263 class C(object):
3264 def __del__(self):
3265 log.append(1)
3266 c = C()
3267 vereq(log, [])
3268 del c
3269 vereq(log, [1])
3270
Guido van Rossum29d26062001-12-11 04:37:34 +00003271 class D(object): pass
3272 d = D()
3273 try: del d[0]
3274 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003275 else: raise TestFailed("invalid del() didn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003276
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003277def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003278 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003279
3280 class mydict(dict):
3281 pass
3282 d = mydict()
3283 try:
3284 hash(d)
3285 except TypeError:
3286 pass
3287 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003288 raise TestFailed("hash() of dict subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003289
3290 class mylist(list):
3291 pass
3292 d = mylist()
3293 try:
3294 hash(d)
3295 except TypeError:
3296 pass
3297 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003298 raise TestFailed("hash() of list subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003299
Guido van Rossum29d26062001-12-11 04:37:34 +00003300def strops():
3301 try: 'a' + 5
3302 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003303 else: raise TestFailed("'' + 5 doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003304
3305 try: ''.split('')
3306 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003307 else: raise TestFailed("''.split('') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003308
Guido van Rossum29d26062001-12-11 04:37:34 +00003309 try: ''.rindex('5')
3310 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003311 else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003312
Guido van Rossum29d26062001-12-11 04:37:34 +00003313 try: '%(n)s' % None
3314 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003315 else: raise TestFailed("'%(n)s' % None doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003316
3317 try: '%(n' % {}
3318 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003319 else: raise TestFailed("'%(n' % {} '' doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003320
3321 try: '%*s' % ('abc')
3322 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003323 else: raise TestFailed("'%*s' % ('abc') doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003324
3325 try: '%*.*s' % ('abc', 5)
3326 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003327 else: raise TestFailed("'%*.*s' % ('abc', 5) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003328
3329 try: '%s' % (1, 2)
3330 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003331 else: raise TestFailed("'%s' % (1, 2) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003332
3333 try: '%' % None
3334 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003335 else: raise TestFailed("'%' % None doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003336
3337 vereq('534253'.isdigit(), 1)
3338 vereq('534253x'.isdigit(), 0)
3339 vereq('%c' % 5, '\x05')
3340 vereq('%c' % '5', '5')
3341
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003342def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003343 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003344 class Node:
3345 pass
3346 a = Node()
3347 b = Node()
3348 a.b = b
3349 b.a = a
3350 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003351
Guido van Rossumd7035672002-03-12 20:43:31 +00003352def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003353 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003354 from types import ModuleType as M
3355 m = M.__new__(M)
3356 str(m)
3357 vereq(hasattr(m, "__name__"), 0)
3358 vereq(hasattr(m, "__file__"), 0)
3359 vereq(hasattr(m, "foo"), 0)
3360 vereq(m.__dict__, None)
3361 m.foo = 1
3362 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003363
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003364def dictproxyiterkeys():
3365 class C(object):
3366 def meth(self):
3367 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003368 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003369 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003370 keys.sort()
3371 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3372
3373def dictproxyitervalues():
3374 class C(object):
3375 def meth(self):
3376 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003377 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003378 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003379 vereq(len(values), 5)
3380
3381def dictproxyiteritems():
3382 class C(object):
3383 def meth(self):
3384 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003385 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003386 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003387 keys.sort()
3388 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3389
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003390def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003391 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003392 class C(object):
3393 def __new__(cls, arg):
3394 if isinstance(arg, str): return [1, 2, 3]
3395 elif isinstance(arg, int): return object.__new__(D)
3396 else: return object.__new__(cls)
3397 class D(C):
3398 def __init__(self, arg):
3399 self.foo = arg
3400 vereq(C("1"), [1, 2, 3])
3401 vereq(D("1"), [1, 2, 3])
3402 d = D(None)
3403 veris(d.foo, None)
3404 d = C(1)
3405 vereq(isinstance(d, D), True)
3406 vereq(d.foo, 1)
3407 d = D(1)
3408 vereq(isinstance(d, D), True)
3409 vereq(d.foo, 1)
3410
Guido van Rossume8fc6402002-04-16 16:44:51 +00003411def imulbug():
3412 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003413 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003414 class C(object):
3415 def __imul__(self, other):
3416 return (self, other)
3417 x = C()
3418 y = x
3419 y *= 1.0
3420 vereq(y, (x, 1.0))
3421 y = x
3422 y *= 2
3423 vereq(y, (x, 2))
3424 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003425 y *= 3
3426 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003427 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003428 y *= 1<<100
3429 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003430 y = x
3431 y *= None
3432 vereq(y, (x, None))
3433 y = x
3434 y *= "foo"
3435 vereq(y, (x, "foo"))
3436
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003437def docdescriptor():
3438 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003439 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003440 class DocDescr(object):
3441 def __get__(self, object, otype):
3442 if object:
3443 object = object.__class__.__name__ + ' instance'
3444 if otype:
3445 otype = otype.__name__
3446 return 'object=%s; type=%s' % (object, otype)
3447 class OldClass:
3448 __doc__ = DocDescr()
3449 class NewClass(object):
3450 __doc__ = DocDescr()
3451 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3452 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3453 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3454 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3455
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003456def copy_setstate():
3457 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003458 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003459 import copy
3460 class C(object):
3461 def __init__(self, foo=None):
3462 self.foo = foo
3463 self.__foo = foo
3464 def setfoo(self, foo=None):
3465 self.foo = foo
3466 def getfoo(self):
3467 return self.__foo
3468 def __getstate__(self):
3469 return [self.foo]
3470 def __setstate__(self, lst):
3471 assert len(lst) == 1
3472 self.__foo = self.foo = lst[0]
3473 a = C(42)
3474 a.setfoo(24)
3475 vereq(a.foo, 24)
3476 vereq(a.getfoo(), 42)
3477 b = copy.copy(a)
3478 vereq(b.foo, 24)
3479 vereq(b.getfoo(), 24)
3480 b = copy.deepcopy(a)
3481 vereq(b.foo, 24)
3482 vereq(b.getfoo(), 24)
3483
Guido van Rossum09638c12002-06-13 19:17:46 +00003484def slices():
3485 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003486 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003487 # Strings
3488 vereq("hello"[:4], "hell")
3489 vereq("hello"[slice(4)], "hell")
3490 vereq(str.__getitem__("hello", slice(4)), "hell")
3491 class S(str):
3492 def __getitem__(self, x):
3493 return str.__getitem__(self, x)
3494 vereq(S("hello")[:4], "hell")
3495 vereq(S("hello")[slice(4)], "hell")
3496 vereq(S("hello").__getitem__(slice(4)), "hell")
3497 # Tuples
3498 vereq((1,2,3)[:2], (1,2))
3499 vereq((1,2,3)[slice(2)], (1,2))
3500 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3501 class T(tuple):
3502 def __getitem__(self, x):
3503 return tuple.__getitem__(self, x)
3504 vereq(T((1,2,3))[:2], (1,2))
3505 vereq(T((1,2,3))[slice(2)], (1,2))
3506 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3507 # Lists
3508 vereq([1,2,3][:2], [1,2])
3509 vereq([1,2,3][slice(2)], [1,2])
3510 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3511 class L(list):
3512 def __getitem__(self, x):
3513 return list.__getitem__(self, x)
3514 vereq(L([1,2,3])[:2], [1,2])
3515 vereq(L([1,2,3])[slice(2)], [1,2])
3516 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3517 # Now do lists and __setitem__
3518 a = L([1,2,3])
3519 a[slice(1, 3)] = [3,2]
3520 vereq(a, [1,3,2])
3521 a[slice(0, 2, 1)] = [3,1]
3522 vereq(a, [3,1,2])
3523 a.__setitem__(slice(1, 3), [2,1])
3524 vereq(a, [3,2,1])
3525 a.__setitem__(slice(0, 2, 1), [2,3])
3526 vereq(a, [2,3,1])
3527
Tim Peters2484aae2002-07-11 06:56:07 +00003528def subtype_resurrection():
3529 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003530 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003531
3532 class C(object):
3533 container = []
3534
3535 def __del__(self):
3536 # resurrect the instance
3537 C.container.append(self)
3538
3539 c = C()
3540 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003541 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003542 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003543 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003544
3545 # If that didn't blow up, it's also interesting to see whether clearing
3546 # the last container slot works: that will attempt to delete c again,
3547 # which will cause c to get appended back to the container again "during"
3548 # the del.
3549 del C.container[-1]
3550 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003551 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003552
Tim Peters14cb1e12002-07-11 18:26:21 +00003553 # Make c mortal again, so that the test framework with -l doesn't report
3554 # it as a leak.
3555 del C.__del__
3556
Guido van Rossum2d702462002-08-06 21:28:28 +00003557def slottrash():
3558 # Deallocating deeply nested slotted trash caused stack overflows
3559 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003560 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003561 class trash(object):
3562 __slots__ = ['x']
3563 def __init__(self, x):
3564 self.x = x
3565 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003566 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003567 o = trash(o)
3568 del o
3569
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003570def slotmultipleinheritance():
3571 # SF bug 575229, multiple inheritance w/ slots dumps core
3572 class A(object):
3573 __slots__=()
3574 class B(object):
3575 pass
3576 class C(A,B) :
3577 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003578 vereq(C.__basicsize__, B.__basicsize__)
3579 verify(hasattr(C, '__dict__'))
3580 verify(hasattr(C, '__weakref__'))
3581 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003582
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003583def testrmul():
3584 # SF patch 592646
3585 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003586 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003587 class C(object):
3588 def __mul__(self, other):
3589 return "mul"
3590 def __rmul__(self, other):
3591 return "rmul"
3592 a = C()
3593 vereq(a*2, "mul")
3594 vereq(a*2.2, "mul")
3595 vereq(2*a, "rmul")
3596 vereq(2.2*a, "rmul")
3597
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003598def testipow():
3599 # [SF bug 620179]
3600 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003601 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003602 class C(object):
3603 def __ipow__(self, other):
3604 pass
3605 a = C()
3606 a **= 2
3607
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003608def do_this_first():
3609 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003610 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003611 # This dumps core when SF bug 551412 isn't fixed --
3612 # but only when test_descr.py is run separately.
3613 # (That can't be helped -- as soon as PyType_Ready()
3614 # is called for PyLong_Type, the bug is gone.)
3615 class UserLong(object):
3616 def __pow__(self, *args):
3617 pass
3618 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003619 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003620 except:
3621 pass
3622
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003623 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003624 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003625 # Another segfault only when run early
3626 # (before PyType_Ready(tuple) is called)
3627 type.mro(tuple)
3628
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003629def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003630 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003631 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003632 # stuff that should work:
3633 class C(object):
3634 pass
3635 class C2(object):
3636 def __getattribute__(self, attr):
3637 if attr == 'a':
3638 return 2
3639 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003640 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003641 def meth(self):
3642 return 1
3643 class D(C):
3644 pass
3645 class E(D):
3646 pass
3647 d = D()
3648 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003649 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003650 D.__bases__ = (C2,)
3651 vereq(d.meth(), 1)
3652 vereq(e.meth(), 1)
3653 vereq(d.a, 2)
3654 vereq(e.a, 2)
3655 vereq(C2.__subclasses__(), [D])
3656
3657 # stuff that shouldn't:
3658 class L(list):
3659 pass
3660
3661 try:
3662 L.__bases__ = (dict,)
3663 except TypeError:
3664 pass
3665 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003666 raise TestFailed("shouldn't turn list subclass into dict subclass")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003667
3668 try:
3669 list.__bases__ = (dict,)
3670 except TypeError:
3671 pass
3672 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003673 raise TestFailed("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003674
3675 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003676 D.__bases__ = (C2, list)
3677 except TypeError:
3678 pass
3679 else:
3680 assert 0, "best_base calculation found wanting"
3681
3682 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003683 del D.__bases__
3684 except TypeError:
3685 pass
3686 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003687 raise TestFailed("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003688
3689 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003690 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003691 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003692 if str(msg) == "a new-style class can't have only classic bases":
Collin Winter3add4d72007-08-29 23:37:32 +00003693 raise TestFailed("wrong error message for .__bases__ = ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003694 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003695 raise TestFailed("shouldn't be able to set .__bases__ to ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003696
3697 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003698 D.__bases__ = (D,)
3699 except TypeError:
3700 pass
3701 else:
3702 # actually, we'll have crashed by here...
Collin Winter3add4d72007-08-29 23:37:32 +00003703 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003704
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003705 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003706 D.__bases__ = (C, C)
3707 except TypeError:
3708 pass
3709 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003710 raise TestFailed("didn't detect repeated base classes")
Michael W. Hudsone723e452003-08-07 14:58:10 +00003711
3712 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003713 D.__bases__ = (E,)
3714 except TypeError:
3715 pass
3716 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003717 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003718
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003719def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003720 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003721 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003722 class WorkOnce(type):
3723 def __new__(self, name, bases, ns):
3724 self.flag = 0
3725 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3726 def mro(self):
3727 if self.flag > 0:
Collin Winter3add4d72007-08-29 23:37:32 +00003728 raise RuntimeError("bozo")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003729 else:
3730 self.flag += 1
3731 return type.mro(self)
3732
3733 class WorkAlways(type):
3734 def mro(self):
3735 # this is here to make sure that .mro()s aren't called
3736 # with an exception set (which was possible at one point).
3737 # An error message will be printed in a debug build.
3738 # What's a good way to test for this?
3739 return type.mro(self)
3740
3741 class C(object):
3742 pass
3743
3744 class C2(object):
3745 pass
3746
3747 class D(C):
3748 pass
3749
3750 class E(D):
3751 pass
3752
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003753 class F(D, metaclass=WorkOnce):
3754 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003755
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003756 class G(D, metaclass=WorkAlways):
3757 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003758
3759 # Immediate subclasses have their mro's adjusted in alphabetical
3760 # order, so E's will get adjusted before adjusting F's fails. We
3761 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003762
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003763 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003764 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003765
3766 try:
3767 D.__bases__ = (C2,)
3768 except RuntimeError:
3769 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003770 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003771 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003772 raise TestFailed("exception not propagated")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003773
3774def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003775 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003776 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003777 class A(object):
3778 pass
3779
3780 class B(object):
3781 pass
3782
3783 class C(A, B):
3784 pass
3785
3786 class D(A, B):
3787 pass
3788
3789 class E(C, D):
3790 pass
3791
3792 try:
3793 C.__bases__ = (B, A)
3794 except TypeError:
3795 pass
3796 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003797 raise TestFailed("didn't catch MRO conflict")
Tim Peters6578dc92002-12-24 18:31:27 +00003798
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003799def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003800 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003801 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003802 class C(object):
3803 pass
3804
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003805 # C.__module__ could be 'test_descr' or '__main__'
3806 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003807
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003808 C.__name__ = 'D'
3809 vereq((C.__module__, C.__name__), (mod, 'D'))
3810
3811 C.__name__ = 'D.E'
3812 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003813
Guido van Rossum613f24f2003-01-06 23:00:59 +00003814def subclass_right_op():
3815 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003816 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003817
3818 # This code tests various cases where right-dispatch of a subclass
3819 # should be preferred over left-dispatch of a base class.
3820
3821 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3822
3823 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003824 def __floordiv__(self, other):
3825 return "B.__floordiv__"
3826 def __rfloordiv__(self, other):
3827 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003828
Guido van Rossumf389c772003-02-27 20:04:19 +00003829 vereq(B(1) // 1, "B.__floordiv__")
3830 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003831
3832 # Case 2: subclass of object; this is just the baseline for case 3
3833
3834 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003835 def __floordiv__(self, other):
3836 return "C.__floordiv__"
3837 def __rfloordiv__(self, other):
3838 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003839
Guido van Rossumf389c772003-02-27 20:04:19 +00003840 vereq(C() // 1, "C.__floordiv__")
3841 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003842
3843 # Case 3: subclass of new-style class; here it gets interesting
3844
3845 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003846 def __floordiv__(self, other):
3847 return "D.__floordiv__"
3848 def __rfloordiv__(self, other):
3849 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003850
Guido van Rossumf389c772003-02-27 20:04:19 +00003851 vereq(D() // C(), "D.__floordiv__")
3852 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003853
3854 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3855
3856 class E(C):
3857 pass
3858
Guido van Rossumf389c772003-02-27 20:04:19 +00003859 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003860
Guido van Rossumf389c772003-02-27 20:04:19 +00003861 vereq(E() // 1, "C.__floordiv__")
3862 vereq(1 // E(), "C.__rfloordiv__")
3863 vereq(E() // C(), "C.__floordiv__")
3864 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003865
Guido van Rossum373c7412003-01-07 13:41:37 +00003866def dict_type_with_metaclass():
3867 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003868 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003869
3870 class B(object):
3871 pass
3872 class M(type):
3873 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003874 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003875 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003876 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003877 veris(type(C.__dict__), type(B.__dict__))
3878
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003879def meth_class_get():
3880 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003881 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003882 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003883 # Baseline
3884 arg = [1, 2, 3]
3885 res = {1: None, 2: None, 3: None}
3886 vereq(dict.fromkeys(arg), res)
3887 vereq({}.fromkeys(arg), res)
3888 # Now get the descriptor
3889 descr = dict.__dict__["fromkeys"]
3890 # More baseline using the descriptor directly
3891 vereq(descr.__get__(None, dict)(arg), res)
3892 vereq(descr.__get__({})(arg), res)
3893 # Now check various error cases
3894 try:
3895 descr.__get__(None, None)
3896 except TypeError:
3897 pass
3898 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003899 raise TestFailed("shouldn't have allowed descr.__get__(None, None)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003900 try:
3901 descr.__get__(42)
3902 except TypeError:
3903 pass
3904 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003905 raise TestFailed("shouldn't have allowed descr.__get__(42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003906 try:
3907 descr.__get__(None, 42)
3908 except TypeError:
3909 pass
3910 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003911 raise TestFailed("shouldn't have allowed descr.__get__(None, 42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003912 try:
3913 descr.__get__(None, int)
3914 except TypeError:
3915 pass
3916 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003917 raise TestFailed("shouldn't have allowed descr.__get__(None, int)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003918
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003919def isinst_isclass():
3920 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003921 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003922 class Proxy(object):
3923 def __init__(self, obj):
3924 self.__obj = obj
3925 def __getattribute__(self, name):
3926 if name.startswith("_Proxy__"):
3927 return object.__getattribute__(self, name)
3928 else:
3929 return getattr(self.__obj, name)
3930 # Test with a classic class
3931 class C:
3932 pass
3933 a = C()
3934 pa = Proxy(a)
3935 verify(isinstance(a, C)) # Baseline
3936 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003937 # Test with a classic subclass
3938 class D(C):
3939 pass
3940 a = D()
3941 pa = Proxy(a)
3942 verify(isinstance(a, C)) # Baseline
3943 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003944 # Test with a new-style class
3945 class C(object):
3946 pass
3947 a = C()
3948 pa = Proxy(a)
3949 verify(isinstance(a, C)) # Baseline
3950 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003951 # Test with a new-style subclass
3952 class D(C):
3953 pass
3954 a = D()
3955 pa = Proxy(a)
3956 verify(isinstance(a, C)) # Baseline
3957 verify(isinstance(pa, C)) # Test
3958
3959def proxysuper():
3960 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003961 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003962 class Proxy(object):
3963 def __init__(self, obj):
3964 self.__obj = obj
3965 def __getattribute__(self, name):
3966 if name.startswith("_Proxy__"):
3967 return object.__getattribute__(self, name)
3968 else:
3969 return getattr(self.__obj, name)
3970
3971 class B(object):
3972 def f(self):
3973 return "B.f"
3974
3975 class C(B):
3976 def f(self):
3977 return super(C, self).f() + "->C.f"
3978
3979 obj = C()
3980 p = Proxy(obj)
3981 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003982
Guido van Rossum52b27052003-04-15 20:05:10 +00003983def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003984 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003985 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003986 try:
3987 object.__setattr__(str, "foo", 42)
3988 except TypeError:
3989 pass
3990 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003991 raise TestFailed("Carlo Verre __setattr__ suceeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003992 try:
3993 object.__delattr__(str, "lower")
3994 except TypeError:
3995 pass
3996 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003997 raise TestFailed("Carlo Verre __delattr__ succeeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003998
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003999def weakref_segfault():
4000 # SF 742911
4001 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004002 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004003
4004 import weakref
4005
4006 class Provoker:
4007 def __init__(self, referrent):
4008 self.ref = weakref.ref(referrent)
4009
4010 def __del__(self):
4011 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004012
4013 class Oops(object):
4014 pass
4015
4016 o = Oops()
4017 o.whatever = Provoker(o)
4018 del o
4019
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004020def wrapper_segfault():
4021 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004022 if verbose:
4023 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004024 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00004025 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004026 f = f.__call__
4027 f = None
4028
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004029# Fix SF #762455, segfault when sys.stdout is changed in getattr
4030def filefault():
4031 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004032 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004033 import sys
4034 class StdoutGuard:
4035 def __getattr__(self, attr):
4036 sys.stdout = sys.__stdout__
4037 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4038 sys.stdout = StdoutGuard()
4039 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004040 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004041 except RuntimeError:
4042 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004043
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004044def vicious_descriptor_nonsense():
4045 # A potential segfault spotted by Thomas Wouters in mail to
4046 # python-dev 2003-04-17, turned into an example & fixed by Michael
4047 # Hudson just less than four months later...
4048 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004049 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004050
4051 class Evil(object):
4052 def __hash__(self):
4053 return hash('attr')
4054 def __eq__(self, other):
4055 del C.attr
4056 return 0
4057
4058 class Descr(object):
4059 def __get__(self, ob, type=None):
4060 return 1
4061
4062 class C(object):
4063 attr = Descr()
4064
4065 c = C()
4066 c.__dict__[Evil()] = 0
4067
4068 vereq(c.attr, 1)
4069 # this makes a crash more likely:
4070 import gc; gc.collect()
4071 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004072
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004073def test_init():
4074 # SF 1155938
4075 class Foo(object):
4076 def __init__(self):
4077 return 10
4078 try:
4079 Foo()
4080 except TypeError:
4081 pass
4082 else:
Collin Winter3add4d72007-08-29 23:37:32 +00004083 raise TestFailed("did not test __init__() for None return")
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004084
Armin Rigoc6686b72005-11-07 08:38:00 +00004085def methodwrapper():
4086 # <type 'method-wrapper'> did not support any reflection before 2.5
4087 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004088 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004089
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004090 return # XXX should methods really support __eq__?
4091
Armin Rigoc6686b72005-11-07 08:38:00 +00004092 l = []
4093 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004094 vereq(l.__add__, [].__add__)
4095 verify(l.__add__ != [5].__add__)
4096 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004097 verify(l.__add__.__name__ == '__add__')
4098 verify(l.__add__.__self__ is l)
4099 verify(l.__add__.__objclass__ is list)
4100 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004101 try:
4102 hash(l.__add__)
4103 except TypeError:
4104 pass
4105 else:
4106 raise TestFailed("no TypeError from hash([].__add__)")
4107
4108 t = ()
4109 t += (7,)
4110 vereq(t.__add__, (7,).__add__)
4111 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004112
Armin Rigofd163f92005-12-29 15:59:19 +00004113def notimplemented():
4114 # all binary methods should be able to return a NotImplemented
4115 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004116 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004117
4118 import sys
4119 import types
4120 import operator
4121
4122 def specialmethod(self, other):
4123 return NotImplemented
4124
4125 def check(expr, x, y):
4126 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004127 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004128 except TypeError:
4129 pass
4130 else:
4131 raise TestFailed("no TypeError from %r" % (expr,))
4132
Guido van Rossume2a383d2007-01-15 16:59:06 +00004133 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004134 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4135 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004136 if 1:
4137 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004138 for name, expr, iexpr in [
4139 ('__add__', 'x + y', 'x += y'),
4140 ('__sub__', 'x - y', 'x -= y'),
4141 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004142 ('__truediv__', 'x / y', None),
4143 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004144 ('__mod__', 'x % y', 'x %= y'),
4145 ('__divmod__', 'divmod(x, y)', None),
4146 ('__pow__', 'x ** y', 'x **= y'),
4147 ('__lshift__', 'x << y', 'x <<= y'),
4148 ('__rshift__', 'x >> y', 'x >>= y'),
4149 ('__and__', 'x & y', 'x &= y'),
4150 ('__or__', 'x | y', 'x |= y'),
4151 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004152 ]:
4153 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004154 A = metaclass('A', (), {name: specialmethod})
4155 B = metaclass('B', (), {rname: specialmethod})
4156 a = A()
4157 b = B()
4158 check(expr, a, a)
4159 check(expr, a, b)
4160 check(expr, b, a)
4161 check(expr, b, b)
4162 check(expr, a, N1)
4163 check(expr, a, N2)
4164 check(expr, N1, b)
4165 check(expr, N2, b)
4166 if iexpr:
4167 check(iexpr, a, a)
4168 check(iexpr, a, b)
4169 check(iexpr, b, a)
4170 check(iexpr, b, b)
4171 check(iexpr, a, N1)
4172 check(iexpr, a, N2)
4173 iname = '__i' + name[2:]
4174 C = metaclass('C', (), {iname: specialmethod})
4175 c = C()
4176 check(iexpr, c, a)
4177 check(iexpr, c, b)
4178 check(iexpr, c, N1)
4179 check(iexpr, c, N2)
4180
Guido van Rossumd8faa362007-04-27 19:54:29 +00004181def test_assign_slice():
4182 # ceval.c's assign_slice used to check for
4183 # tp->tp_as_sequence->sq_slice instead of
4184 # tp->tp_as_sequence->sq_ass_slice
4185
4186 class C(object):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00004187 def __setitem__(self, idx, value):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004188 self.value = value
4189
4190 c = C()
4191 c[1:2] = 3
4192 vereq(c.value, 3)
4193
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004194def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004195 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004196 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004197 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004198 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004199 lists()
4200 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004201 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004202 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004203 ints()
4204 longs()
4205 floats()
4206 complexes()
4207 spamlists()
4208 spamdicts()
4209 pydicts()
4210 pylists()
4211 metaclass()
4212 pymods()
4213 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004214 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004215 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004216 ex5()
4217 monotonicity()
4218 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004219 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004220 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004221 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004222 dynamics()
4223 errors()
4224 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004225 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004226 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004227 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004228 classic()
4229 compattr()
4230 newslot()
4231 altmro()
4232 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004233 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004234 specials()
Thomas Wouters89d996e2007-09-08 17:39:28 +00004235 recursions()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004236 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004237 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004238 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004239 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004240 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004241 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004242 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004243 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004244 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004245 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004246 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004247 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004248 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004249 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004250 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004251 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004252 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004253 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004254 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004255 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004256 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004257 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004258 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004259 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004260 dictproxyiterkeys()
4261 dictproxyitervalues()
4262 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004263 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004264 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004265 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004266 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004267 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004268 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004269 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004270 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004271 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004272 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004273 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004274 test_mutable_bases()
4275 test_mutable_bases_with_failing_mro()
4276 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004277 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004278 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004279 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004280 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004281 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004282 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004283 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004284 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004285 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004286 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004287 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004288 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004289 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004290
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004291 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004292
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004293if __name__ == "__main__":
4294 test_main()