blob: 69400eedfd3d931d91d38946ab31fb9fd6043983 [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
Tim Peters4d9b4662002-04-16 01:59:17 +00006import warnings
Guido van Rossum360e4b82007-05-14 22:51:27 +00007import types
Tim Peters4d9b4662002-04-16 01:59:17 +00008
9warnings.filterwarnings("ignore",
10 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +000011 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000012
Guido van Rossum875eeaa2001-10-11 18:33:53 +000013def veris(a, b):
14 if a is not b:
Collin Winter3add4d72007-08-29 23:37:32 +000015 raise TestFailed("%r is %r" % (a, b))
Guido van Rossum875eeaa2001-10-11 18:33:53 +000016
Tim Peters6d6c1a32001-08-02 04:15:00 +000017def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000018 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000020 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000021 t = type(a)
22 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000023 while meth not in t.__dict__:
24 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000025 vereq(m, t.__dict__[meth])
26 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000028 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000029
30def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000031 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000032 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000033
Guido van Rossum45704552001-10-08 16:35:45 +000034 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000035 t = type(a)
36 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000037 while meth not in t.__dict__:
38 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000039 vereq(m, t.__dict__[meth])
40 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000041 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000042 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043
44def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000045 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000047 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000048 t = type(a)
49 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000050 while meth not in t.__dict__:
51 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000052 vereq(m, t.__dict__[meth])
53 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000055 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000056
57def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000058 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000059 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000060 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000061 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000062 t = type(a)
63 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000064 while meth not in t.__dict__:
65 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000066 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000067 dict['a'] = deepcopy(a)
68 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000069 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000070 dict['a'] = deepcopy(a)
71 bm = getattr(dict['a'], meth)
72 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000073 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000074
75def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000076 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000077 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000078 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000079 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000080 t = type(a)
81 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000082 while meth not in t.__dict__:
83 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000084 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000085 dict['a'] = deepcopy(a)
86 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000087 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000088 dict['a'] = deepcopy(a)
89 bm = getattr(dict['a'], meth)
90 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000091 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000092
93def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000094 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000095 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000096 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000097 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000098 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000099 while meth not in t.__dict__:
100 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000102 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 dict['a'] = deepcopy(a)
104 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000105 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106 dict['a'] = deepcopy(a)
107 bm = getattr(dict['a'], meth)
108 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000109 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000110
Tim Peters2f93e282001-10-04 05:27:00 +0000111def class_docstrings():
112 class Classic:
113 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000114 vereq(Classic.__doc__, "A classic docstring.")
115 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000116
117 class Classic2:
118 pass
119 verify(Classic2.__doc__ is None)
120
Tim Peters4fb1fe82001-10-04 05:48:13 +0000121 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000122 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000123 vereq(NewStatic.__doc__, "Another docstring.")
124 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000125
Tim Peters4fb1fe82001-10-04 05:48:13 +0000126 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000127 pass
128 verify(NewStatic2.__doc__ is None)
129
Tim Peters4fb1fe82001-10-04 05:48:13 +0000130 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000131 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000132 vereq(NewDynamic.__doc__, "Another docstring.")
133 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000134
Tim Peters4fb1fe82001-10-04 05:48:13 +0000135 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000136 pass
137 verify(NewDynamic2.__doc__ is None)
138
Tim Peters6d6c1a32001-08-02 04:15:00 +0000139def lists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000140 if verbose: print("Testing list operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141 testbinop([1], [2], [1,2], "a+b", "__add__")
142 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
143 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
144 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
145 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
146 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
147 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
148 testunop([1,2,3], 3, "len(a)", "__len__")
149 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
150 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
151 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
152 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
153
154def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000155 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000156 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000157 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
158 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
159 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
160 d = {1:2,3:4}
161 l1 = []
162 for i in d.keys(): l1.append(i)
163 l = []
164 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000165 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000166 l = []
167 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000168 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000169 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000170 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000171 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000172 d = {1:2, 3:4}
173 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000174 vereq(eval(repr(d), {}), d)
175 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000176 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
177
Tim Peters25786c02001-09-02 08:22:48 +0000178def dict_constructor():
179 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000180 print("Testing dict constructor ...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000181 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000186 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000187 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000188 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000189 d = dict({'one':1, 'two':2})
190 vereq(d, dict(one=1, two=2))
191 vereq(d, dict(**d))
192 vereq(d, dict({"one": 1}, two=2))
193 vereq(d, dict([("two", 2)], one=1))
194 vereq(d, dict([("one", 100), ("two", 200)], **d))
195 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000196 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000197 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000198 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000199 except TypeError:
200 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000201 except ValueError:
202 if badarg == "0":
203 # It's a sequence, and its elements are also sequences (gotta
204 # love strings <wink>), but they aren't of length 2, so this
205 # one seemed better as a ValueError than a TypeError.
206 pass
207 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000208 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000209 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000210 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000211
212 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000213 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000214 except TypeError:
215 pass
216 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000217 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000218
219 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000220 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000221 dict = {1:2, 3:4, 'a':1j}
222
Tim Peters25786c02001-09-02 08:22:48 +0000223 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000224 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000225 except TypeError:
226 pass
227 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000228 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000229
230 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000231 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000232 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000233 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000234
Tim Peters1fc240e2001-10-26 05:06:50 +0000235 # Init from sequence of iterable objects, each producing a 2-sequence.
236 class AddressBookEntry:
237 def __init__(self, first, last):
238 self.first = first
239 self.last = last
240 def __iter__(self):
241 return iter([self.first, self.last])
242
Tim Petersa427a2b2001-10-29 22:25:45 +0000243 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000244 AddressBookEntry('Barry', 'Peters'),
245 AddressBookEntry('Tim', 'Peters'),
246 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000247 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
248
Tim Petersa427a2b2001-10-29 22:25:45 +0000249 d = dict(zip(range(4), range(1, 5)))
250 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000251
252 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000253 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000254 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000255 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000256 except ValueError:
257 pass
258 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000259 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000260
Tim Peters5d2b77c2001-09-03 05:47:38 +0000261def test_dir():
262 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000263 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000265 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000266 del junk
267
268 # Just make sure these don't blow up!
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000269 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000270 dir(arg)
271
Thomas Wouters0725cf22006-04-15 09:04:57 +0000272 # Test dir on custom classes. Since these have object as a
273 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000274 def interesting(strings):
275 return [s for s in strings if not s.startswith('_')]
276
Tim Peters5d2b77c2001-09-03 05:47:38 +0000277 class C(object):
278 Cdata = 1
279 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000280
281 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000282 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000283
284 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000285 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000286 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000287
288 c.cdata = 2
289 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000290 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000291 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000292
Tim Peters5d2b77c2001-09-03 05:47:38 +0000293 class A(C):
294 Adata = 1
295 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000296
297 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000298 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000299 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000300 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000301 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000302 a.adata = 42
303 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000304 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000305 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000306
Tim Peterscaaff8d2001-09-10 23:12:14 +0000307 # Try a module subclass.
308 import sys
309 class M(type(sys)):
310 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000311 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000312 minstance.b = 2
313 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000314 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
315 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000316
317 class M2(M):
318 def getdict(self):
319 return "Not a dict!"
320 __dict__ = property(getdict)
321
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000322 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000323 m2instance.b = 2
324 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000325 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000326 try:
327 dir(m2instance)
328 except TypeError:
329 pass
330
Tim Peters9e6a3992001-10-30 05:45:26 +0000331 # Two essentially featureless objects, just inheriting stuff from
332 # object.
333 vereq(dir(None), dir(Ellipsis))
334
Guido van Rossum44022412002-05-13 18:29:46 +0000335 # Nasty test case for proxied objects
336 class Wrapper(object):
337 def __init__(self, obj):
338 self.__obj = obj
339 def __repr__(self):
340 return "Wrapper(%s)" % repr(self.__obj)
341 def __getitem__(self, key):
342 return Wrapper(self.__obj[key])
343 def __len__(self):
344 return len(self.__obj)
345 def __getattr__(self, name):
346 return Wrapper(getattr(self.__obj, name))
347
348 class C(object):
349 def __getclass(self):
350 return Wrapper(type(self))
351 __class__ = property(__getclass)
352
353 dir(C()) # This used to segfault
354
Tim Peters6d6c1a32001-08-02 04:15:00 +0000355binops = {
356 'add': '+',
357 'sub': '-',
358 'mul': '*',
359 'div': '/',
360 'mod': '%',
361 'divmod': 'divmod',
362 'pow': '**',
363 'lshift': '<<',
364 'rshift': '>>',
365 'and': '&',
366 'xor': '^',
367 'or': '|',
368 'cmp': 'cmp',
369 'lt': '<',
370 'le': '<=',
371 'eq': '==',
372 'ne': '!=',
373 'gt': '>',
374 'ge': '>=',
375 }
376
377for name, expr in binops.items():
378 if expr.islower():
379 expr = expr + "(a, b)"
380 else:
381 expr = 'a %s b' % expr
382 binops[name] = expr
383
384unops = {
385 'pos': '+',
386 'neg': '-',
387 'abs': 'abs',
388 'invert': '~',
389 'int': 'int',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000390 'float': 'float',
391 'oct': 'oct',
392 'hex': 'hex',
393 }
394
395for name, expr in unops.items():
396 if expr.islower():
397 expr = expr + "(a)"
398 else:
399 expr = '%s a' % expr
400 unops[name] = expr
401
402def numops(a, b, skip=[]):
403 dict = {'a': a, 'b': b}
404 for name, expr in binops.items():
405 if name not in skip:
406 name = "__%s__" % name
407 if hasattr(a, name):
408 res = eval(expr, dict)
409 testbinop(a, b, res, expr, name)
410 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000411 if name not in skip:
412 name = "__%s__" % name
413 if hasattr(a, name):
414 res = eval(expr, dict)
415 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000416
417def ints():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000418 if verbose: print("Testing int operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000419 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000420 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000421 vereq((1).__bool__(), True)
422 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000423 # This returns 'NotImplemented' in Python 2.2
424 class C(int):
425 def __add__(self, other):
426 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000427 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000428 try:
429 C() + ""
430 except TypeError:
431 pass
432 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000433 raise TestFailed("NotImplemented should have caused TypeError")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000434
435def longs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000436 if verbose: print("Testing long operations...")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000437 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000438
439def floats():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000440 if verbose: print("Testing float operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000441 numops(100.0, 3.0)
442
443def complexes():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000444 if verbose: print("Testing complex operations...")
Guido van Rossum4a7fd902007-08-03 21:15:23 +0000445 numops(100.0j, 3.0j,
446 skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float',
447 'divmod', 'mod'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000448 class Number(complex):
449 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000450 def __new__(cls, *args, **kwds):
451 result = complex.__new__(cls, *args)
452 result.prec = kwds.get('prec', 12)
453 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000454 def __repr__(self):
455 prec = self.prec
456 if self.imag == 0.0:
457 return "%.*g" % (prec, self.real)
458 if self.real == 0.0:
459 return "%.*gj" % (prec, self.imag)
460 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
461 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000462
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000464 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000465 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000466
Tim Peters3f996e72001-09-13 19:18:27 +0000467 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000468 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000469 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000470
471 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000472 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000473 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000474
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475def spamlists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000476 if verbose: print("Testing spamlist operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000477 import copy, xxsubtype as spam
478 def spamlist(l, memo=None):
479 import xxsubtype as spam
480 return spam.spamlist(l)
481 # This is an ugly hack:
482 copy._deepcopy_dispatch[spam.spamlist] = spamlist
483
484 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
485 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
486 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
487 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
488 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
489 "a[b:c]", "__getslice__")
490 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
491 "a+=b", "__iadd__")
492 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
493 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
494 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
495 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
496 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
497 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
498 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
499 # Test subclassing
500 class C(spam.spamlist):
501 def foo(self): return 1
502 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000503 vereq(a, [])
504 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000505 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000506 vereq(a, [100])
507 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000508 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000509 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000510
511def spamdicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000512 if verbose: print("Testing spamdict operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000513 import copy, xxsubtype as spam
514 def spamdict(d, memo=None):
515 import xxsubtype as spam
516 sd = spam.spamdict()
517 for k, v in d.items(): sd[k] = v
518 return sd
519 # This is an ugly hack:
520 copy._deepcopy_dispatch[spam.spamdict] = spamdict
521
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000522 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000523 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
524 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
525 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
526 d = spamdict({1:2,3:4})
527 l1 = []
528 for i in d.keys(): l1.append(i)
529 l = []
530 for i in iter(d): 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 d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000534 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000535 l = []
536 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000537 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000538 straightd = {1:2, 3:4}
539 spamd = spamdict(straightd)
540 testunop(spamd, 2, "len(a)", "__len__")
541 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
542 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
543 "a[b]=c", "__setitem__")
544 # Test subclassing
545 class C(spam.spamdict):
546 def foo(self): return 1
547 a = C()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000548 vereq(list(a.items()), [])
Guido van Rossum45704552001-10-08 16:35:45 +0000549 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000550 a['foo'] = 'bar'
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000551 vereq(list(a.items()), [('foo', 'bar')])
Guido van Rossum45704552001-10-08 16:35:45 +0000552 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000553 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000554 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000555
556def pydicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000557 if verbose: print("Testing Python subclass of dict...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000558 verify(issubclass(dict, dict))
559 verify(isinstance({}, dict))
560 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000561 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000562 verify(d.__class__ is dict)
563 verify(isinstance(d, dict))
564 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565 state = -1
566 def __init__(self, *a, **kw):
567 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000568 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000569 self.state = a[0]
570 if kw:
571 for k, v in kw.items(): self[v] = k
572 def __getitem__(self, key):
573 return self.get(key, 0)
574 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000575 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000576 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 def setstate(self, state):
578 self.state = state
579 def getstate(self):
580 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000581 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000584 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000585 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000586 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000587 vereq(a.state, -1)
588 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a.state, 0)
591 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a.state, 10)
594 vereq(a.getstate(), 10)
595 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000597 vereq(a[42], 24)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000598 if verbose: print("pydict stress test ...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000599 N = 50
600 for i in range(N):
601 a[i] = C()
602 for j in range(N):
603 a[i][j] = i*j
604 for i in range(N):
605 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000606 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000607
608def pylists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000609 if verbose: print("Testing Python subclass of list...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000610 class C(list):
611 def __getitem__(self, i):
612 return list.__getitem__(self, i) + 100
613 def __getslice__(self, i, j):
614 return (i, j)
615 a = C()
616 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000617 vereq(a[0], 100)
618 vereq(a[1], 101)
619 vereq(a[2], 102)
620 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621
622def metaclass():
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000623 if verbose: print("Testing metaclass...")
624 class C(metaclass=type):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000625 def __init__(self):
626 self.__state = 0
627 def getstate(self):
628 return self.__state
629 def setstate(self, state):
630 self.__state = state
631 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000632 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000633 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000634 vereq(a.getstate(), 10)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000635 class _metaclass(type):
636 def myself(cls): return cls
637 class D(metaclass=_metaclass):
638 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000639 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000640 d = D()
641 verify(d.__class__ is D)
642 class M1(type):
643 def __new__(cls, name, bases, dict):
644 dict['__spam__'] = 1
645 return type.__new__(cls, name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000646 class C(metaclass=M1):
647 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000648 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000649 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000650 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000651
Guido van Rossum309b5662001-08-17 11:43:17 +0000652 class _instance(object):
653 pass
654 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000655 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000656 def __new__(cls, name, bases, dict):
657 self = object.__new__(cls)
658 self.name = name
659 self.bases = bases
660 self.dict = dict
661 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000662 def __call__(self):
663 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000664 # Early binding of methods
665 for key in self.dict:
666 if key.startswith("__"):
667 continue
668 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000669 return it
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000670 class C(metaclass=M2):
Guido van Rossum309b5662001-08-17 11:43:17 +0000671 def spam(self):
672 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000673 vereq(C.name, 'C')
674 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000675 verify('spam' in C.dict)
676 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000677 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000678
Guido van Rossum91ee7982001-08-30 20:52:40 +0000679 # More metaclass examples
680
681 class autosuper(type):
682 # Automatically add __super to the class
683 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000684 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000685 cls = super(autosuper, metaclass).__new__(metaclass,
686 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000687 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000688 while name[:1] == "_":
689 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000690 if name:
691 name = "_%s__super" % name
692 else:
693 name = "__super"
694 setattr(cls, name, super(cls))
695 return cls
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000696 class A(metaclass=autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000697 def meth(self):
698 return "A"
699 class B(A):
700 def meth(self):
701 return "B" + self.__super.meth()
702 class C(A):
703 def meth(self):
704 return "C" + self.__super.meth()
705 class D(C, B):
706 def meth(self):
707 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000708 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000709 class E(B, C):
710 def meth(self):
711 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000712 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000713
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000714 class autoproperty(type):
715 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000716 # named _get_x and/or _set_x are found
717 def __new__(metaclass, name, bases, dict):
718 hits = {}
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000719 for key, val in dict.items():
Guido van Rossum91ee7982001-08-30 20:52:40 +0000720 if key.startswith("_get_"):
721 key = key[5:]
722 get, set = hits.get(key, (None, None))
723 get = val
724 hits[key] = get, set
725 elif key.startswith("_set_"):
726 key = key[5:]
727 get, set = hits.get(key, (None, None))
728 set = val
729 hits[key] = get, set
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000730 for key, (get, set) in hits.items():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000731 dict[key] = property(get, set)
732 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000733 name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000734 class A(metaclass=autoproperty):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000735 def _get_x(self):
736 return -self.__x
737 def _set_x(self, x):
738 self.__x = -x
739 a = A()
740 verify(not hasattr(a, "x"))
741 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000742 vereq(a.x, 12)
743 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000744
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000745 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000746 # Merge of multiple cooperating metaclasses
747 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000748 class A(metaclass=multimetaclass):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000749 def _get_x(self):
750 return "A"
751 class B(A):
752 def _get_x(self):
753 return "B" + self.__super._get_x()
754 class C(A):
755 def _get_x(self):
756 return "C" + self.__super._get_x()
757 class D(C, B):
758 def _get_x(self):
759 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000760 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000761
Guido van Rossumf76de622001-10-18 15:49:21 +0000762 # Make sure type(x) doesn't call x.__class__.__init__
763 class T(type):
764 counter = 0
765 def __init__(self, *args):
766 T.counter += 1
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000767 class C(metaclass=T):
768 pass
Guido van Rossumf76de622001-10-18 15:49:21 +0000769 vereq(T.counter, 1)
770 a = C()
771 vereq(type(a), C)
772 vereq(T.counter, 1)
773
Guido van Rossum29d26062001-12-11 04:37:34 +0000774 class C(object): pass
775 c = C()
776 try: c()
777 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +0000778 else: raise TestFailed("calling object w/o call method should raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +0000779
Guido van Rossumd8faa362007-04-27 19:54:29 +0000780 # Testing code to find most derived baseclass
781 class A(type):
782 def __new__(*args, **kwargs):
783 return type.__new__(*args, **kwargs)
784
785 class B(object):
786 pass
787
788 class C(object, metaclass=A):
789 pass
790
791 # The most derived metaclass of D is A rather than type.
792 class D(B, C):
793 pass
794
795
Tim Peters6d6c1a32001-08-02 04:15:00 +0000796def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000797 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000799 import sys
800 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000802 def __init__(self, name):
803 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000804 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000805 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000806 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 def __setattr__(self, name, value):
808 log.append(("setattr", name, value))
809 MT.__setattr__(self, name, value)
810 def __delattr__(self, name):
811 log.append(("delattr", name))
812 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000813 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814 a.foo = 12
815 x = a.foo
816 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000817 vereq(log, [("setattr", "foo", 12),
818 ("getattr", "foo"),
819 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000820
Guido van Rossum360e4b82007-05-14 22:51:27 +0000821 # http://python.org/sf/1174712
822 try:
823 class Module(types.ModuleType, str):
824 pass
825 except TypeError:
826 pass
827 else:
828 raise TestFailed("inheriting from ModuleType and str at the "
829 "same time should fail")
830
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000832 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000833 class C(object):
834 def __init__(self):
835 self.__state = 0
836 def getstate(self):
837 return self.__state
838 def setstate(self, state):
839 self.__state = state
840 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000841 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000843 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000844 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000845 def __init__(self):
846 type({}).__init__(self)
847 C.__init__(self)
848 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000849 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000851 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000852 vereq(d["hello"], "world")
853 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000854 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000855 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000856 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000857
Guido van Rossume45763a2001-08-10 21:28:46 +0000858 # SF bug #442833
859 class Node(object):
860 def __int__(self):
861 return int(self.foo())
862 def foo(self):
863 return "23"
864 class Frag(Node, list):
865 def foo(self):
866 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000867 vereq(Node().__int__(), 23)
868 vereq(int(Node()), 23)
869 vereq(Frag().__int__(), 42)
870 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000871
Tim Peters6d6c1a32001-08-02 04:15:00 +0000872def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000873 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000874 class A(object):
875 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000876 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000877 class B(A):
878 def boo(self): return "B"
879 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000880 vereq(B().spam(), "B")
881 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000882 class C(A):
883 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000884 vereq(C().spam(), "A")
885 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000886 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000887 vereq(D().spam(), "B")
888 vereq(D().boo(), "B")
889 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000890 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000891 vereq(E().spam(), "B")
892 vereq(E().boo(), "C")
893 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000894 # MRO order disagreement
895 try:
896 class F(D, E): pass
897 except TypeError:
898 pass
899 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000900 raise TestFailed("expected MRO order disagreement (F)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000901 try:
902 class G(E, D): pass
903 except TypeError:
904 pass
905 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000906 raise TestFailed("expected MRO order disagreement (G)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000907
908
909# see thread python-dev/2002-October/029035.html
910def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000911 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000912 class A(object): pass
913 class B(object): pass
914 class C(object): pass
915 class X(A): pass
916 class Y(A): pass
917 class Z(X,B,Y,C): pass
918 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
919
920# see "A Monotonic Superclass Linearization for Dylan",
921# by Kim Barrett et al. (OOPSLA 1996)
922def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000923 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000924 class Boat(object): pass
925 class DayBoat(Boat): pass
926 class WheelBoat(Boat): pass
927 class EngineLess(DayBoat): pass
928 class SmallMultihull(DayBoat): pass
929 class PedalWheelBoat(EngineLess,WheelBoat): pass
930 class SmallCatamaran(SmallMultihull): pass
931 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
932
933 vereq(PedalWheelBoat.__mro__,
934 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
935 object))
936 vereq(SmallCatamaran.__mro__,
937 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
938
939 vereq(Pedalo.__mro__,
940 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
941 SmallMultihull, DayBoat, WheelBoat, Boat, object))
942
943# see "A Monotonic Superclass Linearization for Dylan",
944# by Kim Barrett et al. (OOPSLA 1996)
945def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000946 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000947 class Pane(object): pass
948 class ScrollingMixin(object): pass
949 class EditingMixin(object): pass
950 class ScrollablePane(Pane,ScrollingMixin): pass
951 class EditablePane(Pane,EditingMixin): pass
952 class EditableScrollablePane(ScrollablePane,EditablePane): pass
953
954 vereq(EditableScrollablePane.__mro__,
955 (EditableScrollablePane, ScrollablePane, EditablePane,
956 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957
Raymond Hettingerf394df42003-04-06 19:13:41 +0000958mro_err_msg = """Cannot create a consistent method resolution
959order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000960
Guido van Rossumd32047f2002-11-25 21:38:52 +0000961def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000962 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000963 def raises(exc, expected, callable, *args):
964 try:
965 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000966 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000967 if not str(msg).startswith(expected):
Collin Winter3add4d72007-08-29 23:37:32 +0000968 raise TestFailed("Message %r, expected %r" % (str(msg),
969 expected))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000970 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000971 raise TestFailed("Expected %s" % exc)
Guido van Rossumd32047f2002-11-25 21:38:52 +0000972 class A(object): pass
973 class B(A): pass
974 class C(object): pass
975 # Test some very simple errors
976 raises(TypeError, "duplicate base class A",
977 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000978 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000979 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000980 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000981 type, "X", (A, C, B), {})
982 # Test a slightly more complex error
983 class GridLayout(object): pass
984 class HorizontalGrid(GridLayout): pass
985 class VerticalGrid(GridLayout): pass
986 class HVGrid(HorizontalGrid, VerticalGrid): pass
987 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000988 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000989 type, "ConfusedGrid", (HVGrid, VHGrid), {})
990
Guido van Rossum37202612001-08-09 19:45:21 +0000991def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000992 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000993 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000994 vereq(a.__class__, object)
995 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000996 b = object()
997 verify(a is not b)
998 verify(not hasattr(a, "foo"))
999 try:
1000 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001001 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001002 pass
1003 else:
1004 verify(0, "object() should not allow setting a foo attribute")
1005 verify(not hasattr(object(), "__dict__"))
1006
1007 class Cdict(object):
1008 pass
1009 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001010 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001011 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001012 vereq(x.foo, 1)
1013 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001014
Tim Peters6d6c1a32001-08-02 04:15:00 +00001015def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001016 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001017 class C0(object):
1018 __slots__ = []
1019 x = C0()
1020 verify(not hasattr(x, "__dict__"))
1021 verify(not hasattr(x, "foo"))
1022
1023 class C1(object):
1024 __slots__ = ['a']
1025 x = C1()
1026 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001027 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001028 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001029 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001030 x.a = None
1031 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001032 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001033 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001034
1035 class C3(object):
1036 __slots__ = ['a', 'b', 'c']
1037 x = C3()
1038 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001039 verify(not hasattr(x, 'a'))
1040 verify(not hasattr(x, 'b'))
1041 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001042 x.a = 1
1043 x.b = 2
1044 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001045 vereq(x.a, 1)
1046 vereq(x.b, 2)
1047 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001048
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001049 class C4(object):
1050 """Validate name mangling"""
1051 __slots__ = ['__a']
1052 def __init__(self, value):
1053 self.__a = value
1054 def get(self):
1055 return self.__a
1056 x = C4(5)
1057 verify(not hasattr(x, '__dict__'))
1058 verify(not hasattr(x, '__a'))
1059 vereq(x.get(), 5)
1060 try:
1061 x.__a = 6
1062 except AttributeError:
1063 pass
1064 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001065 raise TestFailed("Double underscored names not mangled")
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001066
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001067 # Make sure slot names are proper identifiers
1068 try:
1069 class C(object):
1070 __slots__ = [None]
1071 except TypeError:
1072 pass
1073 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001074 raise TestFailed("[None] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001075 try:
1076 class C(object):
1077 __slots__ = ["foo bar"]
1078 except TypeError:
1079 pass
1080 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001081 raise TestFailed("['foo bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001082 try:
1083 class C(object):
1084 __slots__ = ["foo\0bar"]
1085 except TypeError:
1086 pass
1087 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001088 raise TestFailed("['foo\\0bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001089 try:
1090 class C(object):
1091 __slots__ = ["1"]
1092 except TypeError:
1093 pass
1094 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001095 raise TestFailed("['1'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001096 try:
1097 class C(object):
1098 __slots__ = [""]
1099 except TypeError:
1100 pass
1101 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001102 raise TestFailed("[''] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001103 class C(object):
1104 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001105 # XXX(nnorwitz): was there supposed to be something tested
1106 # from the class above?
1107
1108 # Test a single string is not expanded as a sequence.
1109 class C(object):
1110 __slots__ = "abc"
1111 c = C()
1112 c.abc = 5
1113 vereq(c.abc, 5)
1114
1115 # Test unicode slot names
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001116 # Test a single unicode string is not expanded as a sequence.
1117 class C(object):
1118 __slots__ = "abc"
1119 c = C()
1120 c.abc = 5
1121 vereq(c.abc, 5)
1122
1123 # _unicode_to_string used to modify slots in certain circumstances
1124 slots = ("foo", "bar")
1125 class C(object):
1126 __slots__ = slots
1127 x = C()
1128 x.foo = 5
1129 vereq(x.foo, 5)
1130 veris(type(slots[0]), str)
1131 # this used to leak references
Guido van Rossumd8faa362007-04-27 19:54:29 +00001132 try:
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001133 class C(object):
1134 __slots__ = [chr(128)]
1135 except (TypeError, UnicodeEncodeError):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001136 pass
1137 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001138 raise TestFailed("[unichr(128)] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001139
Guido van Rossum33bab012001-12-05 22:45:48 +00001140 # Test leaks
1141 class Counted(object):
1142 counter = 0 # counts the number of instances alive
1143 def __init__(self):
1144 Counted.counter += 1
1145 def __del__(self):
1146 Counted.counter -= 1
1147 class C(object):
1148 __slots__ = ['a', 'b', 'c']
1149 x = C()
1150 x.a = Counted()
1151 x.b = Counted()
1152 x.c = Counted()
1153 vereq(Counted.counter, 3)
1154 del x
1155 vereq(Counted.counter, 0)
1156 class D(C):
1157 pass
1158 x = D()
1159 x.a = Counted()
1160 x.z = Counted()
1161 vereq(Counted.counter, 2)
1162 del x
1163 vereq(Counted.counter, 0)
1164 class E(D):
1165 __slots__ = ['e']
1166 x = E()
1167 x.a = Counted()
1168 x.z = Counted()
1169 x.e = Counted()
1170 vereq(Counted.counter, 3)
1171 del x
1172 vereq(Counted.counter, 0)
1173
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001174 # Test cyclical leaks [SF bug 519621]
1175 class F(object):
1176 __slots__ = ['a', 'b']
1177 log = []
1178 s = F()
1179 s.a = [Counted(), s]
1180 vereq(Counted.counter, 1)
1181 s = None
1182 import gc
1183 gc.collect()
1184 vereq(Counted.counter, 0)
1185
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001186 # Test lookup leaks [SF bug 572567]
1187 import sys,gc
1188 class G(object):
1189 def __cmp__(self, other):
1190 return 0
1191 g = G()
1192 orig_objects = len(gc.get_objects())
Guido van Rossum805365e2007-05-07 22:24:25 +00001193 for i in range(10):
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001194 g==g
1195 new_objects = len(gc.get_objects())
1196 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001197 class H(object):
1198 __slots__ = ['a', 'b']
1199 def __init__(self):
1200 self.a = 1
1201 self.b = 2
1202 def __del__(self):
1203 assert self.a == 1
1204 assert self.b == 2
1205
1206 save_stderr = sys.stderr
1207 sys.stderr = sys.stdout
1208 h = H()
1209 try:
1210 del h
1211 finally:
1212 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001213
Guido van Rossum8b056da2002-08-13 18:26:26 +00001214def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001215 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001216
1217 class D(object):
1218 __slots__ = ["__dict__"]
1219 a = D()
1220 verify(hasattr(a, "__dict__"))
1221 verify(not hasattr(a, "__weakref__"))
1222 a.foo = 42
1223 vereq(a.__dict__, {"foo": 42})
1224
1225 class W(object):
1226 __slots__ = ["__weakref__"]
1227 a = W()
1228 verify(hasattr(a, "__weakref__"))
1229 verify(not hasattr(a, "__dict__"))
1230 try:
1231 a.foo = 42
1232 except AttributeError:
1233 pass
1234 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001235 raise TestFailed("shouldn't be allowed to set a.foo")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001236
1237 class C1(W, D):
1238 __slots__ = []
1239 a = C1()
1240 verify(hasattr(a, "__dict__"))
1241 verify(hasattr(a, "__weakref__"))
1242 a.foo = 42
1243 vereq(a.__dict__, {"foo": 42})
1244
1245 class C2(D, W):
1246 __slots__ = []
1247 a = C2()
1248 verify(hasattr(a, "__dict__"))
1249 verify(hasattr(a, "__weakref__"))
1250 a.foo = 42
1251 vereq(a.__dict__, {"foo": 42})
1252
Guido van Rossum9a818922002-11-14 19:50:14 +00001253# MRO order disagreement
1254#
1255# class C3(C1, C2):
1256# __slots__ = []
1257#
1258# class C4(C2, C1):
1259# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001260
Tim Peters6d6c1a32001-08-02 04:15:00 +00001261def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001262 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001263 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001264 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001265 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001267 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001269 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001270 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001271 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001272 vereq(E.foo, 1)
1273 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001274 # Test dynamic instances
1275 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001276 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001277 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001278 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001279 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001280 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001281 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001282 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001283 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001284 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001285 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001286 vereq(int(a), 100)
1287 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001288 verify(not hasattr(a, "spam"))
1289 def mygetattr(self, name):
1290 if name == "spam":
1291 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001292 raise AttributeError
1293 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001294 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001295 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001296 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001297 def mysetattr(self, name, value):
1298 if name == "spam":
1299 raise AttributeError
1300 return object.__setattr__(self, name, value)
1301 C.__setattr__ = mysetattr
1302 try:
1303 a.spam = "not spam"
1304 except AttributeError:
1305 pass
1306 else:
1307 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001308 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001309 class D(C):
1310 pass
1311 d = D()
1312 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001313 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001314
Guido van Rossum7e35d572001-09-15 03:14:32 +00001315 # Test handling of int*seq and seq*int
1316 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001317 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001318 vereq("a"*I(2), "aa")
1319 vereq(I(2)*"a", "aa")
1320 vereq(2*I(3), 6)
1321 vereq(I(3)*2, 6)
1322 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001323
1324 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001325 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001326 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001327 vereq("a"*L(2), "aa")
1328 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001329 vereq(2*L(3), 6)
1330 vereq(L(3)*2, 6)
1331 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001332
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001333 # Test comparison of classes with dynamic metaclasses
1334 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001335 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001336 class someclass(metaclass=dynamicmetaclass):
1337 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001338 verify(someclass != object)
1339
Tim Peters6d6c1a32001-08-02 04:15:00 +00001340def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001341 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342
1343 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001344 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001345 pass
1346 except TypeError:
1347 pass
1348 else:
1349 verify(0, "inheritance from both list and dict should be illegal")
1350
1351 try:
1352 class C(object, None):
1353 pass
1354 except TypeError:
1355 pass
1356 else:
1357 verify(0, "inheritance from non-type should be illegal")
1358 class Classic:
1359 pass
1360
1361 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001362 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001363 pass
1364 except TypeError:
1365 pass
1366 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001367 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001368
1369 try:
1370 class C(object):
1371 __slots__ = 1
1372 except TypeError:
1373 pass
1374 else:
1375 verify(0, "__slots__ = 1 should be illegal")
1376
1377 try:
1378 class C(object):
1379 __slots__ = [1]
1380 except TypeError:
1381 pass
1382 else:
1383 verify(0, "__slots__ = [1] should be illegal")
1384
Guido van Rossumd8faa362007-04-27 19:54:29 +00001385 class M1(type):
1386 pass
1387 class M2(type):
1388 pass
1389 class A1(object, metaclass=M1):
1390 pass
1391 class A2(object, metaclass=M2):
1392 pass
1393 try:
1394 class B(A1, A2):
1395 pass
1396 except TypeError:
1397 pass
1398 else:
1399 verify(0, "finding the most derived metaclass should have failed")
1400
Tim Peters6d6c1a32001-08-02 04:15:00 +00001401def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001402 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001403 class C(object):
1404 def foo(*a): return a
1405 goo = classmethod(foo)
1406 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001407 vereq(C.goo(1), (C, 1))
1408 vereq(c.goo(1), (C, 1))
1409 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001410 class D(C):
1411 pass
1412 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001413 vereq(D.goo(1), (D, 1))
1414 vereq(d.goo(1), (D, 1))
1415 vereq(d.foo(1), (d, 1))
1416 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001417 # Test for a specific crash (SF bug 528132)
1418 def f(cls, arg): return (cls, arg)
1419 ff = classmethod(f)
1420 vereq(ff.__get__(0, int)(42), (int, 42))
1421 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001422
Guido van Rossum155db9a2002-04-02 17:53:47 +00001423 # Test super() with classmethods (SF bug 535444)
1424 veris(C.goo.im_self, C)
1425 veris(D.goo.im_self, D)
1426 veris(super(D,D).goo.im_self, D)
1427 veris(super(D,d).goo.im_self, D)
1428 vereq(super(D,D).goo(), (D,))
1429 vereq(super(D,d).goo(), (D,))
1430
Raymond Hettingerbe971532003-06-18 01:13:41 +00001431 # Verify that argument is checked for callability (SF bug 753451)
1432 try:
1433 classmethod(1).__get__(1)
1434 except TypeError:
1435 pass
1436 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001437 raise TestFailed("classmethod should check for callability")
Raymond Hettingerbe971532003-06-18 01:13:41 +00001438
Georg Brandl6a29c322006-02-21 22:17:46 +00001439 # Verify that classmethod() doesn't allow keyword args
1440 try:
1441 classmethod(f, kw=1)
1442 except TypeError:
1443 pass
1444 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001445 raise TestFailed("classmethod shouldn't accept keyword args")
Georg Brandl6a29c322006-02-21 22:17:46 +00001446
Fred Drakef841aa62002-03-28 15:49:54 +00001447def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001448 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001449 import xxsubtype as spam
1450 a = (1, 2, 3)
1451 d = {'abc': 123}
1452 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001453 veris(x, spam.spamlist)
1454 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001455 vereq(d, d1)
1456 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001457 veris(x, spam.spamlist)
1458 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001459 vereq(d, d1)
1460
Tim Peters6d6c1a32001-08-02 04:15:00 +00001461def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001462 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001463 class C(object):
1464 def foo(*a): return a
1465 goo = staticmethod(foo)
1466 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001467 vereq(C.goo(1), (1,))
1468 vereq(c.goo(1), (1,))
1469 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001470 class D(C):
1471 pass
1472 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001473 vereq(D.goo(1), (1,))
1474 vereq(d.goo(1), (1,))
1475 vereq(d.foo(1), (d, 1))
1476 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001477
Fred Drakef841aa62002-03-28 15:49:54 +00001478def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001479 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001480 import xxsubtype as spam
1481 a = (1, 2, 3)
1482 d = {"abc": 123}
1483 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1484 veris(x, None)
1485 vereq(a, a1)
1486 vereq(d, d1)
1487 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1488 veris(x, None)
1489 vereq(a, a1)
1490 vereq(d, d1)
1491
Tim Peters6d6c1a32001-08-02 04:15:00 +00001492def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001493 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001494 class C:
1495 def foo(*a): return a
1496 goo = classmethod(foo)
1497 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001498 vereq(C.goo(1), (C, 1))
1499 vereq(c.goo(1), (C, 1))
1500 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001501 class D(C):
1502 pass
1503 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001504 vereq(D.goo(1), (D, 1))
1505 vereq(d.goo(1), (D, 1))
1506 vereq(d.foo(1), (d, 1))
1507 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001508 class E: # *not* subclassing from C
1509 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001510 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001511 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512
1513def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001514 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001515 class C(object):
1516 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001517 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001518 self.__get = get
1519 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001520 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001521 def __get__(self, obj, type=None):
1522 return self.__get(obj)
1523 def __set__(self, obj, value):
1524 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001525 def __delete__(self, obj):
1526 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001527 def __init__(self):
1528 self.__x = 0
1529 def __get_x(self):
1530 x = self.__x
1531 self.__x = x+1
1532 return x
1533 def __set_x(self, x):
1534 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001535 def __delete_x(self):
1536 del self.__x
1537 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001538 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001539 vereq(a.x, 0)
1540 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001541 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001542 vereq(a.x, 10)
1543 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001544 del a.x
1545 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001546
1547def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001548 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001549 class C(list):
1550 def __new__(cls):
1551 self = list.__new__(cls)
1552 self.foo = 1
1553 return self
1554 def __init__(self):
1555 self.foo = self.foo + 2
1556 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001557 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001558 verify(a.__class__ is C)
1559 class D(C):
1560 pass
1561 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001562 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001563 verify(b.__class__ is D)
1564
Tim Peters6d6c1a32001-08-02 04:15:00 +00001565def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001566 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001567 class A(object):
1568 def f(self): return "A"
1569 class B(A):
1570 pass
1571 class C(A):
1572 def f(self): return "C"
1573 class D(B, C):
1574 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001575 vereq(D.mro(), [D, B, C, A, object])
1576 vereq(D.__mro__, (D, B, C, A, object))
1577 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001578
Guido van Rossumd3077402001-08-12 05:24:18 +00001579 class PerverseMetaType(type):
1580 def mro(cls):
1581 L = type.mro(cls)
1582 L.reverse()
1583 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001584 class X(D,B,C,A, metaclass=PerverseMetaType):
1585 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001586 vereq(X.__mro__, (object, A, C, B, D, X))
1587 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001588
Armin Rigo037d1e02005-12-29 17:07:39 +00001589 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001590 class _metaclass(type):
1591 def mro(self):
1592 return [self, dict, object]
1593 class X(object, metaclass=_metaclass):
1594 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001595 except TypeError:
1596 pass
1597 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001598 raise TestFailed("devious mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001599
1600 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001601 class _metaclass(type):
1602 def mro(self):
1603 return [1]
1604 class X(object, metaclass=_metaclass):
1605 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001606 except TypeError:
1607 pass
1608 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001609 raise TestFailed("non-class mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001610
1611 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001612 class _metaclass(type):
1613 def mro(self):
1614 return 1
1615 class X(object, metaclass=_metaclass):
1616 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001617 except TypeError:
1618 pass
1619 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001620 raise TestFailed("non-sequence mro() return not caught")
Tim Peters1b27f862005-12-30 18:42:42 +00001621
Armin Rigo037d1e02005-12-29 17:07:39 +00001622
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001624 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001625
1626 class B(object):
1627 "Intermediate class because object doesn't have a __setattr__"
1628
1629 class C(B):
1630
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001631 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001632 if name == "foo":
1633 return ("getattr", name)
1634 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001635 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001636 def __setattr__(self, name, value):
1637 if name == "foo":
1638 self.setattr = (name, value)
1639 else:
1640 return B.__setattr__(self, name, value)
1641 def __delattr__(self, name):
1642 if name == "foo":
1643 self.delattr = name
1644 else:
1645 return B.__delattr__(self, name)
1646
1647 def __getitem__(self, key):
1648 return ("getitem", key)
1649 def __setitem__(self, key, value):
1650 self.setitem = (key, value)
1651 def __delitem__(self, key):
1652 self.delitem = key
1653
1654 def __getslice__(self, i, j):
1655 return ("getslice", i, j)
1656 def __setslice__(self, i, j, value):
1657 self.setslice = (i, j, value)
1658 def __delslice__(self, i, j):
1659 self.delslice = (i, j)
1660
1661 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001663 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001664 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667
Guido van Rossum45704552001-10-08 16:35:45 +00001668 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001669 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001670 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001671 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001672 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001673
Guido van Rossum45704552001-10-08 16:35:45 +00001674 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001675 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001676 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001677 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001678 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001679
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001680def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001681 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001682 class C(object):
1683 def __init__(self, x):
1684 self.x = x
1685 def foo(self):
1686 return self.x
1687 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001688 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001689 class D(C):
1690 boo = C.foo
1691 goo = c1.foo
1692 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001693 vereq(d2.foo(), 2)
1694 vereq(d2.boo(), 2)
1695 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001696 class E(object):
1697 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001698 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001699 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001700
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001701def specials():
1702 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001703 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001704 # Test the default behavior for static classes
1705 class C(object):
1706 def __getitem__(self, i):
1707 if 0 <= i < 10: return i
1708 raise IndexError
1709 c1 = C()
1710 c2 = C()
1711 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001712 verify(id(c1) != id(c2))
1713 hash(c1)
1714 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001715 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001716 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001717 verify(c1 != c2)
1718 verify(not c1 != c1)
1719 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001720 # Note that the module name appears in str/repr, and that varies
1721 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001722 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001723 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001724 verify(-1 not in c1)
1725 for i in range(10):
1726 verify(i in c1)
1727 verify(10 not in c1)
1728 # Test the default behavior for dynamic classes
1729 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001730 def __getitem__(self, i):
1731 if 0 <= i < 10: return i
1732 raise IndexError
1733 d1 = D()
1734 d2 = D()
1735 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001736 verify(id(d1) != id(d2))
1737 hash(d1)
1738 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001739 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001740 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001741 verify(d1 != d2)
1742 verify(not d1 != d1)
1743 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001744 # Note that the module name appears in str/repr, and that varies
1745 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001746 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001747 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001748 verify(-1 not in d1)
1749 for i in range(10):
1750 verify(i in d1)
1751 verify(10 not in d1)
1752 # Test overridden behavior for static classes
1753 class Proxy(object):
1754 def __init__(self, x):
1755 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001756 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001757 return not not self.x
1758 def __hash__(self):
1759 return hash(self.x)
1760 def __eq__(self, other):
1761 return self.x == other
1762 def __ne__(self, other):
1763 return self.x != other
1764 def __cmp__(self, other):
1765 return cmp(self.x, other.x)
1766 def __str__(self):
1767 return "Proxy:%s" % self.x
1768 def __repr__(self):
1769 return "Proxy(%r)" % self.x
1770 def __contains__(self, value):
1771 return value in self.x
1772 p0 = Proxy(0)
1773 p1 = Proxy(1)
1774 p_1 = Proxy(-1)
1775 verify(not p0)
1776 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001777 vereq(hash(p0), hash(0))
1778 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001779 verify(p0 != p1)
1780 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(not p0, p1)
1782 vereq(cmp(p0, p1), -1)
1783 vereq(cmp(p0, p0), 0)
1784 vereq(cmp(p0, p_1), 1)
1785 vereq(str(p0), "Proxy:0")
1786 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001787 p10 = Proxy(range(10))
1788 verify(-1 not in p10)
1789 for i in range(10):
1790 verify(i in p10)
1791 verify(10 not in p10)
1792 # Test overridden behavior for dynamic classes
1793 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001794 def __init__(self, x):
1795 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001796 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001797 return not not self.x
1798 def __hash__(self):
1799 return hash(self.x)
1800 def __eq__(self, other):
1801 return self.x == other
1802 def __ne__(self, other):
1803 return self.x != other
1804 def __cmp__(self, other):
1805 return cmp(self.x, other.x)
1806 def __str__(self):
1807 return "DProxy:%s" % self.x
1808 def __repr__(self):
1809 return "DProxy(%r)" % self.x
1810 def __contains__(self, value):
1811 return value in self.x
1812 p0 = DProxy(0)
1813 p1 = DProxy(1)
1814 p_1 = DProxy(-1)
1815 verify(not p0)
1816 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001817 vereq(hash(p0), hash(0))
1818 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001819 verify(p0 != p1)
1820 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001821 vereq(not p0, p1)
1822 vereq(cmp(p0, p1), -1)
1823 vereq(cmp(p0, p0), 0)
1824 vereq(cmp(p0, p_1), 1)
1825 vereq(str(p0), "DProxy:0")
1826 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001827 p10 = DProxy(range(10))
1828 verify(-1 not in p10)
1829 for i in range(10):
1830 verify(i in p10)
1831 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001832## # Safety test for __cmp__
1833## def unsafecmp(a, b):
1834## try:
1835## a.__class__.__cmp__(a, b)
1836## except TypeError:
1837## pass
1838## else:
1839## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1840## a.__class__, a, b)
1841## unsafecmp(u"123", "123")
1842## unsafecmp("123", u"123")
1843## unsafecmp(1, 1.0)
1844## unsafecmp(1.0, 1)
1845## unsafecmp(1, 1L)
1846## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001847
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001848## class Letter(str):
1849## def __new__(cls, letter):
1850## if letter == 'EPS':
1851## return str.__new__(cls)
1852## return str.__new__(cls, letter)
1853## def __str__(self):
1854## if not self:
1855## return 'EPS'
1856## return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001857
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001858## # sys.stdout needs to be the original to trigger the recursion bug
1859## import sys
1860## test_stdout = sys.stdout
1861## sys.stdout = get_original_stdout()
1862## try:
1863## # nothing should actually be printed, this should raise an exception
1864## print(Letter('w'))
1865## except RuntimeError:
1866## pass
1867## else:
1868## raise TestFailed, "expected a RuntimeError for print recursion"
1869## sys.stdout = test_stdout
Neal Norwitz1a997502003-01-13 20:13:12 +00001870
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001871def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001872 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001873 import weakref
1874 class C(object):
1875 pass
1876 c = C()
1877 r = weakref.ref(c)
1878 verify(r() is c)
1879 del c
1880 verify(r() is None)
1881 del r
1882 class NoWeak(object):
1883 __slots__ = ['foo']
1884 no = NoWeak()
1885 try:
1886 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001887 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001888 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001889 else:
1890 verify(0, "weakref.ref(no) should be illegal")
1891 class Weak(object):
1892 __slots__ = ['foo', '__weakref__']
1893 yes = Weak()
1894 r = weakref.ref(yes)
1895 verify(r() is yes)
1896 del yes
1897 verify(r() is None)
1898 del r
1899
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001900def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001901 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001902 class C(object):
1903 def getx(self):
1904 return self.__x
1905 def setx(self, value):
1906 self.__x = value
1907 def delx(self):
1908 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001909 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001910 a = C()
1911 verify(not hasattr(a, "x"))
1912 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001913 vereq(a._C__x, 42)
1914 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001915 del a.x
1916 verify(not hasattr(a, "x"))
1917 verify(not hasattr(a, "_C__x"))
1918 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001919 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001920 C.x.__delete__(a)
1921 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001922
Tim Peters66c1a522001-09-24 21:17:50 +00001923 raw = C.__dict__['x']
1924 verify(isinstance(raw, property))
1925
1926 attrs = dir(raw)
1927 verify("__doc__" in attrs)
1928 verify("fget" in attrs)
1929 verify("fset" in attrs)
1930 verify("fdel" in attrs)
1931
Guido van Rossum45704552001-10-08 16:35:45 +00001932 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001933 verify(raw.fget is C.__dict__['getx'])
1934 verify(raw.fset is C.__dict__['setx'])
1935 verify(raw.fdel is C.__dict__['delx'])
1936
1937 for attr in "__doc__", "fget", "fset", "fdel":
1938 try:
1939 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001940 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001941 if str(msg).find('readonly') < 0:
1942 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001943 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001944 "msg %r" % (attr, str(msg)))
1945 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001946 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001947 "readonly %r attr on a property" % attr)
1948
Neal Norwitz673cd822002-10-18 16:33:13 +00001949 class D(object):
1950 __getitem__ = property(lambda s: 1/0)
1951
1952 d = D()
1953 try:
1954 for i in d:
1955 str(i)
1956 except ZeroDivisionError:
1957 pass
1958 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001959 raise TestFailed("expected ZeroDivisionError from bad property")
Neal Norwitz673cd822002-10-18 16:33:13 +00001960
Georg Brandl533ff6f2006-03-08 18:09:27 +00001961 class E(object):
1962 def getter(self):
1963 "getter method"
1964 return 0
1965 def setter(self, value):
1966 "setter method"
1967 pass
1968 prop = property(getter)
1969 vereq(prop.__doc__, "getter method")
1970 prop2 = property(fset=setter)
1971 vereq(prop2.__doc__, None)
1972
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001973 # this segfaulted in 2.5b2
1974 try:
1975 import _testcapi
1976 except ImportError:
1977 pass
1978 else:
1979 class X(object):
1980 p = property(_testcapi.test_with_docstring)
1981
1982
Guido van Rossumc4a18802001-08-24 16:55:27 +00001983def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001984 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001985
1986 class A(object):
1987 def meth(self, a):
1988 return "A(%r)" % a
1989
Guido van Rossum45704552001-10-08 16:35:45 +00001990 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001991
1992 class B(A):
1993 def __init__(self):
1994 self.__super = super(B, self)
1995 def meth(self, a):
1996 return "B(%r)" % a + self.__super.meth(a)
1997
Guido van Rossum45704552001-10-08 16:35:45 +00001998 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001999
2000 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002001 def meth(self, a):
2002 return "C(%r)" % a + self.__super.meth(a)
2003 C._C__super = super(C)
2004
Guido van Rossum45704552001-10-08 16:35:45 +00002005 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002006
2007 class D(C, B):
2008 def meth(self, a):
2009 return "D(%r)" % a + super(D, self).meth(a)
2010
Guido van Rossum5b443c62001-12-03 15:38:28 +00002011 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2012
2013 # Test for subclassing super
2014
2015 class mysuper(super):
2016 def __init__(self, *args):
2017 return super(mysuper, self).__init__(*args)
2018
2019 class E(D):
2020 def meth(self, a):
2021 return "E(%r)" % a + mysuper(E, self).meth(a)
2022
2023 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2024
2025 class F(E):
2026 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002027 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002028 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2029 F._F__super = mysuper(F)
2030
2031 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2032
2033 # Make sure certain errors are raised
2034
2035 try:
2036 super(D, 42)
2037 except TypeError:
2038 pass
2039 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002040 raise TestFailed("shouldn't allow super(D, 42)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002041
2042 try:
2043 super(D, C())
2044 except TypeError:
2045 pass
2046 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002047 raise TestFailed("shouldn't allow super(D, C())")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002048
2049 try:
2050 super(D).__get__(12)
2051 except TypeError:
2052 pass
2053 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002054 raise TestFailed("shouldn't allow super(D).__get__(12)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002055
2056 try:
2057 super(D).__get__(C())
2058 except TypeError:
2059 pass
2060 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002061 raise TestFailed("shouldn't allow super(D).__get__(C())")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002062
Guido van Rossuma4541a32003-04-16 20:02:22 +00002063 # Make sure data descriptors can be overridden and accessed via super
2064 # (new feature in Python 2.3)
2065
2066 class DDbase(object):
2067 def getx(self): return 42
2068 x = property(getx)
2069
2070 class DDsub(DDbase):
2071 def getx(self): return "hello"
2072 x = property(getx)
2073
2074 dd = DDsub()
2075 vereq(dd.x, "hello")
2076 vereq(super(DDsub, dd).x, 42)
2077
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002078 # Ensure that super() lookup of descriptor from classmethod
2079 # works (SF ID# 743627)
2080
2081 class Base(object):
2082 aProp = property(lambda self: "foo")
2083
2084 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002085 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002086 def test(klass):
2087 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002088
2089 veris(Sub.test(), Base.aProp)
2090
Thomas Wouters89f507f2006-12-13 04:49:30 +00002091 # Verify that super() doesn't allow keyword args
2092 try:
2093 super(Base, kw=1)
2094 except TypeError:
2095 pass
2096 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002097 raise TestFailed("super shouldn't accept keyword args")
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002098
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002099def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002100 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002101
2102 class hexint(int):
2103 def __repr__(self):
2104 return hex(self)
2105 def __add__(self, other):
2106 return hexint(int.__add__(self, other))
2107 # (Note that overriding __radd__ doesn't work,
2108 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002109 vereq(repr(hexint(7) + 9), "0x10")
2110 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002111 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002112 vereq(a, 12345)
2113 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002114 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002115 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002116 verify((+a).__class__ is int)
2117 verify((a >> 0).__class__ is int)
2118 verify((a << 0).__class__ is int)
2119 verify((hexint(0) << 12).__class__ is int)
2120 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002121
Guido van Rossume2a383d2007-01-15 16:59:06 +00002122 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002123 __slots__ = []
2124 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002125 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002126 def __add__(self, other):
2127 return self.__class__(super(octlong, self).__add__(other))
2128 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002129 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002130 # (Note that overriding __radd__ here only seems to work
2131 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002132 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002133 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002134 vereq(a, 12345)
2135 vereq(int(a), 12345)
2136 vereq(hash(a), hash(12345))
2137 verify(int(a).__class__ is int)
2138 verify((+a).__class__ is int)
2139 verify((-a).__class__ is int)
2140 verify((-octlong(0)).__class__ is int)
2141 verify((a >> 0).__class__ is int)
2142 verify((a << 0).__class__ is int)
2143 verify((a - 0).__class__ is int)
2144 verify((a * 1).__class__ is int)
2145 verify((a ** 1).__class__ is int)
2146 verify((a // 1).__class__ is int)
2147 verify((1 * a).__class__ is int)
2148 verify((a | 0).__class__ is int)
2149 verify((a ^ 0).__class__ is int)
2150 verify((a & -1).__class__ is int)
2151 verify((octlong(0) << 12).__class__ is int)
2152 verify((octlong(0) >> 12).__class__ is int)
2153 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002154
2155 # Because octlong overrides __add__, we can't check the absence of +0
2156 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002157 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002158 pass
2159 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002160 verify((a + 0).__class__ is int)
2161 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002162
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002163 # Check that negative clones don't segfault
2164 a = longclone(-1)
2165 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002166 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002167
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002168 class precfloat(float):
2169 __slots__ = ['prec']
2170 def __init__(self, value=0.0, prec=12):
2171 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002172 def __repr__(self):
2173 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002174 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002175 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002176 vereq(a, 12345.0)
2177 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002178 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002179 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002180 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002181
Tim Peters2400fa42001-09-12 19:12:49 +00002182 class madcomplex(complex):
2183 def __repr__(self):
2184 return "%.17gj%+.17g" % (self.imag, self.real)
2185 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002186 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002187 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002188 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002189 vereq(a, base)
2190 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002191 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002192 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002193 vereq(repr(a), "4j-3")
2194 vereq(a, base)
2195 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002196 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002197 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002198 veris((+a).__class__, complex)
2199 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002201 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002202 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002203 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002204 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002205 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002206 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002207
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002208 class madtuple(tuple):
2209 _rev = None
2210 def rev(self):
2211 if self._rev is not None:
2212 return self._rev
2213 L = list(self)
2214 L.reverse()
2215 self._rev = self.__class__(L)
2216 return self._rev
2217 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002218 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2219 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2220 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002221 for i in range(512):
2222 t = madtuple(range(i))
2223 u = t.rev()
2224 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002225 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002226 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002227 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002228 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002229 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002230 verify(a[:].__class__ is tuple)
2231 verify((a * 1).__class__ is tuple)
2232 verify((a * 0).__class__ is tuple)
2233 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002234 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002235 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002236 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002237 verify((a + a).__class__ is tuple)
2238 verify((a * 0).__class__ is tuple)
2239 verify((a * 1).__class__ is tuple)
2240 verify((a * 2).__class__ is tuple)
2241 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002242
2243 class madstring(str):
2244 _rev = None
2245 def rev(self):
2246 if self._rev is not None:
2247 return self._rev
2248 L = list(self)
2249 L.reverse()
2250 self._rev = self.__class__("".join(L))
2251 return self._rev
2252 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002253 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2254 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2255 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002256 for i in range(256):
2257 s = madstring("".join(map(chr, range(i))))
2258 t = s.rev()
2259 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002261 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002263 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002264
Tim Peters8fa5dd02001-09-12 02:18:30 +00002265 base = "\x00" * 5
2266 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002267 vereq(s, base)
2268 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002269 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq(hash(s), hash(base))
2271 vereq({s: 1}[base], 1)
2272 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002273 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002275 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002277 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002279 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002281 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002283 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002285 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002287 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002289 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002291 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002292 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002293 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002294 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002295 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002296 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002297 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002298 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002299 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002300 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002301 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002302 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002303 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002304 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002305 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002306
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002307 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002308 _rev = None
2309 def rev(self):
2310 if self._rev is not None:
2311 return self._rev
2312 L = list(self)
2313 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002314 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002315 return self._rev
2316 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002317 vereq(u, "ABCDEF")
2318 vereq(u.rev(), madunicode("FEDCBA"))
2319 vereq(u.rev().rev(), madunicode("ABCDEF"))
2320 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002321 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002322 vereq(str(u), base)
2323 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002324 vereq(hash(u), hash(base))
2325 vereq({u: 1}[base], 1)
2326 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002327 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002328 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002329 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002330 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002331 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002332 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002333 verify(u.replace("x", "x").__class__ is str)
2334 vereq(u.replace("x", "x"), base)
2335 verify(u.replace("xy", "xy").__class__ is str)
2336 vereq(u.replace("xy", "xy"), base)
2337 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002338 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002339 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002340 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002341 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002342 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002343 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002344 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002345 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002346 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002347 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002349 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002350 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002351 verify((u + "").__class__ is str)
2352 vereq(u + "", base)
2353 verify(("" + u).__class__ is str)
2354 vereq("" + u, base)
2355 verify((u * 0).__class__ is str)
2356 vereq(u * 0, "")
2357 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002358 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002359 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002360 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002361 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002362 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002363 verify(u[0:0].__class__ is str)
2364 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002365
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002366 class sublist(list):
2367 pass
2368 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002369 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002370 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002371 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002372 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002373 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002374 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002375 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002376 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002377 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002378 del a[10:15]
2379 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002380 vereq(a, list(range(10)))
2381 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002382 vereq(a[0], 0)
2383 vereq(a[9], 9)
2384 vereq(a[-10], 0)
2385 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002386 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002387
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002388## class CountedInput(file):
2389## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002390
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002391## self.lineno is the 0-based ordinal of the last line read, up to
2392## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002393
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002394## self.ateof is true if and only if the final "" line has been read,
2395## at which point self.lineno stops incrementing, and further calls
2396## to readline() continue to return "".
2397## """
Tim Peters59c9a642001-09-13 05:38:56 +00002398
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002399## lineno = 0
2400## ateof = 0
2401## def readline(self):
2402## if self.ateof:
2403## return ""
2404## s = file.readline(self)
2405## # Next line works too.
2406## # s = super(CountedInput, self).readline()
2407## self.lineno += 1
2408## if s == "":
2409## self.ateof = 1
2410## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002411
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002412## f = open(name=TESTFN, mode='w')
2413## lines = ['a\n', 'b\n', 'c\n']
2414## try:
2415## f.writelines(lines)
2416## f.close()
2417## f = CountedInput(TESTFN)
2418## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2419## got = f.readline()
2420## vereq(expected, got)
2421## vereq(f.lineno, i)
2422## vereq(f.ateof, (i > len(lines)))
2423## f.close()
2424## finally:
2425## try:
2426## f.close()
2427## except:
2428## pass
2429## try:
2430## import os
2431## os.unlink(TESTFN)
2432## except:
2433## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002434
Tim Peters808b94e2001-09-13 19:33:07 +00002435def keywords():
2436 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002437 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(int(x=1), 1)
2439 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002440 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002441 vereq(complex(imag=42, real=666), complex(666, 42))
2442 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002443 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002444 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002445 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002446 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002447
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002448 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002449 try:
2450 constructor(bogus_keyword_arg=1)
2451 except TypeError:
2452 pass
2453 else:
2454 raise TestFailed("expected TypeError from bogus keyword "
2455 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002456
Tim Peters0ab085c2001-09-14 00:25:33 +00002457def str_subclass_as_dict_key():
2458 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002459 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002460
2461 class cistr(str):
2462 """Sublcass of str that computes __eq__ case-insensitively.
2463
2464 Also computes a hash code of the string in canonical form.
2465 """
2466
2467 def __init__(self, value):
2468 self.canonical = value.lower()
2469 self.hashcode = hash(self.canonical)
2470
2471 def __eq__(self, other):
2472 if not isinstance(other, cistr):
2473 other = cistr(other)
2474 return self.canonical == other.canonical
2475
2476 def __hash__(self):
2477 return self.hashcode
2478
Guido van Rossum45704552001-10-08 16:35:45 +00002479 vereq(cistr('ABC'), 'abc')
2480 vereq('aBc', cistr('ABC'))
2481 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002482
2483 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002484 vereq(d[cistr('one')], 1)
2485 vereq(d[cistr('tWo')], 2)
2486 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002487 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002488 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002489
Guido van Rossumab3b0342001-09-18 20:38:53 +00002490def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002491 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002492 class classic:
2493 pass
2494 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002495 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002496 class C(base):
2497 def __init__(self, value):
2498 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002499 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002500 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002501 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002502 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002503 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002504 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002505 def __ne__(self, other):
2506 if isinstance(other, C):
2507 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002508 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002509 return self.value != other
2510 return NotImplemented
2511 def __lt__(self, other):
2512 if isinstance(other, C):
2513 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002514 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002515 return self.value < other
2516 return NotImplemented
2517 def __le__(self, other):
2518 if isinstance(other, C):
2519 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002520 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002521 return self.value <= other
2522 return NotImplemented
2523 def __gt__(self, other):
2524 if isinstance(other, C):
2525 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002526 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002527 return self.value > other
2528 return NotImplemented
2529 def __ge__(self, other):
2530 if isinstance(other, C):
2531 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002532 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002533 return self.value >= other
2534 return NotImplemented
2535
Guido van Rossumab3b0342001-09-18 20:38:53 +00002536 c1 = C(1)
2537 c2 = C(2)
2538 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002539 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002540 c = {1: c1, 2: c2, 3: c3}
2541 for x in 1, 2, 3:
2542 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002543 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002544 for op in "<", "<=", "==", "!=", ">", ">=":
2545 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2546 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002547 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2548 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002549
Guido van Rossum0639f592001-09-18 21:06:04 +00002550def rich_comparisons():
2551 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002552 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002553 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002554 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002555 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002556 vereq(z, 1+0j)
2557 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002558 class ZZ(complex):
2559 def __eq__(self, other):
2560 try:
2561 return abs(self - other) <= 1e-6
2562 except:
2563 return NotImplemented
2564 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002565 vereq(zz, 1+0j)
2566 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002567
Guido van Rossum0639f592001-09-18 21:06:04 +00002568 class classic:
2569 pass
2570 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002571 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002572 class C(base):
2573 def __init__(self, value):
2574 self.value = int(value)
2575 def __cmp__(self, other):
Collin Winter3add4d72007-08-29 23:37:32 +00002576 raise TestFailed("shouldn't call __cmp__")
Guido van Rossum0639f592001-09-18 21:06:04 +00002577 def __eq__(self, other):
2578 if isinstance(other, C):
2579 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002580 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002581 return self.value == other
2582 return NotImplemented
2583 def __ne__(self, other):
2584 if isinstance(other, C):
2585 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002586 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002587 return self.value != other
2588 return NotImplemented
2589 def __lt__(self, other):
2590 if isinstance(other, C):
2591 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002592 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002593 return self.value < other
2594 return NotImplemented
2595 def __le__(self, other):
2596 if isinstance(other, C):
2597 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002598 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002599 return self.value <= other
2600 return NotImplemented
2601 def __gt__(self, other):
2602 if isinstance(other, C):
2603 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002604 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002605 return self.value > other
2606 return NotImplemented
2607 def __ge__(self, other):
2608 if isinstance(other, C):
2609 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002610 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002611 return self.value >= other
2612 return NotImplemented
2613 c1 = C(1)
2614 c2 = C(2)
2615 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002616 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002617 c = {1: c1, 2: c2, 3: c3}
2618 for x in 1, 2, 3:
2619 for y in 1, 2, 3:
2620 for op in "<", "<=", "==", "!=", ">", ">=":
2621 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2622 "x=%d, y=%d" % (x, y))
2623 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2624 "x=%d, y=%d" % (x, y))
2625 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2626 "x=%d, y=%d" % (x, y))
2627
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002628def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002629 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002630 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002631 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002632 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002633 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2634 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002635
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002636def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002637 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002638 class C(object): pass
2639 class D(object): pass
2640 class E(object): pass
2641 class F(D, E): pass
2642 for cls in C, D, E, F:
2643 for cls2 in C, D, E, F:
2644 x = cls()
2645 x.__class__ = cls2
2646 verify(x.__class__ is cls2)
2647 x.__class__ = cls
2648 verify(x.__class__ is cls)
2649 def cant(x, C):
2650 try:
2651 x.__class__ = C
2652 except TypeError:
2653 pass
2654 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002655 raise TestFailed("shouldn't allow %r.__class__ = %r" % (x, C))
Guido van Rossumb6b89422002-04-15 01:03:30 +00002656 try:
2657 delattr(x, "__class__")
2658 except TypeError:
2659 pass
2660 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002661 raise TestFailed("shouldn't allow del %r.__class__" % x)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002662 cant(C(), list)
2663 cant(list(), C)
2664 cant(C(), 1)
2665 cant(C(), object)
2666 cant(object(), list)
2667 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002668 class Int(int): __slots__ = []
2669 cant(2, Int)
2670 cant(Int(), int)
2671 cant(True, int)
2672 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002673 o = object()
2674 cant(o, type(1))
2675 cant(o, type(None))
2676 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002677 class G(object):
2678 __slots__ = ["a", "b"]
2679 class H(object):
2680 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002681 class I(object):
2682 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002683 class J(object):
2684 __slots__ = ["c", "b"]
2685 class K(object):
2686 __slots__ = ["a", "b", "d"]
2687 class L(H):
2688 __slots__ = ["e"]
2689 class M(I):
2690 __slots__ = ["e"]
2691 class N(J):
2692 __slots__ = ["__weakref__"]
2693 class P(J):
2694 __slots__ = ["__dict__"]
2695 class Q(J):
2696 pass
2697 class R(J):
2698 __slots__ = ["__dict__", "__weakref__"]
2699
2700 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2701 x = cls()
2702 x.a = 1
2703 x.__class__ = cls2
2704 verify(x.__class__ is cls2,
2705 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2706 vereq(x.a, 1)
2707 x.__class__ = cls
2708 verify(x.__class__ is cls,
2709 "assigning %r as __class__ for %r silently failed" % (cls, x))
2710 vereq(x.a, 1)
2711 for cls in G, J, K, L, M, N, P, R, list, Int:
2712 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2713 if cls is cls2:
2714 continue
2715 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002716
Guido van Rossum6661be32001-10-26 04:26:12 +00002717def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002718 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002719 class C(object): pass
2720 a = C()
2721 a.__dict__ = {'b': 1}
2722 vereq(a.b, 1)
2723 def cant(x, dict):
2724 try:
2725 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002726 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002727 pass
2728 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002729 raise TestFailed("shouldn't allow %r.__dict__ = %r" % (x, dict))
Guido van Rossum6661be32001-10-26 04:26:12 +00002730 cant(a, None)
2731 cant(a, [])
2732 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002733 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002734
2735 class Base(object):
2736 pass
2737 def verify_dict_readonly(x):
2738 """
2739 x has to be an instance of a class inheriting from Base.
2740 """
2741 cant(x, {})
2742 try:
2743 del x.__dict__
2744 except (AttributeError, TypeError):
2745 pass
2746 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002747 raise TestFailed("shouldn't allow del %r.__dict__" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002748 dict_descr = Base.__dict__["__dict__"]
2749 try:
2750 dict_descr.__set__(x, {})
2751 except (AttributeError, TypeError):
2752 pass
2753 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002754 raise TestFailed("dict_descr allowed access to %r's dict" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002755
2756 # Classes don't allow __dict__ assignment and have readonly dicts
2757 class Meta1(type, Base):
2758 pass
2759 class Meta2(Base, type):
2760 pass
2761 class D(object):
2762 __metaclass__ = Meta1
2763 class E(object):
2764 __metaclass__ = Meta2
2765 for cls in C, D, E:
2766 verify_dict_readonly(cls)
2767 class_dict = cls.__dict__
2768 try:
2769 class_dict["spam"] = "eggs"
2770 except TypeError:
2771 pass
2772 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002773 raise TestFailed("%r's __dict__ can be modified" % cls)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002774
2775 # Modules also disallow __dict__ assignment
2776 class Module1(types.ModuleType, Base):
2777 pass
2778 class Module2(Base, types.ModuleType):
2779 pass
2780 for ModuleType in Module1, Module2:
2781 mod = ModuleType("spam")
2782 verify_dict_readonly(mod)
2783 mod.__dict__["spam"] = "eggs"
2784
2785 # Exception's __dict__ can be replaced, but not deleted
2786 class Exception1(Exception, Base):
2787 pass
2788 class Exception2(Base, Exception):
2789 pass
2790 for ExceptionType in Exception, Exception1, Exception2:
2791 e = ExceptionType()
2792 e.__dict__ = {"a": 1}
2793 vereq(e.a, 1)
2794 try:
2795 del e.__dict__
2796 except (TypeError, AttributeError):
2797 pass
2798 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002799 raise TestFaied("%r's __dict__ can be deleted" % e)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002800
Guido van Rossum6661be32001-10-26 04:26:12 +00002801
Guido van Rossum3926a632001-09-25 16:25:58 +00002802def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002803 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002804 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002805 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002806
2807 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002808 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002809
2810 global C
2811 class C(object):
2812 def __init__(self, a, b):
2813 super(C, self).__init__()
2814 self.a = a
2815 self.b = b
2816 def __repr__(self):
2817 return "C(%r, %r)" % (self.a, self.b)
2818
2819 global C1
2820 class C1(list):
2821 def __new__(cls, a, b):
2822 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002823 def __getnewargs__(self):
2824 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002825 def __init__(self, a, b):
2826 self.a = a
2827 self.b = b
2828 def __repr__(self):
2829 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2830
2831 global C2
2832 class C2(int):
2833 def __new__(cls, a, b, val=0):
2834 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002835 def __getnewargs__(self):
2836 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002837 def __init__(self, a, b, val=0):
2838 self.a = a
2839 self.b = b
2840 def __repr__(self):
2841 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2842
Guido van Rossum90c45142001-11-24 21:07:01 +00002843 global C3
2844 class C3(object):
2845 def __init__(self, foo):
2846 self.foo = foo
2847 def __getstate__(self):
2848 return self.foo
2849 def __setstate__(self, foo):
2850 self.foo = foo
2851
2852 global C4classic, C4
2853 class C4classic: # classic
2854 pass
2855 class C4(C4classic, object): # mixed inheritance
2856 pass
2857
Guido van Rossum99603b02007-07-20 00:22:32 +00002858 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002859 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002860 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002861 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002862
2863 for cls in C, C1, C2:
2864 s = p.dumps(cls, bin)
2865 cls2 = p.loads(s)
2866 verify(cls2 is cls)
2867
2868 a = C1(1, 2); a.append(42); a.append(24)
2869 b = C2("hello", "world", 42)
2870 s = p.dumps((a, b), bin)
2871 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002872 vereq(x.__class__, a.__class__)
2873 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2874 vereq(y.__class__, b.__class__)
2875 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002876 vereq(repr(x), repr(a))
2877 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002878 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002879 print("a = x =", a)
2880 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002881 # Test for __getstate__ and __setstate__ on new style class
2882 u = C3(42)
2883 s = p.dumps(u, bin)
2884 v = p.loads(s)
2885 veris(u.__class__, v.__class__)
2886 vereq(u.foo, v.foo)
2887 # Test for picklability of hybrid class
2888 u = C4()
2889 u.foo = 42
2890 s = p.dumps(u, bin)
2891 v = p.loads(s)
2892 veris(u.__class__, v.__class__)
2893 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002894
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002895 # Testing copy.deepcopy()
2896 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002897 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002898 import copy
2899 for cls in C, C1, C2:
2900 cls2 = copy.deepcopy(cls)
2901 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002902
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002903 a = C1(1, 2); a.append(42); a.append(24)
2904 b = C2("hello", "world", 42)
2905 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002906 vereq(x.__class__, a.__class__)
2907 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2908 vereq(y.__class__, b.__class__)
2909 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002910 vereq(repr(x), repr(a))
2911 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002912 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002913 print("a = x =", a)
2914 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002915
Guido van Rossum8c842552002-03-14 23:05:54 +00002916def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002917 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002918 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002919 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002920 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002921 global B, C, D, E
2922 class B(object):
2923 pass
2924 for base in [object, B]:
2925 class C(base):
2926 __slots__ = ['a']
2927 class D(C):
2928 pass
2929 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002930 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002931 except TypeError:
2932 pass
2933 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002934 raise TestFailed("should fail: pickle C instance - %s" % base)
Guido van Rossum8c842552002-03-14 23:05:54 +00002935 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002936 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002937 except TypeError:
2938 pass
2939 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002940 raise TestFailed("should fail: pickle D instance - %s" % base)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002941 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002942 class C(base):
2943 __slots__ = ['a']
2944 def __getstate__(self):
2945 try:
2946 d = self.__dict__.copy()
2947 except AttributeError:
2948 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002949 for cls in self.__class__.__mro__:
2950 for sn in cls.__dict__.get('__slots__', ()):
2951 try:
2952 d[sn] = getattr(self, sn)
2953 except AttributeError:
2954 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002955 return d
2956 def __setstate__(self, d):
2957 for k, v in d.items():
2958 setattr(self, k, v)
2959 class D(C):
2960 pass
2961 # Now it should work
2962 x = C()
2963 y = pickle.loads(pickle.dumps(x))
2964 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002965 x.a = 42
2966 y = pickle.loads(pickle.dumps(x))
2967 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00002968 x = D()
2969 x.a = 42
2970 x.b = 100
2971 y = pickle.loads(pickle.dumps(x))
2972 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002973 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002974 class E(C):
2975 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002976 x = E()
2977 x.a = 42
2978 x.b = "foo"
2979 y = pickle.loads(pickle.dumps(x))
2980 vereq(y.a, x.a)
2981 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002982
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002983def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002984 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002985 import copy
2986 class C(object):
2987 pass
2988
2989 a = C()
2990 a.foo = 12
2991 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002992 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002993
2994 a.bar = [1,2,3]
2995 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002996 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002997 verify(c.bar is a.bar)
2998
2999 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003000 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003001 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003002 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003003
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003004def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003005 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003006 class I(int):
3007 def __repr__(self):
3008 return "I(%r)" % int(self)
3009 def __add__(self, other):
3010 return I(int(self) + int(other))
3011 __radd__ = __add__
3012 def __pow__(self, other, mod=None):
3013 if mod is None:
3014 return I(pow(int(self), int(other)))
3015 else:
3016 return I(pow(int(self), int(other), int(mod)))
3017 def __rpow__(self, other, mod=None):
3018 if mod is None:
3019 return I(pow(int(other), int(self), mod))
3020 else:
3021 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003022
Walter Dörwald70a6b492004-02-12 17:35:32 +00003023 vereq(repr(I(1) + I(2)), "I(3)")
3024 vereq(repr(I(1) + 2), "I(3)")
3025 vereq(repr(1 + I(2)), "I(3)")
3026 vereq(repr(I(2) ** I(3)), "I(8)")
3027 vereq(repr(2 ** I(3)), "I(8)")
3028 vereq(repr(I(2) ** 3), "I(8)")
3029 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003030 class S(str):
3031 def __eq__(self, other):
3032 return self.lower() == other.lower()
3033
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003034def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003035 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003036 class A(object):
3037 pass
3038 class B(A):
3039 pass
3040 class C(A):
3041 pass
3042 class D(B, C):
3043 pass
3044 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003045 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003046 A.__hash__ = lambda self: 42
3047 vereq(hash(d), 42)
3048 C.__hash__ = lambda self: 314
3049 vereq(hash(d), 314)
3050 B.__hash__ = lambda self: 144
3051 vereq(hash(d), 144)
3052 D.__hash__ = lambda self: 100
3053 vereq(hash(d), 100)
3054 del D.__hash__
3055 vereq(hash(d), 144)
3056 del B.__hash__
3057 vereq(hash(d), 314)
3058 del C.__hash__
3059 vereq(hash(d), 42)
3060 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003061 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003062 d.foo = 42
3063 d.bar = 42
3064 vereq(d.foo, 42)
3065 vereq(d.bar, 42)
3066 def __getattribute__(self, name):
3067 if name == "foo":
3068 return 24
3069 return object.__getattribute__(self, name)
3070 A.__getattribute__ = __getattribute__
3071 vereq(d.foo, 24)
3072 vereq(d.bar, 42)
3073 def __getattr__(self, name):
3074 if name in ("spam", "foo", "bar"):
3075 return "hello"
Collin Winter3add4d72007-08-29 23:37:32 +00003076 raise AttributeError(name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003077 B.__getattr__ = __getattr__
3078 vereq(d.spam, "hello")
3079 vereq(d.foo, 24)
3080 vereq(d.bar, 42)
3081 del A.__getattribute__
3082 vereq(d.foo, 42)
3083 del d.foo
3084 vereq(d.foo, "hello")
3085 vereq(d.bar, 42)
3086 del B.__getattr__
3087 try:
3088 d.foo
3089 except AttributeError:
3090 pass
3091 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003092 raise TestFailed("d.foo should be undefined now")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003093
Guido van Rossume7f3e242002-06-14 02:35:45 +00003094 # Test a nasty bug in recurse_down_subclasses()
3095 import gc
3096 class A(object):
3097 pass
3098 class B(A):
3099 pass
3100 del B
3101 gc.collect()
3102 A.__setitem__ = lambda *a: None # crash
3103
Tim Petersfc57ccb2001-10-12 02:38:24 +00003104def buffer_inherit():
3105 import binascii
3106 # SF bug [#470040] ParseTuple t# vs subclasses.
3107 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003108 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003109
3110 class MyStr(str):
3111 pass
3112 base = 'abc'
3113 m = MyStr(base)
3114 # b2a_hex uses the buffer interface to get its argument's value, via
3115 # PyArg_ParseTuple 't#' code.
3116 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3117
3118 # It's not clear that unicode will continue to support the character
3119 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003120 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003121 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003122 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003123 m = MyUni(base)
3124 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3125
3126 class MyInt(int):
3127 pass
3128 m = MyInt(42)
3129 try:
3130 binascii.b2a_hex(m)
3131 raise TestFailed('subclass of int should not have a buffer interface')
3132 except TypeError:
3133 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003134
Tim Petersc9933152001-10-16 20:18:24 +00003135def str_of_str_subclass():
3136 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003137 import io
Tim Petersc9933152001-10-16 20:18:24 +00003138
3139 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003140 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003141
3142 class octetstring(str):
3143 def __str__(self):
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003144 return str(binascii.b2a_hex(self))
Tim Petersc9933152001-10-16 20:18:24 +00003145 def __repr__(self):
3146 return self + " repr"
3147
3148 o = octetstring('A')
3149 vereq(type(o), octetstring)
3150 vereq(type(str(o)), str)
3151 vereq(type(repr(o)), str)
3152 vereq(ord(o), 0x41)
3153 vereq(str(o), '41')
3154 vereq(repr(o), 'A repr')
3155 vereq(o.__str__(), '41')
3156 vereq(o.__repr__(), 'A repr')
3157
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003158 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003159 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003160 print(o, file=capture)
3161 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003162 vereq(capture.getvalue(), '41\n41\n')
3163 capture.close()
3164
Guido van Rossumc8e56452001-10-22 00:43:43 +00003165def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003166 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003167 def f(a): return a
3168 vereq(f.__call__(a=42), 42)
3169 a = []
3170 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003171 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003172
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003173def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003174 if verbose: print(("Testing recursive __call__() by setting to instance of "
3175 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003176 class A(object):
3177 pass
3178
3179 A.__call__ = A()
3180 try:
3181 A()()
3182 except RuntimeError:
3183 pass
3184 else:
3185 raise TestFailed("Recursion limit should have been reached for "
3186 "__call__()")
3187
Guido van Rossumed87ad82001-10-30 02:33:02 +00003188def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003189 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003190 log = []
3191 class C(object):
3192 def __del__(self):
3193 log.append(1)
3194 c = C()
3195 vereq(log, [])
3196 del c
3197 vereq(log, [1])
3198
Guido van Rossum29d26062001-12-11 04:37:34 +00003199 class D(object): pass
3200 d = D()
3201 try: del d[0]
3202 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003203 else: raise TestFailed("invalid del() didn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003204
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003205def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003206 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003207
3208 class mydict(dict):
3209 pass
3210 d = mydict()
3211 try:
3212 hash(d)
3213 except TypeError:
3214 pass
3215 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003216 raise TestFailed("hash() of dict subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003217
3218 class mylist(list):
3219 pass
3220 d = mylist()
3221 try:
3222 hash(d)
3223 except TypeError:
3224 pass
3225 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003226 raise TestFailed("hash() of list subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003227
Guido van Rossum29d26062001-12-11 04:37:34 +00003228def strops():
3229 try: 'a' + 5
3230 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003231 else: raise TestFailed("'' + 5 doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003232
3233 try: ''.split('')
3234 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003235 else: raise TestFailed("''.split('') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003236
3237 try: ''.join([0])
3238 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003239 else: raise TestFailed("''.join([0]) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003240
3241 try: ''.rindex('5')
3242 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003243 else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003244
Guido van Rossum29d26062001-12-11 04:37:34 +00003245 try: '%(n)s' % None
3246 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003247 else: raise TestFailed("'%(n)s' % None doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003248
3249 try: '%(n' % {}
3250 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003251 else: raise TestFailed("'%(n' % {} '' doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003252
3253 try: '%*s' % ('abc')
3254 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003255 else: raise TestFailed("'%*s' % ('abc') doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003256
3257 try: '%*.*s' % ('abc', 5)
3258 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003259 else: raise TestFailed("'%*.*s' % ('abc', 5) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003260
3261 try: '%s' % (1, 2)
3262 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003263 else: raise TestFailed("'%s' % (1, 2) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003264
3265 try: '%' % None
3266 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003267 else: raise TestFailed("'%' % None doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003268
3269 vereq('534253'.isdigit(), 1)
3270 vereq('534253x'.isdigit(), 0)
3271 vereq('%c' % 5, '\x05')
3272 vereq('%c' % '5', '5')
3273
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003274def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003275 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003276 class Node:
3277 pass
3278 a = Node()
3279 b = Node()
3280 a.b = b
3281 b.a = a
3282 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003283
Guido van Rossumd7035672002-03-12 20:43:31 +00003284def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003285 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003286 from types import ModuleType as M
3287 m = M.__new__(M)
3288 str(m)
3289 vereq(hasattr(m, "__name__"), 0)
3290 vereq(hasattr(m, "__file__"), 0)
3291 vereq(hasattr(m, "foo"), 0)
3292 vereq(m.__dict__, None)
3293 m.foo = 1
3294 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003295
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003296def dictproxyiterkeys():
3297 class C(object):
3298 def meth(self):
3299 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003300 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003301 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003302 keys.sort()
3303 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3304
3305def dictproxyitervalues():
3306 class C(object):
3307 def meth(self):
3308 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003309 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003310 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003311 vereq(len(values), 5)
3312
3313def dictproxyiteritems():
3314 class C(object):
3315 def meth(self):
3316 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003317 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003318 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003319 keys.sort()
3320 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3321
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003322def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003323 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003324 class C(object):
3325 def __new__(cls, arg):
3326 if isinstance(arg, str): return [1, 2, 3]
3327 elif isinstance(arg, int): return object.__new__(D)
3328 else: return object.__new__(cls)
3329 class D(C):
3330 def __init__(self, arg):
3331 self.foo = arg
3332 vereq(C("1"), [1, 2, 3])
3333 vereq(D("1"), [1, 2, 3])
3334 d = D(None)
3335 veris(d.foo, None)
3336 d = C(1)
3337 vereq(isinstance(d, D), True)
3338 vereq(d.foo, 1)
3339 d = D(1)
3340 vereq(isinstance(d, D), True)
3341 vereq(d.foo, 1)
3342
Guido van Rossume8fc6402002-04-16 16:44:51 +00003343def imulbug():
3344 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003345 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003346 class C(object):
3347 def __imul__(self, other):
3348 return (self, other)
3349 x = C()
3350 y = x
3351 y *= 1.0
3352 vereq(y, (x, 1.0))
3353 y = x
3354 y *= 2
3355 vereq(y, (x, 2))
3356 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003357 y *= 3
3358 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003359 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003360 y *= 1<<100
3361 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003362 y = x
3363 y *= None
3364 vereq(y, (x, None))
3365 y = x
3366 y *= "foo"
3367 vereq(y, (x, "foo"))
3368
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003369def docdescriptor():
3370 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003371 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003372 class DocDescr(object):
3373 def __get__(self, object, otype):
3374 if object:
3375 object = object.__class__.__name__ + ' instance'
3376 if otype:
3377 otype = otype.__name__
3378 return 'object=%s; type=%s' % (object, otype)
3379 class OldClass:
3380 __doc__ = DocDescr()
3381 class NewClass(object):
3382 __doc__ = DocDescr()
3383 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3384 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3385 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3386 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3387
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003388def copy_setstate():
3389 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003390 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003391 import copy
3392 class C(object):
3393 def __init__(self, foo=None):
3394 self.foo = foo
3395 self.__foo = foo
3396 def setfoo(self, foo=None):
3397 self.foo = foo
3398 def getfoo(self):
3399 return self.__foo
3400 def __getstate__(self):
3401 return [self.foo]
3402 def __setstate__(self, lst):
3403 assert len(lst) == 1
3404 self.__foo = self.foo = lst[0]
3405 a = C(42)
3406 a.setfoo(24)
3407 vereq(a.foo, 24)
3408 vereq(a.getfoo(), 42)
3409 b = copy.copy(a)
3410 vereq(b.foo, 24)
3411 vereq(b.getfoo(), 24)
3412 b = copy.deepcopy(a)
3413 vereq(b.foo, 24)
3414 vereq(b.getfoo(), 24)
3415
Guido van Rossum09638c12002-06-13 19:17:46 +00003416def slices():
3417 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003418 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003419 # Strings
3420 vereq("hello"[:4], "hell")
3421 vereq("hello"[slice(4)], "hell")
3422 vereq(str.__getitem__("hello", slice(4)), "hell")
3423 class S(str):
3424 def __getitem__(self, x):
3425 return str.__getitem__(self, x)
3426 vereq(S("hello")[:4], "hell")
3427 vereq(S("hello")[slice(4)], "hell")
3428 vereq(S("hello").__getitem__(slice(4)), "hell")
3429 # Tuples
3430 vereq((1,2,3)[:2], (1,2))
3431 vereq((1,2,3)[slice(2)], (1,2))
3432 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3433 class T(tuple):
3434 def __getitem__(self, x):
3435 return tuple.__getitem__(self, x)
3436 vereq(T((1,2,3))[:2], (1,2))
3437 vereq(T((1,2,3))[slice(2)], (1,2))
3438 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3439 # Lists
3440 vereq([1,2,3][:2], [1,2])
3441 vereq([1,2,3][slice(2)], [1,2])
3442 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3443 class L(list):
3444 def __getitem__(self, x):
3445 return list.__getitem__(self, x)
3446 vereq(L([1,2,3])[:2], [1,2])
3447 vereq(L([1,2,3])[slice(2)], [1,2])
3448 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3449 # Now do lists and __setitem__
3450 a = L([1,2,3])
3451 a[slice(1, 3)] = [3,2]
3452 vereq(a, [1,3,2])
3453 a[slice(0, 2, 1)] = [3,1]
3454 vereq(a, [3,1,2])
3455 a.__setitem__(slice(1, 3), [2,1])
3456 vereq(a, [3,2,1])
3457 a.__setitem__(slice(0, 2, 1), [2,3])
3458 vereq(a, [2,3,1])
3459
Tim Peters2484aae2002-07-11 06:56:07 +00003460def subtype_resurrection():
3461 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003462 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003463
3464 class C(object):
3465 container = []
3466
3467 def __del__(self):
3468 # resurrect the instance
3469 C.container.append(self)
3470
3471 c = C()
3472 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003473 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003474 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003475 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003476
3477 # If that didn't blow up, it's also interesting to see whether clearing
3478 # the last container slot works: that will attempt to delete c again,
3479 # which will cause c to get appended back to the container again "during"
3480 # the del.
3481 del C.container[-1]
3482 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003483 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003484
Tim Peters14cb1e12002-07-11 18:26:21 +00003485 # Make c mortal again, so that the test framework with -l doesn't report
3486 # it as a leak.
3487 del C.__del__
3488
Guido van Rossum2d702462002-08-06 21:28:28 +00003489def slottrash():
3490 # Deallocating deeply nested slotted trash caused stack overflows
3491 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003492 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003493 class trash(object):
3494 __slots__ = ['x']
3495 def __init__(self, x):
3496 self.x = x
3497 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003498 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003499 o = trash(o)
3500 del o
3501
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003502def slotmultipleinheritance():
3503 # SF bug 575229, multiple inheritance w/ slots dumps core
3504 class A(object):
3505 __slots__=()
3506 class B(object):
3507 pass
3508 class C(A,B) :
3509 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003510 vereq(C.__basicsize__, B.__basicsize__)
3511 verify(hasattr(C, '__dict__'))
3512 verify(hasattr(C, '__weakref__'))
3513 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003514
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003515def testrmul():
3516 # SF patch 592646
3517 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003518 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003519 class C(object):
3520 def __mul__(self, other):
3521 return "mul"
3522 def __rmul__(self, other):
3523 return "rmul"
3524 a = C()
3525 vereq(a*2, "mul")
3526 vereq(a*2.2, "mul")
3527 vereq(2*a, "rmul")
3528 vereq(2.2*a, "rmul")
3529
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003530def testipow():
3531 # [SF bug 620179]
3532 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003533 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003534 class C(object):
3535 def __ipow__(self, other):
3536 pass
3537 a = C()
3538 a **= 2
3539
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003540def do_this_first():
3541 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003542 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003543 # This dumps core when SF bug 551412 isn't fixed --
3544 # but only when test_descr.py is run separately.
3545 # (That can't be helped -- as soon as PyType_Ready()
3546 # is called for PyLong_Type, the bug is gone.)
3547 class UserLong(object):
3548 def __pow__(self, *args):
3549 pass
3550 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003551 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003552 except:
3553 pass
3554
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003555 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003556 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003557 # Another segfault only when run early
3558 # (before PyType_Ready(tuple) is called)
3559 type.mro(tuple)
3560
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003561def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003562 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003563 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003564 # stuff that should work:
3565 class C(object):
3566 pass
3567 class C2(object):
3568 def __getattribute__(self, attr):
3569 if attr == 'a':
3570 return 2
3571 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003572 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003573 def meth(self):
3574 return 1
3575 class D(C):
3576 pass
3577 class E(D):
3578 pass
3579 d = D()
3580 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003581 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003582 D.__bases__ = (C2,)
3583 vereq(d.meth(), 1)
3584 vereq(e.meth(), 1)
3585 vereq(d.a, 2)
3586 vereq(e.a, 2)
3587 vereq(C2.__subclasses__(), [D])
3588
3589 # stuff that shouldn't:
3590 class L(list):
3591 pass
3592
3593 try:
3594 L.__bases__ = (dict,)
3595 except TypeError:
3596 pass
3597 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003598 raise TestFailed("shouldn't turn list subclass into dict subclass")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003599
3600 try:
3601 list.__bases__ = (dict,)
3602 except TypeError:
3603 pass
3604 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003605 raise TestFailed("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003606
3607 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003608 D.__bases__ = (C2, list)
3609 except TypeError:
3610 pass
3611 else:
3612 assert 0, "best_base calculation found wanting"
3613
3614 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003615 del D.__bases__
3616 except TypeError:
3617 pass
3618 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003619 raise TestFailed("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003620
3621 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003622 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003623 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003624 if str(msg) == "a new-style class can't have only classic bases":
Collin Winter3add4d72007-08-29 23:37:32 +00003625 raise TestFailed("wrong error message for .__bases__ = ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003626 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003627 raise TestFailed("shouldn't be able to set .__bases__ to ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003628
3629 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003630 D.__bases__ = (D,)
3631 except TypeError:
3632 pass
3633 else:
3634 # actually, we'll have crashed by here...
Collin Winter3add4d72007-08-29 23:37:32 +00003635 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003636
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003637 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003638 D.__bases__ = (C, C)
3639 except TypeError:
3640 pass
3641 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003642 raise TestFailed("didn't detect repeated base classes")
Michael W. Hudsone723e452003-08-07 14:58:10 +00003643
3644 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003645 D.__bases__ = (E,)
3646 except TypeError:
3647 pass
3648 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003649 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003650
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003651def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003652 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003653 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003654 class WorkOnce(type):
3655 def __new__(self, name, bases, ns):
3656 self.flag = 0
3657 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3658 def mro(self):
3659 if self.flag > 0:
Collin Winter3add4d72007-08-29 23:37:32 +00003660 raise RuntimeError("bozo")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003661 else:
3662 self.flag += 1
3663 return type.mro(self)
3664
3665 class WorkAlways(type):
3666 def mro(self):
3667 # this is here to make sure that .mro()s aren't called
3668 # with an exception set (which was possible at one point).
3669 # An error message will be printed in a debug build.
3670 # What's a good way to test for this?
3671 return type.mro(self)
3672
3673 class C(object):
3674 pass
3675
3676 class C2(object):
3677 pass
3678
3679 class D(C):
3680 pass
3681
3682 class E(D):
3683 pass
3684
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003685 class F(D, metaclass=WorkOnce):
3686 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003687
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003688 class G(D, metaclass=WorkAlways):
3689 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003690
3691 # Immediate subclasses have their mro's adjusted in alphabetical
3692 # order, so E's will get adjusted before adjusting F's fails. We
3693 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003694
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003695 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003696 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003697
3698 try:
3699 D.__bases__ = (C2,)
3700 except RuntimeError:
3701 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003702 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003703 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003704 raise TestFailed("exception not propagated")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003705
3706def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003707 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003708 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003709 class A(object):
3710 pass
3711
3712 class B(object):
3713 pass
3714
3715 class C(A, B):
3716 pass
3717
3718 class D(A, B):
3719 pass
3720
3721 class E(C, D):
3722 pass
3723
3724 try:
3725 C.__bases__ = (B, A)
3726 except TypeError:
3727 pass
3728 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003729 raise TestFailed("didn't catch MRO conflict")
Tim Peters6578dc92002-12-24 18:31:27 +00003730
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003731def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003732 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003733 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003734 class C(object):
3735 pass
3736
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003737 # C.__module__ could be 'test_descr' or '__main__'
3738 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003739
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003740 C.__name__ = 'D'
3741 vereq((C.__module__, C.__name__), (mod, 'D'))
3742
3743 C.__name__ = 'D.E'
3744 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003745
Guido van Rossum613f24f2003-01-06 23:00:59 +00003746def subclass_right_op():
3747 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003748 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003749
3750 # This code tests various cases where right-dispatch of a subclass
3751 # should be preferred over left-dispatch of a base class.
3752
3753 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3754
3755 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003756 def __floordiv__(self, other):
3757 return "B.__floordiv__"
3758 def __rfloordiv__(self, other):
3759 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003760
Guido van Rossumf389c772003-02-27 20:04:19 +00003761 vereq(B(1) // 1, "B.__floordiv__")
3762 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003763
3764 # Case 2: subclass of object; this is just the baseline for case 3
3765
3766 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003767 def __floordiv__(self, other):
3768 return "C.__floordiv__"
3769 def __rfloordiv__(self, other):
3770 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003771
Guido van Rossumf389c772003-02-27 20:04:19 +00003772 vereq(C() // 1, "C.__floordiv__")
3773 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003774
3775 # Case 3: subclass of new-style class; here it gets interesting
3776
3777 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003778 def __floordiv__(self, other):
3779 return "D.__floordiv__"
3780 def __rfloordiv__(self, other):
3781 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003782
Guido van Rossumf389c772003-02-27 20:04:19 +00003783 vereq(D() // C(), "D.__floordiv__")
3784 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003785
3786 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3787
3788 class E(C):
3789 pass
3790
Guido van Rossumf389c772003-02-27 20:04:19 +00003791 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003792
Guido van Rossumf389c772003-02-27 20:04:19 +00003793 vereq(E() // 1, "C.__floordiv__")
3794 vereq(1 // E(), "C.__rfloordiv__")
3795 vereq(E() // C(), "C.__floordiv__")
3796 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003797
Guido van Rossum373c7412003-01-07 13:41:37 +00003798def dict_type_with_metaclass():
3799 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003800 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003801
3802 class B(object):
3803 pass
3804 class M(type):
3805 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003806 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003807 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003808 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003809 veris(type(C.__dict__), type(B.__dict__))
3810
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003811def meth_class_get():
3812 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003813 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003814 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003815 # Baseline
3816 arg = [1, 2, 3]
3817 res = {1: None, 2: None, 3: None}
3818 vereq(dict.fromkeys(arg), res)
3819 vereq({}.fromkeys(arg), res)
3820 # Now get the descriptor
3821 descr = dict.__dict__["fromkeys"]
3822 # More baseline using the descriptor directly
3823 vereq(descr.__get__(None, dict)(arg), res)
3824 vereq(descr.__get__({})(arg), res)
3825 # Now check various error cases
3826 try:
3827 descr.__get__(None, None)
3828 except TypeError:
3829 pass
3830 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003831 raise TestFailed("shouldn't have allowed descr.__get__(None, None)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003832 try:
3833 descr.__get__(42)
3834 except TypeError:
3835 pass
3836 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003837 raise TestFailed("shouldn't have allowed descr.__get__(42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003838 try:
3839 descr.__get__(None, 42)
3840 except TypeError:
3841 pass
3842 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003843 raise TestFailed("shouldn't have allowed descr.__get__(None, 42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003844 try:
3845 descr.__get__(None, int)
3846 except TypeError:
3847 pass
3848 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003849 raise TestFailed("shouldn't have allowed descr.__get__(None, int)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003850
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003851def isinst_isclass():
3852 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003853 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003854 class Proxy(object):
3855 def __init__(self, obj):
3856 self.__obj = obj
3857 def __getattribute__(self, name):
3858 if name.startswith("_Proxy__"):
3859 return object.__getattribute__(self, name)
3860 else:
3861 return getattr(self.__obj, name)
3862 # Test with a classic class
3863 class C:
3864 pass
3865 a = C()
3866 pa = Proxy(a)
3867 verify(isinstance(a, C)) # Baseline
3868 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003869 # Test with a classic subclass
3870 class D(C):
3871 pass
3872 a = D()
3873 pa = Proxy(a)
3874 verify(isinstance(a, C)) # Baseline
3875 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003876 # Test with a new-style class
3877 class C(object):
3878 pass
3879 a = C()
3880 pa = Proxy(a)
3881 verify(isinstance(a, C)) # Baseline
3882 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003883 # Test with a new-style subclass
3884 class D(C):
3885 pass
3886 a = D()
3887 pa = Proxy(a)
3888 verify(isinstance(a, C)) # Baseline
3889 verify(isinstance(pa, C)) # Test
3890
3891def proxysuper():
3892 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003893 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003894 class Proxy(object):
3895 def __init__(self, obj):
3896 self.__obj = obj
3897 def __getattribute__(self, name):
3898 if name.startswith("_Proxy__"):
3899 return object.__getattribute__(self, name)
3900 else:
3901 return getattr(self.__obj, name)
3902
3903 class B(object):
3904 def f(self):
3905 return "B.f"
3906
3907 class C(B):
3908 def f(self):
3909 return super(C, self).f() + "->C.f"
3910
3911 obj = C()
3912 p = Proxy(obj)
3913 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003914
Guido van Rossum52b27052003-04-15 20:05:10 +00003915def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003916 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003917 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003918 try:
3919 object.__setattr__(str, "foo", 42)
3920 except TypeError:
3921 pass
3922 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003923 raise TestFailed("Carlo Verre __setattr__ suceeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003924 try:
3925 object.__delattr__(str, "lower")
3926 except TypeError:
3927 pass
3928 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003929 raise TestFailed("Carlo Verre __delattr__ succeeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003930
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003931def weakref_segfault():
3932 # SF 742911
3933 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003934 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003935
3936 import weakref
3937
3938 class Provoker:
3939 def __init__(self, referrent):
3940 self.ref = weakref.ref(referrent)
3941
3942 def __del__(self):
3943 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003944
3945 class Oops(object):
3946 pass
3947
3948 o = Oops()
3949 o.whatever = Provoker(o)
3950 del o
3951
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003952def wrapper_segfault():
3953 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003954 if verbose:
3955 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003956 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00003957 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003958 f = f.__call__
3959 f = None
3960
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003961# Fix SF #762455, segfault when sys.stdout is changed in getattr
3962def filefault():
3963 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003964 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003965 import sys
3966 class StdoutGuard:
3967 def __getattr__(self, attr):
3968 sys.stdout = sys.__stdout__
3969 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3970 sys.stdout = StdoutGuard()
3971 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003972 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003973 except RuntimeError:
3974 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003975
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003976def vicious_descriptor_nonsense():
3977 # A potential segfault spotted by Thomas Wouters in mail to
3978 # python-dev 2003-04-17, turned into an example & fixed by Michael
3979 # Hudson just less than four months later...
3980 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003981 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003982
3983 class Evil(object):
3984 def __hash__(self):
3985 return hash('attr')
3986 def __eq__(self, other):
3987 del C.attr
3988 return 0
3989
3990 class Descr(object):
3991 def __get__(self, ob, type=None):
3992 return 1
3993
3994 class C(object):
3995 attr = Descr()
3996
3997 c = C()
3998 c.__dict__[Evil()] = 0
3999
4000 vereq(c.attr, 1)
4001 # this makes a crash more likely:
4002 import gc; gc.collect()
4003 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004004
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004005def test_init():
4006 # SF 1155938
4007 class Foo(object):
4008 def __init__(self):
4009 return 10
4010 try:
4011 Foo()
4012 except TypeError:
4013 pass
4014 else:
Collin Winter3add4d72007-08-29 23:37:32 +00004015 raise TestFailed("did not test __init__() for None return")
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004016
Armin Rigoc6686b72005-11-07 08:38:00 +00004017def methodwrapper():
4018 # <type 'method-wrapper'> did not support any reflection before 2.5
4019 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004020 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004021
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004022 return # XXX should methods really support __eq__?
4023
Armin Rigoc6686b72005-11-07 08:38:00 +00004024 l = []
4025 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004026 vereq(l.__add__, [].__add__)
4027 verify(l.__add__ != [5].__add__)
4028 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004029 verify(l.__add__.__name__ == '__add__')
4030 verify(l.__add__.__self__ is l)
4031 verify(l.__add__.__objclass__ is list)
4032 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004033 try:
4034 hash(l.__add__)
4035 except TypeError:
4036 pass
4037 else:
4038 raise TestFailed("no TypeError from hash([].__add__)")
4039
4040 t = ()
4041 t += (7,)
4042 vereq(t.__add__, (7,).__add__)
4043 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004044
Armin Rigofd163f92005-12-29 15:59:19 +00004045def notimplemented():
4046 # all binary methods should be able to return a NotImplemented
4047 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004048 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004049
4050 import sys
4051 import types
4052 import operator
4053
4054 def specialmethod(self, other):
4055 return NotImplemented
4056
4057 def check(expr, x, y):
4058 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004059 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004060 except TypeError:
4061 pass
4062 else:
4063 raise TestFailed("no TypeError from %r" % (expr,))
4064
Guido van Rossume2a383d2007-01-15 16:59:06 +00004065 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004066 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4067 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004068 if 1:
4069 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004070 for name, expr, iexpr in [
4071 ('__add__', 'x + y', 'x += y'),
4072 ('__sub__', 'x - y', 'x -= y'),
4073 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004074 ('__truediv__', 'x / y', None),
4075 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004076 ('__mod__', 'x % y', 'x %= y'),
4077 ('__divmod__', 'divmod(x, y)', None),
4078 ('__pow__', 'x ** y', 'x **= y'),
4079 ('__lshift__', 'x << y', 'x <<= y'),
4080 ('__rshift__', 'x >> y', 'x >>= y'),
4081 ('__and__', 'x & y', 'x &= y'),
4082 ('__or__', 'x | y', 'x |= y'),
4083 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004084 ]:
4085 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004086 A = metaclass('A', (), {name: specialmethod})
4087 B = metaclass('B', (), {rname: specialmethod})
4088 a = A()
4089 b = B()
4090 check(expr, a, a)
4091 check(expr, a, b)
4092 check(expr, b, a)
4093 check(expr, b, b)
4094 check(expr, a, N1)
4095 check(expr, a, N2)
4096 check(expr, N1, b)
4097 check(expr, N2, b)
4098 if iexpr:
4099 check(iexpr, a, a)
4100 check(iexpr, a, b)
4101 check(iexpr, b, a)
4102 check(iexpr, b, b)
4103 check(iexpr, a, N1)
4104 check(iexpr, a, N2)
4105 iname = '__i' + name[2:]
4106 C = metaclass('C', (), {iname: specialmethod})
4107 c = C()
4108 check(iexpr, c, a)
4109 check(iexpr, c, b)
4110 check(iexpr, c, N1)
4111 check(iexpr, c, N2)
4112
Guido van Rossumd8faa362007-04-27 19:54:29 +00004113def test_assign_slice():
4114 # ceval.c's assign_slice used to check for
4115 # tp->tp_as_sequence->sq_slice instead of
4116 # tp->tp_as_sequence->sq_ass_slice
4117
4118 class C(object):
4119 def __setslice__(self, start, stop, value):
4120 self.value = value
4121
4122 c = C()
4123 c[1:2] = 3
4124 vereq(c.value, 3)
4125
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004126def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004127 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004128 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004129 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004130 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004131 lists()
4132 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004133 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004134 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004135 ints()
4136 longs()
4137 floats()
4138 complexes()
4139 spamlists()
4140 spamdicts()
4141 pydicts()
4142 pylists()
4143 metaclass()
4144 pymods()
4145 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004146 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004147 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004148 ex5()
4149 monotonicity()
4150 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004151 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004152 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004153 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004154 dynamics()
4155 errors()
4156 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004157 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004158 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004159 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004160 classic()
4161 compattr()
4162 newslot()
4163 altmro()
4164 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004165 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004166 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004167 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004168 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004169 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004170 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004171 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004172 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004173 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004174 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004175 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004176 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004177 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004178 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004179 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004180 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004181 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004182 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004183 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004184 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004185 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004186 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004187 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004188 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004189 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004190 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004191 dictproxyiterkeys()
4192 dictproxyitervalues()
4193 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004194 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004195 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004196 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004197 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004198 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004199 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004200 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004201 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004202 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004203 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004204 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004205 test_mutable_bases()
4206 test_mutable_bases_with_failing_mro()
4207 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004208 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004209 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004210 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004211 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004212 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004213 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004214 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004215 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004216 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004217 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004218 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004219 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004220 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004221
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004222 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004223
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004224if __name__ == "__main__":
4225 test_main()