blob: 1ea93bb9ab7b4a3fca1a7a7e4ac239c0a4cdc064 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
4from test.test_support import get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00005from copy import deepcopy
Guido van Rossum360e4b82007-05-14 22:51:27 +00006import types
Thomas Wouters89d996e2007-09-08 17:39:28 +00007import new
Tim Peters4d9b4662002-04-16 01:59:17 +00008
Guido van Rossum875eeaa2001-10-11 18:33:53 +00009def veris(a, b):
10 if a is not b:
Collin Winter3add4d72007-08-29 23:37:32 +000011 raise TestFailed("%r is %r" % (a, b))
Guido van Rossum875eeaa2001-10-11 18:33:53 +000012
Tim Peters6d6c1a32001-08-02 04:15:00 +000013def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000014 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000015 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000016 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000017 t = type(a)
18 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000019 while meth not in t.__dict__:
20 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000021 vereq(m, t.__dict__[meth])
22 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000023 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000024 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025
26def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000027 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000028 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000029
Guido van Rossum45704552001-10-08 16:35:45 +000030 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000031 t = type(a)
32 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000033 while meth not in t.__dict__:
34 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000035 vereq(m, t.__dict__[meth])
36 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000037 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000038 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000040def testsliceop(a, b, c, res, expr="a[b:c]", meth="__getitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000041 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000042 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000043 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 t = type(a)
45 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000046 while meth not in t.__dict__:
47 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000048 vereq(m, t.__dict__[meth])
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000049 vereq(m(a, slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000050 bm = getattr(a, meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000051 vereq(bm(slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052
53def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000054 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000055 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000056 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000057 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000058 t = type(a)
59 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000060 while meth not in t.__dict__:
61 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000062 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000063 dict['a'] = deepcopy(a)
64 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000065 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000066 dict['a'] = deepcopy(a)
67 bm = getattr(dict['a'], meth)
68 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000069 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000070
71def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000072 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000073 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000074 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000075 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000076 t = type(a)
77 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000078 while meth not in t.__dict__:
79 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000080 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000081 dict['a'] = deepcopy(a)
82 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000083 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000084 dict['a'] = deepcopy(a)
85 bm = getattr(dict['a'], meth)
86 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000087 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000088
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000089def testsetsliceop(a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000090 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000091 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000092 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000093 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000094 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000095 while meth not in t.__dict__:
96 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000097 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000098 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000099 dict['a'] = deepcopy(a)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000100 m(dict['a'], slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000101 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000102 dict['a'] = deepcopy(a)
103 bm = getattr(dict['a'], meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000104 bm(slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000105 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106
Tim Peters2f93e282001-10-04 05:27:00 +0000107def class_docstrings():
108 class Classic:
109 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000110 vereq(Classic.__doc__, "A classic docstring.")
111 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000112
113 class Classic2:
114 pass
115 verify(Classic2.__doc__ is None)
116
Tim Peters4fb1fe82001-10-04 05:48:13 +0000117 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000118 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000119 vereq(NewStatic.__doc__, "Another docstring.")
120 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000121
Tim Peters4fb1fe82001-10-04 05:48:13 +0000122 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000123 pass
124 verify(NewStatic2.__doc__ is None)
125
Tim Peters4fb1fe82001-10-04 05:48:13 +0000126 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000127 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000128 vereq(NewDynamic.__doc__, "Another docstring.")
129 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000130
Tim Peters4fb1fe82001-10-04 05:48:13 +0000131 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000132 pass
133 verify(NewDynamic2.__doc__ is None)
134
Tim Peters6d6c1a32001-08-02 04:15:00 +0000135def lists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000136 if verbose: print("Testing list operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000137 testbinop([1], [2], [1,2], "a+b", "__add__")
138 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
139 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
140 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000141 testsliceop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000142 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
143 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
144 testunop([1,2,3], 3, "len(a)", "__len__")
145 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
146 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
147 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000148 testsetsliceop([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
149 "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000150
151def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000152 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000153 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000154 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
155 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
156 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
157 d = {1:2,3:4}
158 l1 = []
159 for i in d.keys(): l1.append(i)
160 l = []
161 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000162 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000163 l = []
164 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000165 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000166 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000167 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000168 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000169 d = {1:2, 3:4}
170 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000171 vereq(eval(repr(d), {}), d)
172 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000173 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
174
Tim Peters25786c02001-09-02 08:22:48 +0000175def dict_constructor():
176 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000177 print("Testing dict constructor ...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000178 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000179 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000180 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000181 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000183 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000184 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000185 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000186 d = dict({'one':1, 'two':2})
187 vereq(d, dict(one=1, two=2))
188 vereq(d, dict(**d))
189 vereq(d, dict({"one": 1}, two=2))
190 vereq(d, dict([("two", 2)], one=1))
191 vereq(d, dict([("one", 100), ("two", 200)], **d))
192 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000193 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000194 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000195 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000196 except TypeError:
197 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000198 except ValueError:
199 if badarg == "0":
200 # It's a sequence, and its elements are also sequences (gotta
201 # love strings <wink>), but they aren't of length 2, so this
202 # one seemed better as a ValueError than a TypeError.
203 pass
204 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000205 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000206 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000207 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000208
209 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000210 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000211 except TypeError:
212 pass
213 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000214 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000215
216 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000217 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000218 dict = {1:2, 3:4, 'a':1j}
219
Tim Peters25786c02001-09-02 08:22:48 +0000220 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000221 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000222 except TypeError:
223 pass
224 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000225 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000226
227 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000228 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000229 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000230 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000231
Tim Peters1fc240e2001-10-26 05:06:50 +0000232 # Init from sequence of iterable objects, each producing a 2-sequence.
233 class AddressBookEntry:
234 def __init__(self, first, last):
235 self.first = first
236 self.last = last
237 def __iter__(self):
238 return iter([self.first, self.last])
239
Tim Petersa427a2b2001-10-29 22:25:45 +0000240 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000241 AddressBookEntry('Barry', 'Peters'),
242 AddressBookEntry('Tim', 'Peters'),
243 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000244 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
245
Tim Petersa427a2b2001-10-29 22:25:45 +0000246 d = dict(zip(range(4), range(1, 5)))
247 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000248
249 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000250 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000251 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000252 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000253 except ValueError:
254 pass
255 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000256 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000257
Tim Peters5d2b77c2001-09-03 05:47:38 +0000258def test_dir():
259 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000260 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000261 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000262 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000263 del junk
264
265 # Just make sure these don't blow up!
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000266 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000267 dir(arg)
268
Thomas Wouters0725cf22006-04-15 09:04:57 +0000269 # Test dir on custom classes. Since these have object as a
270 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000271 def interesting(strings):
272 return [s for s in strings if not s.startswith('_')]
273
Tim Peters5d2b77c2001-09-03 05:47:38 +0000274 class C(object):
275 Cdata = 1
276 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000277
278 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000279 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000280
281 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000282 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000283 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000284
285 c.cdata = 2
286 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000287 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000288 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000289
Tim Peters5d2b77c2001-09-03 05:47:38 +0000290 class A(C):
291 Adata = 1
292 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000293
294 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000295 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000296 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000297 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000298 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000299 a.adata = 42
300 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000301 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000302 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000303
Tim Peterscaaff8d2001-09-10 23:12:14 +0000304 # Try a module subclass.
305 import sys
306 class M(type(sys)):
307 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000308 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000309 minstance.b = 2
310 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000311 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
312 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000313
314 class M2(M):
315 def getdict(self):
316 return "Not a dict!"
317 __dict__ = property(getdict)
318
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000319 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000320 m2instance.b = 2
321 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000322 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000323 try:
324 dir(m2instance)
325 except TypeError:
326 pass
327
Tim Peters9e6a3992001-10-30 05:45:26 +0000328 # Two essentially featureless objects, just inheriting stuff from
329 # object.
330 vereq(dir(None), dir(Ellipsis))
331
Guido van Rossum44022412002-05-13 18:29:46 +0000332 # Nasty test case for proxied objects
333 class Wrapper(object):
334 def __init__(self, obj):
335 self.__obj = obj
336 def __repr__(self):
337 return "Wrapper(%s)" % repr(self.__obj)
338 def __getitem__(self, key):
339 return Wrapper(self.__obj[key])
340 def __len__(self):
341 return len(self.__obj)
342 def __getattr__(self, name):
343 return Wrapper(getattr(self.__obj, name))
344
345 class C(object):
346 def __getclass(self):
347 return Wrapper(type(self))
348 __class__ = property(__getclass)
349
350 dir(C()) # This used to segfault
351
Tim Peters6d6c1a32001-08-02 04:15:00 +0000352binops = {
353 'add': '+',
354 'sub': '-',
355 'mul': '*',
356 'div': '/',
357 'mod': '%',
358 'divmod': 'divmod',
359 'pow': '**',
360 'lshift': '<<',
361 'rshift': '>>',
362 'and': '&',
363 'xor': '^',
364 'or': '|',
365 'cmp': 'cmp',
366 'lt': '<',
367 'le': '<=',
368 'eq': '==',
369 'ne': '!=',
370 'gt': '>',
371 'ge': '>=',
372 }
373
374for name, expr in binops.items():
375 if expr.islower():
376 expr = expr + "(a, b)"
377 else:
378 expr = 'a %s b' % expr
379 binops[name] = expr
380
381unops = {
382 'pos': '+',
383 'neg': '-',
384 'abs': 'abs',
385 'invert': '~',
386 'int': 'int',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000387 'float': 'float',
388 'oct': 'oct',
389 'hex': 'hex',
390 }
391
392for name, expr in unops.items():
393 if expr.islower():
394 expr = expr + "(a)"
395 else:
396 expr = '%s a' % expr
397 unops[name] = expr
398
399def numops(a, b, skip=[]):
400 dict = {'a': a, 'b': b}
401 for name, expr in binops.items():
402 if name not in skip:
403 name = "__%s__" % name
404 if hasattr(a, name):
405 res = eval(expr, dict)
406 testbinop(a, b, res, expr, name)
407 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000408 if name not in skip:
409 name = "__%s__" % name
410 if hasattr(a, name):
411 res = eval(expr, dict)
412 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000413
414def ints():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000415 if verbose: print("Testing int operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000416 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000417 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000418 vereq((1).__bool__(), True)
419 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000420 # This returns 'NotImplemented' in Python 2.2
421 class C(int):
422 def __add__(self, other):
423 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000424 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000425 try:
426 C() + ""
427 except TypeError:
428 pass
429 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000430 raise TestFailed("NotImplemented should have caused TypeError")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000431
432def longs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000433 if verbose: print("Testing long operations...")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000434 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000435
436def floats():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000437 if verbose: print("Testing float operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000438 numops(100.0, 3.0)
439
440def complexes():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000441 if verbose: print("Testing complex operations...")
Guido van Rossum4a7fd902007-08-03 21:15:23 +0000442 numops(100.0j, 3.0j,
443 skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float',
444 'divmod', 'mod'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000445 class Number(complex):
446 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000447 def __new__(cls, *args, **kwds):
448 result = complex.__new__(cls, *args)
449 result.prec = kwds.get('prec', 12)
450 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451 def __repr__(self):
452 prec = self.prec
453 if self.imag == 0.0:
454 return "%.*g" % (prec, self.real)
455 if self.real == 0.0:
456 return "%.*gj" % (prec, self.imag)
457 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
458 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000459
Tim Peters6d6c1a32001-08-02 04:15:00 +0000460 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000461 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000462 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463
Tim Peters3f996e72001-09-13 19:18:27 +0000464 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000465 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000466 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000467
468 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000469 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000470 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000471
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472def spamlists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000473 if verbose: print("Testing spamlist operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000474 import copy, xxsubtype as spam
475 def spamlist(l, memo=None):
476 import xxsubtype as spam
477 return spam.spamlist(l)
478 # This is an ugly hack:
479 copy._deepcopy_dispatch[spam.spamlist] = spamlist
480
481 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
482 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
483 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
484 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000485 testsliceop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
486 "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000487 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
488 "a+=b", "__iadd__")
489 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
490 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
491 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
492 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
493 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000494 testsetsliceop(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
495 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000496 # Test subclassing
497 class C(spam.spamlist):
498 def foo(self): return 1
499 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000500 vereq(a, [])
501 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000502 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000503 vereq(a, [100])
504 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000505 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000506 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000507
508def spamdicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000509 if verbose: print("Testing spamdict operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000510 import copy, xxsubtype as spam
511 def spamdict(d, memo=None):
512 import xxsubtype as spam
513 sd = spam.spamdict()
514 for k, v in d.items(): sd[k] = v
515 return sd
516 # This is an ugly hack:
517 copy._deepcopy_dispatch[spam.spamdict] = spamdict
518
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000519 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000520 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
521 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
522 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
523 d = spamdict({1:2,3:4})
524 l1 = []
525 for i in d.keys(): l1.append(i)
526 l = []
527 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000528 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000529 l = []
530 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000531 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000532 l = []
533 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000534 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000535 straightd = {1:2, 3:4}
536 spamd = spamdict(straightd)
537 testunop(spamd, 2, "len(a)", "__len__")
538 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
539 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
540 "a[b]=c", "__setitem__")
541 # Test subclassing
542 class C(spam.spamdict):
543 def foo(self): return 1
544 a = C()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000545 vereq(list(a.items()), [])
Guido van Rossum45704552001-10-08 16:35:45 +0000546 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000547 a['foo'] = 'bar'
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000548 vereq(list(a.items()), [('foo', 'bar')])
Guido van Rossum45704552001-10-08 16:35:45 +0000549 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000550 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000551 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000552
553def pydicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000554 if verbose: print("Testing Python subclass of dict...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000555 verify(issubclass(dict, dict))
556 verify(isinstance({}, dict))
557 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000558 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000559 verify(d.__class__ is dict)
560 verify(isinstance(d, dict))
561 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562 state = -1
563 def __init__(self, *a, **kw):
564 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000565 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566 self.state = a[0]
567 if kw:
568 for k, v in kw.items(): self[v] = k
569 def __getitem__(self, key):
570 return self.get(key, 0)
571 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000572 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000573 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000574 def setstate(self, state):
575 self.state = state
576 def getstate(self):
577 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000578 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000579 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000581 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000582 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000584 vereq(a.state, -1)
585 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000586 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000587 vereq(a.state, 0)
588 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a.state, 10)
591 vereq(a.getstate(), 10)
592 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000593 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000594 vereq(a[42], 24)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000595 if verbose: print("pydict stress test ...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596 N = 50
597 for i in range(N):
598 a[i] = C()
599 for j in range(N):
600 a[i][j] = i*j
601 for i in range(N):
602 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000603 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604
605def pylists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000606 if verbose: print("Testing Python subclass of list...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000607 class C(list):
608 def __getitem__(self, i):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000609 if isinstance(i, slice):
610 return (i.start, i.stop)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000611 return list.__getitem__(self, i) + 100
Tim Peters6d6c1a32001-08-02 04:15:00 +0000612 a = C()
613 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000614 vereq(a[0], 100)
615 vereq(a[1], 101)
616 vereq(a[2], 102)
617 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000618
619def metaclass():
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000620 if verbose: print("Testing metaclass...")
621 class C(metaclass=type):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000622 def __init__(self):
623 self.__state = 0
624 def getstate(self):
625 return self.__state
626 def setstate(self, state):
627 self.__state = state
628 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000631 vereq(a.getstate(), 10)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000632 class _metaclass(type):
633 def myself(cls): return cls
634 class D(metaclass=_metaclass):
635 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000636 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000637 d = D()
638 verify(d.__class__ is D)
639 class M1(type):
640 def __new__(cls, name, bases, dict):
641 dict['__spam__'] = 1
642 return type.__new__(cls, name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000643 class C(metaclass=M1):
644 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000645 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000646 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000647 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000648
Guido van Rossum309b5662001-08-17 11:43:17 +0000649 class _instance(object):
650 pass
651 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000652 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000653 def __new__(cls, name, bases, dict):
654 self = object.__new__(cls)
655 self.name = name
656 self.bases = bases
657 self.dict = dict
658 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000659 def __call__(self):
660 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000661 # Early binding of methods
662 for key in self.dict:
663 if key.startswith("__"):
664 continue
665 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000666 return it
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000667 class C(metaclass=M2):
Guido van Rossum309b5662001-08-17 11:43:17 +0000668 def spam(self):
669 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000670 vereq(C.name, 'C')
671 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000672 verify('spam' in C.dict)
673 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675
Guido van Rossum91ee7982001-08-30 20:52:40 +0000676 # More metaclass examples
677
678 class autosuper(type):
679 # Automatically add __super to the class
680 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 cls = super(autosuper, metaclass).__new__(metaclass,
683 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000684 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000685 while name[:1] == "_":
686 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000687 if name:
688 name = "_%s__super" % name
689 else:
690 name = "__super"
691 setattr(cls, name, super(cls))
692 return cls
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000693 class A(metaclass=autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000694 def meth(self):
695 return "A"
696 class B(A):
697 def meth(self):
698 return "B" + self.__super.meth()
699 class C(A):
700 def meth(self):
701 return "C" + self.__super.meth()
702 class D(C, B):
703 def meth(self):
704 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000705 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000706 class E(B, C):
707 def meth(self):
708 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000709 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000710
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000711 class autoproperty(type):
712 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000713 # named _get_x and/or _set_x are found
714 def __new__(metaclass, name, bases, dict):
715 hits = {}
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000716 for key, val in dict.items():
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 if key.startswith("_get_"):
718 key = key[5:]
719 get, set = hits.get(key, (None, None))
720 get = val
721 hits[key] = get, set
722 elif key.startswith("_set_"):
723 key = key[5:]
724 get, set = hits.get(key, (None, None))
725 set = val
726 hits[key] = get, set
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000727 for key, (get, set) in hits.items():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000728 dict[key] = property(get, set)
729 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000730 name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000731 class A(metaclass=autoproperty):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000732 def _get_x(self):
733 return -self.__x
734 def _set_x(self, x):
735 self.__x = -x
736 a = A()
737 verify(not hasattr(a, "x"))
738 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000739 vereq(a.x, 12)
740 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000741
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000742 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000743 # Merge of multiple cooperating metaclasses
744 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000745 class A(metaclass=multimetaclass):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000746 def _get_x(self):
747 return "A"
748 class B(A):
749 def _get_x(self):
750 return "B" + self.__super._get_x()
751 class C(A):
752 def _get_x(self):
753 return "C" + self.__super._get_x()
754 class D(C, B):
755 def _get_x(self):
756 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000757 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000758
Guido van Rossumf76de622001-10-18 15:49:21 +0000759 # Make sure type(x) doesn't call x.__class__.__init__
760 class T(type):
761 counter = 0
762 def __init__(self, *args):
763 T.counter += 1
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000764 class C(metaclass=T):
765 pass
Guido van Rossumf76de622001-10-18 15:49:21 +0000766 vereq(T.counter, 1)
767 a = C()
768 vereq(type(a), C)
769 vereq(T.counter, 1)
770
Guido van Rossum29d26062001-12-11 04:37:34 +0000771 class C(object): pass
772 c = C()
773 try: c()
774 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +0000775 else: raise TestFailed("calling object w/o call method should raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +0000776
Guido van Rossumd8faa362007-04-27 19:54:29 +0000777 # Testing code to find most derived baseclass
778 class A(type):
779 def __new__(*args, **kwargs):
780 return type.__new__(*args, **kwargs)
781
782 class B(object):
783 pass
784
785 class C(object, metaclass=A):
786 pass
787
788 # The most derived metaclass of D is A rather than type.
789 class D(B, C):
790 pass
791
792
Tim Peters6d6c1a32001-08-02 04:15:00 +0000793def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000794 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000796 import sys
797 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000799 def __init__(self, name):
800 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000801 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000803 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804 def __setattr__(self, name, value):
805 log.append(("setattr", name, value))
806 MT.__setattr__(self, name, value)
807 def __delattr__(self, name):
808 log.append(("delattr", name))
809 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000810 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000811 a.foo = 12
812 x = a.foo
813 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000814 vereq(log, [("setattr", "foo", 12),
815 ("getattr", "foo"),
816 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817
Guido van Rossum360e4b82007-05-14 22:51:27 +0000818 # http://python.org/sf/1174712
819 try:
820 class Module(types.ModuleType, str):
821 pass
822 except TypeError:
823 pass
824 else:
825 raise TestFailed("inheriting from ModuleType and str at the "
826 "same time should fail")
827
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000829 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000830 class C(object):
831 def __init__(self):
832 self.__state = 0
833 def getstate(self):
834 return self.__state
835 def setstate(self, state):
836 self.__state = state
837 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000838 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000839 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000840 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000841 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842 def __init__(self):
843 type({}).__init__(self)
844 C.__init__(self)
845 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000846 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000848 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000849 vereq(d["hello"], "world")
850 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000851 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000852 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000853 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854
Guido van Rossume45763a2001-08-10 21:28:46 +0000855 # SF bug #442833
856 class Node(object):
857 def __int__(self):
858 return int(self.foo())
859 def foo(self):
860 return "23"
861 class Frag(Node, list):
862 def foo(self):
863 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000864 vereq(Node().__int__(), 23)
865 vereq(int(Node()), 23)
866 vereq(Frag().__int__(), 42)
867 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000868
Tim Peters6d6c1a32001-08-02 04:15:00 +0000869def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000870 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000871 class A(object):
872 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000873 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874 class B(A):
875 def boo(self): return "B"
876 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(B().spam(), "B")
878 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000879 class C(A):
880 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000881 vereq(C().spam(), "A")
882 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000883 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000884 vereq(D().spam(), "B")
885 vereq(D().boo(), "B")
886 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000888 vereq(E().spam(), "B")
889 vereq(E().boo(), "C")
890 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000891 # MRO order disagreement
892 try:
893 class F(D, E): pass
894 except TypeError:
895 pass
896 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000897 raise TestFailed("expected MRO order disagreement (F)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000898 try:
899 class G(E, D): pass
900 except TypeError:
901 pass
902 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000903 raise TestFailed("expected MRO order disagreement (G)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000904
905
906# see thread python-dev/2002-October/029035.html
907def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000908 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000909 class A(object): pass
910 class B(object): pass
911 class C(object): pass
912 class X(A): pass
913 class Y(A): pass
914 class Z(X,B,Y,C): pass
915 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
916
917# see "A Monotonic Superclass Linearization for Dylan",
918# by Kim Barrett et al. (OOPSLA 1996)
919def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000920 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000921 class Boat(object): pass
922 class DayBoat(Boat): pass
923 class WheelBoat(Boat): pass
924 class EngineLess(DayBoat): pass
925 class SmallMultihull(DayBoat): pass
926 class PedalWheelBoat(EngineLess,WheelBoat): pass
927 class SmallCatamaran(SmallMultihull): pass
928 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
929
930 vereq(PedalWheelBoat.__mro__,
931 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
932 object))
933 vereq(SmallCatamaran.__mro__,
934 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
935
936 vereq(Pedalo.__mro__,
937 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
938 SmallMultihull, DayBoat, WheelBoat, Boat, object))
939
940# see "A Monotonic Superclass Linearization for Dylan",
941# by Kim Barrett et al. (OOPSLA 1996)
942def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000943 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000944 class Pane(object): pass
945 class ScrollingMixin(object): pass
946 class EditingMixin(object): pass
947 class ScrollablePane(Pane,ScrollingMixin): pass
948 class EditablePane(Pane,EditingMixin): pass
949 class EditableScrollablePane(ScrollablePane,EditablePane): pass
950
951 vereq(EditableScrollablePane.__mro__,
952 (EditableScrollablePane, ScrollablePane, EditablePane,
953 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000954
Raymond Hettingerf394df42003-04-06 19:13:41 +0000955mro_err_msg = """Cannot create a consistent method resolution
956order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000957
Guido van Rossumd32047f2002-11-25 21:38:52 +0000958def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000959 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000960 def raises(exc, expected, callable, *args):
961 try:
962 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000963 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000964 if not str(msg).startswith(expected):
Collin Winter3add4d72007-08-29 23:37:32 +0000965 raise TestFailed("Message %r, expected %r" % (str(msg),
966 expected))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000967 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000968 raise TestFailed("Expected %s" % exc)
Guido van Rossumd32047f2002-11-25 21:38:52 +0000969 class A(object): pass
970 class B(A): pass
971 class C(object): pass
972 # Test some very simple errors
973 raises(TypeError, "duplicate base class A",
974 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000975 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000976 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000977 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000978 type, "X", (A, C, B), {})
979 # Test a slightly more complex error
980 class GridLayout(object): pass
981 class HorizontalGrid(GridLayout): pass
982 class VerticalGrid(GridLayout): pass
983 class HVGrid(HorizontalGrid, VerticalGrid): pass
984 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000985 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000986 type, "ConfusedGrid", (HVGrid, VHGrid), {})
987
Guido van Rossum37202612001-08-09 19:45:21 +0000988def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000989 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000990 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000991 vereq(a.__class__, object)
992 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000993 b = object()
994 verify(a is not b)
995 verify(not hasattr(a, "foo"))
996 try:
997 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000998 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000999 pass
1000 else:
1001 verify(0, "object() should not allow setting a foo attribute")
1002 verify(not hasattr(object(), "__dict__"))
1003
1004 class Cdict(object):
1005 pass
1006 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001007 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001008 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001009 vereq(x.foo, 1)
1010 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001011
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001013 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001014 class C0(object):
1015 __slots__ = []
1016 x = C0()
1017 verify(not hasattr(x, "__dict__"))
1018 verify(not hasattr(x, "foo"))
1019
1020 class C1(object):
1021 __slots__ = ['a']
1022 x = C1()
1023 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001024 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001025 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001026 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001027 x.a = None
1028 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001030 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001031
1032 class C3(object):
1033 __slots__ = ['a', 'b', 'c']
1034 x = C3()
1035 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001036 verify(not hasattr(x, 'a'))
1037 verify(not hasattr(x, 'b'))
1038 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001039 x.a = 1
1040 x.b = 2
1041 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001042 vereq(x.a, 1)
1043 vereq(x.b, 2)
1044 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001045
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001046 class C4(object):
1047 """Validate name mangling"""
1048 __slots__ = ['__a']
1049 def __init__(self, value):
1050 self.__a = value
1051 def get(self):
1052 return self.__a
1053 x = C4(5)
1054 verify(not hasattr(x, '__dict__'))
1055 verify(not hasattr(x, '__a'))
1056 vereq(x.get(), 5)
1057 try:
1058 x.__a = 6
1059 except AttributeError:
1060 pass
1061 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001062 raise TestFailed("Double underscored names not mangled")
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001063
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001064 # Make sure slot names are proper identifiers
1065 try:
1066 class C(object):
1067 __slots__ = [None]
1068 except TypeError:
1069 pass
1070 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001071 raise TestFailed("[None] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001072 try:
1073 class C(object):
1074 __slots__ = ["foo bar"]
1075 except TypeError:
1076 pass
1077 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001078 raise TestFailed("['foo bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001079 try:
1080 class C(object):
1081 __slots__ = ["foo\0bar"]
1082 except TypeError:
1083 pass
1084 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001085 raise TestFailed("['foo\\0bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001086 try:
1087 class C(object):
1088 __slots__ = ["1"]
1089 except TypeError:
1090 pass
1091 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001092 raise TestFailed("['1'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001093 try:
1094 class C(object):
1095 __slots__ = [""]
1096 except TypeError:
1097 pass
1098 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001099 raise TestFailed("[''] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001100 class C(object):
1101 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001102 # XXX(nnorwitz): was there supposed to be something tested
1103 # from the class above?
1104
1105 # Test a single string is not expanded as a sequence.
1106 class C(object):
1107 __slots__ = "abc"
1108 c = C()
1109 c.abc = 5
1110 vereq(c.abc, 5)
1111
1112 # Test unicode slot names
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001113 # Test a single unicode string is not expanded as a sequence.
1114 class C(object):
1115 __slots__ = "abc"
1116 c = C()
1117 c.abc = 5
1118 vereq(c.abc, 5)
1119
1120 # _unicode_to_string used to modify slots in certain circumstances
1121 slots = ("foo", "bar")
1122 class C(object):
1123 __slots__ = slots
1124 x = C()
1125 x.foo = 5
1126 vereq(x.foo, 5)
1127 veris(type(slots[0]), str)
1128 # this used to leak references
Guido van Rossumd8faa362007-04-27 19:54:29 +00001129 try:
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001130 class C(object):
1131 __slots__ = [chr(128)]
1132 except (TypeError, UnicodeEncodeError):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001133 pass
1134 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001135 raise TestFailed("[unichr(128)] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001136
Guido van Rossum33bab012001-12-05 22:45:48 +00001137 # Test leaks
1138 class Counted(object):
1139 counter = 0 # counts the number of instances alive
1140 def __init__(self):
1141 Counted.counter += 1
1142 def __del__(self):
1143 Counted.counter -= 1
1144 class C(object):
1145 __slots__ = ['a', 'b', 'c']
1146 x = C()
1147 x.a = Counted()
1148 x.b = Counted()
1149 x.c = Counted()
1150 vereq(Counted.counter, 3)
1151 del x
1152 vereq(Counted.counter, 0)
1153 class D(C):
1154 pass
1155 x = D()
1156 x.a = Counted()
1157 x.z = Counted()
1158 vereq(Counted.counter, 2)
1159 del x
1160 vereq(Counted.counter, 0)
1161 class E(D):
1162 __slots__ = ['e']
1163 x = E()
1164 x.a = Counted()
1165 x.z = Counted()
1166 x.e = Counted()
1167 vereq(Counted.counter, 3)
1168 del x
1169 vereq(Counted.counter, 0)
1170
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001171 # Test cyclical leaks [SF bug 519621]
1172 class F(object):
1173 __slots__ = ['a', 'b']
1174 log = []
1175 s = F()
1176 s.a = [Counted(), s]
1177 vereq(Counted.counter, 1)
1178 s = None
1179 import gc
1180 gc.collect()
1181 vereq(Counted.counter, 0)
1182
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001183 # Test lookup leaks [SF bug 572567]
1184 import sys,gc
1185 class G(object):
1186 def __cmp__(self, other):
1187 return 0
1188 g = G()
1189 orig_objects = len(gc.get_objects())
Guido van Rossum805365e2007-05-07 22:24:25 +00001190 for i in range(10):
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001191 g==g
1192 new_objects = len(gc.get_objects())
1193 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001194 class H(object):
1195 __slots__ = ['a', 'b']
1196 def __init__(self):
1197 self.a = 1
1198 self.b = 2
1199 def __del__(self):
1200 assert self.a == 1
1201 assert self.b == 2
1202
1203 save_stderr = sys.stderr
1204 sys.stderr = sys.stdout
1205 h = H()
1206 try:
1207 del h
1208 finally:
1209 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001210
Guido van Rossum8b056da2002-08-13 18:26:26 +00001211def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001212 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001213
1214 class D(object):
1215 __slots__ = ["__dict__"]
1216 a = D()
1217 verify(hasattr(a, "__dict__"))
1218 verify(not hasattr(a, "__weakref__"))
1219 a.foo = 42
1220 vereq(a.__dict__, {"foo": 42})
1221
1222 class W(object):
1223 __slots__ = ["__weakref__"]
1224 a = W()
1225 verify(hasattr(a, "__weakref__"))
1226 verify(not hasattr(a, "__dict__"))
1227 try:
1228 a.foo = 42
1229 except AttributeError:
1230 pass
1231 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001232 raise TestFailed("shouldn't be allowed to set a.foo")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001233
1234 class C1(W, D):
1235 __slots__ = []
1236 a = C1()
1237 verify(hasattr(a, "__dict__"))
1238 verify(hasattr(a, "__weakref__"))
1239 a.foo = 42
1240 vereq(a.__dict__, {"foo": 42})
1241
1242 class C2(D, W):
1243 __slots__ = []
1244 a = C2()
1245 verify(hasattr(a, "__dict__"))
1246 verify(hasattr(a, "__weakref__"))
1247 a.foo = 42
1248 vereq(a.__dict__, {"foo": 42})
1249
Guido van Rossum9a818922002-11-14 19:50:14 +00001250# MRO order disagreement
1251#
1252# class C3(C1, C2):
1253# __slots__ = []
1254#
1255# class C4(C2, C1):
1256# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001257
Tim Peters6d6c1a32001-08-02 04:15:00 +00001258def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001259 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001260 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001261 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001262 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001263 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001264 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001265 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001267 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001269 vereq(E.foo, 1)
1270 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001271 # Test dynamic instances
1272 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001273 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001274 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001275 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001276 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001277 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001278 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001279 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001280 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001281 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001282 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001283 vereq(int(a), 100)
1284 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001285 verify(not hasattr(a, "spam"))
1286 def mygetattr(self, name):
1287 if name == "spam":
1288 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001289 raise AttributeError
1290 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001291 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001292 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001293 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001294 def mysetattr(self, name, value):
1295 if name == "spam":
1296 raise AttributeError
1297 return object.__setattr__(self, name, value)
1298 C.__setattr__ = mysetattr
1299 try:
1300 a.spam = "not spam"
1301 except AttributeError:
1302 pass
1303 else:
1304 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001305 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001306 class D(C):
1307 pass
1308 d = D()
1309 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001310 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001311
Guido van Rossum7e35d572001-09-15 03:14:32 +00001312 # Test handling of int*seq and seq*int
1313 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001314 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001315 vereq("a"*I(2), "aa")
1316 vereq(I(2)*"a", "aa")
1317 vereq(2*I(3), 6)
1318 vereq(I(3)*2, 6)
1319 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001320
1321 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001322 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001323 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001324 vereq("a"*L(2), "aa")
1325 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001326 vereq(2*L(3), 6)
1327 vereq(L(3)*2, 6)
1328 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001329
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001330 # Test comparison of classes with dynamic metaclasses
1331 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001332 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001333 class someclass(metaclass=dynamicmetaclass):
1334 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001335 verify(someclass != object)
1336
Tim Peters6d6c1a32001-08-02 04:15:00 +00001337def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001338 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001339
1340 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001341 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342 pass
1343 except TypeError:
1344 pass
1345 else:
1346 verify(0, "inheritance from both list and dict should be illegal")
1347
1348 try:
1349 class C(object, None):
1350 pass
1351 except TypeError:
1352 pass
1353 else:
1354 verify(0, "inheritance from non-type should be illegal")
1355 class Classic:
1356 pass
1357
1358 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001359 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 pass
1361 except TypeError:
1362 pass
1363 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001364 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001365
1366 try:
1367 class C(object):
1368 __slots__ = 1
1369 except TypeError:
1370 pass
1371 else:
1372 verify(0, "__slots__ = 1 should be illegal")
1373
1374 try:
1375 class C(object):
1376 __slots__ = [1]
1377 except TypeError:
1378 pass
1379 else:
1380 verify(0, "__slots__ = [1] should be illegal")
1381
Guido van Rossumd8faa362007-04-27 19:54:29 +00001382 class M1(type):
1383 pass
1384 class M2(type):
1385 pass
1386 class A1(object, metaclass=M1):
1387 pass
1388 class A2(object, metaclass=M2):
1389 pass
1390 try:
1391 class B(A1, A2):
1392 pass
1393 except TypeError:
1394 pass
1395 else:
1396 verify(0, "finding the most derived metaclass should have failed")
1397
Tim Peters6d6c1a32001-08-02 04:15:00 +00001398def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001399 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001400 class C(object):
1401 def foo(*a): return a
1402 goo = classmethod(foo)
1403 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001404 vereq(C.goo(1), (C, 1))
1405 vereq(c.goo(1), (C, 1))
1406 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001407 class D(C):
1408 pass
1409 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001410 vereq(D.goo(1), (D, 1))
1411 vereq(d.goo(1), (D, 1))
1412 vereq(d.foo(1), (d, 1))
1413 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001414 # Test for a specific crash (SF bug 528132)
1415 def f(cls, arg): return (cls, arg)
1416 ff = classmethod(f)
1417 vereq(ff.__get__(0, int)(42), (int, 42))
1418 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001419
Guido van Rossum155db9a2002-04-02 17:53:47 +00001420 # Test super() with classmethods (SF bug 535444)
1421 veris(C.goo.im_self, C)
1422 veris(D.goo.im_self, D)
1423 veris(super(D,D).goo.im_self, D)
1424 veris(super(D,d).goo.im_self, D)
1425 vereq(super(D,D).goo(), (D,))
1426 vereq(super(D,d).goo(), (D,))
1427
Raymond Hettingerbe971532003-06-18 01:13:41 +00001428 # Verify that argument is checked for callability (SF bug 753451)
1429 try:
1430 classmethod(1).__get__(1)
1431 except TypeError:
1432 pass
1433 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001434 raise TestFailed("classmethod should check for callability")
Raymond Hettingerbe971532003-06-18 01:13:41 +00001435
Georg Brandl6a29c322006-02-21 22:17:46 +00001436 # Verify that classmethod() doesn't allow keyword args
1437 try:
1438 classmethod(f, kw=1)
1439 except TypeError:
1440 pass
1441 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001442 raise TestFailed("classmethod shouldn't accept keyword args")
Georg Brandl6a29c322006-02-21 22:17:46 +00001443
Fred Drakef841aa62002-03-28 15:49:54 +00001444def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001445 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001446 import xxsubtype as spam
1447 a = (1, 2, 3)
1448 d = {'abc': 123}
1449 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001450 veris(x, spam.spamlist)
1451 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001452 vereq(d, d1)
1453 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001454 veris(x, spam.spamlist)
1455 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001456 vereq(d, d1)
1457
Tim Peters6d6c1a32001-08-02 04:15:00 +00001458def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001459 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001460 class C(object):
1461 def foo(*a): return a
1462 goo = staticmethod(foo)
1463 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001464 vereq(C.goo(1), (1,))
1465 vereq(c.goo(1), (1,))
1466 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001467 class D(C):
1468 pass
1469 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001470 vereq(D.goo(1), (1,))
1471 vereq(d.goo(1), (1,))
1472 vereq(d.foo(1), (d, 1))
1473 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001474
Fred Drakef841aa62002-03-28 15:49:54 +00001475def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001476 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001477 import xxsubtype as spam
1478 a = (1, 2, 3)
1479 d = {"abc": 123}
1480 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1481 veris(x, None)
1482 vereq(a, a1)
1483 vereq(d, d1)
1484 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1485 veris(x, None)
1486 vereq(a, a1)
1487 vereq(d, d1)
1488
Tim Peters6d6c1a32001-08-02 04:15:00 +00001489def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001490 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001491 class C:
1492 def foo(*a): return a
1493 goo = classmethod(foo)
1494 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(C.goo(1), (C, 1))
1496 vereq(c.goo(1), (C, 1))
1497 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001498 class D(C):
1499 pass
1500 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001501 vereq(D.goo(1), (D, 1))
1502 vereq(d.goo(1), (D, 1))
1503 vereq(d.foo(1), (d, 1))
1504 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001505 class E: # *not* subclassing from C
1506 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001507 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001508 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509
1510def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001511 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512 class C(object):
1513 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001514 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001515 self.__get = get
1516 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001517 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001518 def __get__(self, obj, type=None):
1519 return self.__get(obj)
1520 def __set__(self, obj, value):
1521 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001522 def __delete__(self, obj):
1523 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001524 def __init__(self):
1525 self.__x = 0
1526 def __get_x(self):
1527 x = self.__x
1528 self.__x = x+1
1529 return x
1530 def __set_x(self, x):
1531 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001532 def __delete_x(self):
1533 del self.__x
1534 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001535 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001536 vereq(a.x, 0)
1537 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001538 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001539 vereq(a.x, 10)
1540 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001541 del a.x
1542 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001543
1544def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001545 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001546 class C(list):
1547 def __new__(cls):
1548 self = list.__new__(cls)
1549 self.foo = 1
1550 return self
1551 def __init__(self):
1552 self.foo = self.foo + 2
1553 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001554 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001555 verify(a.__class__ is C)
1556 class D(C):
1557 pass
1558 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001559 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001560 verify(b.__class__ is D)
1561
Tim Peters6d6c1a32001-08-02 04:15:00 +00001562def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001563 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001564 class A(object):
1565 def f(self): return "A"
1566 class B(A):
1567 pass
1568 class C(A):
1569 def f(self): return "C"
1570 class D(B, C):
1571 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001572 vereq(D.mro(), [D, B, C, A, object])
1573 vereq(D.__mro__, (D, B, C, A, object))
1574 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001575
Guido van Rossumd3077402001-08-12 05:24:18 +00001576 class PerverseMetaType(type):
1577 def mro(cls):
1578 L = type.mro(cls)
1579 L.reverse()
1580 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001581 class X(D,B,C,A, metaclass=PerverseMetaType):
1582 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(X.__mro__, (object, A, C, B, D, X))
1584 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001585
Armin Rigo037d1e02005-12-29 17:07:39 +00001586 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001587 class _metaclass(type):
1588 def mro(self):
1589 return [self, dict, object]
1590 class X(object, metaclass=_metaclass):
1591 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001592 except TypeError:
1593 pass
1594 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001595 raise TestFailed("devious mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001596
1597 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001598 class _metaclass(type):
1599 def mro(self):
1600 return [1]
1601 class X(object, metaclass=_metaclass):
1602 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001603 except TypeError:
1604 pass
1605 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001606 raise TestFailed("non-class mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001607
1608 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001609 class _metaclass(type):
1610 def mro(self):
1611 return 1
1612 class X(object, metaclass=_metaclass):
1613 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001614 except TypeError:
1615 pass
1616 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001617 raise TestFailed("non-sequence mro() return not caught")
Tim Peters1b27f862005-12-30 18:42:42 +00001618
Armin Rigo037d1e02005-12-29 17:07:39 +00001619
Tim Peters6d6c1a32001-08-02 04:15:00 +00001620def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001621 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001622
1623 class B(object):
1624 "Intermediate class because object doesn't have a __setattr__"
1625
1626 class C(B):
1627
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001628 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001629 if name == "foo":
1630 return ("getattr", name)
1631 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001632 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001633 def __setattr__(self, name, value):
1634 if name == "foo":
1635 self.setattr = (name, value)
1636 else:
1637 return B.__setattr__(self, name, value)
1638 def __delattr__(self, name):
1639 if name == "foo":
1640 self.delattr = name
1641 else:
1642 return B.__delattr__(self, name)
1643
1644 def __getitem__(self, key):
1645 return ("getitem", key)
1646 def __setitem__(self, key, value):
1647 self.setitem = (key, value)
1648 def __delitem__(self, key):
1649 self.delitem = key
1650
Tim Peters6d6c1a32001-08-02 04:15:00 +00001651 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001652 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001653 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001654 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001655 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001656 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001657
Guido van Rossum45704552001-10-08 16:35:45 +00001658 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001659 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001661 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001663
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001664 vereq(a[0:10], ("getitem", slice(0, 10)))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665 a[0:10] = "foo"
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001666 vereq(a.setitem, (slice(0, 10), "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667 del a[0:10]
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001668 vereq(a.delitem, slice(0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001669
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001670def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001671 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001672 class C(object):
1673 def __init__(self, x):
1674 self.x = x
1675 def foo(self):
1676 return self.x
1677 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001678 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001679 class D(C):
1680 boo = C.foo
1681 goo = c1.foo
1682 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001683 vereq(d2.foo(), 2)
1684 vereq(d2.boo(), 2)
1685 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001686 class E(object):
1687 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001688 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001689 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001690
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001691def specials():
1692 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001693 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001694 # Test the default behavior for static classes
1695 class C(object):
1696 def __getitem__(self, i):
1697 if 0 <= i < 10: return i
1698 raise IndexError
1699 c1 = C()
1700 c2 = C()
1701 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001702 verify(id(c1) != id(c2))
1703 hash(c1)
1704 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001705 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001706 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001707 verify(c1 != c2)
1708 verify(not c1 != c1)
1709 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001710 # Note that the module name appears in str/repr, and that varies
1711 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001712 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001713 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001714 verify(-1 not in c1)
1715 for i in range(10):
1716 verify(i in c1)
1717 verify(10 not in c1)
1718 # Test the default behavior for dynamic classes
1719 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001720 def __getitem__(self, i):
1721 if 0 <= i < 10: return i
1722 raise IndexError
1723 d1 = D()
1724 d2 = D()
1725 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001726 verify(id(d1) != id(d2))
1727 hash(d1)
1728 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001729 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001730 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001731 verify(d1 != d2)
1732 verify(not d1 != d1)
1733 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001734 # Note that the module name appears in str/repr, and that varies
1735 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001736 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001737 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001738 verify(-1 not in d1)
1739 for i in range(10):
1740 verify(i in d1)
1741 verify(10 not in d1)
1742 # Test overridden behavior for static classes
1743 class Proxy(object):
1744 def __init__(self, x):
1745 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001746 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001747 return not not self.x
1748 def __hash__(self):
1749 return hash(self.x)
1750 def __eq__(self, other):
1751 return self.x == other
1752 def __ne__(self, other):
1753 return self.x != other
1754 def __cmp__(self, other):
1755 return cmp(self.x, other.x)
1756 def __str__(self):
1757 return "Proxy:%s" % self.x
1758 def __repr__(self):
1759 return "Proxy(%r)" % self.x
1760 def __contains__(self, value):
1761 return value in self.x
1762 p0 = Proxy(0)
1763 p1 = Proxy(1)
1764 p_1 = Proxy(-1)
1765 verify(not p0)
1766 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001767 vereq(hash(p0), hash(0))
1768 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001769 verify(p0 != p1)
1770 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001771 vereq(not p0, p1)
1772 vereq(cmp(p0, p1), -1)
1773 vereq(cmp(p0, p0), 0)
1774 vereq(cmp(p0, p_1), 1)
1775 vereq(str(p0), "Proxy:0")
1776 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001777 p10 = Proxy(range(10))
1778 verify(-1 not in p10)
1779 for i in range(10):
1780 verify(i in p10)
1781 verify(10 not in p10)
1782 # Test overridden behavior for dynamic classes
1783 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001784 def __init__(self, x):
1785 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001786 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001787 return not not self.x
1788 def __hash__(self):
1789 return hash(self.x)
1790 def __eq__(self, other):
1791 return self.x == other
1792 def __ne__(self, other):
1793 return self.x != other
1794 def __cmp__(self, other):
1795 return cmp(self.x, other.x)
1796 def __str__(self):
1797 return "DProxy:%s" % self.x
1798 def __repr__(self):
1799 return "DProxy(%r)" % self.x
1800 def __contains__(self, value):
1801 return value in self.x
1802 p0 = DProxy(0)
1803 p1 = DProxy(1)
1804 p_1 = DProxy(-1)
1805 verify(not p0)
1806 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001807 vereq(hash(p0), hash(0))
1808 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001809 verify(p0 != p1)
1810 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(not p0, p1)
1812 vereq(cmp(p0, p1), -1)
1813 vereq(cmp(p0, p0), 0)
1814 vereq(cmp(p0, p_1), 1)
1815 vereq(str(p0), "DProxy:0")
1816 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001817 p10 = DProxy(range(10))
1818 verify(-1 not in p10)
1819 for i in range(10):
1820 verify(i in p10)
1821 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001822## # Safety test for __cmp__
1823## def unsafecmp(a, b):
1824## try:
1825## a.__class__.__cmp__(a, b)
1826## except TypeError:
1827## pass
1828## else:
1829## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1830## a.__class__, a, b)
1831## unsafecmp(u"123", "123")
1832## unsafecmp("123", u"123")
1833## unsafecmp(1, 1.0)
1834## unsafecmp(1.0, 1)
1835## unsafecmp(1, 1L)
1836## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001837
Thomas Wouters89d996e2007-09-08 17:39:28 +00001838def recursions():
1839 if verbose:
1840 print("Testing recursion checks ...")
1841
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001842## class Letter(str):
1843## def __new__(cls, letter):
1844## if letter == 'EPS':
1845## return str.__new__(cls)
1846## return str.__new__(cls, letter)
1847## def __str__(self):
1848## if not self:
1849## return 'EPS'
1850## return self
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001851## # sys.stdout needs to be the original to trigger the recursion bug
1852## import sys
1853## test_stdout = sys.stdout
1854## sys.stdout = get_original_stdout()
1855## try:
1856## # nothing should actually be printed, this should raise an exception
1857## print(Letter('w'))
1858## except RuntimeError:
1859## pass
1860## else:
1861## raise TestFailed, "expected a RuntimeError for print recursion"
1862## sys.stdout = test_stdout
Neal Norwitz1a997502003-01-13 20:13:12 +00001863
Thomas Wouters89d996e2007-09-08 17:39:28 +00001864 # Bug #1202533.
1865 class A(object):
1866 pass
1867 A.__mul__ = new.instancemethod(lambda self, x: self * x, None, A)
1868 try:
1869 A()*2
1870 except RuntimeError:
1871 pass
1872 else:
1873 raise TestFailed("expected a RuntimeError")
1874
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001875def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001876 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001877 import weakref
1878 class C(object):
1879 pass
1880 c = C()
1881 r = weakref.ref(c)
1882 verify(r() is c)
1883 del c
1884 verify(r() is None)
1885 del r
1886 class NoWeak(object):
1887 __slots__ = ['foo']
1888 no = NoWeak()
1889 try:
1890 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001891 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001892 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001893 else:
1894 verify(0, "weakref.ref(no) should be illegal")
1895 class Weak(object):
1896 __slots__ = ['foo', '__weakref__']
1897 yes = Weak()
1898 r = weakref.ref(yes)
1899 verify(r() is yes)
1900 del yes
1901 verify(r() is None)
1902 del r
1903
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001904def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001905 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001906 class C(object):
1907 def getx(self):
1908 return self.__x
1909 def setx(self, value):
1910 self.__x = value
1911 def delx(self):
1912 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001913 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001914 a = C()
1915 verify(not hasattr(a, "x"))
1916 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001917 vereq(a._C__x, 42)
1918 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001919 del a.x
1920 verify(not hasattr(a, "x"))
1921 verify(not hasattr(a, "_C__x"))
1922 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001923 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001924 C.x.__delete__(a)
1925 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001926
Tim Peters66c1a522001-09-24 21:17:50 +00001927 raw = C.__dict__['x']
1928 verify(isinstance(raw, property))
1929
1930 attrs = dir(raw)
1931 verify("__doc__" in attrs)
1932 verify("fget" in attrs)
1933 verify("fset" in attrs)
1934 verify("fdel" in attrs)
1935
Guido van Rossum45704552001-10-08 16:35:45 +00001936 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001937 verify(raw.fget is C.__dict__['getx'])
1938 verify(raw.fset is C.__dict__['setx'])
1939 verify(raw.fdel is C.__dict__['delx'])
1940
1941 for attr in "__doc__", "fget", "fset", "fdel":
1942 try:
1943 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001944 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001945 if str(msg).find('readonly') < 0:
1946 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001947 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001948 "msg %r" % (attr, str(msg)))
1949 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001950 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001951 "readonly %r attr on a property" % attr)
1952
Neal Norwitz673cd822002-10-18 16:33:13 +00001953 class D(object):
1954 __getitem__ = property(lambda s: 1/0)
1955
1956 d = D()
1957 try:
1958 for i in d:
1959 str(i)
1960 except ZeroDivisionError:
1961 pass
1962 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001963 raise TestFailed("expected ZeroDivisionError from bad property")
Neal Norwitz673cd822002-10-18 16:33:13 +00001964
Georg Brandl533ff6f2006-03-08 18:09:27 +00001965 class E(object):
1966 def getter(self):
1967 "getter method"
1968 return 0
1969 def setter(self, value):
1970 "setter method"
1971 pass
1972 prop = property(getter)
1973 vereq(prop.__doc__, "getter method")
1974 prop2 = property(fset=setter)
1975 vereq(prop2.__doc__, None)
1976
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001977 # this segfaulted in 2.5b2
1978 try:
1979 import _testcapi
1980 except ImportError:
1981 pass
1982 else:
1983 class X(object):
1984 p = property(_testcapi.test_with_docstring)
1985
1986
Guido van Rossum58da9312007-11-10 23:39:45 +00001987def properties_plus():
1988 class C:
1989 foo = property(doc="hello")
1990 @foo.getter
1991 def foo(self):
1992 return self._foo
1993 @foo.setter
1994 def foo(self, value):
1995 self._foo = abs(value)
1996 @foo.deleter
1997 def foo(self):
1998 del self._foo
1999 c = C()
2000 assert C.foo.__doc__ == "hello"
2001 assert not hasattr(c, "foo")
2002 c.foo = -42
2003 assert c.foo == 42
2004 del c.foo
2005 assert not hasattr(c, "foo")
2006
2007 class D(C):
2008 @C.foo.deleter
2009 def foo(self):
2010 try:
2011 del self._foo
2012 except AttributeError:
2013 pass
2014 d = D()
2015 d.foo = 24
2016 assert d.foo == 24
2017 del d.foo
2018 del d.foo
2019
2020 class E:
2021 @property
2022 def foo(self):
2023 return self._foo
2024 @foo.setter
2025 def foo (self, value):
2026 raise RuntimeError
2027 @foo.setter
2028 @foo.deleter
2029 def foo(self, value=None):
2030 if value is None:
2031 del self._foo
2032 else:
2033 self._foo = abs(value)
2034 e = E()
2035 e.foo = -42
2036 assert e.foo == 42
2037 del e.foo
2038
2039 class F(E):
2040 @E.foo.deleter
2041 def foo(self):
2042 del self._foo
2043 @foo.setter
2044 def foo(self, value):
2045 self._foo = max(0, value)
2046 f = F()
2047 f.foo = -10
2048 assert f.foo == 0
2049 del f.foo
2050
2051
Guido van Rossumc4a18802001-08-24 16:55:27 +00002052def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002053 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002054
2055 class A(object):
2056 def meth(self, a):
2057 return "A(%r)" % a
2058
Guido van Rossum45704552001-10-08 16:35:45 +00002059 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002060
2061 class B(A):
2062 def __init__(self):
2063 self.__super = super(B, self)
2064 def meth(self, a):
2065 return "B(%r)" % a + self.__super.meth(a)
2066
Guido van Rossum45704552001-10-08 16:35:45 +00002067 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002068
2069 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002070 def meth(self, a):
2071 return "C(%r)" % a + self.__super.meth(a)
2072 C._C__super = super(C)
2073
Guido van Rossum45704552001-10-08 16:35:45 +00002074 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002075
2076 class D(C, B):
2077 def meth(self, a):
2078 return "D(%r)" % a + super(D, self).meth(a)
2079
Guido van Rossum5b443c62001-12-03 15:38:28 +00002080 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2081
2082 # Test for subclassing super
2083
2084 class mysuper(super):
2085 def __init__(self, *args):
2086 return super(mysuper, self).__init__(*args)
2087
2088 class E(D):
2089 def meth(self, a):
2090 return "E(%r)" % a + mysuper(E, self).meth(a)
2091
2092 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2093
2094 class F(E):
2095 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002096 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002097 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2098 F._F__super = mysuper(F)
2099
2100 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2101
2102 # Make sure certain errors are raised
2103
2104 try:
2105 super(D, 42)
2106 except TypeError:
2107 pass
2108 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002109 raise TestFailed("shouldn't allow super(D, 42)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002110
2111 try:
2112 super(D, C())
2113 except TypeError:
2114 pass
2115 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002116 raise TestFailed("shouldn't allow super(D, C())")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002117
2118 try:
2119 super(D).__get__(12)
2120 except TypeError:
2121 pass
2122 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002123 raise TestFailed("shouldn't allow super(D).__get__(12)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002124
2125 try:
2126 super(D).__get__(C())
2127 except TypeError:
2128 pass
2129 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002130 raise TestFailed("shouldn't allow super(D).__get__(C())")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002131
Guido van Rossuma4541a32003-04-16 20:02:22 +00002132 # Make sure data descriptors can be overridden and accessed via super
2133 # (new feature in Python 2.3)
2134
2135 class DDbase(object):
2136 def getx(self): return 42
2137 x = property(getx)
2138
2139 class DDsub(DDbase):
2140 def getx(self): return "hello"
2141 x = property(getx)
2142
2143 dd = DDsub()
2144 vereq(dd.x, "hello")
2145 vereq(super(DDsub, dd).x, 42)
2146
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002147 # Ensure that super() lookup of descriptor from classmethod
2148 # works (SF ID# 743627)
2149
2150 class Base(object):
2151 aProp = property(lambda self: "foo")
2152
2153 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002154 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002155 def test(klass):
2156 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002157
2158 veris(Sub.test(), Base.aProp)
2159
Thomas Wouters89f507f2006-12-13 04:49:30 +00002160 # Verify that super() doesn't allow keyword args
2161 try:
2162 super(Base, kw=1)
2163 except TypeError:
2164 pass
2165 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002166 raise TestFailed("super shouldn't accept keyword args")
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002167
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002168def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002169 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002170
2171 class hexint(int):
2172 def __repr__(self):
2173 return hex(self)
2174 def __add__(self, other):
2175 return hexint(int.__add__(self, other))
2176 # (Note that overriding __radd__ doesn't work,
2177 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(repr(hexint(7) + 9), "0x10")
2179 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002180 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002181 vereq(a, 12345)
2182 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002183 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002184 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002185 verify((+a).__class__ is int)
2186 verify((a >> 0).__class__ is int)
2187 verify((a << 0).__class__ is int)
2188 verify((hexint(0) << 12).__class__ is int)
2189 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002190
Guido van Rossume2a383d2007-01-15 16:59:06 +00002191 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002192 __slots__ = []
2193 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002194 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002195 def __add__(self, other):
2196 return self.__class__(super(octlong, self).__add__(other))
2197 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002198 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002199 # (Note that overriding __radd__ here only seems to work
2200 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002201 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002202 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002203 vereq(a, 12345)
2204 vereq(int(a), 12345)
2205 vereq(hash(a), hash(12345))
2206 verify(int(a).__class__ is int)
2207 verify((+a).__class__ is int)
2208 verify((-a).__class__ is int)
2209 verify((-octlong(0)).__class__ is int)
2210 verify((a >> 0).__class__ is int)
2211 verify((a << 0).__class__ is int)
2212 verify((a - 0).__class__ is int)
2213 verify((a * 1).__class__ is int)
2214 verify((a ** 1).__class__ is int)
2215 verify((a // 1).__class__ is int)
2216 verify((1 * a).__class__ is int)
2217 verify((a | 0).__class__ is int)
2218 verify((a ^ 0).__class__ is int)
2219 verify((a & -1).__class__ is int)
2220 verify((octlong(0) << 12).__class__ is int)
2221 verify((octlong(0) >> 12).__class__ is int)
2222 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002223
2224 # Because octlong overrides __add__, we can't check the absence of +0
2225 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002226 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002227 pass
2228 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002229 verify((a + 0).__class__ is int)
2230 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002231
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002232 # Check that negative clones don't segfault
2233 a = longclone(-1)
2234 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002235 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002236
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002237 class precfloat(float):
2238 __slots__ = ['prec']
2239 def __init__(self, value=0.0, prec=12):
2240 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002241 def __repr__(self):
2242 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002243 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002244 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002245 vereq(a, 12345.0)
2246 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002247 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002248 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002249 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002250
Tim Peters2400fa42001-09-12 19:12:49 +00002251 class madcomplex(complex):
2252 def __repr__(self):
2253 return "%.17gj%+.17g" % (self.imag, self.real)
2254 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002255 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002256 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002257 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002258 vereq(a, base)
2259 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002260 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002261 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(repr(a), "4j-3")
2263 vereq(a, base)
2264 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002265 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002267 veris((+a).__class__, complex)
2268 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002269 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002270 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002272 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002273 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002274 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002275 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002276
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002277 class madtuple(tuple):
2278 _rev = None
2279 def rev(self):
2280 if self._rev is not None:
2281 return self._rev
2282 L = list(self)
2283 L.reverse()
2284 self._rev = self.__class__(L)
2285 return self._rev
2286 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2288 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2289 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002290 for i in range(512):
2291 t = madtuple(range(i))
2292 u = t.rev()
2293 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002294 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002295 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002296 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002297 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002298 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002299 verify(a[:].__class__ is tuple)
2300 verify((a * 1).__class__ is tuple)
2301 verify((a * 0).__class__ is tuple)
2302 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002303 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002304 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002305 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002306 verify((a + a).__class__ is tuple)
2307 verify((a * 0).__class__ is tuple)
2308 verify((a * 1).__class__ is tuple)
2309 verify((a * 2).__class__ is tuple)
2310 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002311
2312 class madstring(str):
2313 _rev = None
2314 def rev(self):
2315 if self._rev is not None:
2316 return self._rev
2317 L = list(self)
2318 L.reverse()
2319 self._rev = self.__class__("".join(L))
2320 return self._rev
2321 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002322 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2323 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2324 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002325 for i in range(256):
2326 s = madstring("".join(map(chr, range(i))))
2327 t = s.rev()
2328 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002329 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002330 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002331 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002332 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002333
Tim Peters8fa5dd02001-09-12 02:18:30 +00002334 base = "\x00" * 5
2335 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002336 vereq(s, base)
2337 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002338 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq(hash(s), hash(base))
2340 vereq({s: 1}[base], 1)
2341 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002342 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002344 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002345 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002346 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002348 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002349 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002350 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002351 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002352 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002353 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002354 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002356 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002358 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002359 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002360 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002361 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002362 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002363 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002364 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002365 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002366 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002367 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002368 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002369 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002370 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002371 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002372 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002373 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002374 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002375
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002376 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002377 _rev = None
2378 def rev(self):
2379 if self._rev is not None:
2380 return self._rev
2381 L = list(self)
2382 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002383 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002384 return self._rev
2385 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002386 vereq(u, "ABCDEF")
2387 vereq(u.rev(), madunicode("FEDCBA"))
2388 vereq(u.rev().rev(), madunicode("ABCDEF"))
2389 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002390 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002391 vereq(str(u), base)
2392 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002393 vereq(hash(u), hash(base))
2394 vereq({u: 1}[base], 1)
2395 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002396 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002397 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002398 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002399 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002400 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002401 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002402 verify(u.replace("x", "x").__class__ is str)
2403 vereq(u.replace("x", "x"), base)
2404 verify(u.replace("xy", "xy").__class__ is str)
2405 vereq(u.replace("xy", "xy"), base)
2406 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002407 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002408 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002409 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002410 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002411 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002412 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002413 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002414 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002415 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002416 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002417 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002418 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002419 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002420 verify((u + "").__class__ is str)
2421 vereq(u + "", base)
2422 verify(("" + u).__class__ is str)
2423 vereq("" + u, base)
2424 verify((u * 0).__class__ is str)
2425 vereq(u * 0, "")
2426 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002427 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002428 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002429 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002430 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002431 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002432 verify(u[0:0].__class__ is str)
2433 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002434
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002435 class sublist(list):
2436 pass
2437 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002438 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002439 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002440 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002441 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002442 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002443 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002444 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002445 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002446 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002447 del a[10:15]
2448 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002449 vereq(a, list(range(10)))
2450 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002451 vereq(a[0], 0)
2452 vereq(a[9], 9)
2453 vereq(a[-10], 0)
2454 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002455 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002456
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002457## class CountedInput(file):
2458## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002459
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002460## self.lineno is the 0-based ordinal of the last line read, up to
2461## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002462
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002463## self.ateof is true if and only if the final "" line has been read,
2464## at which point self.lineno stops incrementing, and further calls
2465## to readline() continue to return "".
2466## """
Tim Peters59c9a642001-09-13 05:38:56 +00002467
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002468## lineno = 0
2469## ateof = 0
2470## def readline(self):
2471## if self.ateof:
2472## return ""
2473## s = file.readline(self)
2474## # Next line works too.
2475## # s = super(CountedInput, self).readline()
2476## self.lineno += 1
2477## if s == "":
2478## self.ateof = 1
2479## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002480
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002481## f = open(name=TESTFN, mode='w')
2482## lines = ['a\n', 'b\n', 'c\n']
2483## try:
2484## f.writelines(lines)
2485## f.close()
2486## f = CountedInput(TESTFN)
2487## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2488## got = f.readline()
2489## vereq(expected, got)
2490## vereq(f.lineno, i)
2491## vereq(f.ateof, (i > len(lines)))
2492## f.close()
2493## finally:
2494## try:
2495## f.close()
2496## except:
2497## pass
2498## try:
2499## import os
2500## os.unlink(TESTFN)
2501## except:
2502## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002503
Tim Peters808b94e2001-09-13 19:33:07 +00002504def keywords():
2505 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002506 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002507 vereq(int(x=1), 1)
2508 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002509 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002510 vereq(complex(imag=42, real=666), complex(666, 42))
2511 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002512 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002513 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002514 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002515 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002516
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002517 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002518 try:
2519 constructor(bogus_keyword_arg=1)
2520 except TypeError:
2521 pass
2522 else:
2523 raise TestFailed("expected TypeError from bogus keyword "
2524 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002525
Tim Peters0ab085c2001-09-14 00:25:33 +00002526def str_subclass_as_dict_key():
2527 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002528 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002529
2530 class cistr(str):
2531 """Sublcass of str that computes __eq__ case-insensitively.
2532
2533 Also computes a hash code of the string in canonical form.
2534 """
2535
2536 def __init__(self, value):
2537 self.canonical = value.lower()
2538 self.hashcode = hash(self.canonical)
2539
2540 def __eq__(self, other):
2541 if not isinstance(other, cistr):
2542 other = cistr(other)
2543 return self.canonical == other.canonical
2544
2545 def __hash__(self):
2546 return self.hashcode
2547
Guido van Rossum45704552001-10-08 16:35:45 +00002548 vereq(cistr('ABC'), 'abc')
2549 vereq('aBc', cistr('ABC'))
2550 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002551
2552 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002553 vereq(d[cistr('one')], 1)
2554 vereq(d[cistr('tWo')], 2)
2555 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002556 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002557 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002558
Guido van Rossumab3b0342001-09-18 20:38:53 +00002559def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002560 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002561 class classic:
2562 pass
2563 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002564 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002565 class C(base):
2566 def __init__(self, value):
2567 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002568 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002569 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002570 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002571 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002572 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002573 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002574 def __ne__(self, other):
2575 if isinstance(other, C):
2576 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002577 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002578 return self.value != other
2579 return NotImplemented
2580 def __lt__(self, other):
2581 if isinstance(other, C):
2582 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002583 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002584 return self.value < other
2585 return NotImplemented
2586 def __le__(self, other):
2587 if isinstance(other, C):
2588 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002589 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002590 return self.value <= other
2591 return NotImplemented
2592 def __gt__(self, other):
2593 if isinstance(other, C):
2594 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002595 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002596 return self.value > other
2597 return NotImplemented
2598 def __ge__(self, other):
2599 if isinstance(other, C):
2600 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002601 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002602 return self.value >= other
2603 return NotImplemented
2604
Guido van Rossumab3b0342001-09-18 20:38:53 +00002605 c1 = C(1)
2606 c2 = C(2)
2607 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002608 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002609 c = {1: c1, 2: c2, 3: c3}
2610 for x in 1, 2, 3:
2611 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002612 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002613 for op in "<", "<=", "==", "!=", ">", ">=":
2614 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2615 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002616 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2617 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002618
Guido van Rossum0639f592001-09-18 21:06:04 +00002619def rich_comparisons():
2620 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002621 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002622 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002623 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002624 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002625 vereq(z, 1+0j)
2626 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002627 class ZZ(complex):
2628 def __eq__(self, other):
2629 try:
2630 return abs(self - other) <= 1e-6
2631 except:
2632 return NotImplemented
2633 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002634 vereq(zz, 1+0j)
2635 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002636
Guido van Rossum0639f592001-09-18 21:06:04 +00002637 class classic:
2638 pass
2639 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002640 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002641 class C(base):
2642 def __init__(self, value):
2643 self.value = int(value)
2644 def __cmp__(self, other):
Collin Winter3add4d72007-08-29 23:37:32 +00002645 raise TestFailed("shouldn't call __cmp__")
Guido van Rossum0639f592001-09-18 21:06:04 +00002646 def __eq__(self, other):
2647 if isinstance(other, C):
2648 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002649 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002650 return self.value == other
2651 return NotImplemented
2652 def __ne__(self, other):
2653 if isinstance(other, C):
2654 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002655 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002656 return self.value != other
2657 return NotImplemented
2658 def __lt__(self, other):
2659 if isinstance(other, C):
2660 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002661 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002662 return self.value < other
2663 return NotImplemented
2664 def __le__(self, other):
2665 if isinstance(other, C):
2666 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002667 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002668 return self.value <= other
2669 return NotImplemented
2670 def __gt__(self, other):
2671 if isinstance(other, C):
2672 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002673 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002674 return self.value > other
2675 return NotImplemented
2676 def __ge__(self, other):
2677 if isinstance(other, C):
2678 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002679 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002680 return self.value >= other
2681 return NotImplemented
2682 c1 = C(1)
2683 c2 = C(2)
2684 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002685 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002686 c = {1: c1, 2: c2, 3: c3}
2687 for x in 1, 2, 3:
2688 for y in 1, 2, 3:
2689 for op in "<", "<=", "==", "!=", ">", ">=":
2690 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2691 "x=%d, y=%d" % (x, y))
2692 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2693 "x=%d, y=%d" % (x, y))
2694 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2695 "x=%d, y=%d" % (x, y))
2696
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002697def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002698 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002699 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002700 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002701 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002702 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2703 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002704
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002705def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002706 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002707 class C(object): pass
2708 class D(object): pass
2709 class E(object): pass
2710 class F(D, E): pass
2711 for cls in C, D, E, F:
2712 for cls2 in C, D, E, F:
2713 x = cls()
2714 x.__class__ = cls2
2715 verify(x.__class__ is cls2)
2716 x.__class__ = cls
2717 verify(x.__class__ is cls)
2718 def cant(x, C):
2719 try:
2720 x.__class__ = C
2721 except TypeError:
2722 pass
2723 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002724 raise TestFailed("shouldn't allow %r.__class__ = %r" % (x, C))
Guido van Rossumb6b89422002-04-15 01:03:30 +00002725 try:
2726 delattr(x, "__class__")
2727 except TypeError:
2728 pass
2729 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002730 raise TestFailed("shouldn't allow del %r.__class__" % x)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002731 cant(C(), list)
2732 cant(list(), C)
2733 cant(C(), 1)
2734 cant(C(), object)
2735 cant(object(), list)
2736 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002737 class Int(int): __slots__ = []
2738 cant(2, Int)
2739 cant(Int(), int)
2740 cant(True, int)
2741 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002742 o = object()
2743 cant(o, type(1))
2744 cant(o, type(None))
2745 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002746 class G(object):
2747 __slots__ = ["a", "b"]
2748 class H(object):
2749 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002750 class I(object):
2751 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002752 class J(object):
2753 __slots__ = ["c", "b"]
2754 class K(object):
2755 __slots__ = ["a", "b", "d"]
2756 class L(H):
2757 __slots__ = ["e"]
2758 class M(I):
2759 __slots__ = ["e"]
2760 class N(J):
2761 __slots__ = ["__weakref__"]
2762 class P(J):
2763 __slots__ = ["__dict__"]
2764 class Q(J):
2765 pass
2766 class R(J):
2767 __slots__ = ["__dict__", "__weakref__"]
2768
2769 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2770 x = cls()
2771 x.a = 1
2772 x.__class__ = cls2
2773 verify(x.__class__ is cls2,
2774 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2775 vereq(x.a, 1)
2776 x.__class__ = cls
2777 verify(x.__class__ is cls,
2778 "assigning %r as __class__ for %r silently failed" % (cls, x))
2779 vereq(x.a, 1)
2780 for cls in G, J, K, L, M, N, P, R, list, Int:
2781 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2782 if cls is cls2:
2783 continue
2784 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002785
Guido van Rossum6661be32001-10-26 04:26:12 +00002786def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002787 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002788 class C(object): pass
2789 a = C()
2790 a.__dict__ = {'b': 1}
2791 vereq(a.b, 1)
2792 def cant(x, dict):
2793 try:
2794 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002795 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002796 pass
2797 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002798 raise TestFailed("shouldn't allow %r.__dict__ = %r" % (x, dict))
Guido van Rossum6661be32001-10-26 04:26:12 +00002799 cant(a, None)
2800 cant(a, [])
2801 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002802 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002803
2804 class Base(object):
2805 pass
2806 def verify_dict_readonly(x):
2807 """
2808 x has to be an instance of a class inheriting from Base.
2809 """
2810 cant(x, {})
2811 try:
2812 del x.__dict__
2813 except (AttributeError, TypeError):
2814 pass
2815 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002816 raise TestFailed("shouldn't allow del %r.__dict__" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002817 dict_descr = Base.__dict__["__dict__"]
2818 try:
2819 dict_descr.__set__(x, {})
2820 except (AttributeError, TypeError):
2821 pass
2822 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002823 raise TestFailed("dict_descr allowed access to %r's dict" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002824
2825 # Classes don't allow __dict__ assignment and have readonly dicts
2826 class Meta1(type, Base):
2827 pass
2828 class Meta2(Base, type):
2829 pass
2830 class D(object):
2831 __metaclass__ = Meta1
2832 class E(object):
2833 __metaclass__ = Meta2
2834 for cls in C, D, E:
2835 verify_dict_readonly(cls)
2836 class_dict = cls.__dict__
2837 try:
2838 class_dict["spam"] = "eggs"
2839 except TypeError:
2840 pass
2841 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002842 raise TestFailed("%r's __dict__ can be modified" % cls)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002843
2844 # Modules also disallow __dict__ assignment
2845 class Module1(types.ModuleType, Base):
2846 pass
2847 class Module2(Base, types.ModuleType):
2848 pass
2849 for ModuleType in Module1, Module2:
2850 mod = ModuleType("spam")
2851 verify_dict_readonly(mod)
2852 mod.__dict__["spam"] = "eggs"
2853
2854 # Exception's __dict__ can be replaced, but not deleted
2855 class Exception1(Exception, Base):
2856 pass
2857 class Exception2(Base, Exception):
2858 pass
2859 for ExceptionType in Exception, Exception1, Exception2:
2860 e = ExceptionType()
2861 e.__dict__ = {"a": 1}
2862 vereq(e.a, 1)
2863 try:
2864 del e.__dict__
2865 except (TypeError, AttributeError):
2866 pass
2867 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002868 raise TestFaied("%r's __dict__ can be deleted" % e)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002869
Guido van Rossum6661be32001-10-26 04:26:12 +00002870
Guido van Rossum3926a632001-09-25 16:25:58 +00002871def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002872 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002873 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002874 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002875
2876 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002877 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002878
2879 global C
2880 class C(object):
2881 def __init__(self, a, b):
2882 super(C, self).__init__()
2883 self.a = a
2884 self.b = b
2885 def __repr__(self):
2886 return "C(%r, %r)" % (self.a, self.b)
2887
2888 global C1
2889 class C1(list):
2890 def __new__(cls, a, b):
2891 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002892 def __getnewargs__(self):
2893 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002894 def __init__(self, a, b):
2895 self.a = a
2896 self.b = b
2897 def __repr__(self):
2898 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2899
2900 global C2
2901 class C2(int):
2902 def __new__(cls, a, b, val=0):
2903 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002904 def __getnewargs__(self):
2905 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002906 def __init__(self, a, b, val=0):
2907 self.a = a
2908 self.b = b
2909 def __repr__(self):
2910 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2911
Guido van Rossum90c45142001-11-24 21:07:01 +00002912 global C3
2913 class C3(object):
2914 def __init__(self, foo):
2915 self.foo = foo
2916 def __getstate__(self):
2917 return self.foo
2918 def __setstate__(self, foo):
2919 self.foo = foo
2920
2921 global C4classic, C4
2922 class C4classic: # classic
2923 pass
2924 class C4(C4classic, object): # mixed inheritance
2925 pass
2926
Guido van Rossum99603b02007-07-20 00:22:32 +00002927 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002928 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002929 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002930 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002931
2932 for cls in C, C1, C2:
2933 s = p.dumps(cls, bin)
2934 cls2 = p.loads(s)
2935 verify(cls2 is cls)
2936
2937 a = C1(1, 2); a.append(42); a.append(24)
2938 b = C2("hello", "world", 42)
2939 s = p.dumps((a, b), bin)
2940 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002941 vereq(x.__class__, a.__class__)
2942 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2943 vereq(y.__class__, b.__class__)
2944 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002945 vereq(repr(x), repr(a))
2946 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002947 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002948 print("a = x =", a)
2949 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002950 # Test for __getstate__ and __setstate__ on new style class
2951 u = C3(42)
2952 s = p.dumps(u, bin)
2953 v = p.loads(s)
2954 veris(u.__class__, v.__class__)
2955 vereq(u.foo, v.foo)
2956 # Test for picklability of hybrid class
2957 u = C4()
2958 u.foo = 42
2959 s = p.dumps(u, bin)
2960 v = p.loads(s)
2961 veris(u.__class__, v.__class__)
2962 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002963
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002964 # Testing copy.deepcopy()
2965 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002966 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002967 import copy
2968 for cls in C, C1, C2:
2969 cls2 = copy.deepcopy(cls)
2970 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002971
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002972 a = C1(1, 2); a.append(42); a.append(24)
2973 b = C2("hello", "world", 42)
2974 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002975 vereq(x.__class__, a.__class__)
2976 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2977 vereq(y.__class__, b.__class__)
2978 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002979 vereq(repr(x), repr(a))
2980 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002981 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002982 print("a = x =", a)
2983 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002984
Guido van Rossum8c842552002-03-14 23:05:54 +00002985def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002986 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002987 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002988 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002989 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002990 global B, C, D, E
2991 class B(object):
2992 pass
2993 for base in [object, B]:
2994 class C(base):
2995 __slots__ = ['a']
2996 class D(C):
2997 pass
2998 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002999 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003000 except TypeError:
3001 pass
3002 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003003 raise TestFailed("should fail: pickle C instance - %s" % base)
Guido van Rossum8c842552002-03-14 23:05:54 +00003004 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003005 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003006 except TypeError:
3007 pass
3008 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003009 raise TestFailed("should fail: pickle D instance - %s" % base)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003010 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003011 class C(base):
3012 __slots__ = ['a']
3013 def __getstate__(self):
3014 try:
3015 d = self.__dict__.copy()
3016 except AttributeError:
3017 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003018 for cls in self.__class__.__mro__:
3019 for sn in cls.__dict__.get('__slots__', ()):
3020 try:
3021 d[sn] = getattr(self, sn)
3022 except AttributeError:
3023 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003024 return d
3025 def __setstate__(self, d):
3026 for k, v in d.items():
3027 setattr(self, k, v)
3028 class D(C):
3029 pass
3030 # Now it should work
3031 x = C()
3032 y = pickle.loads(pickle.dumps(x))
3033 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003034 x.a = 42
3035 y = pickle.loads(pickle.dumps(x))
3036 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00003037 x = D()
3038 x.a = 42
3039 x.b = 100
3040 y = pickle.loads(pickle.dumps(x))
3041 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003042 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003043 class E(C):
3044 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003045 x = E()
3046 x.a = 42
3047 x.b = "foo"
3048 y = pickle.loads(pickle.dumps(x))
3049 vereq(y.a, x.a)
3050 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003051
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003052def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003053 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003054 import copy
3055 class C(object):
3056 pass
3057
3058 a = C()
3059 a.foo = 12
3060 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003061 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003062
3063 a.bar = [1,2,3]
3064 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003065 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003066 verify(c.bar is a.bar)
3067
3068 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003069 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003070 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003071 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003072
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003073def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003074 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003075 class I(int):
3076 def __repr__(self):
3077 return "I(%r)" % int(self)
3078 def __add__(self, other):
3079 return I(int(self) + int(other))
3080 __radd__ = __add__
3081 def __pow__(self, other, mod=None):
3082 if mod is None:
3083 return I(pow(int(self), int(other)))
3084 else:
3085 return I(pow(int(self), int(other), int(mod)))
3086 def __rpow__(self, other, mod=None):
3087 if mod is None:
3088 return I(pow(int(other), int(self), mod))
3089 else:
3090 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003091
Walter Dörwald70a6b492004-02-12 17:35:32 +00003092 vereq(repr(I(1) + I(2)), "I(3)")
3093 vereq(repr(I(1) + 2), "I(3)")
3094 vereq(repr(1 + I(2)), "I(3)")
3095 vereq(repr(I(2) ** I(3)), "I(8)")
3096 vereq(repr(2 ** I(3)), "I(8)")
3097 vereq(repr(I(2) ** 3), "I(8)")
3098 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003099 class S(str):
3100 def __eq__(self, other):
3101 return self.lower() == other.lower()
3102
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003103def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003104 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003105 class A(object):
3106 pass
3107 class B(A):
3108 pass
3109 class C(A):
3110 pass
3111 class D(B, C):
3112 pass
3113 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003114 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003115 A.__hash__ = lambda self: 42
3116 vereq(hash(d), 42)
3117 C.__hash__ = lambda self: 314
3118 vereq(hash(d), 314)
3119 B.__hash__ = lambda self: 144
3120 vereq(hash(d), 144)
3121 D.__hash__ = lambda self: 100
3122 vereq(hash(d), 100)
3123 del D.__hash__
3124 vereq(hash(d), 144)
3125 del B.__hash__
3126 vereq(hash(d), 314)
3127 del C.__hash__
3128 vereq(hash(d), 42)
3129 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003130 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003131 d.foo = 42
3132 d.bar = 42
3133 vereq(d.foo, 42)
3134 vereq(d.bar, 42)
3135 def __getattribute__(self, name):
3136 if name == "foo":
3137 return 24
3138 return object.__getattribute__(self, name)
3139 A.__getattribute__ = __getattribute__
3140 vereq(d.foo, 24)
3141 vereq(d.bar, 42)
3142 def __getattr__(self, name):
3143 if name in ("spam", "foo", "bar"):
3144 return "hello"
Collin Winter3add4d72007-08-29 23:37:32 +00003145 raise AttributeError(name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003146 B.__getattr__ = __getattr__
3147 vereq(d.spam, "hello")
3148 vereq(d.foo, 24)
3149 vereq(d.bar, 42)
3150 del A.__getattribute__
3151 vereq(d.foo, 42)
3152 del d.foo
3153 vereq(d.foo, "hello")
3154 vereq(d.bar, 42)
3155 del B.__getattr__
3156 try:
3157 d.foo
3158 except AttributeError:
3159 pass
3160 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003161 raise TestFailed("d.foo should be undefined now")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003162
Guido van Rossume7f3e242002-06-14 02:35:45 +00003163 # Test a nasty bug in recurse_down_subclasses()
3164 import gc
3165 class A(object):
3166 pass
3167 class B(A):
3168 pass
3169 del B
3170 gc.collect()
3171 A.__setitem__ = lambda *a: None # crash
3172
Tim Petersfc57ccb2001-10-12 02:38:24 +00003173def buffer_inherit():
3174 import binascii
3175 # SF bug [#470040] ParseTuple t# vs subclasses.
3176 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003177 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003178
3179 class MyStr(str):
3180 pass
3181 base = 'abc'
3182 m = MyStr(base)
3183 # b2a_hex uses the buffer interface to get its argument's value, via
3184 # PyArg_ParseTuple 't#' code.
3185 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3186
3187 # It's not clear that unicode will continue to support the character
3188 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003189 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003190 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003191 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003192 m = MyUni(base)
3193 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3194
3195 class MyInt(int):
3196 pass
3197 m = MyInt(42)
3198 try:
3199 binascii.b2a_hex(m)
3200 raise TestFailed('subclass of int should not have a buffer interface')
3201 except TypeError:
3202 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003203
Tim Petersc9933152001-10-16 20:18:24 +00003204def str_of_str_subclass():
3205 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003206 import io
Tim Petersc9933152001-10-16 20:18:24 +00003207
3208 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003209 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003210
3211 class octetstring(str):
3212 def __str__(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +00003213 return binascii.b2a_hex(self).decode("ascii")
Tim Petersc9933152001-10-16 20:18:24 +00003214 def __repr__(self):
3215 return self + " repr"
3216
3217 o = octetstring('A')
3218 vereq(type(o), octetstring)
3219 vereq(type(str(o)), str)
3220 vereq(type(repr(o)), str)
3221 vereq(ord(o), 0x41)
3222 vereq(str(o), '41')
3223 vereq(repr(o), 'A repr')
3224 vereq(o.__str__(), '41')
3225 vereq(o.__repr__(), 'A repr')
3226
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003227 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003228 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003229 print(o, file=capture)
3230 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003231 vereq(capture.getvalue(), '41\n41\n')
3232 capture.close()
3233
Guido van Rossumc8e56452001-10-22 00:43:43 +00003234def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003235 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003236 def f(a): return a
3237 vereq(f.__call__(a=42), 42)
3238 a = []
3239 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003240 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003241
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003242def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003243 if verbose: print(("Testing recursive __call__() by setting to instance of "
3244 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003245 class A(object):
3246 pass
3247
3248 A.__call__ = A()
3249 try:
3250 A()()
3251 except RuntimeError:
3252 pass
3253 else:
3254 raise TestFailed("Recursion limit should have been reached for "
3255 "__call__()")
3256
Guido van Rossumed87ad82001-10-30 02:33:02 +00003257def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003258 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003259 log = []
3260 class C(object):
3261 def __del__(self):
3262 log.append(1)
3263 c = C()
3264 vereq(log, [])
3265 del c
3266 vereq(log, [1])
3267
Guido van Rossum29d26062001-12-11 04:37:34 +00003268 class D(object): pass
3269 d = D()
3270 try: del d[0]
3271 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003272 else: raise TestFailed("invalid del() didn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003273
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003274def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003275 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003276
3277 class mydict(dict):
3278 pass
3279 d = mydict()
3280 try:
3281 hash(d)
3282 except TypeError:
3283 pass
3284 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003285 raise TestFailed("hash() of dict subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003286
3287 class mylist(list):
3288 pass
3289 d = mylist()
3290 try:
3291 hash(d)
3292 except TypeError:
3293 pass
3294 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003295 raise TestFailed("hash() of list subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003296
Guido van Rossum29d26062001-12-11 04:37:34 +00003297def strops():
3298 try: 'a' + 5
3299 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003300 else: raise TestFailed("'' + 5 doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003301
3302 try: ''.split('')
3303 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003304 else: raise TestFailed("''.split('') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003305
Guido van Rossum29d26062001-12-11 04:37:34 +00003306 try: ''.rindex('5')
3307 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003308 else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003309
Guido van Rossum29d26062001-12-11 04:37:34 +00003310 try: '%(n)s' % None
3311 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003312 else: raise TestFailed("'%(n)s' % None doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003313
3314 try: '%(n' % {}
3315 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003316 else: raise TestFailed("'%(n' % {} '' doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003317
3318 try: '%*s' % ('abc')
3319 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003320 else: raise TestFailed("'%*s' % ('abc') doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003321
3322 try: '%*.*s' % ('abc', 5)
3323 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003324 else: raise TestFailed("'%*.*s' % ('abc', 5) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003325
3326 try: '%s' % (1, 2)
3327 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003328 else: raise TestFailed("'%s' % (1, 2) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003329
3330 try: '%' % None
3331 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003332 else: raise TestFailed("'%' % None doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003333
3334 vereq('534253'.isdigit(), 1)
3335 vereq('534253x'.isdigit(), 0)
3336 vereq('%c' % 5, '\x05')
3337 vereq('%c' % '5', '5')
3338
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003339def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003340 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003341 class Node:
3342 pass
3343 a = Node()
3344 b = Node()
3345 a.b = b
3346 b.a = a
3347 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003348
Guido van Rossumd7035672002-03-12 20:43:31 +00003349def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003350 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003351 from types import ModuleType as M
3352 m = M.__new__(M)
3353 str(m)
3354 vereq(hasattr(m, "__name__"), 0)
3355 vereq(hasattr(m, "__file__"), 0)
3356 vereq(hasattr(m, "foo"), 0)
3357 vereq(m.__dict__, None)
3358 m.foo = 1
3359 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003360
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003361def dictproxyiterkeys():
3362 class C(object):
3363 def meth(self):
3364 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003365 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003366 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003367 keys.sort()
3368 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3369
3370def dictproxyitervalues():
3371 class C(object):
3372 def meth(self):
3373 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003374 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003375 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003376 vereq(len(values), 5)
3377
3378def dictproxyiteritems():
3379 class C(object):
3380 def meth(self):
3381 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003382 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003383 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003384 keys.sort()
3385 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3386
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003387def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003388 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003389 class C(object):
3390 def __new__(cls, arg):
3391 if isinstance(arg, str): return [1, 2, 3]
3392 elif isinstance(arg, int): return object.__new__(D)
3393 else: return object.__new__(cls)
3394 class D(C):
3395 def __init__(self, arg):
3396 self.foo = arg
3397 vereq(C("1"), [1, 2, 3])
3398 vereq(D("1"), [1, 2, 3])
3399 d = D(None)
3400 veris(d.foo, None)
3401 d = C(1)
3402 vereq(isinstance(d, D), True)
3403 vereq(d.foo, 1)
3404 d = D(1)
3405 vereq(isinstance(d, D), True)
3406 vereq(d.foo, 1)
3407
Guido van Rossume8fc6402002-04-16 16:44:51 +00003408def imulbug():
3409 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003410 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003411 class C(object):
3412 def __imul__(self, other):
3413 return (self, other)
3414 x = C()
3415 y = x
3416 y *= 1.0
3417 vereq(y, (x, 1.0))
3418 y = x
3419 y *= 2
3420 vereq(y, (x, 2))
3421 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003422 y *= 3
3423 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003424 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003425 y *= 1<<100
3426 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003427 y = x
3428 y *= None
3429 vereq(y, (x, None))
3430 y = x
3431 y *= "foo"
3432 vereq(y, (x, "foo"))
3433
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003434def docdescriptor():
3435 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003436 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003437 class DocDescr(object):
3438 def __get__(self, object, otype):
3439 if object:
3440 object = object.__class__.__name__ + ' instance'
3441 if otype:
3442 otype = otype.__name__
3443 return 'object=%s; type=%s' % (object, otype)
3444 class OldClass:
3445 __doc__ = DocDescr()
3446 class NewClass(object):
3447 __doc__ = DocDescr()
3448 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3449 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3450 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3451 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3452
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003453def copy_setstate():
3454 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003455 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003456 import copy
3457 class C(object):
3458 def __init__(self, foo=None):
3459 self.foo = foo
3460 self.__foo = foo
3461 def setfoo(self, foo=None):
3462 self.foo = foo
3463 def getfoo(self):
3464 return self.__foo
3465 def __getstate__(self):
3466 return [self.foo]
3467 def __setstate__(self, lst):
3468 assert len(lst) == 1
3469 self.__foo = self.foo = lst[0]
3470 a = C(42)
3471 a.setfoo(24)
3472 vereq(a.foo, 24)
3473 vereq(a.getfoo(), 42)
3474 b = copy.copy(a)
3475 vereq(b.foo, 24)
3476 vereq(b.getfoo(), 24)
3477 b = copy.deepcopy(a)
3478 vereq(b.foo, 24)
3479 vereq(b.getfoo(), 24)
3480
Guido van Rossum09638c12002-06-13 19:17:46 +00003481def slices():
3482 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003483 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003484 # Strings
3485 vereq("hello"[:4], "hell")
3486 vereq("hello"[slice(4)], "hell")
3487 vereq(str.__getitem__("hello", slice(4)), "hell")
3488 class S(str):
3489 def __getitem__(self, x):
3490 return str.__getitem__(self, x)
3491 vereq(S("hello")[:4], "hell")
3492 vereq(S("hello")[slice(4)], "hell")
3493 vereq(S("hello").__getitem__(slice(4)), "hell")
3494 # Tuples
3495 vereq((1,2,3)[:2], (1,2))
3496 vereq((1,2,3)[slice(2)], (1,2))
3497 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3498 class T(tuple):
3499 def __getitem__(self, x):
3500 return tuple.__getitem__(self, x)
3501 vereq(T((1,2,3))[:2], (1,2))
3502 vereq(T((1,2,3))[slice(2)], (1,2))
3503 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3504 # Lists
3505 vereq([1,2,3][:2], [1,2])
3506 vereq([1,2,3][slice(2)], [1,2])
3507 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3508 class L(list):
3509 def __getitem__(self, x):
3510 return list.__getitem__(self, x)
3511 vereq(L([1,2,3])[:2], [1,2])
3512 vereq(L([1,2,3])[slice(2)], [1,2])
3513 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3514 # Now do lists and __setitem__
3515 a = L([1,2,3])
3516 a[slice(1, 3)] = [3,2]
3517 vereq(a, [1,3,2])
3518 a[slice(0, 2, 1)] = [3,1]
3519 vereq(a, [3,1,2])
3520 a.__setitem__(slice(1, 3), [2,1])
3521 vereq(a, [3,2,1])
3522 a.__setitem__(slice(0, 2, 1), [2,3])
3523 vereq(a, [2,3,1])
3524
Tim Peters2484aae2002-07-11 06:56:07 +00003525def subtype_resurrection():
3526 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003527 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003528
3529 class C(object):
3530 container = []
3531
3532 def __del__(self):
3533 # resurrect the instance
3534 C.container.append(self)
3535
3536 c = C()
3537 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003538 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003539 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003540 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003541
3542 # If that didn't blow up, it's also interesting to see whether clearing
3543 # the last container slot works: that will attempt to delete c again,
3544 # which will cause c to get appended back to the container again "during"
3545 # the del.
3546 del C.container[-1]
3547 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003548 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003549
Tim Peters14cb1e12002-07-11 18:26:21 +00003550 # Make c mortal again, so that the test framework with -l doesn't report
3551 # it as a leak.
3552 del C.__del__
3553
Guido van Rossum2d702462002-08-06 21:28:28 +00003554def slottrash():
3555 # Deallocating deeply nested slotted trash caused stack overflows
3556 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003557 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003558 class trash(object):
3559 __slots__ = ['x']
3560 def __init__(self, x):
3561 self.x = x
3562 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003563 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003564 o = trash(o)
3565 del o
3566
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003567def slotmultipleinheritance():
3568 # SF bug 575229, multiple inheritance w/ slots dumps core
3569 class A(object):
3570 __slots__=()
3571 class B(object):
3572 pass
3573 class C(A,B) :
3574 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003575 vereq(C.__basicsize__, B.__basicsize__)
3576 verify(hasattr(C, '__dict__'))
3577 verify(hasattr(C, '__weakref__'))
3578 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003579
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003580def testrmul():
3581 # SF patch 592646
3582 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003583 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003584 class C(object):
3585 def __mul__(self, other):
3586 return "mul"
3587 def __rmul__(self, other):
3588 return "rmul"
3589 a = C()
3590 vereq(a*2, "mul")
3591 vereq(a*2.2, "mul")
3592 vereq(2*a, "rmul")
3593 vereq(2.2*a, "rmul")
3594
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003595def testipow():
3596 # [SF bug 620179]
3597 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003598 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003599 class C(object):
3600 def __ipow__(self, other):
3601 pass
3602 a = C()
3603 a **= 2
3604
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003605def do_this_first():
3606 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003607 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003608 # This dumps core when SF bug 551412 isn't fixed --
3609 # but only when test_descr.py is run separately.
3610 # (That can't be helped -- as soon as PyType_Ready()
3611 # is called for PyLong_Type, the bug is gone.)
3612 class UserLong(object):
3613 def __pow__(self, *args):
3614 pass
3615 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003616 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003617 except:
3618 pass
3619
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003620 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003621 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003622 # Another segfault only when run early
3623 # (before PyType_Ready(tuple) is called)
3624 type.mro(tuple)
3625
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003626def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003627 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003628 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003629 # stuff that should work:
3630 class C(object):
3631 pass
3632 class C2(object):
3633 def __getattribute__(self, attr):
3634 if attr == 'a':
3635 return 2
3636 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003637 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003638 def meth(self):
3639 return 1
3640 class D(C):
3641 pass
3642 class E(D):
3643 pass
3644 d = D()
3645 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003646 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003647 D.__bases__ = (C2,)
3648 vereq(d.meth(), 1)
3649 vereq(e.meth(), 1)
3650 vereq(d.a, 2)
3651 vereq(e.a, 2)
3652 vereq(C2.__subclasses__(), [D])
3653
3654 # stuff that shouldn't:
3655 class L(list):
3656 pass
3657
3658 try:
3659 L.__bases__ = (dict,)
3660 except TypeError:
3661 pass
3662 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003663 raise TestFailed("shouldn't turn list subclass into dict subclass")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003664
3665 try:
3666 list.__bases__ = (dict,)
3667 except TypeError:
3668 pass
3669 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003670 raise TestFailed("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003671
3672 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003673 D.__bases__ = (C2, list)
3674 except TypeError:
3675 pass
3676 else:
3677 assert 0, "best_base calculation found wanting"
3678
3679 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003680 del D.__bases__
3681 except TypeError:
3682 pass
3683 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003684 raise TestFailed("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003685
3686 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003687 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003688 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003689 if str(msg) == "a new-style class can't have only classic bases":
Collin Winter3add4d72007-08-29 23:37:32 +00003690 raise TestFailed("wrong error message for .__bases__ = ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003691 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003692 raise TestFailed("shouldn't be able to set .__bases__ to ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003693
3694 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003695 D.__bases__ = (D,)
3696 except TypeError:
3697 pass
3698 else:
3699 # actually, we'll have crashed by here...
Collin Winter3add4d72007-08-29 23:37:32 +00003700 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003701
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003702 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003703 D.__bases__ = (C, C)
3704 except TypeError:
3705 pass
3706 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003707 raise TestFailed("didn't detect repeated base classes")
Michael W. Hudsone723e452003-08-07 14:58:10 +00003708
3709 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003710 D.__bases__ = (E,)
3711 except TypeError:
3712 pass
3713 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003714 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003715
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003716def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003717 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003718 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003719 class WorkOnce(type):
3720 def __new__(self, name, bases, ns):
3721 self.flag = 0
3722 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3723 def mro(self):
3724 if self.flag > 0:
Collin Winter3add4d72007-08-29 23:37:32 +00003725 raise RuntimeError("bozo")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003726 else:
3727 self.flag += 1
3728 return type.mro(self)
3729
3730 class WorkAlways(type):
3731 def mro(self):
3732 # this is here to make sure that .mro()s aren't called
3733 # with an exception set (which was possible at one point).
3734 # An error message will be printed in a debug build.
3735 # What's a good way to test for this?
3736 return type.mro(self)
3737
3738 class C(object):
3739 pass
3740
3741 class C2(object):
3742 pass
3743
3744 class D(C):
3745 pass
3746
3747 class E(D):
3748 pass
3749
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003750 class F(D, metaclass=WorkOnce):
3751 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003752
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003753 class G(D, metaclass=WorkAlways):
3754 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003755
3756 # Immediate subclasses have their mro's adjusted in alphabetical
3757 # order, so E's will get adjusted before adjusting F's fails. We
3758 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003759
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003760 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003761 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003762
3763 try:
3764 D.__bases__ = (C2,)
3765 except RuntimeError:
3766 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003767 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003768 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003769 raise TestFailed("exception not propagated")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003770
3771def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003772 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003773 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003774 class A(object):
3775 pass
3776
3777 class B(object):
3778 pass
3779
3780 class C(A, B):
3781 pass
3782
3783 class D(A, B):
3784 pass
3785
3786 class E(C, D):
3787 pass
3788
3789 try:
3790 C.__bases__ = (B, A)
3791 except TypeError:
3792 pass
3793 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003794 raise TestFailed("didn't catch MRO conflict")
Tim Peters6578dc92002-12-24 18:31:27 +00003795
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003796def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003797 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003798 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003799 class C(object):
3800 pass
3801
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003802 # C.__module__ could be 'test_descr' or '__main__'
3803 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003804
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003805 C.__name__ = 'D'
3806 vereq((C.__module__, C.__name__), (mod, 'D'))
3807
3808 C.__name__ = 'D.E'
3809 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003810
Guido van Rossum613f24f2003-01-06 23:00:59 +00003811def subclass_right_op():
3812 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003813 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003814
3815 # This code tests various cases where right-dispatch of a subclass
3816 # should be preferred over left-dispatch of a base class.
3817
3818 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3819
3820 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003821 def __floordiv__(self, other):
3822 return "B.__floordiv__"
3823 def __rfloordiv__(self, other):
3824 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003825
Guido van Rossumf389c772003-02-27 20:04:19 +00003826 vereq(B(1) // 1, "B.__floordiv__")
3827 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003828
3829 # Case 2: subclass of object; this is just the baseline for case 3
3830
3831 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003832 def __floordiv__(self, other):
3833 return "C.__floordiv__"
3834 def __rfloordiv__(self, other):
3835 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003836
Guido van Rossumf389c772003-02-27 20:04:19 +00003837 vereq(C() // 1, "C.__floordiv__")
3838 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003839
3840 # Case 3: subclass of new-style class; here it gets interesting
3841
3842 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003843 def __floordiv__(self, other):
3844 return "D.__floordiv__"
3845 def __rfloordiv__(self, other):
3846 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003847
Guido van Rossumf389c772003-02-27 20:04:19 +00003848 vereq(D() // C(), "D.__floordiv__")
3849 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003850
3851 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3852
3853 class E(C):
3854 pass
3855
Guido van Rossumf389c772003-02-27 20:04:19 +00003856 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003857
Guido van Rossumf389c772003-02-27 20:04:19 +00003858 vereq(E() // 1, "C.__floordiv__")
3859 vereq(1 // E(), "C.__rfloordiv__")
3860 vereq(E() // C(), "C.__floordiv__")
3861 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003862
Guido van Rossum373c7412003-01-07 13:41:37 +00003863def dict_type_with_metaclass():
3864 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003865 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003866
3867 class B(object):
3868 pass
3869 class M(type):
3870 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003871 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003872 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003873 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003874 veris(type(C.__dict__), type(B.__dict__))
3875
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003876def meth_class_get():
3877 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003878 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003879 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003880 # Baseline
3881 arg = [1, 2, 3]
3882 res = {1: None, 2: None, 3: None}
3883 vereq(dict.fromkeys(arg), res)
3884 vereq({}.fromkeys(arg), res)
3885 # Now get the descriptor
3886 descr = dict.__dict__["fromkeys"]
3887 # More baseline using the descriptor directly
3888 vereq(descr.__get__(None, dict)(arg), res)
3889 vereq(descr.__get__({})(arg), res)
3890 # Now check various error cases
3891 try:
3892 descr.__get__(None, None)
3893 except TypeError:
3894 pass
3895 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003896 raise TestFailed("shouldn't have allowed descr.__get__(None, None)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003897 try:
3898 descr.__get__(42)
3899 except TypeError:
3900 pass
3901 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003902 raise TestFailed("shouldn't have allowed descr.__get__(42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003903 try:
3904 descr.__get__(None, 42)
3905 except TypeError:
3906 pass
3907 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003908 raise TestFailed("shouldn't have allowed descr.__get__(None, 42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003909 try:
3910 descr.__get__(None, int)
3911 except TypeError:
3912 pass
3913 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003914 raise TestFailed("shouldn't have allowed descr.__get__(None, int)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003915
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003916def isinst_isclass():
3917 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003918 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003919 class Proxy(object):
3920 def __init__(self, obj):
3921 self.__obj = obj
3922 def __getattribute__(self, name):
3923 if name.startswith("_Proxy__"):
3924 return object.__getattribute__(self, name)
3925 else:
3926 return getattr(self.__obj, name)
3927 # Test with a classic class
3928 class C:
3929 pass
3930 a = C()
3931 pa = Proxy(a)
3932 verify(isinstance(a, C)) # Baseline
3933 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003934 # Test with a classic subclass
3935 class D(C):
3936 pass
3937 a = D()
3938 pa = Proxy(a)
3939 verify(isinstance(a, C)) # Baseline
3940 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003941 # Test with a new-style class
3942 class C(object):
3943 pass
3944 a = C()
3945 pa = Proxy(a)
3946 verify(isinstance(a, C)) # Baseline
3947 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003948 # Test with a new-style subclass
3949 class D(C):
3950 pass
3951 a = D()
3952 pa = Proxy(a)
3953 verify(isinstance(a, C)) # Baseline
3954 verify(isinstance(pa, C)) # Test
3955
3956def proxysuper():
3957 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003958 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003959 class Proxy(object):
3960 def __init__(self, obj):
3961 self.__obj = obj
3962 def __getattribute__(self, name):
3963 if name.startswith("_Proxy__"):
3964 return object.__getattribute__(self, name)
3965 else:
3966 return getattr(self.__obj, name)
3967
3968 class B(object):
3969 def f(self):
3970 return "B.f"
3971
3972 class C(B):
3973 def f(self):
3974 return super(C, self).f() + "->C.f"
3975
3976 obj = C()
3977 p = Proxy(obj)
3978 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003979
Guido van Rossum52b27052003-04-15 20:05:10 +00003980def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003981 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003982 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003983 try:
3984 object.__setattr__(str, "foo", 42)
3985 except TypeError:
3986 pass
3987 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003988 raise TestFailed("Carlo Verre __setattr__ suceeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003989 try:
3990 object.__delattr__(str, "lower")
3991 except TypeError:
3992 pass
3993 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003994 raise TestFailed("Carlo Verre __delattr__ succeeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003995
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003996def weakref_segfault():
3997 # SF 742911
3998 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003999 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004000
4001 import weakref
4002
4003 class Provoker:
4004 def __init__(self, referrent):
4005 self.ref = weakref.ref(referrent)
4006
4007 def __del__(self):
4008 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004009
4010 class Oops(object):
4011 pass
4012
4013 o = Oops()
4014 o.whatever = Provoker(o)
4015 del o
4016
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004017def wrapper_segfault():
4018 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004019 if verbose:
4020 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004021 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00004022 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004023 f = f.__call__
4024 f = None
4025
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004026# Fix SF #762455, segfault when sys.stdout is changed in getattr
4027def filefault():
4028 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004029 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004030 import sys
4031 class StdoutGuard:
4032 def __getattr__(self, attr):
4033 sys.stdout = sys.__stdout__
4034 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4035 sys.stdout = StdoutGuard()
4036 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004037 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004038 except RuntimeError:
4039 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004040
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004041def vicious_descriptor_nonsense():
4042 # A potential segfault spotted by Thomas Wouters in mail to
4043 # python-dev 2003-04-17, turned into an example & fixed by Michael
4044 # Hudson just less than four months later...
4045 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004046 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004047
4048 class Evil(object):
4049 def __hash__(self):
4050 return hash('attr')
4051 def __eq__(self, other):
4052 del C.attr
4053 return 0
4054
4055 class Descr(object):
4056 def __get__(self, ob, type=None):
4057 return 1
4058
4059 class C(object):
4060 attr = Descr()
4061
4062 c = C()
4063 c.__dict__[Evil()] = 0
4064
4065 vereq(c.attr, 1)
4066 # this makes a crash more likely:
4067 import gc; gc.collect()
4068 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004069
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004070def test_init():
4071 # SF 1155938
4072 class Foo(object):
4073 def __init__(self):
4074 return 10
4075 try:
4076 Foo()
4077 except TypeError:
4078 pass
4079 else:
Collin Winter3add4d72007-08-29 23:37:32 +00004080 raise TestFailed("did not test __init__() for None return")
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004081
Armin Rigoc6686b72005-11-07 08:38:00 +00004082def methodwrapper():
4083 # <type 'method-wrapper'> did not support any reflection before 2.5
4084 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004085 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004086
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004087 return # XXX should methods really support __eq__?
4088
Armin Rigoc6686b72005-11-07 08:38:00 +00004089 l = []
4090 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004091 vereq(l.__add__, [].__add__)
4092 verify(l.__add__ != [5].__add__)
4093 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004094 verify(l.__add__.__name__ == '__add__')
4095 verify(l.__add__.__self__ is l)
4096 verify(l.__add__.__objclass__ is list)
4097 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004098 try:
4099 hash(l.__add__)
4100 except TypeError:
4101 pass
4102 else:
4103 raise TestFailed("no TypeError from hash([].__add__)")
4104
4105 t = ()
4106 t += (7,)
4107 vereq(t.__add__, (7,).__add__)
4108 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004109
Armin Rigofd163f92005-12-29 15:59:19 +00004110def notimplemented():
4111 # all binary methods should be able to return a NotImplemented
4112 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004113 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004114
4115 import sys
4116 import types
4117 import operator
4118
4119 def specialmethod(self, other):
4120 return NotImplemented
4121
4122 def check(expr, x, y):
4123 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004124 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004125 except TypeError:
4126 pass
4127 else:
4128 raise TestFailed("no TypeError from %r" % (expr,))
4129
Guido van Rossume2a383d2007-01-15 16:59:06 +00004130 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004131 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4132 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004133 if 1:
4134 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004135 for name, expr, iexpr in [
4136 ('__add__', 'x + y', 'x += y'),
4137 ('__sub__', 'x - y', 'x -= y'),
4138 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004139 ('__truediv__', 'x / y', None),
4140 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004141 ('__mod__', 'x % y', 'x %= y'),
4142 ('__divmod__', 'divmod(x, y)', None),
4143 ('__pow__', 'x ** y', 'x **= y'),
4144 ('__lshift__', 'x << y', 'x <<= y'),
4145 ('__rshift__', 'x >> y', 'x >>= y'),
4146 ('__and__', 'x & y', 'x &= y'),
4147 ('__or__', 'x | y', 'x |= y'),
4148 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004149 ]:
4150 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004151 A = metaclass('A', (), {name: specialmethod})
4152 B = metaclass('B', (), {rname: specialmethod})
4153 a = A()
4154 b = B()
4155 check(expr, a, a)
4156 check(expr, a, b)
4157 check(expr, b, a)
4158 check(expr, b, b)
4159 check(expr, a, N1)
4160 check(expr, a, N2)
4161 check(expr, N1, b)
4162 check(expr, N2, b)
4163 if iexpr:
4164 check(iexpr, a, a)
4165 check(iexpr, a, b)
4166 check(iexpr, b, a)
4167 check(iexpr, b, b)
4168 check(iexpr, a, N1)
4169 check(iexpr, a, N2)
4170 iname = '__i' + name[2:]
4171 C = metaclass('C', (), {iname: specialmethod})
4172 c = C()
4173 check(iexpr, c, a)
4174 check(iexpr, c, b)
4175 check(iexpr, c, N1)
4176 check(iexpr, c, N2)
4177
Guido van Rossumd8faa362007-04-27 19:54:29 +00004178def test_assign_slice():
4179 # ceval.c's assign_slice used to check for
4180 # tp->tp_as_sequence->sq_slice instead of
4181 # tp->tp_as_sequence->sq_ass_slice
4182
4183 class C(object):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00004184 def __setitem__(self, idx, value):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004185 self.value = value
4186
4187 c = C()
4188 c[1:2] = 3
4189 vereq(c.value, 3)
4190
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004191def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004192 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004193 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004194 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004195 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004196 lists()
4197 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004198 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004199 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004200 ints()
4201 longs()
4202 floats()
4203 complexes()
4204 spamlists()
4205 spamdicts()
4206 pydicts()
4207 pylists()
4208 metaclass()
4209 pymods()
4210 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004211 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004212 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004213 ex5()
4214 monotonicity()
4215 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004216 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004217 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004218 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004219 dynamics()
4220 errors()
4221 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004222 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004223 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004224 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004225 classic()
4226 compattr()
4227 newslot()
4228 altmro()
4229 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004230 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004231 specials()
Thomas Wouters89d996e2007-09-08 17:39:28 +00004232 recursions()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004233 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004234 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004235 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004236 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004237 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004238 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004239 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004240 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004241 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004242 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004243 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004244 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004245 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004246 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004247 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004248 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004249 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004250 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004251 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004252 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004253 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004254 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004255 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004256 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004257 dictproxyiterkeys()
4258 dictproxyitervalues()
4259 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004260 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004261 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004262 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004263 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004264 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004265 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004266 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004267 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004268 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004269 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004270 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004271 test_mutable_bases()
4272 test_mutable_bases_with_failing_mro()
4273 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004274 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004275 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004276 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004277 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004278 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004279 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004280 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004281 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004282 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004283 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004284 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004285 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004286 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004287
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004288 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004289
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004290if __name__ == "__main__":
4291 test_main()