blob: 8daa1a3efa00b98c43a22803f12292d6e115fdc3 [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:
15 raise TestFailed, "%r is %r" % (a, b)
16
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:
Neal Norwitz1af5e352002-03-11 14:44:12 +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 Rossum0eb2a6e2001-10-09 11:07:24 +0000445 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000446 class Number(complex):
447 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000448 def __new__(cls, *args, **kwds):
449 result = complex.__new__(cls, *args)
450 result.prec = kwds.get('prec', 12)
451 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000452 def __repr__(self):
453 prec = self.prec
454 if self.imag == 0.0:
455 return "%.*g" % (prec, self.real)
456 if self.real == 0.0:
457 return "%.*gj" % (prec, self.imag)
458 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
459 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000460
Tim Peters6d6c1a32001-08-02 04:15:00 +0000461 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000462 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000463 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000464
Tim Peters3f996e72001-09-13 19:18:27 +0000465 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000466 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000467 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000468
469 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000470 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000471 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000472
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473def spamlists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000474 if verbose: print("Testing spamlist operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475 import copy, xxsubtype as spam
476 def spamlist(l, memo=None):
477 import xxsubtype as spam
478 return spam.spamlist(l)
479 # This is an ugly hack:
480 copy._deepcopy_dispatch[spam.spamlist] = spamlist
481
482 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
483 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
484 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
485 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
486 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
487 "a[b:c]", "__getslice__")
488 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
489 "a+=b", "__iadd__")
490 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
491 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
492 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
493 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
494 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
495 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
496 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
497 # Test subclassing
498 class C(spam.spamlist):
499 def foo(self): return 1
500 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000501 vereq(a, [])
502 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000503 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000504 vereq(a, [100])
505 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000507 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000508
509def spamdicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000510 if verbose: print("Testing spamdict operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000511 import copy, xxsubtype as spam
512 def spamdict(d, memo=None):
513 import xxsubtype as spam
514 sd = spam.spamdict()
515 for k, v in d.items(): sd[k] = v
516 return sd
517 # This is an ugly hack:
518 copy._deepcopy_dispatch[spam.spamdict] = spamdict
519
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000520 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000521 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
522 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
523 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
524 d = spamdict({1:2,3:4})
525 l1 = []
526 for i in d.keys(): l1.append(i)
527 l = []
528 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000529 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000530 l = []
531 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000532 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000533 l = []
534 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000535 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000536 straightd = {1:2, 3:4}
537 spamd = spamdict(straightd)
538 testunop(spamd, 2, "len(a)", "__len__")
539 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
540 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
541 "a[b]=c", "__setitem__")
542 # Test subclassing
543 class C(spam.spamdict):
544 def foo(self): return 1
545 a = C()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000546 vereq(list(a.items()), [])
Guido van Rossum45704552001-10-08 16:35:45 +0000547 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000548 a['foo'] = 'bar'
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000549 vereq(list(a.items()), [('foo', 'bar')])
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000552 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000553
554def pydicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000555 if verbose: print("Testing Python subclass of dict...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000556 verify(issubclass(dict, dict))
557 verify(isinstance({}, dict))
558 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000559 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000560 verify(d.__class__ is dict)
561 verify(isinstance(d, dict))
562 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000563 state = -1
564 def __init__(self, *a, **kw):
565 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000566 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000567 self.state = a[0]
568 if kw:
569 for k, v in kw.items(): self[v] = k
570 def __getitem__(self, key):
571 return self.get(key, 0)
572 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000573 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000574 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575 def setstate(self, state):
576 self.state = state
577 def getstate(self):
578 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000579 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000581 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000584 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000585 vereq(a.state, -1)
586 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000587 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000588 vereq(a.state, 0)
589 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000590 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000591 vereq(a.state, 10)
592 vereq(a.getstate(), 10)
593 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000594 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000595 vereq(a[42], 24)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000596 if verbose: print("pydict stress test ...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597 N = 50
598 for i in range(N):
599 a[i] = C()
600 for j in range(N):
601 a[i][j] = i*j
602 for i in range(N):
603 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000604 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000605
606def pylists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000607 if verbose: print("Testing Python subclass of list...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000608 class C(list):
609 def __getitem__(self, i):
610 return list.__getitem__(self, i) + 100
611 def __getslice__(self, i, j):
612 return (i, j)
613 a = C()
614 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000615 vereq(a[0], 100)
616 vereq(a[1], 101)
617 vereq(a[2], 102)
618 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000619
620def metaclass():
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000621 if verbose: print("Testing metaclass...")
622 class C(metaclass=type):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000623 def __init__(self):
624 self.__state = 0
625 def getstate(self):
626 return self.__state
627 def setstate(self, state):
628 self.__state = state
629 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000630 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000631 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000632 vereq(a.getstate(), 10)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000633 class _metaclass(type):
634 def myself(cls): return cls
635 class D(metaclass=_metaclass):
636 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000637 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000638 d = D()
639 verify(d.__class__ is D)
640 class M1(type):
641 def __new__(cls, name, bases, dict):
642 dict['__spam__'] = 1
643 return type.__new__(cls, name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000644 class C(metaclass=M1):
645 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000646 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000647 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000648 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000649
Guido van Rossum309b5662001-08-17 11:43:17 +0000650 class _instance(object):
651 pass
652 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000653 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000654 def __new__(cls, name, bases, dict):
655 self = object.__new__(cls)
656 self.name = name
657 self.bases = bases
658 self.dict = dict
659 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000660 def __call__(self):
661 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000662 # Early binding of methods
663 for key in self.dict:
664 if key.startswith("__"):
665 continue
666 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000667 return it
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000668 class C(metaclass=M2):
Guido van Rossum309b5662001-08-17 11:43:17 +0000669 def spam(self):
670 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000671 vereq(C.name, 'C')
672 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000673 verify('spam' in C.dict)
674 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000675 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000676
Guido van Rossum91ee7982001-08-30 20:52:40 +0000677 # More metaclass examples
678
679 class autosuper(type):
680 # Automatically add __super to the class
681 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000683 cls = super(autosuper, metaclass).__new__(metaclass,
684 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000685 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000686 while name[:1] == "_":
687 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000688 if name:
689 name = "_%s__super" % name
690 else:
691 name = "__super"
692 setattr(cls, name, super(cls))
693 return cls
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000694 class A(metaclass=autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000695 def meth(self):
696 return "A"
697 class B(A):
698 def meth(self):
699 return "B" + self.__super.meth()
700 class C(A):
701 def meth(self):
702 return "C" + self.__super.meth()
703 class D(C, B):
704 def meth(self):
705 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000706 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000707 class E(B, C):
708 def meth(self):
709 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000710 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000711
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000712 class autoproperty(type):
713 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000714 # named _get_x and/or _set_x are found
715 def __new__(metaclass, name, bases, dict):
716 hits = {}
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000717 for key, val in dict.items():
Guido van Rossum91ee7982001-08-30 20:52:40 +0000718 if key.startswith("_get_"):
719 key = key[5:]
720 get, set = hits.get(key, (None, None))
721 get = val
722 hits[key] = get, set
723 elif key.startswith("_set_"):
724 key = key[5:]
725 get, set = hits.get(key, (None, None))
726 set = val
727 hits[key] = get, set
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000728 for key, (get, set) in hits.items():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000729 dict[key] = property(get, set)
730 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000732 class A(metaclass=autoproperty):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000733 def _get_x(self):
734 return -self.__x
735 def _set_x(self, x):
736 self.__x = -x
737 a = A()
738 verify(not hasattr(a, "x"))
739 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000740 vereq(a.x, 12)
741 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000742
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000743 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000744 # Merge of multiple cooperating metaclasses
745 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000746 class A(metaclass=multimetaclass):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000747 def _get_x(self):
748 return "A"
749 class B(A):
750 def _get_x(self):
751 return "B" + self.__super._get_x()
752 class C(A):
753 def _get_x(self):
754 return "C" + self.__super._get_x()
755 class D(C, B):
756 def _get_x(self):
757 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000758 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000759
Guido van Rossumf76de622001-10-18 15:49:21 +0000760 # Make sure type(x) doesn't call x.__class__.__init__
761 class T(type):
762 counter = 0
763 def __init__(self, *args):
764 T.counter += 1
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000765 class C(metaclass=T):
766 pass
Guido van Rossumf76de622001-10-18 15:49:21 +0000767 vereq(T.counter, 1)
768 a = C()
769 vereq(type(a), C)
770 vereq(T.counter, 1)
771
Guido van Rossum29d26062001-12-11 04:37:34 +0000772 class C(object): pass
773 c = C()
774 try: c()
775 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000776 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000777
Guido van Rossumd8faa362007-04-27 19:54:29 +0000778 # Testing code to find most derived baseclass
779 class A(type):
780 def __new__(*args, **kwargs):
781 return type.__new__(*args, **kwargs)
782
783 class B(object):
784 pass
785
786 class C(object, metaclass=A):
787 pass
788
789 # The most derived metaclass of D is A rather than type.
790 class D(B, C):
791 pass
792
793
Tim Peters6d6c1a32001-08-02 04:15:00 +0000794def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000795 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000796 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000797 import sys
798 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000800 def __init__(self, name):
801 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000802 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000804 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000805 def __setattr__(self, name, value):
806 log.append(("setattr", name, value))
807 MT.__setattr__(self, name, value)
808 def __delattr__(self, name):
809 log.append(("delattr", name))
810 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000811 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000812 a.foo = 12
813 x = a.foo
814 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000815 vereq(log, [("setattr", "foo", 12),
816 ("getattr", "foo"),
817 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000818
Guido van Rossum360e4b82007-05-14 22:51:27 +0000819 # http://python.org/sf/1174712
820 try:
821 class Module(types.ModuleType, str):
822 pass
823 except TypeError:
824 pass
825 else:
826 raise TestFailed("inheriting from ModuleType and str at the "
827 "same time should fail")
828
Tim Peters6d6c1a32001-08-02 04:15:00 +0000829def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000830 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831 class C(object):
832 def __init__(self):
833 self.__state = 0
834 def getstate(self):
835 return self.__state
836 def setstate(self, state):
837 self.__state = state
838 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000839 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000841 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000842 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 def __init__(self):
844 type({}).__init__(self)
845 C.__init__(self)
846 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000847 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000849 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000850 vereq(d["hello"], "world")
851 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000852 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000853 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000854 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855
Guido van Rossume45763a2001-08-10 21:28:46 +0000856 # SF bug #442833
857 class Node(object):
858 def __int__(self):
859 return int(self.foo())
860 def foo(self):
861 return "23"
862 class Frag(Node, list):
863 def foo(self):
864 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000865 vereq(Node().__int__(), 23)
866 vereq(int(Node()), 23)
867 vereq(Frag().__int__(), 42)
868 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000869
Tim Peters6d6c1a32001-08-02 04:15:00 +0000870def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000871 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000872 class A(object):
873 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000874 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875 class B(A):
876 def boo(self): return "B"
877 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000878 vereq(B().spam(), "B")
879 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000880 class C(A):
881 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000882 vereq(C().spam(), "A")
883 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000884 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000885 vereq(D().spam(), "B")
886 vereq(D().boo(), "B")
887 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000888 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000889 vereq(E().spam(), "B")
890 vereq(E().boo(), "C")
891 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000892 # MRO order disagreement
893 try:
894 class F(D, E): pass
895 except TypeError:
896 pass
897 else:
898 raise TestFailed, "expected MRO order disagreement (F)"
899 try:
900 class G(E, D): pass
901 except TypeError:
902 pass
903 else:
904 raise TestFailed, "expected MRO order disagreement (G)"
905
906
907# see thread python-dev/2002-October/029035.html
908def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000909 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000910 class A(object): pass
911 class B(object): pass
912 class C(object): pass
913 class X(A): pass
914 class Y(A): pass
915 class Z(X,B,Y,C): pass
916 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
917
918# see "A Monotonic Superclass Linearization for Dylan",
919# by Kim Barrett et al. (OOPSLA 1996)
920def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000921 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000922 class Boat(object): pass
923 class DayBoat(Boat): pass
924 class WheelBoat(Boat): pass
925 class EngineLess(DayBoat): pass
926 class SmallMultihull(DayBoat): pass
927 class PedalWheelBoat(EngineLess,WheelBoat): pass
928 class SmallCatamaran(SmallMultihull): pass
929 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
930
931 vereq(PedalWheelBoat.__mro__,
932 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
933 object))
934 vereq(SmallCatamaran.__mro__,
935 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
936
937 vereq(Pedalo.__mro__,
938 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
939 SmallMultihull, DayBoat, WheelBoat, Boat, object))
940
941# see "A Monotonic Superclass Linearization for Dylan",
942# by Kim Barrett et al. (OOPSLA 1996)
943def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000944 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000945 class Pane(object): pass
946 class ScrollingMixin(object): pass
947 class EditingMixin(object): pass
948 class ScrollablePane(Pane,ScrollingMixin): pass
949 class EditablePane(Pane,EditingMixin): pass
950 class EditableScrollablePane(ScrollablePane,EditablePane): pass
951
952 vereq(EditableScrollablePane.__mro__,
953 (EditableScrollablePane, ScrollablePane, EditablePane,
954 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000955
Raymond Hettingerf394df42003-04-06 19:13:41 +0000956mro_err_msg = """Cannot create a consistent method resolution
957order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000958
Guido van Rossumd32047f2002-11-25 21:38:52 +0000959def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000960 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000961 def raises(exc, expected, callable, *args):
962 try:
963 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000964 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000965 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +0000966 raise TestFailed, "Message %r, expected %r" % (str(msg),
967 expected)
968 else:
969 raise TestFailed, "Expected %s" % exc
970 class A(object): pass
971 class B(A): pass
972 class C(object): pass
973 # Test some very simple errors
974 raises(TypeError, "duplicate base class A",
975 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000976 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000977 type, "X", (A, B), {})
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, C, B), {})
980 # Test a slightly more complex error
981 class GridLayout(object): pass
982 class HorizontalGrid(GridLayout): pass
983 class VerticalGrid(GridLayout): pass
984 class HVGrid(HorizontalGrid, VerticalGrid): pass
985 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000986 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000987 type, "ConfusedGrid", (HVGrid, VHGrid), {})
988
Guido van Rossum37202612001-08-09 19:45:21 +0000989def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000990 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000991 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000992 vereq(a.__class__, object)
993 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000994 b = object()
995 verify(a is not b)
996 verify(not hasattr(a, "foo"))
997 try:
998 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000999 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001000 pass
1001 else:
1002 verify(0, "object() should not allow setting a foo attribute")
1003 verify(not hasattr(object(), "__dict__"))
1004
1005 class Cdict(object):
1006 pass
1007 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001008 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001009 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001010 vereq(x.foo, 1)
1011 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001012
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001014 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001015 class C0(object):
1016 __slots__ = []
1017 x = C0()
1018 verify(not hasattr(x, "__dict__"))
1019 verify(not hasattr(x, "foo"))
1020
1021 class C1(object):
1022 __slots__ = ['a']
1023 x = C1()
1024 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001025 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001026 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001027 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001028 x.a = None
1029 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001030 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001031 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001032
1033 class C3(object):
1034 __slots__ = ['a', 'b', 'c']
1035 x = C3()
1036 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001037 verify(not hasattr(x, 'a'))
1038 verify(not hasattr(x, 'b'))
1039 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001040 x.a = 1
1041 x.b = 2
1042 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001043 vereq(x.a, 1)
1044 vereq(x.b, 2)
1045 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001046
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001047 class C4(object):
1048 """Validate name mangling"""
1049 __slots__ = ['__a']
1050 def __init__(self, value):
1051 self.__a = value
1052 def get(self):
1053 return self.__a
1054 x = C4(5)
1055 verify(not hasattr(x, '__dict__'))
1056 verify(not hasattr(x, '__a'))
1057 vereq(x.get(), 5)
1058 try:
1059 x.__a = 6
1060 except AttributeError:
1061 pass
1062 else:
1063 raise TestFailed, "Double underscored names not mangled"
1064
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001065 # Make sure slot names are proper identifiers
1066 try:
1067 class C(object):
1068 __slots__ = [None]
1069 except TypeError:
1070 pass
1071 else:
1072 raise TestFailed, "[None] slots not caught"
1073 try:
1074 class C(object):
1075 __slots__ = ["foo bar"]
1076 except TypeError:
1077 pass
1078 else:
1079 raise TestFailed, "['foo bar'] slots not caught"
1080 try:
1081 class C(object):
1082 __slots__ = ["foo\0bar"]
1083 except TypeError:
1084 pass
1085 else:
1086 raise TestFailed, "['foo\\0bar'] slots not caught"
1087 try:
1088 class C(object):
1089 __slots__ = ["1"]
1090 except TypeError:
1091 pass
1092 else:
1093 raise TestFailed, "['1'] slots not caught"
1094 try:
1095 class C(object):
1096 __slots__ = [""]
1097 except TypeError:
1098 pass
1099 else:
1100 raise TestFailed, "[''] slots not caught"
1101 class C(object):
1102 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001103 # XXX(nnorwitz): was there supposed to be something tested
1104 # from the class above?
1105
1106 # Test a single string is not expanded as a sequence.
1107 class C(object):
1108 __slots__ = "abc"
1109 c = C()
1110 c.abc = 5
1111 vereq(c.abc, 5)
1112
1113 # Test unicode slot names
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001114 # Test a single unicode string is not expanded as a sequence.
1115 class C(object):
1116 __slots__ = "abc"
1117 c = C()
1118 c.abc = 5
1119 vereq(c.abc, 5)
1120
1121 # _unicode_to_string used to modify slots in certain circumstances
1122 slots = ("foo", "bar")
1123 class C(object):
1124 __slots__ = slots
1125 x = C()
1126 x.foo = 5
1127 vereq(x.foo, 5)
1128 veris(type(slots[0]), str)
1129 # this used to leak references
Guido van Rossumd8faa362007-04-27 19:54:29 +00001130 try:
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001131 class C(object):
1132 __slots__ = [chr(128)]
1133 except (TypeError, UnicodeEncodeError):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001134 pass
1135 else:
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001136 raise TestFailed, "[unichr(128)] slots not caught"
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001137
Guido van Rossum33bab012001-12-05 22:45:48 +00001138 # Test leaks
1139 class Counted(object):
1140 counter = 0 # counts the number of instances alive
1141 def __init__(self):
1142 Counted.counter += 1
1143 def __del__(self):
1144 Counted.counter -= 1
1145 class C(object):
1146 __slots__ = ['a', 'b', 'c']
1147 x = C()
1148 x.a = Counted()
1149 x.b = Counted()
1150 x.c = Counted()
1151 vereq(Counted.counter, 3)
1152 del x
1153 vereq(Counted.counter, 0)
1154 class D(C):
1155 pass
1156 x = D()
1157 x.a = Counted()
1158 x.z = Counted()
1159 vereq(Counted.counter, 2)
1160 del x
1161 vereq(Counted.counter, 0)
1162 class E(D):
1163 __slots__ = ['e']
1164 x = E()
1165 x.a = Counted()
1166 x.z = Counted()
1167 x.e = Counted()
1168 vereq(Counted.counter, 3)
1169 del x
1170 vereq(Counted.counter, 0)
1171
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001172 # Test cyclical leaks [SF bug 519621]
1173 class F(object):
1174 __slots__ = ['a', 'b']
1175 log = []
1176 s = F()
1177 s.a = [Counted(), s]
1178 vereq(Counted.counter, 1)
1179 s = None
1180 import gc
1181 gc.collect()
1182 vereq(Counted.counter, 0)
1183
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001184 # Test lookup leaks [SF bug 572567]
1185 import sys,gc
1186 class G(object):
1187 def __cmp__(self, other):
1188 return 0
1189 g = G()
1190 orig_objects = len(gc.get_objects())
Guido van Rossum805365e2007-05-07 22:24:25 +00001191 for i in range(10):
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001192 g==g
1193 new_objects = len(gc.get_objects())
1194 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001195 class H(object):
1196 __slots__ = ['a', 'b']
1197 def __init__(self):
1198 self.a = 1
1199 self.b = 2
1200 def __del__(self):
1201 assert self.a == 1
1202 assert self.b == 2
1203
1204 save_stderr = sys.stderr
1205 sys.stderr = sys.stdout
1206 h = H()
1207 try:
1208 del h
1209 finally:
1210 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001211
Guido van Rossum8b056da2002-08-13 18:26:26 +00001212def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001213 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001214
1215 class D(object):
1216 __slots__ = ["__dict__"]
1217 a = D()
1218 verify(hasattr(a, "__dict__"))
1219 verify(not hasattr(a, "__weakref__"))
1220 a.foo = 42
1221 vereq(a.__dict__, {"foo": 42})
1222
1223 class W(object):
1224 __slots__ = ["__weakref__"]
1225 a = W()
1226 verify(hasattr(a, "__weakref__"))
1227 verify(not hasattr(a, "__dict__"))
1228 try:
1229 a.foo = 42
1230 except AttributeError:
1231 pass
1232 else:
1233 raise TestFailed, "shouldn't be allowed to set a.foo"
1234
1235 class C1(W, D):
1236 __slots__ = []
1237 a = C1()
1238 verify(hasattr(a, "__dict__"))
1239 verify(hasattr(a, "__weakref__"))
1240 a.foo = 42
1241 vereq(a.__dict__, {"foo": 42})
1242
1243 class C2(D, W):
1244 __slots__ = []
1245 a = C2()
1246 verify(hasattr(a, "__dict__"))
1247 verify(hasattr(a, "__weakref__"))
1248 a.foo = 42
1249 vereq(a.__dict__, {"foo": 42})
1250
Guido van Rossum9a818922002-11-14 19:50:14 +00001251# MRO order disagreement
1252#
1253# class C3(C1, C2):
1254# __slots__ = []
1255#
1256# class C4(C2, C1):
1257# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001258
Tim Peters6d6c1a32001-08-02 04:15:00 +00001259def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001260 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001261 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001262 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001263 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001264 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001265 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001267 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001268 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001269 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001270 vereq(E.foo, 1)
1271 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001272 # Test dynamic instances
1273 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001274 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001275 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001276 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001277 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001278 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001279 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001280 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001281 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001282 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001283 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001284 vereq(int(a), 100)
1285 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001286 verify(not hasattr(a, "spam"))
1287 def mygetattr(self, name):
1288 if name == "spam":
1289 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001290 raise AttributeError
1291 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001292 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001293 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001294 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001295 def mysetattr(self, name, value):
1296 if name == "spam":
1297 raise AttributeError
1298 return object.__setattr__(self, name, value)
1299 C.__setattr__ = mysetattr
1300 try:
1301 a.spam = "not spam"
1302 except AttributeError:
1303 pass
1304 else:
1305 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001306 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001307 class D(C):
1308 pass
1309 d = D()
1310 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001311 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001312
Guido van Rossum7e35d572001-09-15 03:14:32 +00001313 # Test handling of int*seq and seq*int
1314 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001315 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001316 vereq("a"*I(2), "aa")
1317 vereq(I(2)*"a", "aa")
1318 vereq(2*I(3), 6)
1319 vereq(I(3)*2, 6)
1320 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001321
1322 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001323 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001324 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001325 vereq("a"*L(2), "aa")
1326 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001327 vereq(2*L(3), 6)
1328 vereq(L(3)*2, 6)
1329 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001330
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001331 # Test comparison of classes with dynamic metaclasses
1332 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001333 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001334 class someclass(metaclass=dynamicmetaclass):
1335 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001336 verify(someclass != object)
1337
Tim Peters6d6c1a32001-08-02 04:15:00 +00001338def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001339 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001340
1341 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001342 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001343 pass
1344 except TypeError:
1345 pass
1346 else:
1347 verify(0, "inheritance from both list and dict should be illegal")
1348
1349 try:
1350 class C(object, None):
1351 pass
1352 except TypeError:
1353 pass
1354 else:
1355 verify(0, "inheritance from non-type should be illegal")
1356 class Classic:
1357 pass
1358
1359 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001360 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001361 pass
1362 except TypeError:
1363 pass
1364 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001365 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001366
1367 try:
1368 class C(object):
1369 __slots__ = 1
1370 except TypeError:
1371 pass
1372 else:
1373 verify(0, "__slots__ = 1 should be illegal")
1374
1375 try:
1376 class C(object):
1377 __slots__ = [1]
1378 except TypeError:
1379 pass
1380 else:
1381 verify(0, "__slots__ = [1] should be illegal")
1382
Guido van Rossumd8faa362007-04-27 19:54:29 +00001383 class M1(type):
1384 pass
1385 class M2(type):
1386 pass
1387 class A1(object, metaclass=M1):
1388 pass
1389 class A2(object, metaclass=M2):
1390 pass
1391 try:
1392 class B(A1, A2):
1393 pass
1394 except TypeError:
1395 pass
1396 else:
1397 verify(0, "finding the most derived metaclass should have failed")
1398
Tim Peters6d6c1a32001-08-02 04:15:00 +00001399def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001400 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001401 class C(object):
1402 def foo(*a): return a
1403 goo = classmethod(foo)
1404 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001405 vereq(C.goo(1), (C, 1))
1406 vereq(c.goo(1), (C, 1))
1407 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001408 class D(C):
1409 pass
1410 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001411 vereq(D.goo(1), (D, 1))
1412 vereq(d.goo(1), (D, 1))
1413 vereq(d.foo(1), (d, 1))
1414 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001415 # Test for a specific crash (SF bug 528132)
1416 def f(cls, arg): return (cls, arg)
1417 ff = classmethod(f)
1418 vereq(ff.__get__(0, int)(42), (int, 42))
1419 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001420
Guido van Rossum155db9a2002-04-02 17:53:47 +00001421 # Test super() with classmethods (SF bug 535444)
1422 veris(C.goo.im_self, C)
1423 veris(D.goo.im_self, D)
1424 veris(super(D,D).goo.im_self, D)
1425 veris(super(D,d).goo.im_self, D)
1426 vereq(super(D,D).goo(), (D,))
1427 vereq(super(D,d).goo(), (D,))
1428
Raymond Hettingerbe971532003-06-18 01:13:41 +00001429 # Verify that argument is checked for callability (SF bug 753451)
1430 try:
1431 classmethod(1).__get__(1)
1432 except TypeError:
1433 pass
1434 else:
1435 raise TestFailed, "classmethod should check for callability"
1436
Georg Brandl6a29c322006-02-21 22:17:46 +00001437 # Verify that classmethod() doesn't allow keyword args
1438 try:
1439 classmethod(f, kw=1)
1440 except TypeError:
1441 pass
1442 else:
1443 raise TestFailed, "classmethod shouldn't accept keyword args"
1444
Fred Drakef841aa62002-03-28 15:49:54 +00001445def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001446 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001447 import xxsubtype as spam
1448 a = (1, 2, 3)
1449 d = {'abc': 123}
1450 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001451 veris(x, spam.spamlist)
1452 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001453 vereq(d, d1)
1454 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001455 veris(x, spam.spamlist)
1456 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001457 vereq(d, d1)
1458
Tim Peters6d6c1a32001-08-02 04:15:00 +00001459def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001460 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001461 class C(object):
1462 def foo(*a): return a
1463 goo = staticmethod(foo)
1464 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001465 vereq(C.goo(1), (1,))
1466 vereq(c.goo(1), (1,))
1467 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001468 class D(C):
1469 pass
1470 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001471 vereq(D.goo(1), (1,))
1472 vereq(d.goo(1), (1,))
1473 vereq(d.foo(1), (d, 1))
1474 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001475
Fred Drakef841aa62002-03-28 15:49:54 +00001476def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001477 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001478 import xxsubtype as spam
1479 a = (1, 2, 3)
1480 d = {"abc": 123}
1481 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1482 veris(x, None)
1483 vereq(a, a1)
1484 vereq(d, d1)
1485 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1486 veris(x, None)
1487 vereq(a, a1)
1488 vereq(d, d1)
1489
Tim Peters6d6c1a32001-08-02 04:15:00 +00001490def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001491 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001492 class C:
1493 def foo(*a): return a
1494 goo = classmethod(foo)
1495 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001496 vereq(C.goo(1), (C, 1))
1497 vereq(c.goo(1), (C, 1))
1498 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001499 class D(C):
1500 pass
1501 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001502 vereq(D.goo(1), (D, 1))
1503 vereq(d.goo(1), (D, 1))
1504 vereq(d.foo(1), (d, 1))
1505 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001506 class E: # *not* subclassing from C
1507 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001508 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001509 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001510
1511def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001512 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513 class C(object):
1514 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001515 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001516 self.__get = get
1517 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001518 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001519 def __get__(self, obj, type=None):
1520 return self.__get(obj)
1521 def __set__(self, obj, value):
1522 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001523 def __delete__(self, obj):
1524 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001525 def __init__(self):
1526 self.__x = 0
1527 def __get_x(self):
1528 x = self.__x
1529 self.__x = x+1
1530 return x
1531 def __set_x(self, x):
1532 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001533 def __delete_x(self):
1534 del self.__x
1535 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001536 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001537 vereq(a.x, 0)
1538 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001539 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001540 vereq(a.x, 10)
1541 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001542 del a.x
1543 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001544
1545def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001546 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001547 class C(list):
1548 def __new__(cls):
1549 self = list.__new__(cls)
1550 self.foo = 1
1551 return self
1552 def __init__(self):
1553 self.foo = self.foo + 2
1554 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001555 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001556 verify(a.__class__ is C)
1557 class D(C):
1558 pass
1559 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001560 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001561 verify(b.__class__ is D)
1562
Tim Peters6d6c1a32001-08-02 04:15:00 +00001563def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001564 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001565 class A(object):
1566 def f(self): return "A"
1567 class B(A):
1568 pass
1569 class C(A):
1570 def f(self): return "C"
1571 class D(B, C):
1572 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001573 vereq(D.mro(), [D, B, C, A, object])
1574 vereq(D.__mro__, (D, B, C, A, object))
1575 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001576
Guido van Rossumd3077402001-08-12 05:24:18 +00001577 class PerverseMetaType(type):
1578 def mro(cls):
1579 L = type.mro(cls)
1580 L.reverse()
1581 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001582 class X(D,B,C,A, metaclass=PerverseMetaType):
1583 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001584 vereq(X.__mro__, (object, A, C, B, D, X))
1585 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001586
Armin Rigo037d1e02005-12-29 17:07:39 +00001587 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001588 class _metaclass(type):
1589 def mro(self):
1590 return [self, dict, object]
1591 class X(object, metaclass=_metaclass):
1592 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001593 except TypeError:
1594 pass
1595 else:
1596 raise TestFailed, "devious mro() return not caught"
1597
1598 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001599 class _metaclass(type):
1600 def mro(self):
1601 return [1]
1602 class X(object, metaclass=_metaclass):
1603 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001604 except TypeError:
1605 pass
1606 else:
1607 raise TestFailed, "non-class mro() return not caught"
1608
1609 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001610 class _metaclass(type):
1611 def mro(self):
1612 return 1
1613 class X(object, metaclass=_metaclass):
1614 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001615 except TypeError:
1616 pass
1617 else:
1618 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001619
Armin Rigo037d1e02005-12-29 17:07:39 +00001620
Tim Peters6d6c1a32001-08-02 04:15:00 +00001621def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001622 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623
1624 class B(object):
1625 "Intermediate class because object doesn't have a __setattr__"
1626
1627 class C(B):
1628
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001629 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001630 if name == "foo":
1631 return ("getattr", name)
1632 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001633 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001634 def __setattr__(self, name, value):
1635 if name == "foo":
1636 self.setattr = (name, value)
1637 else:
1638 return B.__setattr__(self, name, value)
1639 def __delattr__(self, name):
1640 if name == "foo":
1641 self.delattr = name
1642 else:
1643 return B.__delattr__(self, name)
1644
1645 def __getitem__(self, key):
1646 return ("getitem", key)
1647 def __setitem__(self, key, value):
1648 self.setitem = (key, value)
1649 def __delitem__(self, key):
1650 self.delitem = key
1651
1652 def __getslice__(self, i, j):
1653 return ("getslice", i, j)
1654 def __setslice__(self, i, j, value):
1655 self.setslice = (i, j, value)
1656 def __delslice__(self, i, j):
1657 self.delslice = (i, j)
1658
1659 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001661 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001663 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001664 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001668 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001669 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001670 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001671
Guido van Rossum45704552001-10-08 16:35:45 +00001672 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001673 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001674 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001675 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001676 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001677
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001678def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001679 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001680 class C(object):
1681 def __init__(self, x):
1682 self.x = x
1683 def foo(self):
1684 return self.x
1685 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001686 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001687 class D(C):
1688 boo = C.foo
1689 goo = c1.foo
1690 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001691 vereq(d2.foo(), 2)
1692 vereq(d2.boo(), 2)
1693 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001694 class E(object):
1695 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001696 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001697 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001698
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001699def specials():
1700 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001701 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001702 # Test the default behavior for static classes
1703 class C(object):
1704 def __getitem__(self, i):
1705 if 0 <= i < 10: return i
1706 raise IndexError
1707 c1 = C()
1708 c2 = C()
1709 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001710 verify(id(c1) != id(c2))
1711 hash(c1)
1712 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001713 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001714 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001715 verify(c1 != c2)
1716 verify(not c1 != c1)
1717 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001718 # Note that the module name appears in str/repr, and that varies
1719 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001720 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001721 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001722 verify(-1 not in c1)
1723 for i in range(10):
1724 verify(i in c1)
1725 verify(10 not in c1)
1726 # Test the default behavior for dynamic classes
1727 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001728 def __getitem__(self, i):
1729 if 0 <= i < 10: return i
1730 raise IndexError
1731 d1 = D()
1732 d2 = D()
1733 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001734 verify(id(d1) != id(d2))
1735 hash(d1)
1736 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001737 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001738 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001739 verify(d1 != d2)
1740 verify(not d1 != d1)
1741 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001742 # Note that the module name appears in str/repr, and that varies
1743 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001744 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001745 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001746 verify(-1 not in d1)
1747 for i in range(10):
1748 verify(i in d1)
1749 verify(10 not in d1)
1750 # Test overridden behavior for static classes
1751 class Proxy(object):
1752 def __init__(self, x):
1753 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001754 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001755 return not not self.x
1756 def __hash__(self):
1757 return hash(self.x)
1758 def __eq__(self, other):
1759 return self.x == other
1760 def __ne__(self, other):
1761 return self.x != other
1762 def __cmp__(self, other):
1763 return cmp(self.x, other.x)
1764 def __str__(self):
1765 return "Proxy:%s" % self.x
1766 def __repr__(self):
1767 return "Proxy(%r)" % self.x
1768 def __contains__(self, value):
1769 return value in self.x
1770 p0 = Proxy(0)
1771 p1 = Proxy(1)
1772 p_1 = Proxy(-1)
1773 verify(not p0)
1774 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001775 vereq(hash(p0), hash(0))
1776 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001777 verify(p0 != p1)
1778 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001779 vereq(not p0, p1)
1780 vereq(cmp(p0, p1), -1)
1781 vereq(cmp(p0, p0), 0)
1782 vereq(cmp(p0, p_1), 1)
1783 vereq(str(p0), "Proxy:0")
1784 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001785 p10 = Proxy(range(10))
1786 verify(-1 not in p10)
1787 for i in range(10):
1788 verify(i in p10)
1789 verify(10 not in p10)
1790 # Test overridden behavior for dynamic classes
1791 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001792 def __init__(self, x):
1793 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001794 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001795 return not not self.x
1796 def __hash__(self):
1797 return hash(self.x)
1798 def __eq__(self, other):
1799 return self.x == other
1800 def __ne__(self, other):
1801 return self.x != other
1802 def __cmp__(self, other):
1803 return cmp(self.x, other.x)
1804 def __str__(self):
1805 return "DProxy:%s" % self.x
1806 def __repr__(self):
1807 return "DProxy(%r)" % self.x
1808 def __contains__(self, value):
1809 return value in self.x
1810 p0 = DProxy(0)
1811 p1 = DProxy(1)
1812 p_1 = DProxy(-1)
1813 verify(not p0)
1814 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001815 vereq(hash(p0), hash(0))
1816 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001817 verify(p0 != p1)
1818 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001819 vereq(not p0, p1)
1820 vereq(cmp(p0, p1), -1)
1821 vereq(cmp(p0, p0), 0)
1822 vereq(cmp(p0, p_1), 1)
1823 vereq(str(p0), "DProxy:0")
1824 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001825 p10 = DProxy(range(10))
1826 verify(-1 not in p10)
1827 for i in range(10):
1828 verify(i in p10)
1829 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001830## # Safety test for __cmp__
1831## def unsafecmp(a, b):
1832## try:
1833## a.__class__.__cmp__(a, b)
1834## except TypeError:
1835## pass
1836## else:
1837## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1838## a.__class__, a, b)
1839## unsafecmp(u"123", "123")
1840## unsafecmp("123", u"123")
1841## unsafecmp(1, 1.0)
1842## unsafecmp(1.0, 1)
1843## unsafecmp(1, 1L)
1844## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001845
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001846## class Letter(str):
1847## def __new__(cls, letter):
1848## if letter == 'EPS':
1849## return str.__new__(cls)
1850## return str.__new__(cls, letter)
1851## def __str__(self):
1852## if not self:
1853## return 'EPS'
1854## return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001855
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001856## # sys.stdout needs to be the original to trigger the recursion bug
1857## import sys
1858## test_stdout = sys.stdout
1859## sys.stdout = get_original_stdout()
1860## try:
1861## # nothing should actually be printed, this should raise an exception
1862## print(Letter('w'))
1863## except RuntimeError:
1864## pass
1865## else:
1866## raise TestFailed, "expected a RuntimeError for print recursion"
1867## sys.stdout = test_stdout
Neal Norwitz1a997502003-01-13 20:13:12 +00001868
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001869def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001870 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001871 import weakref
1872 class C(object):
1873 pass
1874 c = C()
1875 r = weakref.ref(c)
1876 verify(r() is c)
1877 del c
1878 verify(r() is None)
1879 del r
1880 class NoWeak(object):
1881 __slots__ = ['foo']
1882 no = NoWeak()
1883 try:
1884 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001885 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001886 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001887 else:
1888 verify(0, "weakref.ref(no) should be illegal")
1889 class Weak(object):
1890 __slots__ = ['foo', '__weakref__']
1891 yes = Weak()
1892 r = weakref.ref(yes)
1893 verify(r() is yes)
1894 del yes
1895 verify(r() is None)
1896 del r
1897
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001898def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001899 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001900 class C(object):
1901 def getx(self):
1902 return self.__x
1903 def setx(self, value):
1904 self.__x = value
1905 def delx(self):
1906 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001907 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001908 a = C()
1909 verify(not hasattr(a, "x"))
1910 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001911 vereq(a._C__x, 42)
1912 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001913 del a.x
1914 verify(not hasattr(a, "x"))
1915 verify(not hasattr(a, "_C__x"))
1916 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001917 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001918 C.x.__delete__(a)
1919 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001920
Tim Peters66c1a522001-09-24 21:17:50 +00001921 raw = C.__dict__['x']
1922 verify(isinstance(raw, property))
1923
1924 attrs = dir(raw)
1925 verify("__doc__" in attrs)
1926 verify("fget" in attrs)
1927 verify("fset" in attrs)
1928 verify("fdel" in attrs)
1929
Guido van Rossum45704552001-10-08 16:35:45 +00001930 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001931 verify(raw.fget is C.__dict__['getx'])
1932 verify(raw.fset is C.__dict__['setx'])
1933 verify(raw.fdel is C.__dict__['delx'])
1934
1935 for attr in "__doc__", "fget", "fset", "fdel":
1936 try:
1937 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001938 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001939 if str(msg).find('readonly') < 0:
1940 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001941 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001942 "msg %r" % (attr, str(msg)))
1943 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001944 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001945 "readonly %r attr on a property" % attr)
1946
Neal Norwitz673cd822002-10-18 16:33:13 +00001947 class D(object):
1948 __getitem__ = property(lambda s: 1/0)
1949
1950 d = D()
1951 try:
1952 for i in d:
1953 str(i)
1954 except ZeroDivisionError:
1955 pass
1956 else:
1957 raise TestFailed, "expected ZeroDivisionError from bad property"
1958
Georg Brandl533ff6f2006-03-08 18:09:27 +00001959 class E(object):
1960 def getter(self):
1961 "getter method"
1962 return 0
1963 def setter(self, value):
1964 "setter method"
1965 pass
1966 prop = property(getter)
1967 vereq(prop.__doc__, "getter method")
1968 prop2 = property(fset=setter)
1969 vereq(prop2.__doc__, None)
1970
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001971 # this segfaulted in 2.5b2
1972 try:
1973 import _testcapi
1974 except ImportError:
1975 pass
1976 else:
1977 class X(object):
1978 p = property(_testcapi.test_with_docstring)
1979
1980
Guido van Rossumc4a18802001-08-24 16:55:27 +00001981def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001982 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001983
1984 class A(object):
1985 def meth(self, a):
1986 return "A(%r)" % a
1987
Guido van Rossum45704552001-10-08 16:35:45 +00001988 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001989
1990 class B(A):
1991 def __init__(self):
1992 self.__super = super(B, self)
1993 def meth(self, a):
1994 return "B(%r)" % a + self.__super.meth(a)
1995
Guido van Rossum45704552001-10-08 16:35:45 +00001996 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001997
1998 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001999 def meth(self, a):
2000 return "C(%r)" % a + self.__super.meth(a)
2001 C._C__super = super(C)
2002
Guido van Rossum45704552001-10-08 16:35:45 +00002003 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002004
2005 class D(C, B):
2006 def meth(self, a):
2007 return "D(%r)" % a + super(D, self).meth(a)
2008
Guido van Rossum5b443c62001-12-03 15:38:28 +00002009 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2010
2011 # Test for subclassing super
2012
2013 class mysuper(super):
2014 def __init__(self, *args):
2015 return super(mysuper, self).__init__(*args)
2016
2017 class E(D):
2018 def meth(self, a):
2019 return "E(%r)" % a + mysuper(E, self).meth(a)
2020
2021 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2022
2023 class F(E):
2024 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002025 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002026 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2027 F._F__super = mysuper(F)
2028
2029 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2030
2031 # Make sure certain errors are raised
2032
2033 try:
2034 super(D, 42)
2035 except TypeError:
2036 pass
2037 else:
2038 raise TestFailed, "shouldn't allow super(D, 42)"
2039
2040 try:
2041 super(D, C())
2042 except TypeError:
2043 pass
2044 else:
2045 raise TestFailed, "shouldn't allow super(D, C())"
2046
2047 try:
2048 super(D).__get__(12)
2049 except TypeError:
2050 pass
2051 else:
2052 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2053
2054 try:
2055 super(D).__get__(C())
2056 except TypeError:
2057 pass
2058 else:
2059 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002060
Guido van Rossuma4541a32003-04-16 20:02:22 +00002061 # Make sure data descriptors can be overridden and accessed via super
2062 # (new feature in Python 2.3)
2063
2064 class DDbase(object):
2065 def getx(self): return 42
2066 x = property(getx)
2067
2068 class DDsub(DDbase):
2069 def getx(self): return "hello"
2070 x = property(getx)
2071
2072 dd = DDsub()
2073 vereq(dd.x, "hello")
2074 vereq(super(DDsub, dd).x, 42)
2075
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002076 # Ensure that super() lookup of descriptor from classmethod
2077 # works (SF ID# 743627)
2078
2079 class Base(object):
2080 aProp = property(lambda self: "foo")
2081
2082 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002083 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002084 def test(klass):
2085 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002086
2087 veris(Sub.test(), Base.aProp)
2088
Thomas Wouters89f507f2006-12-13 04:49:30 +00002089 # Verify that super() doesn't allow keyword args
2090 try:
2091 super(Base, kw=1)
2092 except TypeError:
2093 pass
2094 else:
2095 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002096
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002097def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002098 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002099
2100 class hexint(int):
2101 def __repr__(self):
2102 return hex(self)
2103 def __add__(self, other):
2104 return hexint(int.__add__(self, other))
2105 # (Note that overriding __radd__ doesn't work,
2106 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002107 vereq(repr(hexint(7) + 9), "0x10")
2108 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002109 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002110 vereq(a, 12345)
2111 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002112 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002113 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002114 verify((+a).__class__ is int)
2115 verify((a >> 0).__class__ is int)
2116 verify((a << 0).__class__ is int)
2117 verify((hexint(0) << 12).__class__ is int)
2118 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002119
Guido van Rossume2a383d2007-01-15 16:59:06 +00002120 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002121 __slots__ = []
2122 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002123 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002124 def __add__(self, other):
2125 return self.__class__(super(octlong, self).__add__(other))
2126 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002127 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002128 # (Note that overriding __radd__ here only seems to work
2129 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002130 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002131 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002132 vereq(a, 12345)
2133 vereq(int(a), 12345)
2134 vereq(hash(a), hash(12345))
2135 verify(int(a).__class__ is int)
2136 verify((+a).__class__ is int)
2137 verify((-a).__class__ is int)
2138 verify((-octlong(0)).__class__ is int)
2139 verify((a >> 0).__class__ is int)
2140 verify((a << 0).__class__ is int)
2141 verify((a - 0).__class__ is int)
2142 verify((a * 1).__class__ is int)
2143 verify((a ** 1).__class__ is int)
2144 verify((a // 1).__class__ is int)
2145 verify((1 * a).__class__ is int)
2146 verify((a | 0).__class__ is int)
2147 verify((a ^ 0).__class__ is int)
2148 verify((a & -1).__class__ is int)
2149 verify((octlong(0) << 12).__class__ is int)
2150 verify((octlong(0) >> 12).__class__ is int)
2151 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002152
2153 # Because octlong overrides __add__, we can't check the absence of +0
2154 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002155 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002156 pass
2157 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002158 verify((a + 0).__class__ is int)
2159 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002160
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002161 # Check that negative clones don't segfault
2162 a = longclone(-1)
2163 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002164 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002165
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002166 class precfloat(float):
2167 __slots__ = ['prec']
2168 def __init__(self, value=0.0, prec=12):
2169 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002170 def __repr__(self):
2171 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002172 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002173 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002174 vereq(a, 12345.0)
2175 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002176 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002177 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002178 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002179
Tim Peters2400fa42001-09-12 19:12:49 +00002180 class madcomplex(complex):
2181 def __repr__(self):
2182 return "%.17gj%+.17g" % (self.imag, self.real)
2183 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002184 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002185 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002186 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(a, base)
2188 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002189 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002190 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(repr(a), "4j-3")
2192 vereq(a, base)
2193 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002194 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002195 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002196 veris((+a).__class__, complex)
2197 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002198 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002199 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 * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002202 vereq(a * 1, 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)
Tim Peters2400fa42001-09-12 19:12:49 +00002205
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002206 class madtuple(tuple):
2207 _rev = None
2208 def rev(self):
2209 if self._rev is not None:
2210 return self._rev
2211 L = list(self)
2212 L.reverse()
2213 self._rev = self.__class__(L)
2214 return self._rev
2215 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002216 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2217 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2218 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002219 for i in range(512):
2220 t = madtuple(range(i))
2221 u = t.rev()
2222 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002223 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002224 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002225 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002226 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002227 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002228 verify(a[:].__class__ is tuple)
2229 verify((a * 1).__class__ is tuple)
2230 verify((a * 0).__class__ is tuple)
2231 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002232 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002233 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002234 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002235 verify((a + a).__class__ is tuple)
2236 verify((a * 0).__class__ is tuple)
2237 verify((a * 1).__class__ is tuple)
2238 verify((a * 2).__class__ is tuple)
2239 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002240
2241 class madstring(str):
2242 _rev = None
2243 def rev(self):
2244 if self._rev is not None:
2245 return self._rev
2246 L = list(self)
2247 L.reverse()
2248 self._rev = self.__class__("".join(L))
2249 return self._rev
2250 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002251 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2252 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2253 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002254 for i in range(256):
2255 s = madstring("".join(map(chr, range(i))))
2256 t = s.rev()
2257 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002258 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002259 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002261 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002262
Tim Peters8fa5dd02001-09-12 02:18:30 +00002263 base = "\x00" * 5
2264 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002265 vereq(s, base)
2266 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002267 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(hash(s), hash(base))
2269 vereq({s: 1}[base], 1)
2270 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002271 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(s + "", base)
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 * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002277 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002279 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002281 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002283 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002285 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002287 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002289 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002291 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002292 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002293 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002294 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002295 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002296 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002297 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002298 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002299 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002300 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002301 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002302 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002303 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002304
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002305 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002306 _rev = None
2307 def rev(self):
2308 if self._rev is not None:
2309 return self._rev
2310 L = list(self)
2311 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002312 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002313 return self._rev
2314 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002315 vereq(u, "ABCDEF")
2316 vereq(u.rev(), madunicode("FEDCBA"))
2317 vereq(u.rev().rev(), madunicode("ABCDEF"))
2318 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002319 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002320 vereq(str(u), base)
2321 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002322 vereq(hash(u), hash(base))
2323 vereq({u: 1}[base], 1)
2324 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002325 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002326 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002327 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002328 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002329 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002330 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002331 verify(u.replace("x", "x").__class__ is str)
2332 vereq(u.replace("x", "x"), base)
2333 verify(u.replace("xy", "xy").__class__ is str)
2334 vereq(u.replace("xy", "xy"), base)
2335 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002336 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002337 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002338 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002339 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002340 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002341 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002342 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002343 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002344 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002345 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002346 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002347 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002349 verify((u + "").__class__ is str)
2350 vereq(u + "", base)
2351 verify(("" + u).__class__ is str)
2352 vereq("" + u, base)
2353 verify((u * 0).__class__ is str)
2354 vereq(u * 0, "")
2355 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002356 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002357 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002358 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002359 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002360 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002361 verify(u[0:0].__class__ is str)
2362 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002363
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002364 class sublist(list):
2365 pass
2366 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002367 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002368 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002369 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002370 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002371 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002372 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002373 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002374 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002375 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002376 del a[10:15]
2377 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002378 vereq(a, list(range(10)))
2379 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002380 vereq(a[0], 0)
2381 vereq(a[9], 9)
2382 vereq(a[-10], 0)
2383 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002384 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002385
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002386## class CountedInput(file):
2387## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002388
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002389## self.lineno is the 0-based ordinal of the last line read, up to
2390## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002391
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002392## self.ateof is true if and only if the final "" line has been read,
2393## at which point self.lineno stops incrementing, and further calls
2394## to readline() continue to return "".
2395## """
Tim Peters59c9a642001-09-13 05:38:56 +00002396
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002397## lineno = 0
2398## ateof = 0
2399## def readline(self):
2400## if self.ateof:
2401## return ""
2402## s = file.readline(self)
2403## # Next line works too.
2404## # s = super(CountedInput, self).readline()
2405## self.lineno += 1
2406## if s == "":
2407## self.ateof = 1
2408## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002409
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002410## f = open(name=TESTFN, mode='w')
2411## lines = ['a\n', 'b\n', 'c\n']
2412## try:
2413## f.writelines(lines)
2414## f.close()
2415## f = CountedInput(TESTFN)
2416## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2417## got = f.readline()
2418## vereq(expected, got)
2419## vereq(f.lineno, i)
2420## vereq(f.ateof, (i > len(lines)))
2421## f.close()
2422## finally:
2423## try:
2424## f.close()
2425## except:
2426## pass
2427## try:
2428## import os
2429## os.unlink(TESTFN)
2430## except:
2431## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002432
Tim Peters808b94e2001-09-13 19:33:07 +00002433def keywords():
2434 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002435 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002436 vereq(int(x=1), 1)
2437 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002438 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002439 vereq(complex(imag=42, real=666), complex(666, 42))
2440 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002441 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002442 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002443 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002444 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002445
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002446 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002447 try:
2448 constructor(bogus_keyword_arg=1)
2449 except TypeError:
2450 pass
2451 else:
2452 raise TestFailed("expected TypeError from bogus keyword "
2453 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002454
Tim Peters0ab085c2001-09-14 00:25:33 +00002455def str_subclass_as_dict_key():
2456 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002457 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002458
2459 class cistr(str):
2460 """Sublcass of str that computes __eq__ case-insensitively.
2461
2462 Also computes a hash code of the string in canonical form.
2463 """
2464
2465 def __init__(self, value):
2466 self.canonical = value.lower()
2467 self.hashcode = hash(self.canonical)
2468
2469 def __eq__(self, other):
2470 if not isinstance(other, cistr):
2471 other = cistr(other)
2472 return self.canonical == other.canonical
2473
2474 def __hash__(self):
2475 return self.hashcode
2476
Guido van Rossum45704552001-10-08 16:35:45 +00002477 vereq(cistr('ABC'), 'abc')
2478 vereq('aBc', cistr('ABC'))
2479 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002480
2481 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002482 vereq(d[cistr('one')], 1)
2483 vereq(d[cistr('tWo')], 2)
2484 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002485 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002486 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002487
Guido van Rossumab3b0342001-09-18 20:38:53 +00002488def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002489 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002490 class classic:
2491 pass
2492 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002493 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002494 class C(base):
2495 def __init__(self, value):
2496 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002497 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002498 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002499 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002500 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002501 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002502 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002503 def __ne__(self, other):
2504 if isinstance(other, C):
2505 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002506 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002507 return self.value != other
2508 return NotImplemented
2509 def __lt__(self, other):
2510 if isinstance(other, C):
2511 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002512 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002513 return self.value < other
2514 return NotImplemented
2515 def __le__(self, other):
2516 if isinstance(other, C):
2517 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002518 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002519 return self.value <= other
2520 return NotImplemented
2521 def __gt__(self, other):
2522 if isinstance(other, C):
2523 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002524 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002525 return self.value > other
2526 return NotImplemented
2527 def __ge__(self, other):
2528 if isinstance(other, C):
2529 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002530 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002531 return self.value >= other
2532 return NotImplemented
2533
Guido van Rossumab3b0342001-09-18 20:38:53 +00002534 c1 = C(1)
2535 c2 = C(2)
2536 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002537 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002538 c = {1: c1, 2: c2, 3: c3}
2539 for x in 1, 2, 3:
2540 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002541 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002542 for op in "<", "<=", "==", "!=", ">", ">=":
2543 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2544 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002545 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2546 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002547
Guido van Rossum0639f592001-09-18 21:06:04 +00002548def rich_comparisons():
2549 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002550 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002551 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002552 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002553 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002554 vereq(z, 1+0j)
2555 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002556 class ZZ(complex):
2557 def __eq__(self, other):
2558 try:
2559 return abs(self - other) <= 1e-6
2560 except:
2561 return NotImplemented
2562 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002563 vereq(zz, 1+0j)
2564 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002565
Guido van Rossum0639f592001-09-18 21:06:04 +00002566 class classic:
2567 pass
2568 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002569 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002570 class C(base):
2571 def __init__(self, value):
2572 self.value = int(value)
2573 def __cmp__(self, other):
2574 raise TestFailed, "shouldn't call __cmp__"
2575 def __eq__(self, other):
2576 if isinstance(other, C):
2577 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002578 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002579 return self.value == other
2580 return NotImplemented
2581 def __ne__(self, other):
2582 if isinstance(other, C):
2583 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002584 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002585 return self.value != other
2586 return NotImplemented
2587 def __lt__(self, other):
2588 if isinstance(other, C):
2589 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002590 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002591 return self.value < other
2592 return NotImplemented
2593 def __le__(self, other):
2594 if isinstance(other, C):
2595 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002596 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002597 return self.value <= other
2598 return NotImplemented
2599 def __gt__(self, other):
2600 if isinstance(other, C):
2601 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002602 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002603 return self.value > other
2604 return NotImplemented
2605 def __ge__(self, other):
2606 if isinstance(other, C):
2607 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002608 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002609 return self.value >= other
2610 return NotImplemented
2611 c1 = C(1)
2612 c2 = C(2)
2613 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002614 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002615 c = {1: c1, 2: c2, 3: c3}
2616 for x in 1, 2, 3:
2617 for y in 1, 2, 3:
2618 for op in "<", "<=", "==", "!=", ">", ">=":
2619 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2620 "x=%d, y=%d" % (x, y))
2621 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2622 "x=%d, y=%d" % (x, y))
2623 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2624 "x=%d, y=%d" % (x, y))
2625
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002626def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002627 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002628 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002629 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002630 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002631 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2632 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002633
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002634def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002635 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002636 class C(object): pass
2637 class D(object): pass
2638 class E(object): pass
2639 class F(D, E): pass
2640 for cls in C, D, E, F:
2641 for cls2 in C, D, E, F:
2642 x = cls()
2643 x.__class__ = cls2
2644 verify(x.__class__ is cls2)
2645 x.__class__ = cls
2646 verify(x.__class__ is cls)
2647 def cant(x, C):
2648 try:
2649 x.__class__ = C
2650 except TypeError:
2651 pass
2652 else:
2653 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002654 try:
2655 delattr(x, "__class__")
2656 except TypeError:
2657 pass
2658 else:
2659 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002660 cant(C(), list)
2661 cant(list(), C)
2662 cant(C(), 1)
2663 cant(C(), object)
2664 cant(object(), list)
2665 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002666 class Int(int): __slots__ = []
2667 cant(2, Int)
2668 cant(Int(), int)
2669 cant(True, int)
2670 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002671 o = object()
2672 cant(o, type(1))
2673 cant(o, type(None))
2674 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002675 class G(object):
2676 __slots__ = ["a", "b"]
2677 class H(object):
2678 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002679 class I(object):
2680 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002681 class J(object):
2682 __slots__ = ["c", "b"]
2683 class K(object):
2684 __slots__ = ["a", "b", "d"]
2685 class L(H):
2686 __slots__ = ["e"]
2687 class M(I):
2688 __slots__ = ["e"]
2689 class N(J):
2690 __slots__ = ["__weakref__"]
2691 class P(J):
2692 __slots__ = ["__dict__"]
2693 class Q(J):
2694 pass
2695 class R(J):
2696 __slots__ = ["__dict__", "__weakref__"]
2697
2698 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2699 x = cls()
2700 x.a = 1
2701 x.__class__ = cls2
2702 verify(x.__class__ is cls2,
2703 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2704 vereq(x.a, 1)
2705 x.__class__ = cls
2706 verify(x.__class__ is cls,
2707 "assigning %r as __class__ for %r silently failed" % (cls, x))
2708 vereq(x.a, 1)
2709 for cls in G, J, K, L, M, N, P, R, list, Int:
2710 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2711 if cls is cls2:
2712 continue
2713 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002714
Guido van Rossum6661be32001-10-26 04:26:12 +00002715def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002716 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002717 class C(object): pass
2718 a = C()
2719 a.__dict__ = {'b': 1}
2720 vereq(a.b, 1)
2721 def cant(x, dict):
2722 try:
2723 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002724 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002725 pass
2726 else:
2727 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2728 cant(a, None)
2729 cant(a, [])
2730 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002731 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002732
2733 class Base(object):
2734 pass
2735 def verify_dict_readonly(x):
2736 """
2737 x has to be an instance of a class inheriting from Base.
2738 """
2739 cant(x, {})
2740 try:
2741 del x.__dict__
2742 except (AttributeError, TypeError):
2743 pass
2744 else:
2745 raise TestFailed, "shouldn't allow del %r.__dict__" % x
2746 dict_descr = Base.__dict__["__dict__"]
2747 try:
2748 dict_descr.__set__(x, {})
2749 except (AttributeError, TypeError):
2750 pass
2751 else:
2752 raise TestFailed, "dict_descr allowed access to %r's dict" % x
2753
2754 # Classes don't allow __dict__ assignment and have readonly dicts
2755 class Meta1(type, Base):
2756 pass
2757 class Meta2(Base, type):
2758 pass
2759 class D(object):
2760 __metaclass__ = Meta1
2761 class E(object):
2762 __metaclass__ = Meta2
2763 for cls in C, D, E:
2764 verify_dict_readonly(cls)
2765 class_dict = cls.__dict__
2766 try:
2767 class_dict["spam"] = "eggs"
2768 except TypeError:
2769 pass
2770 else:
2771 raise TestFailed, "%r's __dict__ can be modified" % cls
2772
2773 # Modules also disallow __dict__ assignment
2774 class Module1(types.ModuleType, Base):
2775 pass
2776 class Module2(Base, types.ModuleType):
2777 pass
2778 for ModuleType in Module1, Module2:
2779 mod = ModuleType("spam")
2780 verify_dict_readonly(mod)
2781 mod.__dict__["spam"] = "eggs"
2782
2783 # Exception's __dict__ can be replaced, but not deleted
2784 class Exception1(Exception, Base):
2785 pass
2786 class Exception2(Base, Exception):
2787 pass
2788 for ExceptionType in Exception, Exception1, Exception2:
2789 e = ExceptionType()
2790 e.__dict__ = {"a": 1}
2791 vereq(e.a, 1)
2792 try:
2793 del e.__dict__
2794 except (TypeError, AttributeError):
2795 pass
2796 else:
2797 raise TestFaied, "%r's __dict__ can be deleted" % e
2798
Guido van Rossum6661be32001-10-26 04:26:12 +00002799
Guido van Rossum3926a632001-09-25 16:25:58 +00002800def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002801 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002802 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002803 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002804
2805 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002806 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002807
2808 global C
2809 class C(object):
2810 def __init__(self, a, b):
2811 super(C, self).__init__()
2812 self.a = a
2813 self.b = b
2814 def __repr__(self):
2815 return "C(%r, %r)" % (self.a, self.b)
2816
2817 global C1
2818 class C1(list):
2819 def __new__(cls, a, b):
2820 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002821 def __getnewargs__(self):
2822 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002823 def __init__(self, a, b):
2824 self.a = a
2825 self.b = b
2826 def __repr__(self):
2827 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2828
2829 global C2
2830 class C2(int):
2831 def __new__(cls, a, b, val=0):
2832 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002833 def __getnewargs__(self):
2834 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002835 def __init__(self, a, b, val=0):
2836 self.a = a
2837 self.b = b
2838 def __repr__(self):
2839 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2840
Guido van Rossum90c45142001-11-24 21:07:01 +00002841 global C3
2842 class C3(object):
2843 def __init__(self, foo):
2844 self.foo = foo
2845 def __getstate__(self):
2846 return self.foo
2847 def __setstate__(self, foo):
2848 self.foo = foo
2849
2850 global C4classic, C4
2851 class C4classic: # classic
2852 pass
2853 class C4(C4classic, object): # mixed inheritance
2854 pass
2855
Guido van Rossum99603b02007-07-20 00:22:32 +00002856 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002857 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002858 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002859 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002860
2861 for cls in C, C1, C2:
2862 s = p.dumps(cls, bin)
2863 cls2 = p.loads(s)
2864 verify(cls2 is cls)
2865
2866 a = C1(1, 2); a.append(42); a.append(24)
2867 b = C2("hello", "world", 42)
2868 s = p.dumps((a, b), bin)
2869 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002870 vereq(x.__class__, a.__class__)
2871 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2872 vereq(y.__class__, b.__class__)
2873 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002874 vereq(repr(x), repr(a))
2875 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002876 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002877 print("a = x =", a)
2878 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002879 # Test for __getstate__ and __setstate__ on new style class
2880 u = C3(42)
2881 s = p.dumps(u, bin)
2882 v = p.loads(s)
2883 veris(u.__class__, v.__class__)
2884 vereq(u.foo, v.foo)
2885 # Test for picklability of hybrid class
2886 u = C4()
2887 u.foo = 42
2888 s = p.dumps(u, bin)
2889 v = p.loads(s)
2890 veris(u.__class__, v.__class__)
2891 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002892
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002893 # Testing copy.deepcopy()
2894 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002895 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002896 import copy
2897 for cls in C, C1, C2:
2898 cls2 = copy.deepcopy(cls)
2899 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002900
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002901 a = C1(1, 2); a.append(42); a.append(24)
2902 b = C2("hello", "world", 42)
2903 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002904 vereq(x.__class__, a.__class__)
2905 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2906 vereq(y.__class__, b.__class__)
2907 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002908 vereq(repr(x), repr(a))
2909 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002910 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002911 print("a = x =", a)
2912 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002913
Guido van Rossum8c842552002-03-14 23:05:54 +00002914def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002915 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002916 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002917 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002918 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002919 global B, C, D, E
2920 class B(object):
2921 pass
2922 for base in [object, B]:
2923 class C(base):
2924 __slots__ = ['a']
2925 class D(C):
2926 pass
2927 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002928 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002929 except TypeError:
2930 pass
2931 else:
2932 raise TestFailed, "should fail: pickle C instance - %s" % base
2933 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002934 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002935 except TypeError:
2936 pass
2937 else:
2938 raise TestFailed, "should fail: pickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002939 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002940 class C(base):
2941 __slots__ = ['a']
2942 def __getstate__(self):
2943 try:
2944 d = self.__dict__.copy()
2945 except AttributeError:
2946 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002947 for cls in self.__class__.__mro__:
2948 for sn in cls.__dict__.get('__slots__', ()):
2949 try:
2950 d[sn] = getattr(self, sn)
2951 except AttributeError:
2952 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002953 return d
2954 def __setstate__(self, d):
2955 for k, v in d.items():
2956 setattr(self, k, v)
2957 class D(C):
2958 pass
2959 # Now it should work
2960 x = C()
2961 y = pickle.loads(pickle.dumps(x))
2962 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002963 x.a = 42
2964 y = pickle.loads(pickle.dumps(x))
2965 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00002966 x = D()
2967 x.a = 42
2968 x.b = 100
2969 y = pickle.loads(pickle.dumps(x))
2970 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002971 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002972 class E(C):
2973 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002974 x = E()
2975 x.a = 42
2976 x.b = "foo"
2977 y = pickle.loads(pickle.dumps(x))
2978 vereq(y.a, x.a)
2979 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002980
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002981def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002982 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002983 import copy
2984 class C(object):
2985 pass
2986
2987 a = C()
2988 a.foo = 12
2989 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002990 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002991
2992 a.bar = [1,2,3]
2993 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002994 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002995 verify(c.bar is a.bar)
2996
2997 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002998 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002999 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003000 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003001
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003002def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003003 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003004 class I(int):
3005 def __repr__(self):
3006 return "I(%r)" % int(self)
3007 def __add__(self, other):
3008 return I(int(self) + int(other))
3009 __radd__ = __add__
3010 def __pow__(self, other, mod=None):
3011 if mod is None:
3012 return I(pow(int(self), int(other)))
3013 else:
3014 return I(pow(int(self), int(other), int(mod)))
3015 def __rpow__(self, other, mod=None):
3016 if mod is None:
3017 return I(pow(int(other), int(self), mod))
3018 else:
3019 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003020
Walter Dörwald70a6b492004-02-12 17:35:32 +00003021 vereq(repr(I(1) + I(2)), "I(3)")
3022 vereq(repr(I(1) + 2), "I(3)")
3023 vereq(repr(1 + I(2)), "I(3)")
3024 vereq(repr(I(2) ** I(3)), "I(8)")
3025 vereq(repr(2 ** I(3)), "I(8)")
3026 vereq(repr(I(2) ** 3), "I(8)")
3027 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003028 class S(str):
3029 def __eq__(self, other):
3030 return self.lower() == other.lower()
3031
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003032def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003033 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003034 class A(object):
3035 pass
3036 class B(A):
3037 pass
3038 class C(A):
3039 pass
3040 class D(B, C):
3041 pass
3042 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003043 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003044 A.__hash__ = lambda self: 42
3045 vereq(hash(d), 42)
3046 C.__hash__ = lambda self: 314
3047 vereq(hash(d), 314)
3048 B.__hash__ = lambda self: 144
3049 vereq(hash(d), 144)
3050 D.__hash__ = lambda self: 100
3051 vereq(hash(d), 100)
3052 del D.__hash__
3053 vereq(hash(d), 144)
3054 del B.__hash__
3055 vereq(hash(d), 314)
3056 del C.__hash__
3057 vereq(hash(d), 42)
3058 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003059 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003060 d.foo = 42
3061 d.bar = 42
3062 vereq(d.foo, 42)
3063 vereq(d.bar, 42)
3064 def __getattribute__(self, name):
3065 if name == "foo":
3066 return 24
3067 return object.__getattribute__(self, name)
3068 A.__getattribute__ = __getattribute__
3069 vereq(d.foo, 24)
3070 vereq(d.bar, 42)
3071 def __getattr__(self, name):
3072 if name in ("spam", "foo", "bar"):
3073 return "hello"
3074 raise AttributeError, name
3075 B.__getattr__ = __getattr__
3076 vereq(d.spam, "hello")
3077 vereq(d.foo, 24)
3078 vereq(d.bar, 42)
3079 del A.__getattribute__
3080 vereq(d.foo, 42)
3081 del d.foo
3082 vereq(d.foo, "hello")
3083 vereq(d.bar, 42)
3084 del B.__getattr__
3085 try:
3086 d.foo
3087 except AttributeError:
3088 pass
3089 else:
3090 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003091
Guido van Rossume7f3e242002-06-14 02:35:45 +00003092 # Test a nasty bug in recurse_down_subclasses()
3093 import gc
3094 class A(object):
3095 pass
3096 class B(A):
3097 pass
3098 del B
3099 gc.collect()
3100 A.__setitem__ = lambda *a: None # crash
3101
Tim Petersfc57ccb2001-10-12 02:38:24 +00003102def buffer_inherit():
3103 import binascii
3104 # SF bug [#470040] ParseTuple t# vs subclasses.
3105 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003106 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003107
3108 class MyStr(str):
3109 pass
3110 base = 'abc'
3111 m = MyStr(base)
3112 # b2a_hex uses the buffer interface to get its argument's value, via
3113 # PyArg_ParseTuple 't#' code.
3114 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3115
3116 # It's not clear that unicode will continue to support the character
3117 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003118 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003119 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003120 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003121 m = MyUni(base)
3122 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3123
3124 class MyInt(int):
3125 pass
3126 m = MyInt(42)
3127 try:
3128 binascii.b2a_hex(m)
3129 raise TestFailed('subclass of int should not have a buffer interface')
3130 except TypeError:
3131 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003132
Tim Petersc9933152001-10-16 20:18:24 +00003133def str_of_str_subclass():
3134 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003135 import io
Tim Petersc9933152001-10-16 20:18:24 +00003136
3137 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003138 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003139
3140 class octetstring(str):
3141 def __str__(self):
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003142 return str(binascii.b2a_hex(self))
Tim Petersc9933152001-10-16 20:18:24 +00003143 def __repr__(self):
3144 return self + " repr"
3145
3146 o = octetstring('A')
3147 vereq(type(o), octetstring)
3148 vereq(type(str(o)), str)
3149 vereq(type(repr(o)), str)
3150 vereq(ord(o), 0x41)
3151 vereq(str(o), '41')
3152 vereq(repr(o), 'A repr')
3153 vereq(o.__str__(), '41')
3154 vereq(o.__repr__(), 'A repr')
3155
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003156 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003157 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003158 print(o, file=capture)
3159 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003160 vereq(capture.getvalue(), '41\n41\n')
3161 capture.close()
3162
Guido van Rossumc8e56452001-10-22 00:43:43 +00003163def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003164 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003165 def f(a): return a
3166 vereq(f.__call__(a=42), 42)
3167 a = []
3168 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003169 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003170
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003171def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003172 if verbose: print(("Testing recursive __call__() by setting to instance of "
3173 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003174 class A(object):
3175 pass
3176
3177 A.__call__ = A()
3178 try:
3179 A()()
3180 except RuntimeError:
3181 pass
3182 else:
3183 raise TestFailed("Recursion limit should have been reached for "
3184 "__call__()")
3185
Guido van Rossumed87ad82001-10-30 02:33:02 +00003186def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003187 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003188 log = []
3189 class C(object):
3190 def __del__(self):
3191 log.append(1)
3192 c = C()
3193 vereq(log, [])
3194 del c
3195 vereq(log, [1])
3196
Guido van Rossum29d26062001-12-11 04:37:34 +00003197 class D(object): pass
3198 d = D()
3199 try: del d[0]
3200 except TypeError: pass
3201 else: raise TestFailed, "invalid del() didn't raise TypeError"
3202
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003203def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003204 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003205
3206 class mydict(dict):
3207 pass
3208 d = mydict()
3209 try:
3210 hash(d)
3211 except TypeError:
3212 pass
3213 else:
3214 raise TestFailed, "hash() of dict subclass should fail"
3215
3216 class mylist(list):
3217 pass
3218 d = mylist()
3219 try:
3220 hash(d)
3221 except TypeError:
3222 pass
3223 else:
3224 raise TestFailed, "hash() of list subclass should fail"
3225
Guido van Rossum29d26062001-12-11 04:37:34 +00003226def strops():
3227 try: 'a' + 5
3228 except TypeError: pass
3229 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3230
3231 try: ''.split('')
3232 except ValueError: pass
3233 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3234
3235 try: ''.join([0])
3236 except TypeError: pass
3237 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3238
3239 try: ''.rindex('5')
3240 except ValueError: pass
3241 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3242
Guido van Rossum29d26062001-12-11 04:37:34 +00003243 try: '%(n)s' % None
3244 except TypeError: pass
3245 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3246
3247 try: '%(n' % {}
3248 except ValueError: pass
3249 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3250
3251 try: '%*s' % ('abc')
3252 except TypeError: pass
3253 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3254
3255 try: '%*.*s' % ('abc', 5)
3256 except TypeError: pass
3257 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3258
3259 try: '%s' % (1, 2)
3260 except TypeError: pass
3261 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3262
3263 try: '%' % None
3264 except ValueError: pass
3265 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3266
3267 vereq('534253'.isdigit(), 1)
3268 vereq('534253x'.isdigit(), 0)
3269 vereq('%c' % 5, '\x05')
3270 vereq('%c' % '5', '5')
3271
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003272def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003273 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003274 class Node:
3275 pass
3276 a = Node()
3277 b = Node()
3278 a.b = b
3279 b.a = a
3280 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003281
Guido van Rossumd7035672002-03-12 20:43:31 +00003282def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003283 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003284 from types import ModuleType as M
3285 m = M.__new__(M)
3286 str(m)
3287 vereq(hasattr(m, "__name__"), 0)
3288 vereq(hasattr(m, "__file__"), 0)
3289 vereq(hasattr(m, "foo"), 0)
3290 vereq(m.__dict__, None)
3291 m.foo = 1
3292 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003293
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003294def dictproxyiterkeys():
3295 class C(object):
3296 def meth(self):
3297 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003298 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003299 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003300 keys.sort()
3301 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3302
3303def dictproxyitervalues():
3304 class C(object):
3305 def meth(self):
3306 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003307 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003308 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003309 vereq(len(values), 5)
3310
3311def dictproxyiteritems():
3312 class C(object):
3313 def meth(self):
3314 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003315 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003316 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003317 keys.sort()
3318 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3319
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003320def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003321 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003322 class C(object):
3323 def __new__(cls, arg):
3324 if isinstance(arg, str): return [1, 2, 3]
3325 elif isinstance(arg, int): return object.__new__(D)
3326 else: return object.__new__(cls)
3327 class D(C):
3328 def __init__(self, arg):
3329 self.foo = arg
3330 vereq(C("1"), [1, 2, 3])
3331 vereq(D("1"), [1, 2, 3])
3332 d = D(None)
3333 veris(d.foo, None)
3334 d = C(1)
3335 vereq(isinstance(d, D), True)
3336 vereq(d.foo, 1)
3337 d = D(1)
3338 vereq(isinstance(d, D), True)
3339 vereq(d.foo, 1)
3340
Guido van Rossume8fc6402002-04-16 16:44:51 +00003341def imulbug():
3342 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003343 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003344 class C(object):
3345 def __imul__(self, other):
3346 return (self, other)
3347 x = C()
3348 y = x
3349 y *= 1.0
3350 vereq(y, (x, 1.0))
3351 y = x
3352 y *= 2
3353 vereq(y, (x, 2))
3354 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003355 y *= 3
3356 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003357 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003358 y *= 1<<100
3359 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003360 y = x
3361 y *= None
3362 vereq(y, (x, None))
3363 y = x
3364 y *= "foo"
3365 vereq(y, (x, "foo"))
3366
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003367def docdescriptor():
3368 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003369 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003370 class DocDescr(object):
3371 def __get__(self, object, otype):
3372 if object:
3373 object = object.__class__.__name__ + ' instance'
3374 if otype:
3375 otype = otype.__name__
3376 return 'object=%s; type=%s' % (object, otype)
3377 class OldClass:
3378 __doc__ = DocDescr()
3379 class NewClass(object):
3380 __doc__ = DocDescr()
3381 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3382 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3383 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3384 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3385
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003386def copy_setstate():
3387 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003388 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003389 import copy
3390 class C(object):
3391 def __init__(self, foo=None):
3392 self.foo = foo
3393 self.__foo = foo
3394 def setfoo(self, foo=None):
3395 self.foo = foo
3396 def getfoo(self):
3397 return self.__foo
3398 def __getstate__(self):
3399 return [self.foo]
3400 def __setstate__(self, lst):
3401 assert len(lst) == 1
3402 self.__foo = self.foo = lst[0]
3403 a = C(42)
3404 a.setfoo(24)
3405 vereq(a.foo, 24)
3406 vereq(a.getfoo(), 42)
3407 b = copy.copy(a)
3408 vereq(b.foo, 24)
3409 vereq(b.getfoo(), 24)
3410 b = copy.deepcopy(a)
3411 vereq(b.foo, 24)
3412 vereq(b.getfoo(), 24)
3413
Guido van Rossum09638c12002-06-13 19:17:46 +00003414def slices():
3415 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003416 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003417 # Strings
3418 vereq("hello"[:4], "hell")
3419 vereq("hello"[slice(4)], "hell")
3420 vereq(str.__getitem__("hello", slice(4)), "hell")
3421 class S(str):
3422 def __getitem__(self, x):
3423 return str.__getitem__(self, x)
3424 vereq(S("hello")[:4], "hell")
3425 vereq(S("hello")[slice(4)], "hell")
3426 vereq(S("hello").__getitem__(slice(4)), "hell")
3427 # Tuples
3428 vereq((1,2,3)[:2], (1,2))
3429 vereq((1,2,3)[slice(2)], (1,2))
3430 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3431 class T(tuple):
3432 def __getitem__(self, x):
3433 return tuple.__getitem__(self, x)
3434 vereq(T((1,2,3))[:2], (1,2))
3435 vereq(T((1,2,3))[slice(2)], (1,2))
3436 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3437 # Lists
3438 vereq([1,2,3][:2], [1,2])
3439 vereq([1,2,3][slice(2)], [1,2])
3440 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3441 class L(list):
3442 def __getitem__(self, x):
3443 return list.__getitem__(self, x)
3444 vereq(L([1,2,3])[:2], [1,2])
3445 vereq(L([1,2,3])[slice(2)], [1,2])
3446 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3447 # Now do lists and __setitem__
3448 a = L([1,2,3])
3449 a[slice(1, 3)] = [3,2]
3450 vereq(a, [1,3,2])
3451 a[slice(0, 2, 1)] = [3,1]
3452 vereq(a, [3,1,2])
3453 a.__setitem__(slice(1, 3), [2,1])
3454 vereq(a, [3,2,1])
3455 a.__setitem__(slice(0, 2, 1), [2,3])
3456 vereq(a, [2,3,1])
3457
Tim Peters2484aae2002-07-11 06:56:07 +00003458def subtype_resurrection():
3459 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003460 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003461
3462 class C(object):
3463 container = []
3464
3465 def __del__(self):
3466 # resurrect the instance
3467 C.container.append(self)
3468
3469 c = C()
3470 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003471 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003472 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003473 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003474
3475 # If that didn't blow up, it's also interesting to see whether clearing
3476 # the last container slot works: that will attempt to delete c again,
3477 # which will cause c to get appended back to the container again "during"
3478 # the del.
3479 del C.container[-1]
3480 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003481 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003482
Tim Peters14cb1e12002-07-11 18:26:21 +00003483 # Make c mortal again, so that the test framework with -l doesn't report
3484 # it as a leak.
3485 del C.__del__
3486
Guido van Rossum2d702462002-08-06 21:28:28 +00003487def slottrash():
3488 # Deallocating deeply nested slotted trash caused stack overflows
3489 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003490 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003491 class trash(object):
3492 __slots__ = ['x']
3493 def __init__(self, x):
3494 self.x = x
3495 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003496 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003497 o = trash(o)
3498 del o
3499
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003500def slotmultipleinheritance():
3501 # SF bug 575229, multiple inheritance w/ slots dumps core
3502 class A(object):
3503 __slots__=()
3504 class B(object):
3505 pass
3506 class C(A,B) :
3507 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003508 vereq(C.__basicsize__, B.__basicsize__)
3509 verify(hasattr(C, '__dict__'))
3510 verify(hasattr(C, '__weakref__'))
3511 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003512
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003513def testrmul():
3514 # SF patch 592646
3515 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003516 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003517 class C(object):
3518 def __mul__(self, other):
3519 return "mul"
3520 def __rmul__(self, other):
3521 return "rmul"
3522 a = C()
3523 vereq(a*2, "mul")
3524 vereq(a*2.2, "mul")
3525 vereq(2*a, "rmul")
3526 vereq(2.2*a, "rmul")
3527
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003528def testipow():
3529 # [SF bug 620179]
3530 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003531 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003532 class C(object):
3533 def __ipow__(self, other):
3534 pass
3535 a = C()
3536 a **= 2
3537
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003538def do_this_first():
3539 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003540 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003541 # This dumps core when SF bug 551412 isn't fixed --
3542 # but only when test_descr.py is run separately.
3543 # (That can't be helped -- as soon as PyType_Ready()
3544 # is called for PyLong_Type, the bug is gone.)
3545 class UserLong(object):
3546 def __pow__(self, *args):
3547 pass
3548 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003549 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003550 except:
3551 pass
3552
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003553 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003554 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003555 # Another segfault only when run early
3556 # (before PyType_Ready(tuple) is called)
3557 type.mro(tuple)
3558
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003559def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003560 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003561 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003562 # stuff that should work:
3563 class C(object):
3564 pass
3565 class C2(object):
3566 def __getattribute__(self, attr):
3567 if attr == 'a':
3568 return 2
3569 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003570 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003571 def meth(self):
3572 return 1
3573 class D(C):
3574 pass
3575 class E(D):
3576 pass
3577 d = D()
3578 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003579 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003580 D.__bases__ = (C2,)
3581 vereq(d.meth(), 1)
3582 vereq(e.meth(), 1)
3583 vereq(d.a, 2)
3584 vereq(e.a, 2)
3585 vereq(C2.__subclasses__(), [D])
3586
3587 # stuff that shouldn't:
3588 class L(list):
3589 pass
3590
3591 try:
3592 L.__bases__ = (dict,)
3593 except TypeError:
3594 pass
3595 else:
3596 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3597
3598 try:
3599 list.__bases__ = (dict,)
3600 except TypeError:
3601 pass
3602 else:
3603 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3604
3605 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003606 D.__bases__ = (C2, list)
3607 except TypeError:
3608 pass
3609 else:
3610 assert 0, "best_base calculation found wanting"
3611
3612 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003613 del D.__bases__
3614 except TypeError:
3615 pass
3616 else:
3617 raise TestFailed, "shouldn't be able to delete .__bases__"
3618
3619 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003620 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003621 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003622 if str(msg) == "a new-style class can't have only classic bases":
3623 raise TestFailed, "wrong error message for .__bases__ = ()"
3624 else:
3625 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3626
3627 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003628 D.__bases__ = (D,)
3629 except TypeError:
3630 pass
3631 else:
3632 # actually, we'll have crashed by here...
3633 raise TestFailed, "shouldn't be able to create inheritance cycles"
3634
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003635 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003636 D.__bases__ = (C, C)
3637 except TypeError:
3638 pass
3639 else:
3640 raise TestFailed, "didn't detect repeated base classes"
3641
3642 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003643 D.__bases__ = (E,)
3644 except TypeError:
3645 pass
3646 else:
3647 raise TestFailed, "shouldn't be able to create inheritance cycles"
3648
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003649def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003650 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003651 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003652 class WorkOnce(type):
3653 def __new__(self, name, bases, ns):
3654 self.flag = 0
3655 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3656 def mro(self):
3657 if self.flag > 0:
3658 raise RuntimeError, "bozo"
3659 else:
3660 self.flag += 1
3661 return type.mro(self)
3662
3663 class WorkAlways(type):
3664 def mro(self):
3665 # this is here to make sure that .mro()s aren't called
3666 # with an exception set (which was possible at one point).
3667 # An error message will be printed in a debug build.
3668 # What's a good way to test for this?
3669 return type.mro(self)
3670
3671 class C(object):
3672 pass
3673
3674 class C2(object):
3675 pass
3676
3677 class D(C):
3678 pass
3679
3680 class E(D):
3681 pass
3682
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003683 class F(D, metaclass=WorkOnce):
3684 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003685
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003686 class G(D, metaclass=WorkAlways):
3687 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003688
3689 # Immediate subclasses have their mro's adjusted in alphabetical
3690 # order, so E's will get adjusted before adjusting F's fails. We
3691 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003692
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003693 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003694 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003695
3696 try:
3697 D.__bases__ = (C2,)
3698 except RuntimeError:
3699 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003700 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003701 else:
3702 raise TestFailed, "exception not propagated"
3703
3704def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003705 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003706 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003707 class A(object):
3708 pass
3709
3710 class B(object):
3711 pass
3712
3713 class C(A, B):
3714 pass
3715
3716 class D(A, B):
3717 pass
3718
3719 class E(C, D):
3720 pass
3721
3722 try:
3723 C.__bases__ = (B, A)
3724 except TypeError:
3725 pass
3726 else:
3727 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003728
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003729def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003730 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003731 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003732 class C(object):
3733 pass
3734
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003735 # C.__module__ could be 'test_descr' or '__main__'
3736 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003737
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003738 C.__name__ = 'D'
3739 vereq((C.__module__, C.__name__), (mod, 'D'))
3740
3741 C.__name__ = 'D.E'
3742 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003743
Guido van Rossum613f24f2003-01-06 23:00:59 +00003744def subclass_right_op():
3745 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003746 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003747
3748 # This code tests various cases where right-dispatch of a subclass
3749 # should be preferred over left-dispatch of a base class.
3750
3751 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3752
3753 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003754 def __floordiv__(self, other):
3755 return "B.__floordiv__"
3756 def __rfloordiv__(self, other):
3757 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003758
Guido van Rossumf389c772003-02-27 20:04:19 +00003759 vereq(B(1) // 1, "B.__floordiv__")
3760 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003761
3762 # Case 2: subclass of object; this is just the baseline for case 3
3763
3764 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003765 def __floordiv__(self, other):
3766 return "C.__floordiv__"
3767 def __rfloordiv__(self, other):
3768 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003769
Guido van Rossumf389c772003-02-27 20:04:19 +00003770 vereq(C() // 1, "C.__floordiv__")
3771 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003772
3773 # Case 3: subclass of new-style class; here it gets interesting
3774
3775 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003776 def __floordiv__(self, other):
3777 return "D.__floordiv__"
3778 def __rfloordiv__(self, other):
3779 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003780
Guido van Rossumf389c772003-02-27 20:04:19 +00003781 vereq(D() // C(), "D.__floordiv__")
3782 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003783
3784 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3785
3786 class E(C):
3787 pass
3788
Guido van Rossumf389c772003-02-27 20:04:19 +00003789 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003790
Guido van Rossumf389c772003-02-27 20:04:19 +00003791 vereq(E() // 1, "C.__floordiv__")
3792 vereq(1 // E(), "C.__rfloordiv__")
3793 vereq(E() // C(), "C.__floordiv__")
3794 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003795
Guido van Rossum373c7412003-01-07 13:41:37 +00003796def dict_type_with_metaclass():
3797 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003798 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003799
3800 class B(object):
3801 pass
3802 class M(type):
3803 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003804 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003805 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003806 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003807 veris(type(C.__dict__), type(B.__dict__))
3808
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003809def meth_class_get():
3810 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003811 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003812 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003813 # Baseline
3814 arg = [1, 2, 3]
3815 res = {1: None, 2: None, 3: None}
3816 vereq(dict.fromkeys(arg), res)
3817 vereq({}.fromkeys(arg), res)
3818 # Now get the descriptor
3819 descr = dict.__dict__["fromkeys"]
3820 # More baseline using the descriptor directly
3821 vereq(descr.__get__(None, dict)(arg), res)
3822 vereq(descr.__get__({})(arg), res)
3823 # Now check various error cases
3824 try:
3825 descr.__get__(None, None)
3826 except TypeError:
3827 pass
3828 else:
3829 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3830 try:
3831 descr.__get__(42)
3832 except TypeError:
3833 pass
3834 else:
3835 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3836 try:
3837 descr.__get__(None, 42)
3838 except TypeError:
3839 pass
3840 else:
3841 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3842 try:
3843 descr.__get__(None, int)
3844 except TypeError:
3845 pass
3846 else:
3847 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3848
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003849def isinst_isclass():
3850 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003851 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003852 class Proxy(object):
3853 def __init__(self, obj):
3854 self.__obj = obj
3855 def __getattribute__(self, name):
3856 if name.startswith("_Proxy__"):
3857 return object.__getattribute__(self, name)
3858 else:
3859 return getattr(self.__obj, name)
3860 # Test with a classic class
3861 class C:
3862 pass
3863 a = C()
3864 pa = Proxy(a)
3865 verify(isinstance(a, C)) # Baseline
3866 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003867 # Test with a classic subclass
3868 class D(C):
3869 pass
3870 a = D()
3871 pa = Proxy(a)
3872 verify(isinstance(a, C)) # Baseline
3873 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003874 # Test with a new-style class
3875 class C(object):
3876 pass
3877 a = C()
3878 pa = Proxy(a)
3879 verify(isinstance(a, C)) # Baseline
3880 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003881 # Test with a new-style subclass
3882 class D(C):
3883 pass
3884 a = D()
3885 pa = Proxy(a)
3886 verify(isinstance(a, C)) # Baseline
3887 verify(isinstance(pa, C)) # Test
3888
3889def proxysuper():
3890 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003891 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003892 class Proxy(object):
3893 def __init__(self, obj):
3894 self.__obj = obj
3895 def __getattribute__(self, name):
3896 if name.startswith("_Proxy__"):
3897 return object.__getattribute__(self, name)
3898 else:
3899 return getattr(self.__obj, name)
3900
3901 class B(object):
3902 def f(self):
3903 return "B.f"
3904
3905 class C(B):
3906 def f(self):
3907 return super(C, self).f() + "->C.f"
3908
3909 obj = C()
3910 p = Proxy(obj)
3911 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003912
Guido van Rossum52b27052003-04-15 20:05:10 +00003913def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003914 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003915 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003916 try:
3917 object.__setattr__(str, "foo", 42)
3918 except TypeError:
3919 pass
3920 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003921 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003922 try:
3923 object.__delattr__(str, "lower")
3924 except TypeError:
3925 pass
3926 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003927 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003928
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003929def weakref_segfault():
3930 # SF 742911
3931 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003932 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003933
3934 import weakref
3935
3936 class Provoker:
3937 def __init__(self, referrent):
3938 self.ref = weakref.ref(referrent)
3939
3940 def __del__(self):
3941 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003942
3943 class Oops(object):
3944 pass
3945
3946 o = Oops()
3947 o.whatever = Provoker(o)
3948 del o
3949
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003950def wrapper_segfault():
3951 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003952 if verbose:
3953 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003954 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00003955 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003956 f = f.__call__
3957 f = None
3958
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003959# Fix SF #762455, segfault when sys.stdout is changed in getattr
3960def filefault():
3961 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003962 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003963 import sys
3964 class StdoutGuard:
3965 def __getattr__(self, attr):
3966 sys.stdout = sys.__stdout__
3967 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3968 sys.stdout = StdoutGuard()
3969 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003970 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003971 except RuntimeError:
3972 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003973
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003974def vicious_descriptor_nonsense():
3975 # A potential segfault spotted by Thomas Wouters in mail to
3976 # python-dev 2003-04-17, turned into an example & fixed by Michael
3977 # Hudson just less than four months later...
3978 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003979 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003980
3981 class Evil(object):
3982 def __hash__(self):
3983 return hash('attr')
3984 def __eq__(self, other):
3985 del C.attr
3986 return 0
3987
3988 class Descr(object):
3989 def __get__(self, ob, type=None):
3990 return 1
3991
3992 class C(object):
3993 attr = Descr()
3994
3995 c = C()
3996 c.__dict__[Evil()] = 0
3997
3998 vereq(c.attr, 1)
3999 # this makes a crash more likely:
4000 import gc; gc.collect()
4001 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004002
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004003def test_init():
4004 # SF 1155938
4005 class Foo(object):
4006 def __init__(self):
4007 return 10
4008 try:
4009 Foo()
4010 except TypeError:
4011 pass
4012 else:
4013 raise TestFailed, "did not test __init__() for None return"
4014
Armin Rigoc6686b72005-11-07 08:38:00 +00004015def methodwrapper():
4016 # <type 'method-wrapper'> did not support any reflection before 2.5
4017 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004018 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004019
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004020 return # XXX should methods really support __eq__?
4021
Armin Rigoc6686b72005-11-07 08:38:00 +00004022 l = []
4023 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004024 vereq(l.__add__, [].__add__)
4025 verify(l.__add__ != [5].__add__)
4026 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004027 verify(l.__add__.__name__ == '__add__')
4028 verify(l.__add__.__self__ is l)
4029 verify(l.__add__.__objclass__ is list)
4030 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004031 try:
4032 hash(l.__add__)
4033 except TypeError:
4034 pass
4035 else:
4036 raise TestFailed("no TypeError from hash([].__add__)")
4037
4038 t = ()
4039 t += (7,)
4040 vereq(t.__add__, (7,).__add__)
4041 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004042
Armin Rigofd163f92005-12-29 15:59:19 +00004043def notimplemented():
4044 # all binary methods should be able to return a NotImplemented
4045 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004046 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004047
4048 import sys
4049 import types
4050 import operator
4051
4052 def specialmethod(self, other):
4053 return NotImplemented
4054
4055 def check(expr, x, y):
4056 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004057 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004058 except TypeError:
4059 pass
4060 else:
4061 raise TestFailed("no TypeError from %r" % (expr,))
4062
Guido van Rossume2a383d2007-01-15 16:59:06 +00004063 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004064 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4065 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004066 if 1:
4067 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004068 for name, expr, iexpr in [
4069 ('__add__', 'x + y', 'x += y'),
4070 ('__sub__', 'x - y', 'x -= y'),
4071 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004072 ('__truediv__', 'x / y', None),
4073 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004074 ('__mod__', 'x % y', 'x %= y'),
4075 ('__divmod__', 'divmod(x, y)', None),
4076 ('__pow__', 'x ** y', 'x **= y'),
4077 ('__lshift__', 'x << y', 'x <<= y'),
4078 ('__rshift__', 'x >> y', 'x >>= y'),
4079 ('__and__', 'x & y', 'x &= y'),
4080 ('__or__', 'x | y', 'x |= y'),
4081 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004082 ]:
4083 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004084 A = metaclass('A', (), {name: specialmethod})
4085 B = metaclass('B', (), {rname: specialmethod})
4086 a = A()
4087 b = B()
4088 check(expr, a, a)
4089 check(expr, a, b)
4090 check(expr, b, a)
4091 check(expr, b, b)
4092 check(expr, a, N1)
4093 check(expr, a, N2)
4094 check(expr, N1, b)
4095 check(expr, N2, b)
4096 if iexpr:
4097 check(iexpr, a, a)
4098 check(iexpr, a, b)
4099 check(iexpr, b, a)
4100 check(iexpr, b, b)
4101 check(iexpr, a, N1)
4102 check(iexpr, a, N2)
4103 iname = '__i' + name[2:]
4104 C = metaclass('C', (), {iname: specialmethod})
4105 c = C()
4106 check(iexpr, c, a)
4107 check(iexpr, c, b)
4108 check(iexpr, c, N1)
4109 check(iexpr, c, N2)
4110
Guido van Rossumd8faa362007-04-27 19:54:29 +00004111def test_assign_slice():
4112 # ceval.c's assign_slice used to check for
4113 # tp->tp_as_sequence->sq_slice instead of
4114 # tp->tp_as_sequence->sq_ass_slice
4115
4116 class C(object):
4117 def __setslice__(self, start, stop, value):
4118 self.value = value
4119
4120 c = C()
4121 c[1:2] = 3
4122 vereq(c.value, 3)
4123
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004124def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004125 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004126 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004127 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004128 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004129 lists()
4130 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004131 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004132 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004133 ints()
4134 longs()
4135 floats()
4136 complexes()
4137 spamlists()
4138 spamdicts()
4139 pydicts()
4140 pylists()
4141 metaclass()
4142 pymods()
4143 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004144 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004145 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004146 ex5()
4147 monotonicity()
4148 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004149 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004150 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004151 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004152 dynamics()
4153 errors()
4154 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004155 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004156 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004157 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004158 classic()
4159 compattr()
4160 newslot()
4161 altmro()
4162 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004163 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004164 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004165 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004166 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004167 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004168 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004169 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004170 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004171 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004172 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004173 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004174 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004175 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004176 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004177 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004178 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004179 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004180 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004181 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004182 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004183 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004184 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004185 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004186 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004187 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004188 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004189 dictproxyiterkeys()
4190 dictproxyitervalues()
4191 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004192 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004193 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004194 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004195 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004196 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004197 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004198 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004199 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004200 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004201 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004202 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004203 test_mutable_bases()
4204 test_mutable_bases_with_failing_mro()
4205 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004206 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004207 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004208 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004209 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004210 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004211 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004212 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004213 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004214 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004215 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004216 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004217 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004218 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004219
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004220 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004221
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004222if __name__ == "__main__":
4223 test_main()