blob: 47b647cee31e188d3f48354fa81ddc9b1da0ffc7 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
4from test.test_support import get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00005from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00006import warnings
Guido van Rossum360e4b82007-05-14 22:51:27 +00007import types
Tim Peters4d9b4662002-04-16 01:59:17 +00008
9warnings.filterwarnings("ignore",
10 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +000011 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000012
Guido van Rossum875eeaa2001-10-11 18:33:53 +000013def veris(a, b):
14 if a is not b:
Collin Winter3add4d72007-08-29 23:37:32 +000015 raise TestFailed("%r is %r" % (a, b))
Guido van Rossum875eeaa2001-10-11 18:33:53 +000016
Tim Peters6d6c1a32001-08-02 04:15:00 +000017def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000018 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000020 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000021 t = type(a)
22 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000023 while meth not in t.__dict__:
24 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000025 vereq(m, t.__dict__[meth])
26 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000028 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000029
30def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000031 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000032 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000033
Guido van Rossum45704552001-10-08 16:35:45 +000034 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000035 t = type(a)
36 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000037 while meth not in t.__dict__:
38 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000039 vereq(m, t.__dict__[meth])
40 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000041 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000042 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000044def testsliceop(a, b, c, res, expr="a[b:c]", meth="__getitem__"):
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])
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000053 vereq(m(a, slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054 bm = getattr(a, meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000055 vereq(bm(slice(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
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000093def testsetsliceop(a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
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)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000104 m(dict['a'], slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000105 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000106 dict['a'] = deepcopy(a)
107 bm = getattr(dict['a'], meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000108 bm(slice(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__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000145 testsliceop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000146 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__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000152 testsetsliceop([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
153 "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000154
155def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000156 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000157 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000158 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
159 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
160 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
161 d = {1:2,3:4}
162 l1 = []
163 for i in d.keys(): l1.append(i)
164 l = []
165 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000166 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000167 l = []
168 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000169 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000171 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000172 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000173 d = {1:2, 3:4}
174 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000175 vereq(eval(repr(d), {}), d)
176 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000177 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
178
Tim Peters25786c02001-09-02 08:22:48 +0000179def dict_constructor():
180 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000181 print("Testing dict constructor ...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000183 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000184 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000185 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000186 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000187 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000188 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000189 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000190 d = dict({'one':1, 'two':2})
191 vereq(d, dict(one=1, two=2))
192 vereq(d, dict(**d))
193 vereq(d, dict({"one": 1}, two=2))
194 vereq(d, dict([("two", 2)], one=1))
195 vereq(d, dict([("one", 100), ("two", 200)], **d))
196 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000197 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000198 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000199 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000200 except TypeError:
201 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000202 except ValueError:
203 if badarg == "0":
204 # It's a sequence, and its elements are also sequences (gotta
205 # love strings <wink>), but they aren't of length 2, so this
206 # one seemed better as a ValueError than a TypeError.
207 pass
208 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000209 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000210 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000211 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000212
213 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000214 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000215 except TypeError:
216 pass
217 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000218 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000219
220 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000221 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000222 dict = {1:2, 3:4, 'a':1j}
223
Tim Peters25786c02001-09-02 08:22:48 +0000224 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000225 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000226 except TypeError:
227 pass
228 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000229 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000230
231 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000232 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000233 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000234 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000235
Tim Peters1fc240e2001-10-26 05:06:50 +0000236 # Init from sequence of iterable objects, each producing a 2-sequence.
237 class AddressBookEntry:
238 def __init__(self, first, last):
239 self.first = first
240 self.last = last
241 def __iter__(self):
242 return iter([self.first, self.last])
243
Tim Petersa427a2b2001-10-29 22:25:45 +0000244 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000245 AddressBookEntry('Barry', 'Peters'),
246 AddressBookEntry('Tim', 'Peters'),
247 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000248 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
249
Tim Petersa427a2b2001-10-29 22:25:45 +0000250 d = dict(zip(range(4), range(1, 5)))
251 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000252
253 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000254 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000255 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000256 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000257 except ValueError:
258 pass
259 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000260 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000261
Tim Peters5d2b77c2001-09-03 05:47:38 +0000262def test_dir():
263 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000264 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000265 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000266 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000267 del junk
268
269 # Just make sure these don't blow up!
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000270 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000271 dir(arg)
272
Thomas Wouters0725cf22006-04-15 09:04:57 +0000273 # Test dir on custom classes. Since these have object as a
274 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000275 def interesting(strings):
276 return [s for s in strings if not s.startswith('_')]
277
Tim Peters5d2b77c2001-09-03 05:47:38 +0000278 class C(object):
279 Cdata = 1
280 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000281
282 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000284
285 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000286 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000287 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000288
289 c.cdata = 2
290 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000291 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000292 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000293
Tim Peters5d2b77c2001-09-03 05:47:38 +0000294 class A(C):
295 Adata = 1
296 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000297
298 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000300 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000301 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000302 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000303 a.adata = 42
304 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000305 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000306 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000307
Tim Peterscaaff8d2001-09-10 23:12:14 +0000308 # Try a module subclass.
309 import sys
310 class M(type(sys)):
311 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000312 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000313 minstance.b = 2
314 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000315 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
316 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000317
318 class M2(M):
319 def getdict(self):
320 return "Not a dict!"
321 __dict__ = property(getdict)
322
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000323 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000324 m2instance.b = 2
325 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000326 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000327 try:
328 dir(m2instance)
329 except TypeError:
330 pass
331
Tim Peters9e6a3992001-10-30 05:45:26 +0000332 # Two essentially featureless objects, just inheriting stuff from
333 # object.
334 vereq(dir(None), dir(Ellipsis))
335
Guido van Rossum44022412002-05-13 18:29:46 +0000336 # Nasty test case for proxied objects
337 class Wrapper(object):
338 def __init__(self, obj):
339 self.__obj = obj
340 def __repr__(self):
341 return "Wrapper(%s)" % repr(self.__obj)
342 def __getitem__(self, key):
343 return Wrapper(self.__obj[key])
344 def __len__(self):
345 return len(self.__obj)
346 def __getattr__(self, name):
347 return Wrapper(getattr(self.__obj, name))
348
349 class C(object):
350 def __getclass(self):
351 return Wrapper(type(self))
352 __class__ = property(__getclass)
353
354 dir(C()) # This used to segfault
355
Tim Peters6d6c1a32001-08-02 04:15:00 +0000356binops = {
357 'add': '+',
358 'sub': '-',
359 'mul': '*',
360 'div': '/',
361 'mod': '%',
362 'divmod': 'divmod',
363 'pow': '**',
364 'lshift': '<<',
365 'rshift': '>>',
366 'and': '&',
367 'xor': '^',
368 'or': '|',
369 'cmp': 'cmp',
370 'lt': '<',
371 'le': '<=',
372 'eq': '==',
373 'ne': '!=',
374 'gt': '>',
375 'ge': '>=',
376 }
377
378for name, expr in binops.items():
379 if expr.islower():
380 expr = expr + "(a, b)"
381 else:
382 expr = 'a %s b' % expr
383 binops[name] = expr
384
385unops = {
386 'pos': '+',
387 'neg': '-',
388 'abs': 'abs',
389 'invert': '~',
390 'int': 'int',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000391 'float': 'float',
392 'oct': 'oct',
393 'hex': 'hex',
394 }
395
396for name, expr in unops.items():
397 if expr.islower():
398 expr = expr + "(a)"
399 else:
400 expr = '%s a' % expr
401 unops[name] = expr
402
403def numops(a, b, skip=[]):
404 dict = {'a': a, 'b': b}
405 for name, expr in binops.items():
406 if name not in skip:
407 name = "__%s__" % name
408 if hasattr(a, name):
409 res = eval(expr, dict)
410 testbinop(a, b, res, expr, name)
411 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000412 if name not in skip:
413 name = "__%s__" % name
414 if hasattr(a, name):
415 res = eval(expr, dict)
416 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000417
418def ints():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000419 if verbose: print("Testing int operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000420 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000421 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000422 vereq((1).__bool__(), True)
423 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000424 # This returns 'NotImplemented' in Python 2.2
425 class C(int):
426 def __add__(self, other):
427 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000428 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000429 try:
430 C() + ""
431 except TypeError:
432 pass
433 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000434 raise TestFailed("NotImplemented should have caused TypeError")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000435
436def longs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000437 if verbose: print("Testing long operations...")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000438 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000439
440def floats():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000441 if verbose: print("Testing float operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000442 numops(100.0, 3.0)
443
444def complexes():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000445 if verbose: print("Testing complex operations...")
Guido van Rossum4a7fd902007-08-03 21:15:23 +0000446 numops(100.0j, 3.0j,
447 skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float',
448 'divmod', 'mod'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000449 class Number(complex):
450 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000451 def __new__(cls, *args, **kwds):
452 result = complex.__new__(cls, *args)
453 result.prec = kwds.get('prec', 12)
454 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000455 def __repr__(self):
456 prec = self.prec
457 if self.imag == 0.0:
458 return "%.*g" % (prec, self.real)
459 if self.real == 0.0:
460 return "%.*gj" % (prec, self.imag)
461 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
462 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000463
Tim Peters6d6c1a32001-08-02 04:15:00 +0000464 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000465 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000466 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000467
Tim Peters3f996e72001-09-13 19:18:27 +0000468 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000469 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000470 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000471
472 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000473 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000474 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000475
Tim Peters6d6c1a32001-08-02 04:15:00 +0000476def spamlists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000477 if verbose: print("Testing spamlist operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000478 import copy, xxsubtype as spam
479 def spamlist(l, memo=None):
480 import xxsubtype as spam
481 return spam.spamlist(l)
482 # This is an ugly hack:
483 copy._deepcopy_dispatch[spam.spamlist] = spamlist
484
485 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
486 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
487 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
488 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000489 testsliceop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
490 "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000491 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
492 "a+=b", "__iadd__")
493 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
494 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
495 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
496 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
497 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000498 testsetsliceop(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
499 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000500 # Test subclassing
501 class C(spam.spamlist):
502 def foo(self): return 1
503 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000504 vereq(a, [])
505 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000507 vereq(a, [100])
508 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000509 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000510 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000511
512def spamdicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000513 if verbose: print("Testing spamdict operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000514 import copy, xxsubtype as spam
515 def spamdict(d, memo=None):
516 import xxsubtype as spam
517 sd = spam.spamdict()
518 for k, v in d.items(): sd[k] = v
519 return sd
520 # This is an ugly hack:
521 copy._deepcopy_dispatch[spam.spamdict] = spamdict
522
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000523 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000524 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
525 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
526 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
527 d = spamdict({1:2,3:4})
528 l1 = []
529 for i in d.keys(): l1.append(i)
530 l = []
531 for i in iter(d): 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 d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000535 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000536 l = []
537 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000538 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000539 straightd = {1:2, 3:4}
540 spamd = spamdict(straightd)
541 testunop(spamd, 2, "len(a)", "__len__")
542 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
543 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
544 "a[b]=c", "__setitem__")
545 # Test subclassing
546 class C(spam.spamdict):
547 def foo(self): return 1
548 a = C()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000549 vereq(list(a.items()), [])
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551 a['foo'] = 'bar'
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000552 vereq(list(a.items()), [('foo', 'bar')])
Guido van Rossum45704552001-10-08 16:35:45 +0000553 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000554 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000555 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000556
557def pydicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000558 if verbose: print("Testing Python subclass of dict...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000559 verify(issubclass(dict, dict))
560 verify(isinstance({}, dict))
561 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000562 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000563 verify(d.__class__ is dict)
564 verify(isinstance(d, dict))
565 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000566 state = -1
567 def __init__(self, *a, **kw):
568 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000569 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000570 self.state = a[0]
571 if kw:
572 for k, v in kw.items(): self[v] = k
573 def __getitem__(self, key):
574 return self.get(key, 0)
575 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000576 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000577 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 def setstate(self, state):
579 self.state = state
580 def getstate(self):
581 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000582 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000584 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000587 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000588 vereq(a.state, -1)
589 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000590 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000591 vereq(a.state, 0)
592 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000593 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000594 vereq(a.state, 10)
595 vereq(a.getstate(), 10)
596 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000597 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000598 vereq(a[42], 24)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000599 if verbose: print("pydict stress test ...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000600 N = 50
601 for i in range(N):
602 a[i] = C()
603 for j in range(N):
604 a[i][j] = i*j
605 for i in range(N):
606 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000607 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000608
609def pylists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000610 if verbose: print("Testing Python subclass of list...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000611 class C(list):
612 def __getitem__(self, i):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000613 if isinstance(i, slice):
614 return (i.start, i.stop)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000615 return list.__getitem__(self, i) + 100
Tim Peters6d6c1a32001-08-02 04:15:00 +0000616 a = C()
617 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000618 vereq(a[0], 100)
619 vereq(a[1], 101)
620 vereq(a[2], 102)
621 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000622
623def metaclass():
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000624 if verbose: print("Testing metaclass...")
625 class C(metaclass=type):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000626 def __init__(self):
627 self.__state = 0
628 def getstate(self):
629 return self.__state
630 def setstate(self, state):
631 self.__state = state
632 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000633 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000634 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000635 vereq(a.getstate(), 10)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000636 class _metaclass(type):
637 def myself(cls): return cls
638 class D(metaclass=_metaclass):
639 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000640 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000641 d = D()
642 verify(d.__class__ is D)
643 class M1(type):
644 def __new__(cls, name, bases, dict):
645 dict['__spam__'] = 1
646 return type.__new__(cls, name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000647 class C(metaclass=M1):
648 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000649 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000650 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000651 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000652
Guido van Rossum309b5662001-08-17 11:43:17 +0000653 class _instance(object):
654 pass
655 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000656 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000657 def __new__(cls, name, bases, dict):
658 self = object.__new__(cls)
659 self.name = name
660 self.bases = bases
661 self.dict = dict
662 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000663 def __call__(self):
664 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000665 # Early binding of methods
666 for key in self.dict:
667 if key.startswith("__"):
668 continue
669 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000670 return it
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000671 class C(metaclass=M2):
Guido van Rossum309b5662001-08-17 11:43:17 +0000672 def spam(self):
673 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(C.name, 'C')
675 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000676 verify('spam' in C.dict)
677 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000678 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000679
Guido van Rossum91ee7982001-08-30 20:52:40 +0000680 # More metaclass examples
681
682 class autosuper(type):
683 # Automatically add __super to the class
684 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000685 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000686 cls = super(autosuper, metaclass).__new__(metaclass,
687 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000688 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000689 while name[:1] == "_":
690 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000691 if name:
692 name = "_%s__super" % name
693 else:
694 name = "__super"
695 setattr(cls, name, super(cls))
696 return cls
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000697 class A(metaclass=autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000698 def meth(self):
699 return "A"
700 class B(A):
701 def meth(self):
702 return "B" + self.__super.meth()
703 class C(A):
704 def meth(self):
705 return "C" + self.__super.meth()
706 class D(C, B):
707 def meth(self):
708 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000709 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000710 class E(B, C):
711 def meth(self):
712 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000713 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000714
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000715 class autoproperty(type):
716 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 # named _get_x and/or _set_x are found
718 def __new__(metaclass, name, bases, dict):
719 hits = {}
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000720 for key, val in dict.items():
Guido van Rossum91ee7982001-08-30 20:52:40 +0000721 if key.startswith("_get_"):
722 key = key[5:]
723 get, set = hits.get(key, (None, None))
724 get = val
725 hits[key] = get, set
726 elif key.startswith("_set_"):
727 key = key[5:]
728 get, set = hits.get(key, (None, None))
729 set = val
730 hits[key] = get, set
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000731 for key, (get, set) in hits.items():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000732 dict[key] = property(get, set)
733 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000734 name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000735 class A(metaclass=autoproperty):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000736 def _get_x(self):
737 return -self.__x
738 def _set_x(self, x):
739 self.__x = -x
740 a = A()
741 verify(not hasattr(a, "x"))
742 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000743 vereq(a.x, 12)
744 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000745
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000746 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000747 # Merge of multiple cooperating metaclasses
748 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000749 class A(metaclass=multimetaclass):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000750 def _get_x(self):
751 return "A"
752 class B(A):
753 def _get_x(self):
754 return "B" + self.__super._get_x()
755 class C(A):
756 def _get_x(self):
757 return "C" + self.__super._get_x()
758 class D(C, B):
759 def _get_x(self):
760 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000761 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000762
Guido van Rossumf76de622001-10-18 15:49:21 +0000763 # Make sure type(x) doesn't call x.__class__.__init__
764 class T(type):
765 counter = 0
766 def __init__(self, *args):
767 T.counter += 1
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000768 class C(metaclass=T):
769 pass
Guido van Rossumf76de622001-10-18 15:49:21 +0000770 vereq(T.counter, 1)
771 a = C()
772 vereq(type(a), C)
773 vereq(T.counter, 1)
774
Guido van Rossum29d26062001-12-11 04:37:34 +0000775 class C(object): pass
776 c = C()
777 try: c()
778 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +0000779 else: raise TestFailed("calling object w/o call method should raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +0000780
Guido van Rossumd8faa362007-04-27 19:54:29 +0000781 # Testing code to find most derived baseclass
782 class A(type):
783 def __new__(*args, **kwargs):
784 return type.__new__(*args, **kwargs)
785
786 class B(object):
787 pass
788
789 class C(object, metaclass=A):
790 pass
791
792 # The most derived metaclass of D is A rather than type.
793 class D(B, C):
794 pass
795
796
Tim Peters6d6c1a32001-08-02 04:15:00 +0000797def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000798 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000800 import sys
801 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000802 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000803 def __init__(self, name):
804 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000805 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000806 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000807 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000808 def __setattr__(self, name, value):
809 log.append(("setattr", name, value))
810 MT.__setattr__(self, name, value)
811 def __delattr__(self, name):
812 log.append(("delattr", name))
813 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000814 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000815 a.foo = 12
816 x = a.foo
817 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000818 vereq(log, [("setattr", "foo", 12),
819 ("getattr", "foo"),
820 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000821
Guido van Rossum360e4b82007-05-14 22:51:27 +0000822 # http://python.org/sf/1174712
823 try:
824 class Module(types.ModuleType, str):
825 pass
826 except TypeError:
827 pass
828 else:
829 raise TestFailed("inheriting from ModuleType and str at the "
830 "same time should fail")
831
Tim Peters6d6c1a32001-08-02 04:15:00 +0000832def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000833 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 class C(object):
835 def __init__(self):
836 self.__state = 0
837 def getstate(self):
838 return self.__state
839 def setstate(self, state):
840 self.__state = state
841 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000842 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000844 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000845 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000846 def __init__(self):
847 type({}).__init__(self)
848 C.__init__(self)
849 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000850 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000851 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000852 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000853 vereq(d["hello"], "world")
854 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000855 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000856 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000857 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000858
Guido van Rossume45763a2001-08-10 21:28:46 +0000859 # SF bug #442833
860 class Node(object):
861 def __int__(self):
862 return int(self.foo())
863 def foo(self):
864 return "23"
865 class Frag(Node, list):
866 def foo(self):
867 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000868 vereq(Node().__int__(), 23)
869 vereq(int(Node()), 23)
870 vereq(Frag().__int__(), 42)
871 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000872
Tim Peters6d6c1a32001-08-02 04:15:00 +0000873def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000874 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000875 class A(object):
876 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000878 class B(A):
879 def boo(self): return "B"
880 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000881 vereq(B().spam(), "B")
882 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000883 class C(A):
884 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000885 vereq(C().spam(), "A")
886 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000887 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000888 vereq(D().spam(), "B")
889 vereq(D().boo(), "B")
890 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000891 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000892 vereq(E().spam(), "B")
893 vereq(E().boo(), "C")
894 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000895 # MRO order disagreement
896 try:
897 class F(D, E): pass
898 except TypeError:
899 pass
900 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000901 raise TestFailed("expected MRO order disagreement (F)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000902 try:
903 class G(E, D): pass
904 except TypeError:
905 pass
906 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000907 raise TestFailed("expected MRO order disagreement (G)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000908
909
910# see thread python-dev/2002-October/029035.html
911def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000912 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000913 class A(object): pass
914 class B(object): pass
915 class C(object): pass
916 class X(A): pass
917 class Y(A): pass
918 class Z(X,B,Y,C): pass
919 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
920
921# see "A Monotonic Superclass Linearization for Dylan",
922# by Kim Barrett et al. (OOPSLA 1996)
923def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000924 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000925 class Boat(object): pass
926 class DayBoat(Boat): pass
927 class WheelBoat(Boat): pass
928 class EngineLess(DayBoat): pass
929 class SmallMultihull(DayBoat): pass
930 class PedalWheelBoat(EngineLess,WheelBoat): pass
931 class SmallCatamaran(SmallMultihull): pass
932 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
933
934 vereq(PedalWheelBoat.__mro__,
935 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
936 object))
937 vereq(SmallCatamaran.__mro__,
938 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
939
940 vereq(Pedalo.__mro__,
941 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
942 SmallMultihull, DayBoat, WheelBoat, Boat, object))
943
944# see "A Monotonic Superclass Linearization for Dylan",
945# by Kim Barrett et al. (OOPSLA 1996)
946def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000947 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000948 class Pane(object): pass
949 class ScrollingMixin(object): pass
950 class EditingMixin(object): pass
951 class ScrollablePane(Pane,ScrollingMixin): pass
952 class EditablePane(Pane,EditingMixin): pass
953 class EditableScrollablePane(ScrollablePane,EditablePane): pass
954
955 vereq(EditableScrollablePane.__mro__,
956 (EditableScrollablePane, ScrollablePane, EditablePane,
957 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000958
Raymond Hettingerf394df42003-04-06 19:13:41 +0000959mro_err_msg = """Cannot create a consistent method resolution
960order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000961
Guido van Rossumd32047f2002-11-25 21:38:52 +0000962def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000963 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000964 def raises(exc, expected, callable, *args):
965 try:
966 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000967 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000968 if not str(msg).startswith(expected):
Collin Winter3add4d72007-08-29 23:37:32 +0000969 raise TestFailed("Message %r, expected %r" % (str(msg),
970 expected))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000971 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000972 raise TestFailed("Expected %s" % exc)
Guido van Rossumd32047f2002-11-25 21:38:52 +0000973 class A(object): pass
974 class B(A): pass
975 class C(object): pass
976 # Test some very simple errors
977 raises(TypeError, "duplicate base class A",
978 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000979 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000980 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000981 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000982 type, "X", (A, C, B), {})
983 # Test a slightly more complex error
984 class GridLayout(object): pass
985 class HorizontalGrid(GridLayout): pass
986 class VerticalGrid(GridLayout): pass
987 class HVGrid(HorizontalGrid, VerticalGrid): pass
988 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000989 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000990 type, "ConfusedGrid", (HVGrid, VHGrid), {})
991
Guido van Rossum37202612001-08-09 19:45:21 +0000992def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000993 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000994 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000995 vereq(a.__class__, object)
996 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000997 b = object()
998 verify(a is not b)
999 verify(not hasattr(a, "foo"))
1000 try:
1001 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +00001002 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +00001003 pass
1004 else:
1005 verify(0, "object() should not allow setting a foo attribute")
1006 verify(not hasattr(object(), "__dict__"))
1007
1008 class Cdict(object):
1009 pass
1010 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001011 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001012 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001013 vereq(x.foo, 1)
1014 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001015
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001017 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001018 class C0(object):
1019 __slots__ = []
1020 x = C0()
1021 verify(not hasattr(x, "__dict__"))
1022 verify(not hasattr(x, "foo"))
1023
1024 class C1(object):
1025 __slots__ = ['a']
1026 x = C1()
1027 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001028 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001029 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001030 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001031 x.a = None
1032 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001033 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001034 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001035
1036 class C3(object):
1037 __slots__ = ['a', 'b', 'c']
1038 x = C3()
1039 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001040 verify(not hasattr(x, 'a'))
1041 verify(not hasattr(x, 'b'))
1042 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001043 x.a = 1
1044 x.b = 2
1045 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001046 vereq(x.a, 1)
1047 vereq(x.b, 2)
1048 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001049
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001050 class C4(object):
1051 """Validate name mangling"""
1052 __slots__ = ['__a']
1053 def __init__(self, value):
1054 self.__a = value
1055 def get(self):
1056 return self.__a
1057 x = C4(5)
1058 verify(not hasattr(x, '__dict__'))
1059 verify(not hasattr(x, '__a'))
1060 vereq(x.get(), 5)
1061 try:
1062 x.__a = 6
1063 except AttributeError:
1064 pass
1065 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001066 raise TestFailed("Double underscored names not mangled")
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001067
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001068 # Make sure slot names are proper identifiers
1069 try:
1070 class C(object):
1071 __slots__ = [None]
1072 except TypeError:
1073 pass
1074 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001075 raise TestFailed("[None] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001076 try:
1077 class C(object):
1078 __slots__ = ["foo bar"]
1079 except TypeError:
1080 pass
1081 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001082 raise TestFailed("['foo bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001083 try:
1084 class C(object):
1085 __slots__ = ["foo\0bar"]
1086 except TypeError:
1087 pass
1088 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001089 raise TestFailed("['foo\\0bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001090 try:
1091 class C(object):
1092 __slots__ = ["1"]
1093 except TypeError:
1094 pass
1095 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001096 raise TestFailed("['1'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001097 try:
1098 class C(object):
1099 __slots__ = [""]
1100 except TypeError:
1101 pass
1102 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001103 raise TestFailed("[''] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001104 class C(object):
1105 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001106 # XXX(nnorwitz): was there supposed to be something tested
1107 # from the class above?
1108
1109 # Test a single string is not expanded as a sequence.
1110 class C(object):
1111 __slots__ = "abc"
1112 c = C()
1113 c.abc = 5
1114 vereq(c.abc, 5)
1115
1116 # Test unicode slot names
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001117 # Test a single unicode string is not expanded as a sequence.
1118 class C(object):
1119 __slots__ = "abc"
1120 c = C()
1121 c.abc = 5
1122 vereq(c.abc, 5)
1123
1124 # _unicode_to_string used to modify slots in certain circumstances
1125 slots = ("foo", "bar")
1126 class C(object):
1127 __slots__ = slots
1128 x = C()
1129 x.foo = 5
1130 vereq(x.foo, 5)
1131 veris(type(slots[0]), str)
1132 # this used to leak references
Guido van Rossumd8faa362007-04-27 19:54:29 +00001133 try:
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001134 class C(object):
1135 __slots__ = [chr(128)]
1136 except (TypeError, UnicodeEncodeError):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001137 pass
1138 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001139 raise TestFailed("[unichr(128)] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001140
Guido van Rossum33bab012001-12-05 22:45:48 +00001141 # Test leaks
1142 class Counted(object):
1143 counter = 0 # counts the number of instances alive
1144 def __init__(self):
1145 Counted.counter += 1
1146 def __del__(self):
1147 Counted.counter -= 1
1148 class C(object):
1149 __slots__ = ['a', 'b', 'c']
1150 x = C()
1151 x.a = Counted()
1152 x.b = Counted()
1153 x.c = Counted()
1154 vereq(Counted.counter, 3)
1155 del x
1156 vereq(Counted.counter, 0)
1157 class D(C):
1158 pass
1159 x = D()
1160 x.a = Counted()
1161 x.z = Counted()
1162 vereq(Counted.counter, 2)
1163 del x
1164 vereq(Counted.counter, 0)
1165 class E(D):
1166 __slots__ = ['e']
1167 x = E()
1168 x.a = Counted()
1169 x.z = Counted()
1170 x.e = Counted()
1171 vereq(Counted.counter, 3)
1172 del x
1173 vereq(Counted.counter, 0)
1174
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001175 # Test cyclical leaks [SF bug 519621]
1176 class F(object):
1177 __slots__ = ['a', 'b']
1178 log = []
1179 s = F()
1180 s.a = [Counted(), s]
1181 vereq(Counted.counter, 1)
1182 s = None
1183 import gc
1184 gc.collect()
1185 vereq(Counted.counter, 0)
1186
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001187 # Test lookup leaks [SF bug 572567]
1188 import sys,gc
1189 class G(object):
1190 def __cmp__(self, other):
1191 return 0
1192 g = G()
1193 orig_objects = len(gc.get_objects())
Guido van Rossum805365e2007-05-07 22:24:25 +00001194 for i in range(10):
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001195 g==g
1196 new_objects = len(gc.get_objects())
1197 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001198 class H(object):
1199 __slots__ = ['a', 'b']
1200 def __init__(self):
1201 self.a = 1
1202 self.b = 2
1203 def __del__(self):
1204 assert self.a == 1
1205 assert self.b == 2
1206
1207 save_stderr = sys.stderr
1208 sys.stderr = sys.stdout
1209 h = H()
1210 try:
1211 del h
1212 finally:
1213 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001214
Guido van Rossum8b056da2002-08-13 18:26:26 +00001215def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001216 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001217
1218 class D(object):
1219 __slots__ = ["__dict__"]
1220 a = D()
1221 verify(hasattr(a, "__dict__"))
1222 verify(not hasattr(a, "__weakref__"))
1223 a.foo = 42
1224 vereq(a.__dict__, {"foo": 42})
1225
1226 class W(object):
1227 __slots__ = ["__weakref__"]
1228 a = W()
1229 verify(hasattr(a, "__weakref__"))
1230 verify(not hasattr(a, "__dict__"))
1231 try:
1232 a.foo = 42
1233 except AttributeError:
1234 pass
1235 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001236 raise TestFailed("shouldn't be allowed to set a.foo")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001237
1238 class C1(W, D):
1239 __slots__ = []
1240 a = C1()
1241 verify(hasattr(a, "__dict__"))
1242 verify(hasattr(a, "__weakref__"))
1243 a.foo = 42
1244 vereq(a.__dict__, {"foo": 42})
1245
1246 class C2(D, W):
1247 __slots__ = []
1248 a = C2()
1249 verify(hasattr(a, "__dict__"))
1250 verify(hasattr(a, "__weakref__"))
1251 a.foo = 42
1252 vereq(a.__dict__, {"foo": 42})
1253
Guido van Rossum9a818922002-11-14 19:50:14 +00001254# MRO order disagreement
1255#
1256# class C3(C1, C2):
1257# __slots__ = []
1258#
1259# class C4(C2, C1):
1260# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001261
Tim Peters6d6c1a32001-08-02 04:15:00 +00001262def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001263 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001264 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001265 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001266 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001267 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001268 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001269 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001270 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001271 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001272 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001273 vereq(E.foo, 1)
1274 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001275 # Test dynamic instances
1276 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001277 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001278 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001279 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001280 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001281 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001282 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001283 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001284 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001285 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001286 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001287 vereq(int(a), 100)
1288 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001289 verify(not hasattr(a, "spam"))
1290 def mygetattr(self, name):
1291 if name == "spam":
1292 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001293 raise AttributeError
1294 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001295 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001296 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001297 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001298 def mysetattr(self, name, value):
1299 if name == "spam":
1300 raise AttributeError
1301 return object.__setattr__(self, name, value)
1302 C.__setattr__ = mysetattr
1303 try:
1304 a.spam = "not spam"
1305 except AttributeError:
1306 pass
1307 else:
1308 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001309 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001310 class D(C):
1311 pass
1312 d = D()
1313 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001314 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001315
Guido van Rossum7e35d572001-09-15 03:14:32 +00001316 # Test handling of int*seq and seq*int
1317 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001318 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001319 vereq("a"*I(2), "aa")
1320 vereq(I(2)*"a", "aa")
1321 vereq(2*I(3), 6)
1322 vereq(I(3)*2, 6)
1323 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001324
1325 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001326 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001327 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001328 vereq("a"*L(2), "aa")
1329 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001330 vereq(2*L(3), 6)
1331 vereq(L(3)*2, 6)
1332 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001333
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001334 # Test comparison of classes with dynamic metaclasses
1335 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001336 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001337 class someclass(metaclass=dynamicmetaclass):
1338 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001339 verify(someclass != object)
1340
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001342 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001343
1344 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001345 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001346 pass
1347 except TypeError:
1348 pass
1349 else:
1350 verify(0, "inheritance from both list and dict should be illegal")
1351
1352 try:
1353 class C(object, None):
1354 pass
1355 except TypeError:
1356 pass
1357 else:
1358 verify(0, "inheritance from non-type should be illegal")
1359 class Classic:
1360 pass
1361
1362 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001363 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364 pass
1365 except TypeError:
1366 pass
1367 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001368 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001369
1370 try:
1371 class C(object):
1372 __slots__ = 1
1373 except TypeError:
1374 pass
1375 else:
1376 verify(0, "__slots__ = 1 should be illegal")
1377
1378 try:
1379 class C(object):
1380 __slots__ = [1]
1381 except TypeError:
1382 pass
1383 else:
1384 verify(0, "__slots__ = [1] should be illegal")
1385
Guido van Rossumd8faa362007-04-27 19:54:29 +00001386 class M1(type):
1387 pass
1388 class M2(type):
1389 pass
1390 class A1(object, metaclass=M1):
1391 pass
1392 class A2(object, metaclass=M2):
1393 pass
1394 try:
1395 class B(A1, A2):
1396 pass
1397 except TypeError:
1398 pass
1399 else:
1400 verify(0, "finding the most derived metaclass should have failed")
1401
Tim Peters6d6c1a32001-08-02 04:15:00 +00001402def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001403 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001404 class C(object):
1405 def foo(*a): return a
1406 goo = classmethod(foo)
1407 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001408 vereq(C.goo(1), (C, 1))
1409 vereq(c.goo(1), (C, 1))
1410 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001411 class D(C):
1412 pass
1413 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001414 vereq(D.goo(1), (D, 1))
1415 vereq(d.goo(1), (D, 1))
1416 vereq(d.foo(1), (d, 1))
1417 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001418 # Test for a specific crash (SF bug 528132)
1419 def f(cls, arg): return (cls, arg)
1420 ff = classmethod(f)
1421 vereq(ff.__get__(0, int)(42), (int, 42))
1422 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001423
Guido van Rossum155db9a2002-04-02 17:53:47 +00001424 # Test super() with classmethods (SF bug 535444)
1425 veris(C.goo.im_self, C)
1426 veris(D.goo.im_self, D)
1427 veris(super(D,D).goo.im_self, D)
1428 veris(super(D,d).goo.im_self, D)
1429 vereq(super(D,D).goo(), (D,))
1430 vereq(super(D,d).goo(), (D,))
1431
Raymond Hettingerbe971532003-06-18 01:13:41 +00001432 # Verify that argument is checked for callability (SF bug 753451)
1433 try:
1434 classmethod(1).__get__(1)
1435 except TypeError:
1436 pass
1437 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001438 raise TestFailed("classmethod should check for callability")
Raymond Hettingerbe971532003-06-18 01:13:41 +00001439
Georg Brandl6a29c322006-02-21 22:17:46 +00001440 # Verify that classmethod() doesn't allow keyword args
1441 try:
1442 classmethod(f, kw=1)
1443 except TypeError:
1444 pass
1445 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001446 raise TestFailed("classmethod shouldn't accept keyword args")
Georg Brandl6a29c322006-02-21 22:17:46 +00001447
Fred Drakef841aa62002-03-28 15:49:54 +00001448def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001449 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001450 import xxsubtype as spam
1451 a = (1, 2, 3)
1452 d = {'abc': 123}
1453 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001454 veris(x, spam.spamlist)
1455 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001456 vereq(d, d1)
1457 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001458 veris(x, spam.spamlist)
1459 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001460 vereq(d, d1)
1461
Tim Peters6d6c1a32001-08-02 04:15:00 +00001462def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001463 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001464 class C(object):
1465 def foo(*a): return a
1466 goo = staticmethod(foo)
1467 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001468 vereq(C.goo(1), (1,))
1469 vereq(c.goo(1), (1,))
1470 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001471 class D(C):
1472 pass
1473 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001474 vereq(D.goo(1), (1,))
1475 vereq(d.goo(1), (1,))
1476 vereq(d.foo(1), (d, 1))
1477 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001478
Fred Drakef841aa62002-03-28 15:49:54 +00001479def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001480 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001481 import xxsubtype as spam
1482 a = (1, 2, 3)
1483 d = {"abc": 123}
1484 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1485 veris(x, None)
1486 vereq(a, a1)
1487 vereq(d, d1)
1488 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1489 veris(x, None)
1490 vereq(a, a1)
1491 vereq(d, d1)
1492
Tim Peters6d6c1a32001-08-02 04:15:00 +00001493def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001494 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001495 class C:
1496 def foo(*a): return a
1497 goo = classmethod(foo)
1498 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001499 vereq(C.goo(1), (C, 1))
1500 vereq(c.goo(1), (C, 1))
1501 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001502 class D(C):
1503 pass
1504 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001505 vereq(D.goo(1), (D, 1))
1506 vereq(d.goo(1), (D, 1))
1507 vereq(d.foo(1), (d, 1))
1508 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001509 class E: # *not* subclassing from C
1510 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001511 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001512 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513
1514def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001515 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001516 class C(object):
1517 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001518 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001519 self.__get = get
1520 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001521 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001522 def __get__(self, obj, type=None):
1523 return self.__get(obj)
1524 def __set__(self, obj, value):
1525 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001526 def __delete__(self, obj):
1527 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001528 def __init__(self):
1529 self.__x = 0
1530 def __get_x(self):
1531 x = self.__x
1532 self.__x = x+1
1533 return x
1534 def __set_x(self, x):
1535 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001536 def __delete_x(self):
1537 del self.__x
1538 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001539 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001540 vereq(a.x, 0)
1541 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001542 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001543 vereq(a.x, 10)
1544 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001545 del a.x
1546 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001547
1548def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001549 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001550 class C(list):
1551 def __new__(cls):
1552 self = list.__new__(cls)
1553 self.foo = 1
1554 return self
1555 def __init__(self):
1556 self.foo = self.foo + 2
1557 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001558 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001559 verify(a.__class__ is C)
1560 class D(C):
1561 pass
1562 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001563 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001564 verify(b.__class__ is D)
1565
Tim Peters6d6c1a32001-08-02 04:15:00 +00001566def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001567 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001568 class A(object):
1569 def f(self): return "A"
1570 class B(A):
1571 pass
1572 class C(A):
1573 def f(self): return "C"
1574 class D(B, C):
1575 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001576 vereq(D.mro(), [D, B, C, A, object])
1577 vereq(D.__mro__, (D, B, C, A, object))
1578 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001579
Guido van Rossumd3077402001-08-12 05:24:18 +00001580 class PerverseMetaType(type):
1581 def mro(cls):
1582 L = type.mro(cls)
1583 L.reverse()
1584 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001585 class X(D,B,C,A, metaclass=PerverseMetaType):
1586 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001587 vereq(X.__mro__, (object, A, C, B, D, X))
1588 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001589
Armin Rigo037d1e02005-12-29 17:07:39 +00001590 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001591 class _metaclass(type):
1592 def mro(self):
1593 return [self, dict, object]
1594 class X(object, metaclass=_metaclass):
1595 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001596 except TypeError:
1597 pass
1598 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001599 raise TestFailed("devious mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001600
1601 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001602 class _metaclass(type):
1603 def mro(self):
1604 return [1]
1605 class X(object, metaclass=_metaclass):
1606 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001607 except TypeError:
1608 pass
1609 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001610 raise TestFailed("non-class mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001611
1612 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001613 class _metaclass(type):
1614 def mro(self):
1615 return 1
1616 class X(object, metaclass=_metaclass):
1617 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001618 except TypeError:
1619 pass
1620 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001621 raise TestFailed("non-sequence mro() return not caught")
Tim Peters1b27f862005-12-30 18:42:42 +00001622
Armin Rigo037d1e02005-12-29 17:07:39 +00001623
Tim Peters6d6c1a32001-08-02 04:15:00 +00001624def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001625 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001626
1627 class B(object):
1628 "Intermediate class because object doesn't have a __setattr__"
1629
1630 class C(B):
1631
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001632 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001633 if name == "foo":
1634 return ("getattr", name)
1635 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001636 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001637 def __setattr__(self, name, value):
1638 if name == "foo":
1639 self.setattr = (name, value)
1640 else:
1641 return B.__setattr__(self, name, value)
1642 def __delattr__(self, name):
1643 if name == "foo":
1644 self.delattr = name
1645 else:
1646 return B.__delattr__(self, name)
1647
1648 def __getitem__(self, key):
1649 return ("getitem", key)
1650 def __setitem__(self, key, value):
1651 self.setitem = (key, value)
1652 def __delitem__(self, key):
1653 self.delitem = key
1654
Tim Peters6d6c1a32001-08-02 04:15:00 +00001655 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001656 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001657 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001658 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001659 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001661
Guido van Rossum45704552001-10-08 16:35:45 +00001662 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001663 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001664 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001666 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001668 vereq(a[0:10], ("getitem", slice(0, 10)))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001669 a[0:10] = "foo"
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001670 vereq(a.setitem, (slice(0, 10), "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001671 del a[0:10]
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001672 vereq(a.delitem, slice(0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001673
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001674def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001675 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001676 class C(object):
1677 def __init__(self, x):
1678 self.x = x
1679 def foo(self):
1680 return self.x
1681 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001682 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001683 class D(C):
1684 boo = C.foo
1685 goo = c1.foo
1686 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001687 vereq(d2.foo(), 2)
1688 vereq(d2.boo(), 2)
1689 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001690 class E(object):
1691 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001692 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001693 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001694
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001695def specials():
1696 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001697 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001698 # Test the default behavior for static classes
1699 class C(object):
1700 def __getitem__(self, i):
1701 if 0 <= i < 10: return i
1702 raise IndexError
1703 c1 = C()
1704 c2 = C()
1705 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001706 verify(id(c1) != id(c2))
1707 hash(c1)
1708 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001709 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001710 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001711 verify(c1 != c2)
1712 verify(not c1 != c1)
1713 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001714 # Note that the module name appears in str/repr, and that varies
1715 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001716 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001717 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001718 verify(-1 not in c1)
1719 for i in range(10):
1720 verify(i in c1)
1721 verify(10 not in c1)
1722 # Test the default behavior for dynamic classes
1723 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001724 def __getitem__(self, i):
1725 if 0 <= i < 10: return i
1726 raise IndexError
1727 d1 = D()
1728 d2 = D()
1729 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001730 verify(id(d1) != id(d2))
1731 hash(d1)
1732 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001733 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001734 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001735 verify(d1 != d2)
1736 verify(not d1 != d1)
1737 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001738 # Note that the module name appears in str/repr, and that varies
1739 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001740 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001741 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001742 verify(-1 not in d1)
1743 for i in range(10):
1744 verify(i in d1)
1745 verify(10 not in d1)
1746 # Test overridden behavior for static classes
1747 class Proxy(object):
1748 def __init__(self, x):
1749 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001750 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001751 return not not self.x
1752 def __hash__(self):
1753 return hash(self.x)
1754 def __eq__(self, other):
1755 return self.x == other
1756 def __ne__(self, other):
1757 return self.x != other
1758 def __cmp__(self, other):
1759 return cmp(self.x, other.x)
1760 def __str__(self):
1761 return "Proxy:%s" % self.x
1762 def __repr__(self):
1763 return "Proxy(%r)" % self.x
1764 def __contains__(self, value):
1765 return value in self.x
1766 p0 = Proxy(0)
1767 p1 = Proxy(1)
1768 p_1 = Proxy(-1)
1769 verify(not p0)
1770 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001771 vereq(hash(p0), hash(0))
1772 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001773 verify(p0 != p1)
1774 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001775 vereq(not p0, p1)
1776 vereq(cmp(p0, p1), -1)
1777 vereq(cmp(p0, p0), 0)
1778 vereq(cmp(p0, p_1), 1)
1779 vereq(str(p0), "Proxy:0")
1780 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001781 p10 = Proxy(range(10))
1782 verify(-1 not in p10)
1783 for i in range(10):
1784 verify(i in p10)
1785 verify(10 not in p10)
1786 # Test overridden behavior for dynamic classes
1787 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001788 def __init__(self, x):
1789 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001790 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001791 return not not self.x
1792 def __hash__(self):
1793 return hash(self.x)
1794 def __eq__(self, other):
1795 return self.x == other
1796 def __ne__(self, other):
1797 return self.x != other
1798 def __cmp__(self, other):
1799 return cmp(self.x, other.x)
1800 def __str__(self):
1801 return "DProxy:%s" % self.x
1802 def __repr__(self):
1803 return "DProxy(%r)" % self.x
1804 def __contains__(self, value):
1805 return value in self.x
1806 p0 = DProxy(0)
1807 p1 = DProxy(1)
1808 p_1 = DProxy(-1)
1809 verify(not p0)
1810 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(hash(p0), hash(0))
1812 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001813 verify(p0 != p1)
1814 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001815 vereq(not p0, p1)
1816 vereq(cmp(p0, p1), -1)
1817 vereq(cmp(p0, p0), 0)
1818 vereq(cmp(p0, p_1), 1)
1819 vereq(str(p0), "DProxy:0")
1820 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001821 p10 = DProxy(range(10))
1822 verify(-1 not in p10)
1823 for i in range(10):
1824 verify(i in p10)
1825 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001826## # Safety test for __cmp__
1827## def unsafecmp(a, b):
1828## try:
1829## a.__class__.__cmp__(a, b)
1830## except TypeError:
1831## pass
1832## else:
1833## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1834## a.__class__, a, b)
1835## unsafecmp(u"123", "123")
1836## unsafecmp("123", u"123")
1837## unsafecmp(1, 1.0)
1838## unsafecmp(1.0, 1)
1839## unsafecmp(1, 1L)
1840## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001841
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001842## class Letter(str):
1843## def __new__(cls, letter):
1844## if letter == 'EPS':
1845## return str.__new__(cls)
1846## return str.__new__(cls, letter)
1847## def __str__(self):
1848## if not self:
1849## return 'EPS'
1850## return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001851
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001852## # sys.stdout needs to be the original to trigger the recursion bug
1853## import sys
1854## test_stdout = sys.stdout
1855## sys.stdout = get_original_stdout()
1856## try:
1857## # nothing should actually be printed, this should raise an exception
1858## print(Letter('w'))
1859## except RuntimeError:
1860## pass
1861## else:
1862## raise TestFailed, "expected a RuntimeError for print recursion"
1863## sys.stdout = test_stdout
Neal Norwitz1a997502003-01-13 20:13:12 +00001864
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001865def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001866 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001867 import weakref
1868 class C(object):
1869 pass
1870 c = C()
1871 r = weakref.ref(c)
1872 verify(r() is c)
1873 del c
1874 verify(r() is None)
1875 del r
1876 class NoWeak(object):
1877 __slots__ = ['foo']
1878 no = NoWeak()
1879 try:
1880 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001881 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001882 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001883 else:
1884 verify(0, "weakref.ref(no) should be illegal")
1885 class Weak(object):
1886 __slots__ = ['foo', '__weakref__']
1887 yes = Weak()
1888 r = weakref.ref(yes)
1889 verify(r() is yes)
1890 del yes
1891 verify(r() is None)
1892 del r
1893
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001894def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001895 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001896 class C(object):
1897 def getx(self):
1898 return self.__x
1899 def setx(self, value):
1900 self.__x = value
1901 def delx(self):
1902 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001903 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001904 a = C()
1905 verify(not hasattr(a, "x"))
1906 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001907 vereq(a._C__x, 42)
1908 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001909 del a.x
1910 verify(not hasattr(a, "x"))
1911 verify(not hasattr(a, "_C__x"))
1912 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001913 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001914 C.x.__delete__(a)
1915 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001916
Tim Peters66c1a522001-09-24 21:17:50 +00001917 raw = C.__dict__['x']
1918 verify(isinstance(raw, property))
1919
1920 attrs = dir(raw)
1921 verify("__doc__" in attrs)
1922 verify("fget" in attrs)
1923 verify("fset" in attrs)
1924 verify("fdel" in attrs)
1925
Guido van Rossum45704552001-10-08 16:35:45 +00001926 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001927 verify(raw.fget is C.__dict__['getx'])
1928 verify(raw.fset is C.__dict__['setx'])
1929 verify(raw.fdel is C.__dict__['delx'])
1930
1931 for attr in "__doc__", "fget", "fset", "fdel":
1932 try:
1933 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001934 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001935 if str(msg).find('readonly') < 0:
1936 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001937 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001938 "msg %r" % (attr, str(msg)))
1939 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001940 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001941 "readonly %r attr on a property" % attr)
1942
Neal Norwitz673cd822002-10-18 16:33:13 +00001943 class D(object):
1944 __getitem__ = property(lambda s: 1/0)
1945
1946 d = D()
1947 try:
1948 for i in d:
1949 str(i)
1950 except ZeroDivisionError:
1951 pass
1952 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001953 raise TestFailed("expected ZeroDivisionError from bad property")
Neal Norwitz673cd822002-10-18 16:33:13 +00001954
Georg Brandl533ff6f2006-03-08 18:09:27 +00001955 class E(object):
1956 def getter(self):
1957 "getter method"
1958 return 0
1959 def setter(self, value):
1960 "setter method"
1961 pass
1962 prop = property(getter)
1963 vereq(prop.__doc__, "getter method")
1964 prop2 = property(fset=setter)
1965 vereq(prop2.__doc__, None)
1966
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001967 # this segfaulted in 2.5b2
1968 try:
1969 import _testcapi
1970 except ImportError:
1971 pass
1972 else:
1973 class X(object):
1974 p = property(_testcapi.test_with_docstring)
1975
1976
Guido van Rossumc4a18802001-08-24 16:55:27 +00001977def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001978 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001979
1980 class A(object):
1981 def meth(self, a):
1982 return "A(%r)" % a
1983
Guido van Rossum45704552001-10-08 16:35:45 +00001984 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001985
1986 class B(A):
1987 def __init__(self):
1988 self.__super = super(B, self)
1989 def meth(self, a):
1990 return "B(%r)" % a + self.__super.meth(a)
1991
Guido van Rossum45704552001-10-08 16:35:45 +00001992 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001993
1994 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001995 def meth(self, a):
1996 return "C(%r)" % a + self.__super.meth(a)
1997 C._C__super = super(C)
1998
Guido van Rossum45704552001-10-08 16:35:45 +00001999 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002000
2001 class D(C, B):
2002 def meth(self, a):
2003 return "D(%r)" % a + super(D, self).meth(a)
2004
Guido van Rossum5b443c62001-12-03 15:38:28 +00002005 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2006
2007 # Test for subclassing super
2008
2009 class mysuper(super):
2010 def __init__(self, *args):
2011 return super(mysuper, self).__init__(*args)
2012
2013 class E(D):
2014 def meth(self, a):
2015 return "E(%r)" % a + mysuper(E, self).meth(a)
2016
2017 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2018
2019 class F(E):
2020 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002021 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002022 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2023 F._F__super = mysuper(F)
2024
2025 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2026
2027 # Make sure certain errors are raised
2028
2029 try:
2030 super(D, 42)
2031 except TypeError:
2032 pass
2033 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002034 raise TestFailed("shouldn't allow super(D, 42)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002035
2036 try:
2037 super(D, C())
2038 except TypeError:
2039 pass
2040 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002041 raise TestFailed("shouldn't allow super(D, C())")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002042
2043 try:
2044 super(D).__get__(12)
2045 except TypeError:
2046 pass
2047 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002048 raise TestFailed("shouldn't allow super(D).__get__(12)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002049
2050 try:
2051 super(D).__get__(C())
2052 except TypeError:
2053 pass
2054 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002055 raise TestFailed("shouldn't allow super(D).__get__(C())")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002056
Guido van Rossuma4541a32003-04-16 20:02:22 +00002057 # Make sure data descriptors can be overridden and accessed via super
2058 # (new feature in Python 2.3)
2059
2060 class DDbase(object):
2061 def getx(self): return 42
2062 x = property(getx)
2063
2064 class DDsub(DDbase):
2065 def getx(self): return "hello"
2066 x = property(getx)
2067
2068 dd = DDsub()
2069 vereq(dd.x, "hello")
2070 vereq(super(DDsub, dd).x, 42)
2071
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002072 # Ensure that super() lookup of descriptor from classmethod
2073 # works (SF ID# 743627)
2074
2075 class Base(object):
2076 aProp = property(lambda self: "foo")
2077
2078 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002079 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002080 def test(klass):
2081 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002082
2083 veris(Sub.test(), Base.aProp)
2084
Thomas Wouters89f507f2006-12-13 04:49:30 +00002085 # Verify that super() doesn't allow keyword args
2086 try:
2087 super(Base, kw=1)
2088 except TypeError:
2089 pass
2090 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002091 raise TestFailed("super shouldn't accept keyword args")
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002092
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002093def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002094 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002095
2096 class hexint(int):
2097 def __repr__(self):
2098 return hex(self)
2099 def __add__(self, other):
2100 return hexint(int.__add__(self, other))
2101 # (Note that overriding __radd__ doesn't work,
2102 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002103 vereq(repr(hexint(7) + 9), "0x10")
2104 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002105 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002106 vereq(a, 12345)
2107 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002108 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002109 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002110 verify((+a).__class__ is int)
2111 verify((a >> 0).__class__ is int)
2112 verify((a << 0).__class__ is int)
2113 verify((hexint(0) << 12).__class__ is int)
2114 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002115
Guido van Rossume2a383d2007-01-15 16:59:06 +00002116 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002117 __slots__ = []
2118 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002119 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002120 def __add__(self, other):
2121 return self.__class__(super(octlong, self).__add__(other))
2122 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002123 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002124 # (Note that overriding __radd__ here only seems to work
2125 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002126 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002127 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002128 vereq(a, 12345)
2129 vereq(int(a), 12345)
2130 vereq(hash(a), hash(12345))
2131 verify(int(a).__class__ is int)
2132 verify((+a).__class__ is int)
2133 verify((-a).__class__ is int)
2134 verify((-octlong(0)).__class__ is int)
2135 verify((a >> 0).__class__ is int)
2136 verify((a << 0).__class__ is int)
2137 verify((a - 0).__class__ is int)
2138 verify((a * 1).__class__ is int)
2139 verify((a ** 1).__class__ is int)
2140 verify((a // 1).__class__ is int)
2141 verify((1 * a).__class__ is int)
2142 verify((a | 0).__class__ is int)
2143 verify((a ^ 0).__class__ is int)
2144 verify((a & -1).__class__ is int)
2145 verify((octlong(0) << 12).__class__ is int)
2146 verify((octlong(0) >> 12).__class__ is int)
2147 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002148
2149 # Because octlong overrides __add__, we can't check the absence of +0
2150 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002151 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002152 pass
2153 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002154 verify((a + 0).__class__ is int)
2155 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002156
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002157 # Check that negative clones don't segfault
2158 a = longclone(-1)
2159 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002160 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002161
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002162 class precfloat(float):
2163 __slots__ = ['prec']
2164 def __init__(self, value=0.0, prec=12):
2165 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002166 def __repr__(self):
2167 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002168 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002169 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002170 vereq(a, 12345.0)
2171 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002172 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002173 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002174 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002175
Tim Peters2400fa42001-09-12 19:12:49 +00002176 class madcomplex(complex):
2177 def __repr__(self):
2178 return "%.17gj%+.17g" % (self.imag, self.real)
2179 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002180 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002181 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002182 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(a, base)
2184 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002185 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002186 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(repr(a), "4j-3")
2188 vereq(a, base)
2189 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002190 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002192 veris((+a).__class__, complex)
2193 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002194 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002195 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002196 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002197 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002198 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002199 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002201
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002202 class madtuple(tuple):
2203 _rev = None
2204 def rev(self):
2205 if self._rev is not None:
2206 return self._rev
2207 L = list(self)
2208 L.reverse()
2209 self._rev = self.__class__(L)
2210 return self._rev
2211 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002212 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2213 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2214 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002215 for i in range(512):
2216 t = madtuple(range(i))
2217 u = t.rev()
2218 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002219 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002220 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002222 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002223 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002224 verify(a[:].__class__ is tuple)
2225 verify((a * 1).__class__ is tuple)
2226 verify((a * 0).__class__ is tuple)
2227 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002228 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002229 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002230 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002231 verify((a + a).__class__ is tuple)
2232 verify((a * 0).__class__ is tuple)
2233 verify((a * 1).__class__ is tuple)
2234 verify((a * 2).__class__ is tuple)
2235 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002236
2237 class madstring(str):
2238 _rev = None
2239 def rev(self):
2240 if self._rev is not None:
2241 return self._rev
2242 L = list(self)
2243 L.reverse()
2244 self._rev = self.__class__("".join(L))
2245 return self._rev
2246 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002247 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2248 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2249 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002250 for i in range(256):
2251 s = madstring("".join(map(chr, range(i))))
2252 t = s.rev()
2253 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002254 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002255 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002257 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002258
Tim Peters8fa5dd02001-09-12 02:18:30 +00002259 base = "\x00" * 5
2260 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002261 vereq(s, base)
2262 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002263 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(hash(s), hash(base))
2265 vereq({s: 1}[base], 1)
2266 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002267 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002269 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002271 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002273 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002275 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002277 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002279 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002281 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002283 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002285 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002287 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002288 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002290 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002291 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002292 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002293 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002294 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002295 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002296 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002297 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002298 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002299 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002300
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002301 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002302 _rev = None
2303 def rev(self):
2304 if self._rev is not None:
2305 return self._rev
2306 L = list(self)
2307 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002308 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002309 return self._rev
2310 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002311 vereq(u, "ABCDEF")
2312 vereq(u.rev(), madunicode("FEDCBA"))
2313 vereq(u.rev().rev(), madunicode("ABCDEF"))
2314 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002315 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002316 vereq(str(u), base)
2317 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002318 vereq(hash(u), hash(base))
2319 vereq({u: 1}[base], 1)
2320 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002321 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002322 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002323 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002324 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002325 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002326 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002327 verify(u.replace("x", "x").__class__ is str)
2328 vereq(u.replace("x", "x"), base)
2329 verify(u.replace("xy", "xy").__class__ is str)
2330 vereq(u.replace("xy", "xy"), base)
2331 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002332 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002333 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002334 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002335 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002336 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002337 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002338 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002339 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002340 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002341 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002342 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002343 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002344 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002345 verify((u + "").__class__ is str)
2346 vereq(u + "", base)
2347 verify(("" + u).__class__ is str)
2348 vereq("" + u, base)
2349 verify((u * 0).__class__ is str)
2350 vereq(u * 0, "")
2351 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002352 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002353 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002354 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002355 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002356 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002357 verify(u[0:0].__class__ is str)
2358 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002359
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002360 class sublist(list):
2361 pass
2362 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002363 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002364 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002365 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002366 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002367 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002368 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002369 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002370 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002371 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002372 del a[10:15]
2373 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002374 vereq(a, list(range(10)))
2375 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002376 vereq(a[0], 0)
2377 vereq(a[9], 9)
2378 vereq(a[-10], 0)
2379 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002380 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002381
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002382## class CountedInput(file):
2383## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002384
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002385## self.lineno is the 0-based ordinal of the last line read, up to
2386## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002387
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002388## self.ateof is true if and only if the final "" line has been read,
2389## at which point self.lineno stops incrementing, and further calls
2390## to readline() continue to return "".
2391## """
Tim Peters59c9a642001-09-13 05:38:56 +00002392
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002393## lineno = 0
2394## ateof = 0
2395## def readline(self):
2396## if self.ateof:
2397## return ""
2398## s = file.readline(self)
2399## # Next line works too.
2400## # s = super(CountedInput, self).readline()
2401## self.lineno += 1
2402## if s == "":
2403## self.ateof = 1
2404## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002405
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002406## f = open(name=TESTFN, mode='w')
2407## lines = ['a\n', 'b\n', 'c\n']
2408## try:
2409## f.writelines(lines)
2410## f.close()
2411## f = CountedInput(TESTFN)
2412## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2413## got = f.readline()
2414## vereq(expected, got)
2415## vereq(f.lineno, i)
2416## vereq(f.ateof, (i > len(lines)))
2417## f.close()
2418## finally:
2419## try:
2420## f.close()
2421## except:
2422## pass
2423## try:
2424## import os
2425## os.unlink(TESTFN)
2426## except:
2427## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002428
Tim Peters808b94e2001-09-13 19:33:07 +00002429def keywords():
2430 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002431 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002432 vereq(int(x=1), 1)
2433 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002434 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002435 vereq(complex(imag=42, real=666), complex(666, 42))
2436 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002437 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002439 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002440 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002441
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002442 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002443 try:
2444 constructor(bogus_keyword_arg=1)
2445 except TypeError:
2446 pass
2447 else:
2448 raise TestFailed("expected TypeError from bogus keyword "
2449 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002450
Tim Peters0ab085c2001-09-14 00:25:33 +00002451def str_subclass_as_dict_key():
2452 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002453 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002454
2455 class cistr(str):
2456 """Sublcass of str that computes __eq__ case-insensitively.
2457
2458 Also computes a hash code of the string in canonical form.
2459 """
2460
2461 def __init__(self, value):
2462 self.canonical = value.lower()
2463 self.hashcode = hash(self.canonical)
2464
2465 def __eq__(self, other):
2466 if not isinstance(other, cistr):
2467 other = cistr(other)
2468 return self.canonical == other.canonical
2469
2470 def __hash__(self):
2471 return self.hashcode
2472
Guido van Rossum45704552001-10-08 16:35:45 +00002473 vereq(cistr('ABC'), 'abc')
2474 vereq('aBc', cistr('ABC'))
2475 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002476
2477 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002478 vereq(d[cistr('one')], 1)
2479 vereq(d[cistr('tWo')], 2)
2480 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002481 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002482 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002483
Guido van Rossumab3b0342001-09-18 20:38:53 +00002484def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002485 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002486 class classic:
2487 pass
2488 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002489 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002490 class C(base):
2491 def __init__(self, value):
2492 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002493 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002494 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002495 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002496 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002497 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002498 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002499 def __ne__(self, other):
2500 if isinstance(other, C):
2501 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002502 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002503 return self.value != other
2504 return NotImplemented
2505 def __lt__(self, other):
2506 if isinstance(other, C):
2507 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002508 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002509 return self.value < other
2510 return NotImplemented
2511 def __le__(self, other):
2512 if isinstance(other, C):
2513 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002514 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002515 return self.value <= other
2516 return NotImplemented
2517 def __gt__(self, other):
2518 if isinstance(other, C):
2519 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002520 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002521 return self.value > other
2522 return NotImplemented
2523 def __ge__(self, other):
2524 if isinstance(other, C):
2525 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002526 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002527 return self.value >= other
2528 return NotImplemented
2529
Guido van Rossumab3b0342001-09-18 20:38:53 +00002530 c1 = C(1)
2531 c2 = C(2)
2532 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002533 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002534 c = {1: c1, 2: c2, 3: c3}
2535 for x in 1, 2, 3:
2536 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002537 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002538 for op in "<", "<=", "==", "!=", ">", ">=":
2539 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2540 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002541 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2542 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002543
Guido van Rossum0639f592001-09-18 21:06:04 +00002544def rich_comparisons():
2545 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002546 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002547 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002548 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002549 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002550 vereq(z, 1+0j)
2551 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002552 class ZZ(complex):
2553 def __eq__(self, other):
2554 try:
2555 return abs(self - other) <= 1e-6
2556 except:
2557 return NotImplemented
2558 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002559 vereq(zz, 1+0j)
2560 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002561
Guido van Rossum0639f592001-09-18 21:06:04 +00002562 class classic:
2563 pass
2564 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002565 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002566 class C(base):
2567 def __init__(self, value):
2568 self.value = int(value)
2569 def __cmp__(self, other):
Collin Winter3add4d72007-08-29 23:37:32 +00002570 raise TestFailed("shouldn't call __cmp__")
Guido van Rossum0639f592001-09-18 21:06:04 +00002571 def __eq__(self, other):
2572 if isinstance(other, C):
2573 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002574 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002575 return self.value == other
2576 return NotImplemented
2577 def __ne__(self, other):
2578 if isinstance(other, C):
2579 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002580 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002581 return self.value != other
2582 return NotImplemented
2583 def __lt__(self, other):
2584 if isinstance(other, C):
2585 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002586 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002587 return self.value < other
2588 return NotImplemented
2589 def __le__(self, other):
2590 if isinstance(other, C):
2591 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002592 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002593 return self.value <= other
2594 return NotImplemented
2595 def __gt__(self, other):
2596 if isinstance(other, C):
2597 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002598 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002599 return self.value > other
2600 return NotImplemented
2601 def __ge__(self, other):
2602 if isinstance(other, C):
2603 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002604 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002605 return self.value >= other
2606 return NotImplemented
2607 c1 = C(1)
2608 c2 = C(2)
2609 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002610 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002611 c = {1: c1, 2: c2, 3: c3}
2612 for x in 1, 2, 3:
2613 for y in 1, 2, 3:
2614 for op in "<", "<=", "==", "!=", ">", ">=":
2615 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2616 "x=%d, y=%d" % (x, y))
2617 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2618 "x=%d, y=%d" % (x, y))
2619 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2620 "x=%d, y=%d" % (x, y))
2621
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002622def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002623 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002624 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002625 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002626 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002627 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2628 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002629
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002630def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002631 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002632 class C(object): pass
2633 class D(object): pass
2634 class E(object): pass
2635 class F(D, E): pass
2636 for cls in C, D, E, F:
2637 for cls2 in C, D, E, F:
2638 x = cls()
2639 x.__class__ = cls2
2640 verify(x.__class__ is cls2)
2641 x.__class__ = cls
2642 verify(x.__class__ is cls)
2643 def cant(x, C):
2644 try:
2645 x.__class__ = C
2646 except TypeError:
2647 pass
2648 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002649 raise TestFailed("shouldn't allow %r.__class__ = %r" % (x, C))
Guido van Rossumb6b89422002-04-15 01:03:30 +00002650 try:
2651 delattr(x, "__class__")
2652 except TypeError:
2653 pass
2654 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002655 raise TestFailed("shouldn't allow del %r.__class__" % x)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002656 cant(C(), list)
2657 cant(list(), C)
2658 cant(C(), 1)
2659 cant(C(), object)
2660 cant(object(), list)
2661 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002662 class Int(int): __slots__ = []
2663 cant(2, Int)
2664 cant(Int(), int)
2665 cant(True, int)
2666 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002667 o = object()
2668 cant(o, type(1))
2669 cant(o, type(None))
2670 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002671 class G(object):
2672 __slots__ = ["a", "b"]
2673 class H(object):
2674 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002675 class I(object):
2676 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002677 class J(object):
2678 __slots__ = ["c", "b"]
2679 class K(object):
2680 __slots__ = ["a", "b", "d"]
2681 class L(H):
2682 __slots__ = ["e"]
2683 class M(I):
2684 __slots__ = ["e"]
2685 class N(J):
2686 __slots__ = ["__weakref__"]
2687 class P(J):
2688 __slots__ = ["__dict__"]
2689 class Q(J):
2690 pass
2691 class R(J):
2692 __slots__ = ["__dict__", "__weakref__"]
2693
2694 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2695 x = cls()
2696 x.a = 1
2697 x.__class__ = cls2
2698 verify(x.__class__ is cls2,
2699 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2700 vereq(x.a, 1)
2701 x.__class__ = cls
2702 verify(x.__class__ is cls,
2703 "assigning %r as __class__ for %r silently failed" % (cls, x))
2704 vereq(x.a, 1)
2705 for cls in G, J, K, L, M, N, P, R, list, Int:
2706 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2707 if cls is cls2:
2708 continue
2709 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002710
Guido van Rossum6661be32001-10-26 04:26:12 +00002711def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002712 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002713 class C(object): pass
2714 a = C()
2715 a.__dict__ = {'b': 1}
2716 vereq(a.b, 1)
2717 def cant(x, dict):
2718 try:
2719 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002720 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002721 pass
2722 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002723 raise TestFailed("shouldn't allow %r.__dict__ = %r" % (x, dict))
Guido van Rossum6661be32001-10-26 04:26:12 +00002724 cant(a, None)
2725 cant(a, [])
2726 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002727 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002728
2729 class Base(object):
2730 pass
2731 def verify_dict_readonly(x):
2732 """
2733 x has to be an instance of a class inheriting from Base.
2734 """
2735 cant(x, {})
2736 try:
2737 del x.__dict__
2738 except (AttributeError, TypeError):
2739 pass
2740 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002741 raise TestFailed("shouldn't allow del %r.__dict__" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002742 dict_descr = Base.__dict__["__dict__"]
2743 try:
2744 dict_descr.__set__(x, {})
2745 except (AttributeError, TypeError):
2746 pass
2747 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002748 raise TestFailed("dict_descr allowed access to %r's dict" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002749
2750 # Classes don't allow __dict__ assignment and have readonly dicts
2751 class Meta1(type, Base):
2752 pass
2753 class Meta2(Base, type):
2754 pass
2755 class D(object):
2756 __metaclass__ = Meta1
2757 class E(object):
2758 __metaclass__ = Meta2
2759 for cls in C, D, E:
2760 verify_dict_readonly(cls)
2761 class_dict = cls.__dict__
2762 try:
2763 class_dict["spam"] = "eggs"
2764 except TypeError:
2765 pass
2766 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002767 raise TestFailed("%r's __dict__ can be modified" % cls)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002768
2769 # Modules also disallow __dict__ assignment
2770 class Module1(types.ModuleType, Base):
2771 pass
2772 class Module2(Base, types.ModuleType):
2773 pass
2774 for ModuleType in Module1, Module2:
2775 mod = ModuleType("spam")
2776 verify_dict_readonly(mod)
2777 mod.__dict__["spam"] = "eggs"
2778
2779 # Exception's __dict__ can be replaced, but not deleted
2780 class Exception1(Exception, Base):
2781 pass
2782 class Exception2(Base, Exception):
2783 pass
2784 for ExceptionType in Exception, Exception1, Exception2:
2785 e = ExceptionType()
2786 e.__dict__ = {"a": 1}
2787 vereq(e.a, 1)
2788 try:
2789 del e.__dict__
2790 except (TypeError, AttributeError):
2791 pass
2792 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002793 raise TestFaied("%r's __dict__ can be deleted" % e)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002794
Guido van Rossum6661be32001-10-26 04:26:12 +00002795
Guido van Rossum3926a632001-09-25 16:25:58 +00002796def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002797 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002798 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002799 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002800
2801 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002802 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002803
2804 global C
2805 class C(object):
2806 def __init__(self, a, b):
2807 super(C, self).__init__()
2808 self.a = a
2809 self.b = b
2810 def __repr__(self):
2811 return "C(%r, %r)" % (self.a, self.b)
2812
2813 global C1
2814 class C1(list):
2815 def __new__(cls, a, b):
2816 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002817 def __getnewargs__(self):
2818 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002819 def __init__(self, a, b):
2820 self.a = a
2821 self.b = b
2822 def __repr__(self):
2823 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2824
2825 global C2
2826 class C2(int):
2827 def __new__(cls, a, b, val=0):
2828 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002829 def __getnewargs__(self):
2830 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002831 def __init__(self, a, b, val=0):
2832 self.a = a
2833 self.b = b
2834 def __repr__(self):
2835 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2836
Guido van Rossum90c45142001-11-24 21:07:01 +00002837 global C3
2838 class C3(object):
2839 def __init__(self, foo):
2840 self.foo = foo
2841 def __getstate__(self):
2842 return self.foo
2843 def __setstate__(self, foo):
2844 self.foo = foo
2845
2846 global C4classic, C4
2847 class C4classic: # classic
2848 pass
2849 class C4(C4classic, object): # mixed inheritance
2850 pass
2851
Guido van Rossum99603b02007-07-20 00:22:32 +00002852 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002853 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002854 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002855 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002856
2857 for cls in C, C1, C2:
2858 s = p.dumps(cls, bin)
2859 cls2 = p.loads(s)
2860 verify(cls2 is cls)
2861
2862 a = C1(1, 2); a.append(42); a.append(24)
2863 b = C2("hello", "world", 42)
2864 s = p.dumps((a, b), bin)
2865 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002866 vereq(x.__class__, a.__class__)
2867 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2868 vereq(y.__class__, b.__class__)
2869 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002870 vereq(repr(x), repr(a))
2871 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002872 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002873 print("a = x =", a)
2874 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002875 # Test for __getstate__ and __setstate__ on new style class
2876 u = C3(42)
2877 s = p.dumps(u, bin)
2878 v = p.loads(s)
2879 veris(u.__class__, v.__class__)
2880 vereq(u.foo, v.foo)
2881 # Test for picklability of hybrid class
2882 u = C4()
2883 u.foo = 42
2884 s = p.dumps(u, bin)
2885 v = p.loads(s)
2886 veris(u.__class__, v.__class__)
2887 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002888
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002889 # Testing copy.deepcopy()
2890 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002891 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002892 import copy
2893 for cls in C, C1, C2:
2894 cls2 = copy.deepcopy(cls)
2895 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002896
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002897 a = C1(1, 2); a.append(42); a.append(24)
2898 b = C2("hello", "world", 42)
2899 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002900 vereq(x.__class__, a.__class__)
2901 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2902 vereq(y.__class__, b.__class__)
2903 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002904 vereq(repr(x), repr(a))
2905 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002906 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002907 print("a = x =", a)
2908 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002909
Guido van Rossum8c842552002-03-14 23:05:54 +00002910def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002911 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002912 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002913 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002914 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002915 global B, C, D, E
2916 class B(object):
2917 pass
2918 for base in [object, B]:
2919 class C(base):
2920 __slots__ = ['a']
2921 class D(C):
2922 pass
2923 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002924 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002925 except TypeError:
2926 pass
2927 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002928 raise TestFailed("should fail: pickle C instance - %s" % base)
Guido van Rossum8c842552002-03-14 23:05:54 +00002929 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002930 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002931 except TypeError:
2932 pass
2933 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002934 raise TestFailed("should fail: pickle D instance - %s" % base)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002935 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002936 class C(base):
2937 __slots__ = ['a']
2938 def __getstate__(self):
2939 try:
2940 d = self.__dict__.copy()
2941 except AttributeError:
2942 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002943 for cls in self.__class__.__mro__:
2944 for sn in cls.__dict__.get('__slots__', ()):
2945 try:
2946 d[sn] = getattr(self, sn)
2947 except AttributeError:
2948 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002949 return d
2950 def __setstate__(self, d):
2951 for k, v in d.items():
2952 setattr(self, k, v)
2953 class D(C):
2954 pass
2955 # Now it should work
2956 x = C()
2957 y = pickle.loads(pickle.dumps(x))
2958 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002959 x.a = 42
2960 y = pickle.loads(pickle.dumps(x))
2961 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00002962 x = D()
2963 x.a = 42
2964 x.b = 100
2965 y = pickle.loads(pickle.dumps(x))
2966 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002967 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002968 class E(C):
2969 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002970 x = E()
2971 x.a = 42
2972 x.b = "foo"
2973 y = pickle.loads(pickle.dumps(x))
2974 vereq(y.a, x.a)
2975 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002976
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002977def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002978 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002979 import copy
2980 class C(object):
2981 pass
2982
2983 a = C()
2984 a.foo = 12
2985 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002986 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002987
2988 a.bar = [1,2,3]
2989 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002990 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002991 verify(c.bar is a.bar)
2992
2993 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002994 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002995 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002996 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002997
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002998def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002999 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003000 class I(int):
3001 def __repr__(self):
3002 return "I(%r)" % int(self)
3003 def __add__(self, other):
3004 return I(int(self) + int(other))
3005 __radd__ = __add__
3006 def __pow__(self, other, mod=None):
3007 if mod is None:
3008 return I(pow(int(self), int(other)))
3009 else:
3010 return I(pow(int(self), int(other), int(mod)))
3011 def __rpow__(self, other, mod=None):
3012 if mod is None:
3013 return I(pow(int(other), int(self), mod))
3014 else:
3015 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003016
Walter Dörwald70a6b492004-02-12 17:35:32 +00003017 vereq(repr(I(1) + I(2)), "I(3)")
3018 vereq(repr(I(1) + 2), "I(3)")
3019 vereq(repr(1 + I(2)), "I(3)")
3020 vereq(repr(I(2) ** I(3)), "I(8)")
3021 vereq(repr(2 ** I(3)), "I(8)")
3022 vereq(repr(I(2) ** 3), "I(8)")
3023 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003024 class S(str):
3025 def __eq__(self, other):
3026 return self.lower() == other.lower()
3027
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003028def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003029 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003030 class A(object):
3031 pass
3032 class B(A):
3033 pass
3034 class C(A):
3035 pass
3036 class D(B, C):
3037 pass
3038 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003039 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003040 A.__hash__ = lambda self: 42
3041 vereq(hash(d), 42)
3042 C.__hash__ = lambda self: 314
3043 vereq(hash(d), 314)
3044 B.__hash__ = lambda self: 144
3045 vereq(hash(d), 144)
3046 D.__hash__ = lambda self: 100
3047 vereq(hash(d), 100)
3048 del D.__hash__
3049 vereq(hash(d), 144)
3050 del B.__hash__
3051 vereq(hash(d), 314)
3052 del C.__hash__
3053 vereq(hash(d), 42)
3054 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003055 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003056 d.foo = 42
3057 d.bar = 42
3058 vereq(d.foo, 42)
3059 vereq(d.bar, 42)
3060 def __getattribute__(self, name):
3061 if name == "foo":
3062 return 24
3063 return object.__getattribute__(self, name)
3064 A.__getattribute__ = __getattribute__
3065 vereq(d.foo, 24)
3066 vereq(d.bar, 42)
3067 def __getattr__(self, name):
3068 if name in ("spam", "foo", "bar"):
3069 return "hello"
Collin Winter3add4d72007-08-29 23:37:32 +00003070 raise AttributeError(name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003071 B.__getattr__ = __getattr__
3072 vereq(d.spam, "hello")
3073 vereq(d.foo, 24)
3074 vereq(d.bar, 42)
3075 del A.__getattribute__
3076 vereq(d.foo, 42)
3077 del d.foo
3078 vereq(d.foo, "hello")
3079 vereq(d.bar, 42)
3080 del B.__getattr__
3081 try:
3082 d.foo
3083 except AttributeError:
3084 pass
3085 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003086 raise TestFailed("d.foo should be undefined now")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003087
Guido van Rossume7f3e242002-06-14 02:35:45 +00003088 # Test a nasty bug in recurse_down_subclasses()
3089 import gc
3090 class A(object):
3091 pass
3092 class B(A):
3093 pass
3094 del B
3095 gc.collect()
3096 A.__setitem__ = lambda *a: None # crash
3097
Tim Petersfc57ccb2001-10-12 02:38:24 +00003098def buffer_inherit():
3099 import binascii
3100 # SF bug [#470040] ParseTuple t# vs subclasses.
3101 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003102 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003103
3104 class MyStr(str):
3105 pass
3106 base = 'abc'
3107 m = MyStr(base)
3108 # b2a_hex uses the buffer interface to get its argument's value, via
3109 # PyArg_ParseTuple 't#' code.
3110 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3111
3112 # It's not clear that unicode will continue to support the character
3113 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003114 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003115 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003116 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003117 m = MyUni(base)
3118 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3119
3120 class MyInt(int):
3121 pass
3122 m = MyInt(42)
3123 try:
3124 binascii.b2a_hex(m)
3125 raise TestFailed('subclass of int should not have a buffer interface')
3126 except TypeError:
3127 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003128
Tim Petersc9933152001-10-16 20:18:24 +00003129def str_of_str_subclass():
3130 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003131 import io
Tim Petersc9933152001-10-16 20:18:24 +00003132
3133 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003134 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003135
3136 class octetstring(str):
3137 def __str__(self):
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003138 return str(binascii.b2a_hex(self))
Tim Petersc9933152001-10-16 20:18:24 +00003139 def __repr__(self):
3140 return self + " repr"
3141
3142 o = octetstring('A')
3143 vereq(type(o), octetstring)
3144 vereq(type(str(o)), str)
3145 vereq(type(repr(o)), str)
3146 vereq(ord(o), 0x41)
3147 vereq(str(o), '41')
3148 vereq(repr(o), 'A repr')
3149 vereq(o.__str__(), '41')
3150 vereq(o.__repr__(), 'A repr')
3151
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003152 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003153 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003154 print(o, file=capture)
3155 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003156 vereq(capture.getvalue(), '41\n41\n')
3157 capture.close()
3158
Guido van Rossumc8e56452001-10-22 00:43:43 +00003159def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003160 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003161 def f(a): return a
3162 vereq(f.__call__(a=42), 42)
3163 a = []
3164 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003165 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003166
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003167def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003168 if verbose: print(("Testing recursive __call__() by setting to instance of "
3169 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003170 class A(object):
3171 pass
3172
3173 A.__call__ = A()
3174 try:
3175 A()()
3176 except RuntimeError:
3177 pass
3178 else:
3179 raise TestFailed("Recursion limit should have been reached for "
3180 "__call__()")
3181
Guido van Rossumed87ad82001-10-30 02:33:02 +00003182def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003183 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003184 log = []
3185 class C(object):
3186 def __del__(self):
3187 log.append(1)
3188 c = C()
3189 vereq(log, [])
3190 del c
3191 vereq(log, [1])
3192
Guido van Rossum29d26062001-12-11 04:37:34 +00003193 class D(object): pass
3194 d = D()
3195 try: del d[0]
3196 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003197 else: raise TestFailed("invalid del() didn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003198
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003199def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003200 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003201
3202 class mydict(dict):
3203 pass
3204 d = mydict()
3205 try:
3206 hash(d)
3207 except TypeError:
3208 pass
3209 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003210 raise TestFailed("hash() of dict subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003211
3212 class mylist(list):
3213 pass
3214 d = mylist()
3215 try:
3216 hash(d)
3217 except TypeError:
3218 pass
3219 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003220 raise TestFailed("hash() of list subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003221
Guido van Rossum29d26062001-12-11 04:37:34 +00003222def strops():
3223 try: 'a' + 5
3224 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003225 else: raise TestFailed("'' + 5 doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003226
3227 try: ''.split('')
3228 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003229 else: raise TestFailed("''.split('') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003230
3231 try: ''.join([0])
3232 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003233 else: raise TestFailed("''.join([0]) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003234
3235 try: ''.rindex('5')
3236 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003237 else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003238
Guido van Rossum29d26062001-12-11 04:37:34 +00003239 try: '%(n)s' % None
3240 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003241 else: raise TestFailed("'%(n)s' % None doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003242
3243 try: '%(n' % {}
3244 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003245 else: raise TestFailed("'%(n' % {} '' doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003246
3247 try: '%*s' % ('abc')
3248 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003249 else: raise TestFailed("'%*s' % ('abc') doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003250
3251 try: '%*.*s' % ('abc', 5)
3252 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003253 else: raise TestFailed("'%*.*s' % ('abc', 5) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003254
3255 try: '%s' % (1, 2)
3256 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003257 else: raise TestFailed("'%s' % (1, 2) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003258
3259 try: '%' % None
3260 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003261 else: raise TestFailed("'%' % None doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003262
3263 vereq('534253'.isdigit(), 1)
3264 vereq('534253x'.isdigit(), 0)
3265 vereq('%c' % 5, '\x05')
3266 vereq('%c' % '5', '5')
3267
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003268def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003269 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003270 class Node:
3271 pass
3272 a = Node()
3273 b = Node()
3274 a.b = b
3275 b.a = a
3276 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003277
Guido van Rossumd7035672002-03-12 20:43:31 +00003278def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003279 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003280 from types import ModuleType as M
3281 m = M.__new__(M)
3282 str(m)
3283 vereq(hasattr(m, "__name__"), 0)
3284 vereq(hasattr(m, "__file__"), 0)
3285 vereq(hasattr(m, "foo"), 0)
3286 vereq(m.__dict__, None)
3287 m.foo = 1
3288 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003289
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003290def dictproxyiterkeys():
3291 class C(object):
3292 def meth(self):
3293 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003294 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003295 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003296 keys.sort()
3297 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3298
3299def dictproxyitervalues():
3300 class C(object):
3301 def meth(self):
3302 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003303 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003304 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003305 vereq(len(values), 5)
3306
3307def dictproxyiteritems():
3308 class C(object):
3309 def meth(self):
3310 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003311 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003312 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003313 keys.sort()
3314 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3315
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003316def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003317 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003318 class C(object):
3319 def __new__(cls, arg):
3320 if isinstance(arg, str): return [1, 2, 3]
3321 elif isinstance(arg, int): return object.__new__(D)
3322 else: return object.__new__(cls)
3323 class D(C):
3324 def __init__(self, arg):
3325 self.foo = arg
3326 vereq(C("1"), [1, 2, 3])
3327 vereq(D("1"), [1, 2, 3])
3328 d = D(None)
3329 veris(d.foo, None)
3330 d = C(1)
3331 vereq(isinstance(d, D), True)
3332 vereq(d.foo, 1)
3333 d = D(1)
3334 vereq(isinstance(d, D), True)
3335 vereq(d.foo, 1)
3336
Guido van Rossume8fc6402002-04-16 16:44:51 +00003337def imulbug():
3338 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003339 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003340 class C(object):
3341 def __imul__(self, other):
3342 return (self, other)
3343 x = C()
3344 y = x
3345 y *= 1.0
3346 vereq(y, (x, 1.0))
3347 y = x
3348 y *= 2
3349 vereq(y, (x, 2))
3350 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003351 y *= 3
3352 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003353 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003354 y *= 1<<100
3355 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003356 y = x
3357 y *= None
3358 vereq(y, (x, None))
3359 y = x
3360 y *= "foo"
3361 vereq(y, (x, "foo"))
3362
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003363def docdescriptor():
3364 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003365 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003366 class DocDescr(object):
3367 def __get__(self, object, otype):
3368 if object:
3369 object = object.__class__.__name__ + ' instance'
3370 if otype:
3371 otype = otype.__name__
3372 return 'object=%s; type=%s' % (object, otype)
3373 class OldClass:
3374 __doc__ = DocDescr()
3375 class NewClass(object):
3376 __doc__ = DocDescr()
3377 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3378 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3379 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3380 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3381
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003382def copy_setstate():
3383 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003384 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003385 import copy
3386 class C(object):
3387 def __init__(self, foo=None):
3388 self.foo = foo
3389 self.__foo = foo
3390 def setfoo(self, foo=None):
3391 self.foo = foo
3392 def getfoo(self):
3393 return self.__foo
3394 def __getstate__(self):
3395 return [self.foo]
3396 def __setstate__(self, lst):
3397 assert len(lst) == 1
3398 self.__foo = self.foo = lst[0]
3399 a = C(42)
3400 a.setfoo(24)
3401 vereq(a.foo, 24)
3402 vereq(a.getfoo(), 42)
3403 b = copy.copy(a)
3404 vereq(b.foo, 24)
3405 vereq(b.getfoo(), 24)
3406 b = copy.deepcopy(a)
3407 vereq(b.foo, 24)
3408 vereq(b.getfoo(), 24)
3409
Guido van Rossum09638c12002-06-13 19:17:46 +00003410def slices():
3411 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003412 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003413 # Strings
3414 vereq("hello"[:4], "hell")
3415 vereq("hello"[slice(4)], "hell")
3416 vereq(str.__getitem__("hello", slice(4)), "hell")
3417 class S(str):
3418 def __getitem__(self, x):
3419 return str.__getitem__(self, x)
3420 vereq(S("hello")[:4], "hell")
3421 vereq(S("hello")[slice(4)], "hell")
3422 vereq(S("hello").__getitem__(slice(4)), "hell")
3423 # Tuples
3424 vereq((1,2,3)[:2], (1,2))
3425 vereq((1,2,3)[slice(2)], (1,2))
3426 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3427 class T(tuple):
3428 def __getitem__(self, x):
3429 return tuple.__getitem__(self, x)
3430 vereq(T((1,2,3))[:2], (1,2))
3431 vereq(T((1,2,3))[slice(2)], (1,2))
3432 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3433 # Lists
3434 vereq([1,2,3][:2], [1,2])
3435 vereq([1,2,3][slice(2)], [1,2])
3436 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3437 class L(list):
3438 def __getitem__(self, x):
3439 return list.__getitem__(self, x)
3440 vereq(L([1,2,3])[:2], [1,2])
3441 vereq(L([1,2,3])[slice(2)], [1,2])
3442 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3443 # Now do lists and __setitem__
3444 a = L([1,2,3])
3445 a[slice(1, 3)] = [3,2]
3446 vereq(a, [1,3,2])
3447 a[slice(0, 2, 1)] = [3,1]
3448 vereq(a, [3,1,2])
3449 a.__setitem__(slice(1, 3), [2,1])
3450 vereq(a, [3,2,1])
3451 a.__setitem__(slice(0, 2, 1), [2,3])
3452 vereq(a, [2,3,1])
3453
Tim Peters2484aae2002-07-11 06:56:07 +00003454def subtype_resurrection():
3455 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003456 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003457
3458 class C(object):
3459 container = []
3460
3461 def __del__(self):
3462 # resurrect the instance
3463 C.container.append(self)
3464
3465 c = C()
3466 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003467 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003468 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003469 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003470
3471 # If that didn't blow up, it's also interesting to see whether clearing
3472 # the last container slot works: that will attempt to delete c again,
3473 # which will cause c to get appended back to the container again "during"
3474 # the del.
3475 del C.container[-1]
3476 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003477 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003478
Tim Peters14cb1e12002-07-11 18:26:21 +00003479 # Make c mortal again, so that the test framework with -l doesn't report
3480 # it as a leak.
3481 del C.__del__
3482
Guido van Rossum2d702462002-08-06 21:28:28 +00003483def slottrash():
3484 # Deallocating deeply nested slotted trash caused stack overflows
3485 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003486 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003487 class trash(object):
3488 __slots__ = ['x']
3489 def __init__(self, x):
3490 self.x = x
3491 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003492 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003493 o = trash(o)
3494 del o
3495
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003496def slotmultipleinheritance():
3497 # SF bug 575229, multiple inheritance w/ slots dumps core
3498 class A(object):
3499 __slots__=()
3500 class B(object):
3501 pass
3502 class C(A,B) :
3503 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003504 vereq(C.__basicsize__, B.__basicsize__)
3505 verify(hasattr(C, '__dict__'))
3506 verify(hasattr(C, '__weakref__'))
3507 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003508
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003509def testrmul():
3510 # SF patch 592646
3511 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003512 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003513 class C(object):
3514 def __mul__(self, other):
3515 return "mul"
3516 def __rmul__(self, other):
3517 return "rmul"
3518 a = C()
3519 vereq(a*2, "mul")
3520 vereq(a*2.2, "mul")
3521 vereq(2*a, "rmul")
3522 vereq(2.2*a, "rmul")
3523
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003524def testipow():
3525 # [SF bug 620179]
3526 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003527 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003528 class C(object):
3529 def __ipow__(self, other):
3530 pass
3531 a = C()
3532 a **= 2
3533
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003534def do_this_first():
3535 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003536 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003537 # This dumps core when SF bug 551412 isn't fixed --
3538 # but only when test_descr.py is run separately.
3539 # (That can't be helped -- as soon as PyType_Ready()
3540 # is called for PyLong_Type, the bug is gone.)
3541 class UserLong(object):
3542 def __pow__(self, *args):
3543 pass
3544 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003545 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003546 except:
3547 pass
3548
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003549 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003550 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003551 # Another segfault only when run early
3552 # (before PyType_Ready(tuple) is called)
3553 type.mro(tuple)
3554
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003555def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003556 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003557 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003558 # stuff that should work:
3559 class C(object):
3560 pass
3561 class C2(object):
3562 def __getattribute__(self, attr):
3563 if attr == 'a':
3564 return 2
3565 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003566 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003567 def meth(self):
3568 return 1
3569 class D(C):
3570 pass
3571 class E(D):
3572 pass
3573 d = D()
3574 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003575 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003576 D.__bases__ = (C2,)
3577 vereq(d.meth(), 1)
3578 vereq(e.meth(), 1)
3579 vereq(d.a, 2)
3580 vereq(e.a, 2)
3581 vereq(C2.__subclasses__(), [D])
3582
3583 # stuff that shouldn't:
3584 class L(list):
3585 pass
3586
3587 try:
3588 L.__bases__ = (dict,)
3589 except TypeError:
3590 pass
3591 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003592 raise TestFailed("shouldn't turn list subclass into dict subclass")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003593
3594 try:
3595 list.__bases__ = (dict,)
3596 except TypeError:
3597 pass
3598 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003599 raise TestFailed("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003600
3601 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003602 D.__bases__ = (C2, list)
3603 except TypeError:
3604 pass
3605 else:
3606 assert 0, "best_base calculation found wanting"
3607
3608 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003609 del D.__bases__
3610 except TypeError:
3611 pass
3612 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003613 raise TestFailed("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003614
3615 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003616 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003617 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003618 if str(msg) == "a new-style class can't have only classic bases":
Collin Winter3add4d72007-08-29 23:37:32 +00003619 raise TestFailed("wrong error message for .__bases__ = ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003620 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003621 raise TestFailed("shouldn't be able to set .__bases__ to ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003622
3623 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003624 D.__bases__ = (D,)
3625 except TypeError:
3626 pass
3627 else:
3628 # actually, we'll have crashed by here...
Collin Winter3add4d72007-08-29 23:37:32 +00003629 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003630
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003631 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003632 D.__bases__ = (C, C)
3633 except TypeError:
3634 pass
3635 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003636 raise TestFailed("didn't detect repeated base classes")
Michael W. Hudsone723e452003-08-07 14:58:10 +00003637
3638 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003639 D.__bases__ = (E,)
3640 except TypeError:
3641 pass
3642 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003643 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003644
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003645def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003646 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003647 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003648 class WorkOnce(type):
3649 def __new__(self, name, bases, ns):
3650 self.flag = 0
3651 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3652 def mro(self):
3653 if self.flag > 0:
Collin Winter3add4d72007-08-29 23:37:32 +00003654 raise RuntimeError("bozo")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003655 else:
3656 self.flag += 1
3657 return type.mro(self)
3658
3659 class WorkAlways(type):
3660 def mro(self):
3661 # this is here to make sure that .mro()s aren't called
3662 # with an exception set (which was possible at one point).
3663 # An error message will be printed in a debug build.
3664 # What's a good way to test for this?
3665 return type.mro(self)
3666
3667 class C(object):
3668 pass
3669
3670 class C2(object):
3671 pass
3672
3673 class D(C):
3674 pass
3675
3676 class E(D):
3677 pass
3678
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003679 class F(D, metaclass=WorkOnce):
3680 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003681
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003682 class G(D, metaclass=WorkAlways):
3683 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003684
3685 # Immediate subclasses have their mro's adjusted in alphabetical
3686 # order, so E's will get adjusted before adjusting F's fails. We
3687 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003688
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003689 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003690 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003691
3692 try:
3693 D.__bases__ = (C2,)
3694 except RuntimeError:
3695 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003696 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003697 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003698 raise TestFailed("exception not propagated")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003699
3700def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003701 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003702 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003703 class A(object):
3704 pass
3705
3706 class B(object):
3707 pass
3708
3709 class C(A, B):
3710 pass
3711
3712 class D(A, B):
3713 pass
3714
3715 class E(C, D):
3716 pass
3717
3718 try:
3719 C.__bases__ = (B, A)
3720 except TypeError:
3721 pass
3722 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003723 raise TestFailed("didn't catch MRO conflict")
Tim Peters6578dc92002-12-24 18:31:27 +00003724
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003725def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003726 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003727 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003728 class C(object):
3729 pass
3730
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003731 # C.__module__ could be 'test_descr' or '__main__'
3732 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003733
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003734 C.__name__ = 'D'
3735 vereq((C.__module__, C.__name__), (mod, 'D'))
3736
3737 C.__name__ = 'D.E'
3738 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003739
Guido van Rossum613f24f2003-01-06 23:00:59 +00003740def subclass_right_op():
3741 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003742 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003743
3744 # This code tests various cases where right-dispatch of a subclass
3745 # should be preferred over left-dispatch of a base class.
3746
3747 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3748
3749 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003750 def __floordiv__(self, other):
3751 return "B.__floordiv__"
3752 def __rfloordiv__(self, other):
3753 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003754
Guido van Rossumf389c772003-02-27 20:04:19 +00003755 vereq(B(1) // 1, "B.__floordiv__")
3756 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003757
3758 # Case 2: subclass of object; this is just the baseline for case 3
3759
3760 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003761 def __floordiv__(self, other):
3762 return "C.__floordiv__"
3763 def __rfloordiv__(self, other):
3764 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003765
Guido van Rossumf389c772003-02-27 20:04:19 +00003766 vereq(C() // 1, "C.__floordiv__")
3767 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003768
3769 # Case 3: subclass of new-style class; here it gets interesting
3770
3771 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003772 def __floordiv__(self, other):
3773 return "D.__floordiv__"
3774 def __rfloordiv__(self, other):
3775 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003776
Guido van Rossumf389c772003-02-27 20:04:19 +00003777 vereq(D() // C(), "D.__floordiv__")
3778 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003779
3780 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3781
3782 class E(C):
3783 pass
3784
Guido van Rossumf389c772003-02-27 20:04:19 +00003785 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003786
Guido van Rossumf389c772003-02-27 20:04:19 +00003787 vereq(E() // 1, "C.__floordiv__")
3788 vereq(1 // E(), "C.__rfloordiv__")
3789 vereq(E() // C(), "C.__floordiv__")
3790 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003791
Guido van Rossum373c7412003-01-07 13:41:37 +00003792def dict_type_with_metaclass():
3793 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003794 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003795
3796 class B(object):
3797 pass
3798 class M(type):
3799 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003800 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003801 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003802 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003803 veris(type(C.__dict__), type(B.__dict__))
3804
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003805def meth_class_get():
3806 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003807 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003808 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003809 # Baseline
3810 arg = [1, 2, 3]
3811 res = {1: None, 2: None, 3: None}
3812 vereq(dict.fromkeys(arg), res)
3813 vereq({}.fromkeys(arg), res)
3814 # Now get the descriptor
3815 descr = dict.__dict__["fromkeys"]
3816 # More baseline using the descriptor directly
3817 vereq(descr.__get__(None, dict)(arg), res)
3818 vereq(descr.__get__({})(arg), res)
3819 # Now check various error cases
3820 try:
3821 descr.__get__(None, None)
3822 except TypeError:
3823 pass
3824 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003825 raise TestFailed("shouldn't have allowed descr.__get__(None, None)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003826 try:
3827 descr.__get__(42)
3828 except TypeError:
3829 pass
3830 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003831 raise TestFailed("shouldn't have allowed descr.__get__(42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003832 try:
3833 descr.__get__(None, 42)
3834 except TypeError:
3835 pass
3836 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003837 raise TestFailed("shouldn't have allowed descr.__get__(None, 42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003838 try:
3839 descr.__get__(None, int)
3840 except TypeError:
3841 pass
3842 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003843 raise TestFailed("shouldn't have allowed descr.__get__(None, int)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003844
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003845def isinst_isclass():
3846 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003847 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003848 class Proxy(object):
3849 def __init__(self, obj):
3850 self.__obj = obj
3851 def __getattribute__(self, name):
3852 if name.startswith("_Proxy__"):
3853 return object.__getattribute__(self, name)
3854 else:
3855 return getattr(self.__obj, name)
3856 # Test with a classic class
3857 class C:
3858 pass
3859 a = C()
3860 pa = Proxy(a)
3861 verify(isinstance(a, C)) # Baseline
3862 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003863 # Test with a classic subclass
3864 class D(C):
3865 pass
3866 a = D()
3867 pa = Proxy(a)
3868 verify(isinstance(a, C)) # Baseline
3869 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003870 # Test with a new-style class
3871 class C(object):
3872 pass
3873 a = C()
3874 pa = Proxy(a)
3875 verify(isinstance(a, C)) # Baseline
3876 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003877 # Test with a new-style subclass
3878 class D(C):
3879 pass
3880 a = D()
3881 pa = Proxy(a)
3882 verify(isinstance(a, C)) # Baseline
3883 verify(isinstance(pa, C)) # Test
3884
3885def proxysuper():
3886 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003887 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003888 class Proxy(object):
3889 def __init__(self, obj):
3890 self.__obj = obj
3891 def __getattribute__(self, name):
3892 if name.startswith("_Proxy__"):
3893 return object.__getattribute__(self, name)
3894 else:
3895 return getattr(self.__obj, name)
3896
3897 class B(object):
3898 def f(self):
3899 return "B.f"
3900
3901 class C(B):
3902 def f(self):
3903 return super(C, self).f() + "->C.f"
3904
3905 obj = C()
3906 p = Proxy(obj)
3907 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003908
Guido van Rossum52b27052003-04-15 20:05:10 +00003909def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003910 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003911 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003912 try:
3913 object.__setattr__(str, "foo", 42)
3914 except TypeError:
3915 pass
3916 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003917 raise TestFailed("Carlo Verre __setattr__ suceeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003918 try:
3919 object.__delattr__(str, "lower")
3920 except TypeError:
3921 pass
3922 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003923 raise TestFailed("Carlo Verre __delattr__ succeeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003924
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003925def weakref_segfault():
3926 # SF 742911
3927 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003928 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003929
3930 import weakref
3931
3932 class Provoker:
3933 def __init__(self, referrent):
3934 self.ref = weakref.ref(referrent)
3935
3936 def __del__(self):
3937 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003938
3939 class Oops(object):
3940 pass
3941
3942 o = Oops()
3943 o.whatever = Provoker(o)
3944 del o
3945
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003946def wrapper_segfault():
3947 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003948 if verbose:
3949 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003950 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00003951 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003952 f = f.__call__
3953 f = None
3954
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003955# Fix SF #762455, segfault when sys.stdout is changed in getattr
3956def filefault():
3957 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003958 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003959 import sys
3960 class StdoutGuard:
3961 def __getattr__(self, attr):
3962 sys.stdout = sys.__stdout__
3963 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3964 sys.stdout = StdoutGuard()
3965 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003966 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003967 except RuntimeError:
3968 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003969
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003970def vicious_descriptor_nonsense():
3971 # A potential segfault spotted by Thomas Wouters in mail to
3972 # python-dev 2003-04-17, turned into an example & fixed by Michael
3973 # Hudson just less than four months later...
3974 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003975 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003976
3977 class Evil(object):
3978 def __hash__(self):
3979 return hash('attr')
3980 def __eq__(self, other):
3981 del C.attr
3982 return 0
3983
3984 class Descr(object):
3985 def __get__(self, ob, type=None):
3986 return 1
3987
3988 class C(object):
3989 attr = Descr()
3990
3991 c = C()
3992 c.__dict__[Evil()] = 0
3993
3994 vereq(c.attr, 1)
3995 # this makes a crash more likely:
3996 import gc; gc.collect()
3997 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00003998
Raymond Hettingerb67cc802005-03-03 16:45:19 +00003999def test_init():
4000 # SF 1155938
4001 class Foo(object):
4002 def __init__(self):
4003 return 10
4004 try:
4005 Foo()
4006 except TypeError:
4007 pass
4008 else:
Collin Winter3add4d72007-08-29 23:37:32 +00004009 raise TestFailed("did not test __init__() for None return")
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004010
Armin Rigoc6686b72005-11-07 08:38:00 +00004011def methodwrapper():
4012 # <type 'method-wrapper'> did not support any reflection before 2.5
4013 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004014 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004015
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004016 return # XXX should methods really support __eq__?
4017
Armin Rigoc6686b72005-11-07 08:38:00 +00004018 l = []
4019 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004020 vereq(l.__add__, [].__add__)
4021 verify(l.__add__ != [5].__add__)
4022 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004023 verify(l.__add__.__name__ == '__add__')
4024 verify(l.__add__.__self__ is l)
4025 verify(l.__add__.__objclass__ is list)
4026 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004027 try:
4028 hash(l.__add__)
4029 except TypeError:
4030 pass
4031 else:
4032 raise TestFailed("no TypeError from hash([].__add__)")
4033
4034 t = ()
4035 t += (7,)
4036 vereq(t.__add__, (7,).__add__)
4037 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004038
Armin Rigofd163f92005-12-29 15:59:19 +00004039def notimplemented():
4040 # all binary methods should be able to return a NotImplemented
4041 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004042 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004043
4044 import sys
4045 import types
4046 import operator
4047
4048 def specialmethod(self, other):
4049 return NotImplemented
4050
4051 def check(expr, x, y):
4052 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004053 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004054 except TypeError:
4055 pass
4056 else:
4057 raise TestFailed("no TypeError from %r" % (expr,))
4058
Guido van Rossume2a383d2007-01-15 16:59:06 +00004059 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004060 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4061 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004062 if 1:
4063 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004064 for name, expr, iexpr in [
4065 ('__add__', 'x + y', 'x += y'),
4066 ('__sub__', 'x - y', 'x -= y'),
4067 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004068 ('__truediv__', 'x / y', None),
4069 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004070 ('__mod__', 'x % y', 'x %= y'),
4071 ('__divmod__', 'divmod(x, y)', None),
4072 ('__pow__', 'x ** y', 'x **= y'),
4073 ('__lshift__', 'x << y', 'x <<= y'),
4074 ('__rshift__', 'x >> y', 'x >>= y'),
4075 ('__and__', 'x & y', 'x &= y'),
4076 ('__or__', 'x | y', 'x |= y'),
4077 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004078 ]:
4079 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004080 A = metaclass('A', (), {name: specialmethod})
4081 B = metaclass('B', (), {rname: specialmethod})
4082 a = A()
4083 b = B()
4084 check(expr, a, a)
4085 check(expr, a, b)
4086 check(expr, b, a)
4087 check(expr, b, b)
4088 check(expr, a, N1)
4089 check(expr, a, N2)
4090 check(expr, N1, b)
4091 check(expr, N2, b)
4092 if iexpr:
4093 check(iexpr, a, a)
4094 check(iexpr, a, b)
4095 check(iexpr, b, a)
4096 check(iexpr, b, b)
4097 check(iexpr, a, N1)
4098 check(iexpr, a, N2)
4099 iname = '__i' + name[2:]
4100 C = metaclass('C', (), {iname: specialmethod})
4101 c = C()
4102 check(iexpr, c, a)
4103 check(iexpr, c, b)
4104 check(iexpr, c, N1)
4105 check(iexpr, c, N2)
4106
Guido van Rossumd8faa362007-04-27 19:54:29 +00004107def test_assign_slice():
4108 # ceval.c's assign_slice used to check for
4109 # tp->tp_as_sequence->sq_slice instead of
4110 # tp->tp_as_sequence->sq_ass_slice
4111
4112 class C(object):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00004113 def __setitem__(self, idx, value):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004114 self.value = value
4115
4116 c = C()
4117 c[1:2] = 3
4118 vereq(c.value, 3)
4119
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004120def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004121 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004122 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004123 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004124 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004125 lists()
4126 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004127 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004128 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004129 ints()
4130 longs()
4131 floats()
4132 complexes()
4133 spamlists()
4134 spamdicts()
4135 pydicts()
4136 pylists()
4137 metaclass()
4138 pymods()
4139 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004140 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004141 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004142 ex5()
4143 monotonicity()
4144 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004145 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004146 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004147 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004148 dynamics()
4149 errors()
4150 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004151 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004152 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004153 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004154 classic()
4155 compattr()
4156 newslot()
4157 altmro()
4158 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004159 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004160 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004161 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004162 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004163 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004164 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004165 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004166 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004167 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004168 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004169 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004170 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004171 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004172 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004173 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004174 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004175 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004176 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004177 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004178 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004179 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004180 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004181 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004182 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004183 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004184 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004185 dictproxyiterkeys()
4186 dictproxyitervalues()
4187 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004188 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004189 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004190 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004191 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004192 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004193 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004194 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004195 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004196 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004197 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004198 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004199 test_mutable_bases()
4200 test_mutable_bases_with_failing_mro()
4201 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004202 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004203 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004204 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004205 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004206 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004207 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004208 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004209 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004210 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004211 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004212 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004213 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004214 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004215
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004216 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004217
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004218if __name__ == "__main__":
4219 test_main()