blob: bfa6a642ec6825d28d2931a770ef79ff6a44908f [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
4from test.test_support import get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00005from copy import deepcopy
Guido van Rossum360e4b82007-05-14 22:51:27 +00006import types
Tim Peters4d9b4662002-04-16 01:59:17 +00007
Guido van Rossum875eeaa2001-10-11 18:33:53 +00008def veris(a, b):
9 if a is not b:
Collin Winter3add4d72007-08-29 23:37:32 +000010 raise TestFailed("%r is %r" % (a, b))
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011
Tim Peters6d6c1a32001-08-02 04:15:00 +000012def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000013 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000014 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000015 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000016 t = type(a)
17 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000018 while meth not in t.__dict__:
19 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000020 vereq(m, t.__dict__[meth])
21 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000022 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000024
25def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000026 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000028
Guido van Rossum45704552001-10-08 16:35:45 +000029 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000030 t = type(a)
31 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000032 while meth not in t.__dict__:
33 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000034 vereq(m, t.__dict__[meth])
35 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000036 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000037 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000038
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000039def testsliceop(a, b, c, res, expr="a[b:c]", meth="__getitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000040 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000041 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000042 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043 t = type(a)
44 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000045 while meth not in t.__dict__:
46 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000047 vereq(m, t.__dict__[meth])
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000048 vereq(m(a, slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000049 bm = getattr(a, meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000050 vereq(bm(slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000051
52def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000053 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000055 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000056 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000057 t = type(a)
58 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000059 while meth not in t.__dict__:
60 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000061 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000062 dict['a'] = deepcopy(a)
63 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000064 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000065 dict['a'] = deepcopy(a)
66 bm = getattr(dict['a'], meth)
67 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000068 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000069
70def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000071 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000073 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000074 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000075 t = type(a)
76 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000077 while meth not in t.__dict__:
78 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000079 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000080 dict['a'] = deepcopy(a)
81 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000082 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000083 dict['a'] = deepcopy(a)
84 bm = getattr(dict['a'], meth)
85 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000087
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000088def testsetsliceop(a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000089 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000091 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000092 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000093 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000094 while meth not in t.__dict__:
95 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000096 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000097 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000098 dict['a'] = deepcopy(a)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000099 m(dict['a'], slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000100 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101 dict['a'] = deepcopy(a)
102 bm = getattr(dict['a'], meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000103 bm(slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105
Tim Peters2f93e282001-10-04 05:27:00 +0000106def class_docstrings():
107 class Classic:
108 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000109 vereq(Classic.__doc__, "A classic docstring.")
110 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000111
112 class Classic2:
113 pass
114 verify(Classic2.__doc__ is None)
115
Tim Peters4fb1fe82001-10-04 05:48:13 +0000116 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000117 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000118 vereq(NewStatic.__doc__, "Another docstring.")
119 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000120
Tim Peters4fb1fe82001-10-04 05:48:13 +0000121 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000122 pass
123 verify(NewStatic2.__doc__ is None)
124
Tim Peters4fb1fe82001-10-04 05:48:13 +0000125 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000126 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000127 vereq(NewDynamic.__doc__, "Another docstring.")
128 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000129
Tim Peters4fb1fe82001-10-04 05:48:13 +0000130 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000131 pass
132 verify(NewDynamic2.__doc__ is None)
133
Tim Peters6d6c1a32001-08-02 04:15:00 +0000134def lists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000135 if verbose: print("Testing list operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000136 testbinop([1], [2], [1,2], "a+b", "__add__")
137 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
138 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
139 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000140 testsliceop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
142 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
143 testunop([1,2,3], 3, "len(a)", "__len__")
144 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
145 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
146 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000147 testsetsliceop([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
148 "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000149
150def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000151 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000152 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000153 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
154 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
155 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
156 d = {1:2,3:4}
157 l1 = []
158 for i in d.keys(): l1.append(i)
159 l = []
160 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000161 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000162 l = []
163 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000164 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000165 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000166 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 d = {1:2, 3:4}
169 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(eval(repr(d), {}), d)
171 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000172 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
173
Tim Peters25786c02001-09-02 08:22:48 +0000174def dict_constructor():
175 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000176 print("Testing dict constructor ...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000177 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000178 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000179 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000180 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000181 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000184 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000185 d = dict({'one':1, 'two':2})
186 vereq(d, dict(one=1, two=2))
187 vereq(d, dict(**d))
188 vereq(d, dict({"one": 1}, two=2))
189 vereq(d, dict([("two", 2)], one=1))
190 vereq(d, dict([("one", 100), ("two", 200)], **d))
191 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000192 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000193 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000194 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000195 except TypeError:
196 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000197 except ValueError:
198 if badarg == "0":
199 # It's a sequence, and its elements are also sequences (gotta
200 # love strings <wink>), but they aren't of length 2, so this
201 # one seemed better as a ValueError than a TypeError.
202 pass
203 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000204 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000205 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000206 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000207
208 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000209 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000210 except TypeError:
211 pass
212 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000213 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000214
215 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000216 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000217 dict = {1:2, 3:4, 'a':1j}
218
Tim Peters25786c02001-09-02 08:22:48 +0000219 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000220 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000221 except TypeError:
222 pass
223 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000224 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000225
226 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000227 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000228 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000229 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000230
Tim Peters1fc240e2001-10-26 05:06:50 +0000231 # Init from sequence of iterable objects, each producing a 2-sequence.
232 class AddressBookEntry:
233 def __init__(self, first, last):
234 self.first = first
235 self.last = last
236 def __iter__(self):
237 return iter([self.first, self.last])
238
Tim Petersa427a2b2001-10-29 22:25:45 +0000239 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000240 AddressBookEntry('Barry', 'Peters'),
241 AddressBookEntry('Tim', 'Peters'),
242 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000243 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
244
Tim Petersa427a2b2001-10-29 22:25:45 +0000245 d = dict(zip(range(4), range(1, 5)))
246 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000247
248 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000249 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000250 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000251 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000252 except ValueError:
253 pass
254 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000255 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000256
Tim Peters5d2b77c2001-09-03 05:47:38 +0000257def test_dir():
258 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000259 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000260 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000261 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000262 del junk
263
264 # Just make sure these don't blow up!
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000265 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000266 dir(arg)
267
Thomas Wouters0725cf22006-04-15 09:04:57 +0000268 # Test dir on custom classes. Since these have object as a
269 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000270 def interesting(strings):
271 return [s for s in strings if not s.startswith('_')]
272
Tim Peters5d2b77c2001-09-03 05:47:38 +0000273 class C(object):
274 Cdata = 1
275 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000276
277 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000278 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000279
280 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000281 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000282 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000283
284 c.cdata = 2
285 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000286 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000287 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000288
Tim Peters5d2b77c2001-09-03 05:47:38 +0000289 class A(C):
290 Adata = 1
291 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000292
293 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000294 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000295 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000296 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000297 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000298 a.adata = 42
299 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000300 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000301 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000302
Tim Peterscaaff8d2001-09-10 23:12:14 +0000303 # Try a module subclass.
304 import sys
305 class M(type(sys)):
306 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000307 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000308 minstance.b = 2
309 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000310 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
311 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000312
313 class M2(M):
314 def getdict(self):
315 return "Not a dict!"
316 __dict__ = property(getdict)
317
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000318 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000319 m2instance.b = 2
320 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000321 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000322 try:
323 dir(m2instance)
324 except TypeError:
325 pass
326
Tim Peters9e6a3992001-10-30 05:45:26 +0000327 # Two essentially featureless objects, just inheriting stuff from
328 # object.
329 vereq(dir(None), dir(Ellipsis))
330
Guido van Rossum44022412002-05-13 18:29:46 +0000331 # Nasty test case for proxied objects
332 class Wrapper(object):
333 def __init__(self, obj):
334 self.__obj = obj
335 def __repr__(self):
336 return "Wrapper(%s)" % repr(self.__obj)
337 def __getitem__(self, key):
338 return Wrapper(self.__obj[key])
339 def __len__(self):
340 return len(self.__obj)
341 def __getattr__(self, name):
342 return Wrapper(getattr(self.__obj, name))
343
344 class C(object):
345 def __getclass(self):
346 return Wrapper(type(self))
347 __class__ = property(__getclass)
348
349 dir(C()) # This used to segfault
350
Tim Peters6d6c1a32001-08-02 04:15:00 +0000351binops = {
352 'add': '+',
353 'sub': '-',
354 'mul': '*',
355 'div': '/',
356 'mod': '%',
357 'divmod': 'divmod',
358 'pow': '**',
359 'lshift': '<<',
360 'rshift': '>>',
361 'and': '&',
362 'xor': '^',
363 'or': '|',
364 'cmp': 'cmp',
365 'lt': '<',
366 'le': '<=',
367 'eq': '==',
368 'ne': '!=',
369 'gt': '>',
370 'ge': '>=',
371 }
372
373for name, expr in binops.items():
374 if expr.islower():
375 expr = expr + "(a, b)"
376 else:
377 expr = 'a %s b' % expr
378 binops[name] = expr
379
380unops = {
381 'pos': '+',
382 'neg': '-',
383 'abs': 'abs',
384 'invert': '~',
385 'int': 'int',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000386 'float': 'float',
387 'oct': 'oct',
388 'hex': 'hex',
389 }
390
391for name, expr in unops.items():
392 if expr.islower():
393 expr = expr + "(a)"
394 else:
395 expr = '%s a' % expr
396 unops[name] = expr
397
398def numops(a, b, skip=[]):
399 dict = {'a': a, 'b': b}
400 for name, expr in binops.items():
401 if name not in skip:
402 name = "__%s__" % name
403 if hasattr(a, name):
404 res = eval(expr, dict)
405 testbinop(a, b, res, expr, name)
406 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000407 if name not in skip:
408 name = "__%s__" % name
409 if hasattr(a, name):
410 res = eval(expr, dict)
411 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000412
413def ints():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000414 if verbose: print("Testing int operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000415 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000416 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000417 vereq((1).__bool__(), True)
418 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000419 # This returns 'NotImplemented' in Python 2.2
420 class C(int):
421 def __add__(self, other):
422 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000423 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000424 try:
425 C() + ""
426 except TypeError:
427 pass
428 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000429 raise TestFailed("NotImplemented should have caused TypeError")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000430
431def longs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000432 if verbose: print("Testing long operations...")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000433 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000434
435def floats():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000436 if verbose: print("Testing float operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000437 numops(100.0, 3.0)
438
439def complexes():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000440 if verbose: print("Testing complex operations...")
Guido van Rossum4a7fd902007-08-03 21:15:23 +0000441 numops(100.0j, 3.0j,
442 skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float',
443 'divmod', 'mod'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000444 class Number(complex):
445 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000446 def __new__(cls, *args, **kwds):
447 result = complex.__new__(cls, *args)
448 result.prec = kwds.get('prec', 12)
449 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 def __repr__(self):
451 prec = self.prec
452 if self.imag == 0.0:
453 return "%.*g" % (prec, self.real)
454 if self.real == 0.0:
455 return "%.*gj" % (prec, self.imag)
456 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
457 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000458
Tim Peters6d6c1a32001-08-02 04:15:00 +0000459 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000460 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000461 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000462
Tim Peters3f996e72001-09-13 19:18:27 +0000463 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000464 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000465 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000466
467 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000468 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000469 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000470
Tim Peters6d6c1a32001-08-02 04:15:00 +0000471def spamlists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000472 if verbose: print("Testing spamlist operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473 import copy, xxsubtype as spam
474 def spamlist(l, memo=None):
475 import xxsubtype as spam
476 return spam.spamlist(l)
477 # This is an ugly hack:
478 copy._deepcopy_dispatch[spam.spamlist] = spamlist
479
480 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
481 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
482 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
483 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000484 testsliceop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
485 "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000486 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
487 "a+=b", "__iadd__")
488 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
489 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
490 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
491 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
492 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000493 testsetsliceop(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
494 spamlist([1,5,6,4]), "a[b:c]=d", "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000495 # Test subclassing
496 class C(spam.spamlist):
497 def foo(self): return 1
498 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(a, [])
500 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000502 vereq(a, [100])
503 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000504 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000505 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506
507def spamdicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000508 if verbose: print("Testing spamdict operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000509 import copy, xxsubtype as spam
510 def spamdict(d, memo=None):
511 import xxsubtype as spam
512 sd = spam.spamdict()
513 for k, v in d.items(): sd[k] = v
514 return sd
515 # This is an ugly hack:
516 copy._deepcopy_dispatch[spam.spamdict] = spamdict
517
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000518 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000519 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
520 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
521 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
522 d = spamdict({1:2,3:4})
523 l1 = []
524 for i in d.keys(): l1.append(i)
525 l = []
526 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000527 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000528 l = []
529 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 l = []
532 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000533 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000534 straightd = {1:2, 3:4}
535 spamd = spamdict(straightd)
536 testunop(spamd, 2, "len(a)", "__len__")
537 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
538 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
539 "a[b]=c", "__setitem__")
540 # Test subclassing
541 class C(spam.spamdict):
542 def foo(self): return 1
543 a = C()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000544 vereq(list(a.items()), [])
Guido van Rossum45704552001-10-08 16:35:45 +0000545 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 a['foo'] = 'bar'
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000547 vereq(list(a.items()), [('foo', 'bar')])
Guido van Rossum45704552001-10-08 16:35:45 +0000548 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551
552def pydicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000553 if verbose: print("Testing Python subclass of dict...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000554 verify(issubclass(dict, dict))
555 verify(isinstance({}, dict))
556 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000557 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000558 verify(d.__class__ is dict)
559 verify(isinstance(d, dict))
560 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561 state = -1
562 def __init__(self, *a, **kw):
563 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000564 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565 self.state = a[0]
566 if kw:
567 for k, v in kw.items(): self[v] = k
568 def __getitem__(self, key):
569 return self.get(key, 0)
570 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000571 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000572 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000573 def setstate(self, state):
574 self.state = state
575 def getstate(self):
576 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000577 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000581 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.state, -1)
584 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.state, 0)
587 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000588 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a.state, 10)
590 vereq(a.getstate(), 10)
591 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a[42], 24)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000594 if verbose: print("pydict stress test ...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 N = 50
596 for i in range(N):
597 a[i] = C()
598 for j in range(N):
599 a[i][j] = i*j
600 for i in range(N):
601 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000602 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603
604def pylists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000605 if verbose: print("Testing Python subclass of list...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000606 class C(list):
607 def __getitem__(self, i):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000608 if isinstance(i, slice):
609 return (i.start, i.stop)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000610 return list.__getitem__(self, i) + 100
Tim Peters6d6c1a32001-08-02 04:15:00 +0000611 a = C()
612 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000613 vereq(a[0], 100)
614 vereq(a[1], 101)
615 vereq(a[2], 102)
616 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617
618def metaclass():
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000619 if verbose: print("Testing metaclass...")
620 class C(metaclass=type):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 def __init__(self):
622 self.__state = 0
623 def getstate(self):
624 return self.__state
625 def setstate(self, state):
626 self.__state = state
627 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000628 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000630 vereq(a.getstate(), 10)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000631 class _metaclass(type):
632 def myself(cls): return cls
633 class D(metaclass=_metaclass):
634 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000635 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000636 d = D()
637 verify(d.__class__ is D)
638 class M1(type):
639 def __new__(cls, name, bases, dict):
640 dict['__spam__'] = 1
641 return type.__new__(cls, name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000642 class C(metaclass=M1):
643 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000644 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000645 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000646 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000647
Guido van Rossum309b5662001-08-17 11:43:17 +0000648 class _instance(object):
649 pass
650 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000651 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000652 def __new__(cls, name, bases, dict):
653 self = object.__new__(cls)
654 self.name = name
655 self.bases = bases
656 self.dict = dict
657 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000658 def __call__(self):
659 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000660 # Early binding of methods
661 for key in self.dict:
662 if key.startswith("__"):
663 continue
664 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000665 return it
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000666 class C(metaclass=M2):
Guido van Rossum309b5662001-08-17 11:43:17 +0000667 def spam(self):
668 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000669 vereq(C.name, 'C')
670 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000671 verify('spam' in C.dict)
672 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000673 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000674
Guido van Rossum91ee7982001-08-30 20:52:40 +0000675 # More metaclass examples
676
677 class autosuper(type):
678 # Automatically add __super to the class
679 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000680 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 cls = super(autosuper, metaclass).__new__(metaclass,
682 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000683 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000684 while name[:1] == "_":
685 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000686 if name:
687 name = "_%s__super" % name
688 else:
689 name = "__super"
690 setattr(cls, name, super(cls))
691 return cls
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000692 class A(metaclass=autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000693 def meth(self):
694 return "A"
695 class B(A):
696 def meth(self):
697 return "B" + self.__super.meth()
698 class C(A):
699 def meth(self):
700 return "C" + self.__super.meth()
701 class D(C, B):
702 def meth(self):
703 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000704 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000705 class E(B, C):
706 def meth(self):
707 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000708 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000709
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000710 class autoproperty(type):
711 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000712 # named _get_x and/or _set_x are found
713 def __new__(metaclass, name, bases, dict):
714 hits = {}
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000715 for key, val in dict.items():
Guido van Rossum91ee7982001-08-30 20:52:40 +0000716 if key.startswith("_get_"):
717 key = key[5:]
718 get, set = hits.get(key, (None, None))
719 get = val
720 hits[key] = get, set
721 elif key.startswith("_set_"):
722 key = key[5:]
723 get, set = hits.get(key, (None, None))
724 set = val
725 hits[key] = get, set
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000726 for key, (get, set) in hits.items():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000727 dict[key] = property(get, set)
728 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000729 name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000730 class A(metaclass=autoproperty):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 def _get_x(self):
732 return -self.__x
733 def _set_x(self, x):
734 self.__x = -x
735 a = A()
736 verify(not hasattr(a, "x"))
737 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000738 vereq(a.x, 12)
739 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000740
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000741 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000742 # Merge of multiple cooperating metaclasses
743 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000744 class A(metaclass=multimetaclass):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000745 def _get_x(self):
746 return "A"
747 class B(A):
748 def _get_x(self):
749 return "B" + self.__super._get_x()
750 class C(A):
751 def _get_x(self):
752 return "C" + self.__super._get_x()
753 class D(C, B):
754 def _get_x(self):
755 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000756 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000757
Guido van Rossumf76de622001-10-18 15:49:21 +0000758 # Make sure type(x) doesn't call x.__class__.__init__
759 class T(type):
760 counter = 0
761 def __init__(self, *args):
762 T.counter += 1
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000763 class C(metaclass=T):
764 pass
Guido van Rossumf76de622001-10-18 15:49:21 +0000765 vereq(T.counter, 1)
766 a = C()
767 vereq(type(a), C)
768 vereq(T.counter, 1)
769
Guido van Rossum29d26062001-12-11 04:37:34 +0000770 class C(object): pass
771 c = C()
772 try: c()
773 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +0000774 else: raise TestFailed("calling object w/o call method should raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +0000775
Guido van Rossumd8faa362007-04-27 19:54:29 +0000776 # Testing code to find most derived baseclass
777 class A(type):
778 def __new__(*args, **kwargs):
779 return type.__new__(*args, **kwargs)
780
781 class B(object):
782 pass
783
784 class C(object, metaclass=A):
785 pass
786
787 # The most derived metaclass of D is A rather than type.
788 class D(B, C):
789 pass
790
791
Tim Peters6d6c1a32001-08-02 04:15:00 +0000792def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000793 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000794 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000795 import sys
796 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000797 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000798 def __init__(self, name):
799 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000800 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000802 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803 def __setattr__(self, name, value):
804 log.append(("setattr", name, value))
805 MT.__setattr__(self, name, value)
806 def __delattr__(self, name):
807 log.append(("delattr", name))
808 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000809 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000810 a.foo = 12
811 x = a.foo
812 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000813 vereq(log, [("setattr", "foo", 12),
814 ("getattr", "foo"),
815 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816
Guido van Rossum360e4b82007-05-14 22:51:27 +0000817 # http://python.org/sf/1174712
818 try:
819 class Module(types.ModuleType, str):
820 pass
821 except TypeError:
822 pass
823 else:
824 raise TestFailed("inheriting from ModuleType and str at the "
825 "same time should fail")
826
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000828 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000829 class C(object):
830 def __init__(self):
831 self.__state = 0
832 def getstate(self):
833 return self.__state
834 def setstate(self, state):
835 self.__state = state
836 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000837 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000838 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000839 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000840 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841 def __init__(self):
842 type({}).__init__(self)
843 C.__init__(self)
844 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000845 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000846 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000847 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000848 vereq(d["hello"], "world")
849 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000850 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000851 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000852 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853
Guido van Rossume45763a2001-08-10 21:28:46 +0000854 # SF bug #442833
855 class Node(object):
856 def __int__(self):
857 return int(self.foo())
858 def foo(self):
859 return "23"
860 class Frag(Node, list):
861 def foo(self):
862 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000863 vereq(Node().__int__(), 23)
864 vereq(int(Node()), 23)
865 vereq(Frag().__int__(), 42)
866 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000867
Tim Peters6d6c1a32001-08-02 04:15:00 +0000868def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000869 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000870 class A(object):
871 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000872 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000873 class B(A):
874 def boo(self): return "B"
875 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000876 vereq(B().spam(), "B")
877 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000878 class C(A):
879 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000880 vereq(C().spam(), "A")
881 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000882 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000883 vereq(D().spam(), "B")
884 vereq(D().boo(), "B")
885 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000886 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000887 vereq(E().spam(), "B")
888 vereq(E().boo(), "C")
889 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000890 # MRO order disagreement
891 try:
892 class F(D, E): pass
893 except TypeError:
894 pass
895 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000896 raise TestFailed("expected MRO order disagreement (F)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000897 try:
898 class G(E, D): pass
899 except TypeError:
900 pass
901 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000902 raise TestFailed("expected MRO order disagreement (G)")
Guido van Rossum9a818922002-11-14 19:50:14 +0000903
904
905# see thread python-dev/2002-October/029035.html
906def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000907 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000908 class A(object): pass
909 class B(object): pass
910 class C(object): pass
911 class X(A): pass
912 class Y(A): pass
913 class Z(X,B,Y,C): pass
914 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
915
916# see "A Monotonic Superclass Linearization for Dylan",
917# by Kim Barrett et al. (OOPSLA 1996)
918def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000919 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000920 class Boat(object): pass
921 class DayBoat(Boat): pass
922 class WheelBoat(Boat): pass
923 class EngineLess(DayBoat): pass
924 class SmallMultihull(DayBoat): pass
925 class PedalWheelBoat(EngineLess,WheelBoat): pass
926 class SmallCatamaran(SmallMultihull): pass
927 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
928
929 vereq(PedalWheelBoat.__mro__,
930 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
931 object))
932 vereq(SmallCatamaran.__mro__,
933 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
934
935 vereq(Pedalo.__mro__,
936 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
937 SmallMultihull, DayBoat, WheelBoat, Boat, object))
938
939# see "A Monotonic Superclass Linearization for Dylan",
940# by Kim Barrett et al. (OOPSLA 1996)
941def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000942 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000943 class Pane(object): pass
944 class ScrollingMixin(object): pass
945 class EditingMixin(object): pass
946 class ScrollablePane(Pane,ScrollingMixin): pass
947 class EditablePane(Pane,EditingMixin): pass
948 class EditableScrollablePane(ScrollablePane,EditablePane): pass
949
950 vereq(EditableScrollablePane.__mro__,
951 (EditableScrollablePane, ScrollablePane, EditablePane,
952 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000953
Raymond Hettingerf394df42003-04-06 19:13:41 +0000954mro_err_msg = """Cannot create a consistent method resolution
955order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000956
Guido van Rossumd32047f2002-11-25 21:38:52 +0000957def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000958 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000959 def raises(exc, expected, callable, *args):
960 try:
961 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000962 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000963 if not str(msg).startswith(expected):
Collin Winter3add4d72007-08-29 23:37:32 +0000964 raise TestFailed("Message %r, expected %r" % (str(msg),
965 expected))
Guido van Rossumd32047f2002-11-25 21:38:52 +0000966 else:
Collin Winter3add4d72007-08-29 23:37:32 +0000967 raise TestFailed("Expected %s" % exc)
Guido van Rossumd32047f2002-11-25 21:38:52 +0000968 class A(object): pass
969 class B(A): pass
970 class C(object): pass
971 # Test some very simple errors
972 raises(TypeError, "duplicate base class A",
973 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000974 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000975 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000976 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000977 type, "X", (A, C, B), {})
978 # Test a slightly more complex error
979 class GridLayout(object): pass
980 class HorizontalGrid(GridLayout): pass
981 class VerticalGrid(GridLayout): pass
982 class HVGrid(HorizontalGrid, VerticalGrid): pass
983 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000984 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000985 type, "ConfusedGrid", (HVGrid, VHGrid), {})
986
Guido van Rossum37202612001-08-09 19:45:21 +0000987def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000988 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000989 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000990 vereq(a.__class__, object)
991 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000992 b = object()
993 verify(a is not b)
994 verify(not hasattr(a, "foo"))
995 try:
996 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000997 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000998 pass
999 else:
1000 verify(0, "object() should not allow setting a foo attribute")
1001 verify(not hasattr(object(), "__dict__"))
1002
1003 class Cdict(object):
1004 pass
1005 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +00001006 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +00001007 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001008 vereq(x.foo, 1)
1009 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001010
Tim Peters6d6c1a32001-08-02 04:15:00 +00001011def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001012 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013 class C0(object):
1014 __slots__ = []
1015 x = C0()
1016 verify(not hasattr(x, "__dict__"))
1017 verify(not hasattr(x, "foo"))
1018
1019 class C1(object):
1020 __slots__ = ['a']
1021 x = C1()
1022 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001023 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001024 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001025 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001026 x.a = None
1027 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001028 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001029 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001030
1031 class C3(object):
1032 __slots__ = ['a', 'b', 'c']
1033 x = C3()
1034 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001035 verify(not hasattr(x, 'a'))
1036 verify(not hasattr(x, 'b'))
1037 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001038 x.a = 1
1039 x.b = 2
1040 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001041 vereq(x.a, 1)
1042 vereq(x.b, 2)
1043 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001044
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001045 class C4(object):
1046 """Validate name mangling"""
1047 __slots__ = ['__a']
1048 def __init__(self, value):
1049 self.__a = value
1050 def get(self):
1051 return self.__a
1052 x = C4(5)
1053 verify(not hasattr(x, '__dict__'))
1054 verify(not hasattr(x, '__a'))
1055 vereq(x.get(), 5)
1056 try:
1057 x.__a = 6
1058 except AttributeError:
1059 pass
1060 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001061 raise TestFailed("Double underscored names not mangled")
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001062
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001063 # Make sure slot names are proper identifiers
1064 try:
1065 class C(object):
1066 __slots__ = [None]
1067 except TypeError:
1068 pass
1069 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001070 raise TestFailed("[None] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001071 try:
1072 class C(object):
1073 __slots__ = ["foo bar"]
1074 except TypeError:
1075 pass
1076 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001077 raise TestFailed("['foo bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001078 try:
1079 class C(object):
1080 __slots__ = ["foo\0bar"]
1081 except TypeError:
1082 pass
1083 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001084 raise TestFailed("['foo\\0bar'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001085 try:
1086 class C(object):
1087 __slots__ = ["1"]
1088 except TypeError:
1089 pass
1090 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001091 raise TestFailed("['1'] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001092 try:
1093 class C(object):
1094 __slots__ = [""]
1095 except TypeError:
1096 pass
1097 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001098 raise TestFailed("[''] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001099 class C(object):
1100 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001101 # XXX(nnorwitz): was there supposed to be something tested
1102 # from the class above?
1103
1104 # Test a single string is not expanded as a sequence.
1105 class C(object):
1106 __slots__ = "abc"
1107 c = C()
1108 c.abc = 5
1109 vereq(c.abc, 5)
1110
1111 # Test unicode slot names
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001112 # Test a single unicode string is not expanded as a sequence.
1113 class C(object):
1114 __slots__ = "abc"
1115 c = C()
1116 c.abc = 5
1117 vereq(c.abc, 5)
1118
1119 # _unicode_to_string used to modify slots in certain circumstances
1120 slots = ("foo", "bar")
1121 class C(object):
1122 __slots__ = slots
1123 x = C()
1124 x.foo = 5
1125 vereq(x.foo, 5)
1126 veris(type(slots[0]), str)
1127 # this used to leak references
Guido van Rossumd8faa362007-04-27 19:54:29 +00001128 try:
Walter Dörwald5de48bd2007-06-11 21:38:39 +00001129 class C(object):
1130 __slots__ = [chr(128)]
1131 except (TypeError, UnicodeEncodeError):
Guido van Rossumd8faa362007-04-27 19:54:29 +00001132 pass
1133 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001134 raise TestFailed("[unichr(128)] slots not caught")
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001135
Guido van Rossum33bab012001-12-05 22:45:48 +00001136 # Test leaks
1137 class Counted(object):
1138 counter = 0 # counts the number of instances alive
1139 def __init__(self):
1140 Counted.counter += 1
1141 def __del__(self):
1142 Counted.counter -= 1
1143 class C(object):
1144 __slots__ = ['a', 'b', 'c']
1145 x = C()
1146 x.a = Counted()
1147 x.b = Counted()
1148 x.c = Counted()
1149 vereq(Counted.counter, 3)
1150 del x
1151 vereq(Counted.counter, 0)
1152 class D(C):
1153 pass
1154 x = D()
1155 x.a = Counted()
1156 x.z = Counted()
1157 vereq(Counted.counter, 2)
1158 del x
1159 vereq(Counted.counter, 0)
1160 class E(D):
1161 __slots__ = ['e']
1162 x = E()
1163 x.a = Counted()
1164 x.z = Counted()
1165 x.e = Counted()
1166 vereq(Counted.counter, 3)
1167 del x
1168 vereq(Counted.counter, 0)
1169
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001170 # Test cyclical leaks [SF bug 519621]
1171 class F(object):
1172 __slots__ = ['a', 'b']
1173 log = []
1174 s = F()
1175 s.a = [Counted(), s]
1176 vereq(Counted.counter, 1)
1177 s = None
1178 import gc
1179 gc.collect()
1180 vereq(Counted.counter, 0)
1181
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001182 # Test lookup leaks [SF bug 572567]
1183 import sys,gc
1184 class G(object):
1185 def __cmp__(self, other):
1186 return 0
1187 g = G()
1188 orig_objects = len(gc.get_objects())
Guido van Rossum805365e2007-05-07 22:24:25 +00001189 for i in range(10):
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001190 g==g
1191 new_objects = len(gc.get_objects())
1192 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001193 class H(object):
1194 __slots__ = ['a', 'b']
1195 def __init__(self):
1196 self.a = 1
1197 self.b = 2
1198 def __del__(self):
1199 assert self.a == 1
1200 assert self.b == 2
1201
1202 save_stderr = sys.stderr
1203 sys.stderr = sys.stdout
1204 h = H()
1205 try:
1206 del h
1207 finally:
1208 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001209
Guido van Rossum8b056da2002-08-13 18:26:26 +00001210def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001211 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001212
1213 class D(object):
1214 __slots__ = ["__dict__"]
1215 a = D()
1216 verify(hasattr(a, "__dict__"))
1217 verify(not hasattr(a, "__weakref__"))
1218 a.foo = 42
1219 vereq(a.__dict__, {"foo": 42})
1220
1221 class W(object):
1222 __slots__ = ["__weakref__"]
1223 a = W()
1224 verify(hasattr(a, "__weakref__"))
1225 verify(not hasattr(a, "__dict__"))
1226 try:
1227 a.foo = 42
1228 except AttributeError:
1229 pass
1230 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001231 raise TestFailed("shouldn't be allowed to set a.foo")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001232
1233 class C1(W, D):
1234 __slots__ = []
1235 a = C1()
1236 verify(hasattr(a, "__dict__"))
1237 verify(hasattr(a, "__weakref__"))
1238 a.foo = 42
1239 vereq(a.__dict__, {"foo": 42})
1240
1241 class C2(D, W):
1242 __slots__ = []
1243 a = C2()
1244 verify(hasattr(a, "__dict__"))
1245 verify(hasattr(a, "__weakref__"))
1246 a.foo = 42
1247 vereq(a.__dict__, {"foo": 42})
1248
Guido van Rossum9a818922002-11-14 19:50:14 +00001249# MRO order disagreement
1250#
1251# class C3(C1, C2):
1252# __slots__ = []
1253#
1254# class C4(C2, C1):
1255# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001256
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001258 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001259 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001260 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001261 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001262 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001263 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001264 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001265 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001266 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001267 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001268 vereq(E.foo, 1)
1269 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001270 # Test dynamic instances
1271 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001272 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001273 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001274 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001275 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001276 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001277 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001278 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001279 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001280 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001281 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001282 vereq(int(a), 100)
1283 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001284 verify(not hasattr(a, "spam"))
1285 def mygetattr(self, name):
1286 if name == "spam":
1287 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001288 raise AttributeError
1289 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001290 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001291 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001292 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001293 def mysetattr(self, name, value):
1294 if name == "spam":
1295 raise AttributeError
1296 return object.__setattr__(self, name, value)
1297 C.__setattr__ = mysetattr
1298 try:
1299 a.spam = "not spam"
1300 except AttributeError:
1301 pass
1302 else:
1303 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001304 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001305 class D(C):
1306 pass
1307 d = D()
1308 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001309 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001310
Guido van Rossum7e35d572001-09-15 03:14:32 +00001311 # Test handling of int*seq and seq*int
1312 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001313 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001314 vereq("a"*I(2), "aa")
1315 vereq(I(2)*"a", "aa")
1316 vereq(2*I(3), 6)
1317 vereq(I(3)*2, 6)
1318 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001319
1320 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001321 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001322 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001323 vereq("a"*L(2), "aa")
1324 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001325 vereq(2*L(3), 6)
1326 vereq(L(3)*2, 6)
1327 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001328
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001329 # Test comparison of classes with dynamic metaclasses
1330 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001331 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001332 class someclass(metaclass=dynamicmetaclass):
1333 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001334 verify(someclass != object)
1335
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001337 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001338
1339 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001340 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341 pass
1342 except TypeError:
1343 pass
1344 else:
1345 verify(0, "inheritance from both list and dict should be illegal")
1346
1347 try:
1348 class C(object, None):
1349 pass
1350 except TypeError:
1351 pass
1352 else:
1353 verify(0, "inheritance from non-type should be illegal")
1354 class Classic:
1355 pass
1356
1357 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001358 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001359 pass
1360 except TypeError:
1361 pass
1362 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001363 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364
1365 try:
1366 class C(object):
1367 __slots__ = 1
1368 except TypeError:
1369 pass
1370 else:
1371 verify(0, "__slots__ = 1 should be illegal")
1372
1373 try:
1374 class C(object):
1375 __slots__ = [1]
1376 except TypeError:
1377 pass
1378 else:
1379 verify(0, "__slots__ = [1] should be illegal")
1380
Guido van Rossumd8faa362007-04-27 19:54:29 +00001381 class M1(type):
1382 pass
1383 class M2(type):
1384 pass
1385 class A1(object, metaclass=M1):
1386 pass
1387 class A2(object, metaclass=M2):
1388 pass
1389 try:
1390 class B(A1, A2):
1391 pass
1392 except TypeError:
1393 pass
1394 else:
1395 verify(0, "finding the most derived metaclass should have failed")
1396
Tim Peters6d6c1a32001-08-02 04:15:00 +00001397def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001398 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001399 class C(object):
1400 def foo(*a): return a
1401 goo = classmethod(foo)
1402 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001403 vereq(C.goo(1), (C, 1))
1404 vereq(c.goo(1), (C, 1))
1405 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001406 class D(C):
1407 pass
1408 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001409 vereq(D.goo(1), (D, 1))
1410 vereq(d.goo(1), (D, 1))
1411 vereq(d.foo(1), (d, 1))
1412 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001413 # Test for a specific crash (SF bug 528132)
1414 def f(cls, arg): return (cls, arg)
1415 ff = classmethod(f)
1416 vereq(ff.__get__(0, int)(42), (int, 42))
1417 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001418
Guido van Rossum155db9a2002-04-02 17:53:47 +00001419 # Test super() with classmethods (SF bug 535444)
1420 veris(C.goo.im_self, C)
1421 veris(D.goo.im_self, D)
1422 veris(super(D,D).goo.im_self, D)
1423 veris(super(D,d).goo.im_self, D)
1424 vereq(super(D,D).goo(), (D,))
1425 vereq(super(D,d).goo(), (D,))
1426
Raymond Hettingerbe971532003-06-18 01:13:41 +00001427 # Verify that argument is checked for callability (SF bug 753451)
1428 try:
1429 classmethod(1).__get__(1)
1430 except TypeError:
1431 pass
1432 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001433 raise TestFailed("classmethod should check for callability")
Raymond Hettingerbe971532003-06-18 01:13:41 +00001434
Georg Brandl6a29c322006-02-21 22:17:46 +00001435 # Verify that classmethod() doesn't allow keyword args
1436 try:
1437 classmethod(f, kw=1)
1438 except TypeError:
1439 pass
1440 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001441 raise TestFailed("classmethod shouldn't accept keyword args")
Georg Brandl6a29c322006-02-21 22:17:46 +00001442
Fred Drakef841aa62002-03-28 15:49:54 +00001443def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001444 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001445 import xxsubtype as spam
1446 a = (1, 2, 3)
1447 d = {'abc': 123}
1448 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001449 veris(x, spam.spamlist)
1450 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001451 vereq(d, d1)
1452 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001453 veris(x, spam.spamlist)
1454 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001455 vereq(d, d1)
1456
Tim Peters6d6c1a32001-08-02 04:15:00 +00001457def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001458 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001459 class C(object):
1460 def foo(*a): return a
1461 goo = staticmethod(foo)
1462 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001463 vereq(C.goo(1), (1,))
1464 vereq(c.goo(1), (1,))
1465 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001466 class D(C):
1467 pass
1468 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001469 vereq(D.goo(1), (1,))
1470 vereq(d.goo(1), (1,))
1471 vereq(d.foo(1), (d, 1))
1472 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001473
Fred Drakef841aa62002-03-28 15:49:54 +00001474def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001475 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001476 import xxsubtype as spam
1477 a = (1, 2, 3)
1478 d = {"abc": 123}
1479 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1480 veris(x, None)
1481 vereq(a, a1)
1482 vereq(d, d1)
1483 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1484 veris(x, None)
1485 vereq(a, a1)
1486 vereq(d, d1)
1487
Tim Peters6d6c1a32001-08-02 04:15:00 +00001488def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001489 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001490 class C:
1491 def foo(*a): return a
1492 goo = classmethod(foo)
1493 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001494 vereq(C.goo(1), (C, 1))
1495 vereq(c.goo(1), (C, 1))
1496 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001497 class D(C):
1498 pass
1499 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001500 vereq(D.goo(1), (D, 1))
1501 vereq(d.goo(1), (D, 1))
1502 vereq(d.foo(1), (d, 1))
1503 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001504 class E: # *not* subclassing from C
1505 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001506 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001507 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001508
1509def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001510 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001511 class C(object):
1512 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001513 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001514 self.__get = get
1515 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001516 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001517 def __get__(self, obj, type=None):
1518 return self.__get(obj)
1519 def __set__(self, obj, value):
1520 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001521 def __delete__(self, obj):
1522 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001523 def __init__(self):
1524 self.__x = 0
1525 def __get_x(self):
1526 x = self.__x
1527 self.__x = x+1
1528 return x
1529 def __set_x(self, x):
1530 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001531 def __delete_x(self):
1532 del self.__x
1533 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001534 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001535 vereq(a.x, 0)
1536 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001537 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001538 vereq(a.x, 10)
1539 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001540 del a.x
1541 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001542
1543def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001544 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001545 class C(list):
1546 def __new__(cls):
1547 self = list.__new__(cls)
1548 self.foo = 1
1549 return self
1550 def __init__(self):
1551 self.foo = self.foo + 2
1552 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001553 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001554 verify(a.__class__ is C)
1555 class D(C):
1556 pass
1557 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001558 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001559 verify(b.__class__ is D)
1560
Tim Peters6d6c1a32001-08-02 04:15:00 +00001561def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001562 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001563 class A(object):
1564 def f(self): return "A"
1565 class B(A):
1566 pass
1567 class C(A):
1568 def f(self): return "C"
1569 class D(B, C):
1570 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001571 vereq(D.mro(), [D, B, C, A, object])
1572 vereq(D.__mro__, (D, B, C, A, object))
1573 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001574
Guido van Rossumd3077402001-08-12 05:24:18 +00001575 class PerverseMetaType(type):
1576 def mro(cls):
1577 L = type.mro(cls)
1578 L.reverse()
1579 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001580 class X(D,B,C,A, metaclass=PerverseMetaType):
1581 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001582 vereq(X.__mro__, (object, A, C, B, D, X))
1583 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001584
Armin Rigo037d1e02005-12-29 17:07:39 +00001585 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001586 class _metaclass(type):
1587 def mro(self):
1588 return [self, dict, object]
1589 class X(object, metaclass=_metaclass):
1590 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001591 except TypeError:
1592 pass
1593 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001594 raise TestFailed("devious mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001595
1596 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001597 class _metaclass(type):
1598 def mro(self):
1599 return [1]
1600 class X(object, metaclass=_metaclass):
1601 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001602 except TypeError:
1603 pass
1604 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001605 raise TestFailed("non-class mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001606
1607 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001608 class _metaclass(type):
1609 def mro(self):
1610 return 1
1611 class X(object, metaclass=_metaclass):
1612 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001613 except TypeError:
1614 pass
1615 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001616 raise TestFailed("non-sequence mro() return not caught")
Tim Peters1b27f862005-12-30 18:42:42 +00001617
Armin Rigo037d1e02005-12-29 17:07:39 +00001618
Tim Peters6d6c1a32001-08-02 04:15:00 +00001619def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001620 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001621
1622 class B(object):
1623 "Intermediate class because object doesn't have a __setattr__"
1624
1625 class C(B):
1626
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001627 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001628 if name == "foo":
1629 return ("getattr", name)
1630 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001631 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001632 def __setattr__(self, name, value):
1633 if name == "foo":
1634 self.setattr = (name, value)
1635 else:
1636 return B.__setattr__(self, name, value)
1637 def __delattr__(self, name):
1638 if name == "foo":
1639 self.delattr = name
1640 else:
1641 return B.__delattr__(self, name)
1642
1643 def __getitem__(self, key):
1644 return ("getitem", key)
1645 def __setitem__(self, key, value):
1646 self.setitem = (key, value)
1647 def __delitem__(self, key):
1648 self.delitem = key
1649
Tim Peters6d6c1a32001-08-02 04:15:00 +00001650 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001651 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001652 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001654 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001655 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001656
Guido van Rossum45704552001-10-08 16:35:45 +00001657 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001658 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001659 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001660 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001661 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001662
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001663 vereq(a[0:10], ("getitem", slice(0, 10)))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001664 a[0:10] = "foo"
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001665 vereq(a.setitem, (slice(0, 10), "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001666 del a[0:10]
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001667 vereq(a.delitem, slice(0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001668
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001669def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001670 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001671 class C(object):
1672 def __init__(self, x):
1673 self.x = x
1674 def foo(self):
1675 return self.x
1676 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001677 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001678 class D(C):
1679 boo = C.foo
1680 goo = c1.foo
1681 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001682 vereq(d2.foo(), 2)
1683 vereq(d2.boo(), 2)
1684 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001685 class E(object):
1686 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001687 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001688 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001689
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001690def specials():
1691 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001692 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001693 # Test the default behavior for static classes
1694 class C(object):
1695 def __getitem__(self, i):
1696 if 0 <= i < 10: return i
1697 raise IndexError
1698 c1 = C()
1699 c2 = C()
1700 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001701 verify(id(c1) != id(c2))
1702 hash(c1)
1703 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001704 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001705 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001706 verify(c1 != c2)
1707 verify(not c1 != c1)
1708 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001709 # Note that the module name appears in str/repr, and that varies
1710 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001711 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001712 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001713 verify(-1 not in c1)
1714 for i in range(10):
1715 verify(i in c1)
1716 verify(10 not in c1)
1717 # Test the default behavior for dynamic classes
1718 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001719 def __getitem__(self, i):
1720 if 0 <= i < 10: return i
1721 raise IndexError
1722 d1 = D()
1723 d2 = D()
1724 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001725 verify(id(d1) != id(d2))
1726 hash(d1)
1727 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001728 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001729 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001730 verify(d1 != d2)
1731 verify(not d1 != d1)
1732 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001733 # Note that the module name appears in str/repr, and that varies
1734 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001735 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001736 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001737 verify(-1 not in d1)
1738 for i in range(10):
1739 verify(i in d1)
1740 verify(10 not in d1)
1741 # Test overridden behavior for static classes
1742 class Proxy(object):
1743 def __init__(self, x):
1744 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001745 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001746 return not not self.x
1747 def __hash__(self):
1748 return hash(self.x)
1749 def __eq__(self, other):
1750 return self.x == other
1751 def __ne__(self, other):
1752 return self.x != other
1753 def __cmp__(self, other):
1754 return cmp(self.x, other.x)
1755 def __str__(self):
1756 return "Proxy:%s" % self.x
1757 def __repr__(self):
1758 return "Proxy(%r)" % self.x
1759 def __contains__(self, value):
1760 return value in self.x
1761 p0 = Proxy(0)
1762 p1 = Proxy(1)
1763 p_1 = Proxy(-1)
1764 verify(not p0)
1765 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001766 vereq(hash(p0), hash(0))
1767 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001768 verify(p0 != p1)
1769 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001770 vereq(not p0, p1)
1771 vereq(cmp(p0, p1), -1)
1772 vereq(cmp(p0, p0), 0)
1773 vereq(cmp(p0, p_1), 1)
1774 vereq(str(p0), "Proxy:0")
1775 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001776 p10 = Proxy(range(10))
1777 verify(-1 not in p10)
1778 for i in range(10):
1779 verify(i in p10)
1780 verify(10 not in p10)
1781 # Test overridden behavior for dynamic classes
1782 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001783 def __init__(self, x):
1784 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001785 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001786 return not not self.x
1787 def __hash__(self):
1788 return hash(self.x)
1789 def __eq__(self, other):
1790 return self.x == other
1791 def __ne__(self, other):
1792 return self.x != other
1793 def __cmp__(self, other):
1794 return cmp(self.x, other.x)
1795 def __str__(self):
1796 return "DProxy:%s" % self.x
1797 def __repr__(self):
1798 return "DProxy(%r)" % self.x
1799 def __contains__(self, value):
1800 return value in self.x
1801 p0 = DProxy(0)
1802 p1 = DProxy(1)
1803 p_1 = DProxy(-1)
1804 verify(not p0)
1805 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001806 vereq(hash(p0), hash(0))
1807 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001808 verify(p0 != p1)
1809 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001810 vereq(not p0, p1)
1811 vereq(cmp(p0, p1), -1)
1812 vereq(cmp(p0, p0), 0)
1813 vereq(cmp(p0, p_1), 1)
1814 vereq(str(p0), "DProxy:0")
1815 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001816 p10 = DProxy(range(10))
1817 verify(-1 not in p10)
1818 for i in range(10):
1819 verify(i in p10)
1820 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001821## # Safety test for __cmp__
1822## def unsafecmp(a, b):
1823## try:
1824## a.__class__.__cmp__(a, b)
1825## except TypeError:
1826## pass
1827## else:
1828## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1829## a.__class__, a, b)
1830## unsafecmp(u"123", "123")
1831## unsafecmp("123", u"123")
1832## unsafecmp(1, 1.0)
1833## unsafecmp(1.0, 1)
1834## unsafecmp(1, 1L)
1835## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001836
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001837## class Letter(str):
1838## def __new__(cls, letter):
1839## if letter == 'EPS':
1840## return str.__new__(cls)
1841## return str.__new__(cls, letter)
1842## def __str__(self):
1843## if not self:
1844## return 'EPS'
1845## return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001846
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001847## # sys.stdout needs to be the original to trigger the recursion bug
1848## import sys
1849## test_stdout = sys.stdout
1850## sys.stdout = get_original_stdout()
1851## try:
1852## # nothing should actually be printed, this should raise an exception
1853## print(Letter('w'))
1854## except RuntimeError:
1855## pass
1856## else:
1857## raise TestFailed, "expected a RuntimeError for print recursion"
1858## sys.stdout = test_stdout
Neal Norwitz1a997502003-01-13 20:13:12 +00001859
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001860def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001861 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001862 import weakref
1863 class C(object):
1864 pass
1865 c = C()
1866 r = weakref.ref(c)
1867 verify(r() is c)
1868 del c
1869 verify(r() is None)
1870 del r
1871 class NoWeak(object):
1872 __slots__ = ['foo']
1873 no = NoWeak()
1874 try:
1875 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001876 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001877 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001878 else:
1879 verify(0, "weakref.ref(no) should be illegal")
1880 class Weak(object):
1881 __slots__ = ['foo', '__weakref__']
1882 yes = Weak()
1883 r = weakref.ref(yes)
1884 verify(r() is yes)
1885 del yes
1886 verify(r() is None)
1887 del r
1888
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001889def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001890 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001891 class C(object):
1892 def getx(self):
1893 return self.__x
1894 def setx(self, value):
1895 self.__x = value
1896 def delx(self):
1897 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001898 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001899 a = C()
1900 verify(not hasattr(a, "x"))
1901 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001902 vereq(a._C__x, 42)
1903 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001904 del a.x
1905 verify(not hasattr(a, "x"))
1906 verify(not hasattr(a, "_C__x"))
1907 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001908 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001909 C.x.__delete__(a)
1910 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001911
Tim Peters66c1a522001-09-24 21:17:50 +00001912 raw = C.__dict__['x']
1913 verify(isinstance(raw, property))
1914
1915 attrs = dir(raw)
1916 verify("__doc__" in attrs)
1917 verify("fget" in attrs)
1918 verify("fset" in attrs)
1919 verify("fdel" in attrs)
1920
Guido van Rossum45704552001-10-08 16:35:45 +00001921 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001922 verify(raw.fget is C.__dict__['getx'])
1923 verify(raw.fset is C.__dict__['setx'])
1924 verify(raw.fdel is C.__dict__['delx'])
1925
1926 for attr in "__doc__", "fget", "fset", "fdel":
1927 try:
1928 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001929 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001930 if str(msg).find('readonly') < 0:
1931 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001932 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001933 "msg %r" % (attr, str(msg)))
1934 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001935 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001936 "readonly %r attr on a property" % attr)
1937
Neal Norwitz673cd822002-10-18 16:33:13 +00001938 class D(object):
1939 __getitem__ = property(lambda s: 1/0)
1940
1941 d = D()
1942 try:
1943 for i in d:
1944 str(i)
1945 except ZeroDivisionError:
1946 pass
1947 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001948 raise TestFailed("expected ZeroDivisionError from bad property")
Neal Norwitz673cd822002-10-18 16:33:13 +00001949
Georg Brandl533ff6f2006-03-08 18:09:27 +00001950 class E(object):
1951 def getter(self):
1952 "getter method"
1953 return 0
1954 def setter(self, value):
1955 "setter method"
1956 pass
1957 prop = property(getter)
1958 vereq(prop.__doc__, "getter method")
1959 prop2 = property(fset=setter)
1960 vereq(prop2.__doc__, None)
1961
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001962 # this segfaulted in 2.5b2
1963 try:
1964 import _testcapi
1965 except ImportError:
1966 pass
1967 else:
1968 class X(object):
1969 p = property(_testcapi.test_with_docstring)
1970
1971
Guido van Rossumc4a18802001-08-24 16:55:27 +00001972def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001973 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001974
1975 class A(object):
1976 def meth(self, a):
1977 return "A(%r)" % a
1978
Guido van Rossum45704552001-10-08 16:35:45 +00001979 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001980
1981 class B(A):
1982 def __init__(self):
1983 self.__super = super(B, self)
1984 def meth(self, a):
1985 return "B(%r)" % a + self.__super.meth(a)
1986
Guido van Rossum45704552001-10-08 16:35:45 +00001987 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001988
1989 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001990 def meth(self, a):
1991 return "C(%r)" % a + self.__super.meth(a)
1992 C._C__super = super(C)
1993
Guido van Rossum45704552001-10-08 16:35:45 +00001994 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001995
1996 class D(C, B):
1997 def meth(self, a):
1998 return "D(%r)" % a + super(D, self).meth(a)
1999
Guido van Rossum5b443c62001-12-03 15:38:28 +00002000 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2001
2002 # Test for subclassing super
2003
2004 class mysuper(super):
2005 def __init__(self, *args):
2006 return super(mysuper, self).__init__(*args)
2007
2008 class E(D):
2009 def meth(self, a):
2010 return "E(%r)" % a + mysuper(E, self).meth(a)
2011
2012 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2013
2014 class F(E):
2015 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002016 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002017 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2018 F._F__super = mysuper(F)
2019
2020 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2021
2022 # Make sure certain errors are raised
2023
2024 try:
2025 super(D, 42)
2026 except TypeError:
2027 pass
2028 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002029 raise TestFailed("shouldn't allow super(D, 42)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002030
2031 try:
2032 super(D, C())
2033 except TypeError:
2034 pass
2035 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002036 raise TestFailed("shouldn't allow super(D, C())")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002037
2038 try:
2039 super(D).__get__(12)
2040 except TypeError:
2041 pass
2042 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002043 raise TestFailed("shouldn't allow super(D).__get__(12)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002044
2045 try:
2046 super(D).__get__(C())
2047 except TypeError:
2048 pass
2049 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002050 raise TestFailed("shouldn't allow super(D).__get__(C())")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002051
Guido van Rossuma4541a32003-04-16 20:02:22 +00002052 # Make sure data descriptors can be overridden and accessed via super
2053 # (new feature in Python 2.3)
2054
2055 class DDbase(object):
2056 def getx(self): return 42
2057 x = property(getx)
2058
2059 class DDsub(DDbase):
2060 def getx(self): return "hello"
2061 x = property(getx)
2062
2063 dd = DDsub()
2064 vereq(dd.x, "hello")
2065 vereq(super(DDsub, dd).x, 42)
2066
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002067 # Ensure that super() lookup of descriptor from classmethod
2068 # works (SF ID# 743627)
2069
2070 class Base(object):
2071 aProp = property(lambda self: "foo")
2072
2073 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002074 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002075 def test(klass):
2076 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002077
2078 veris(Sub.test(), Base.aProp)
2079
Thomas Wouters89f507f2006-12-13 04:49:30 +00002080 # Verify that super() doesn't allow keyword args
2081 try:
2082 super(Base, kw=1)
2083 except TypeError:
2084 pass
2085 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002086 raise TestFailed("super shouldn't accept keyword args")
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002087
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002088def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002089 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002090
2091 class hexint(int):
2092 def __repr__(self):
2093 return hex(self)
2094 def __add__(self, other):
2095 return hexint(int.__add__(self, other))
2096 # (Note that overriding __radd__ doesn't work,
2097 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002098 vereq(repr(hexint(7) + 9), "0x10")
2099 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002100 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002101 vereq(a, 12345)
2102 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002103 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002104 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002105 verify((+a).__class__ is int)
2106 verify((a >> 0).__class__ is int)
2107 verify((a << 0).__class__ is int)
2108 verify((hexint(0) << 12).__class__ is int)
2109 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002110
Guido van Rossume2a383d2007-01-15 16:59:06 +00002111 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002112 __slots__ = []
2113 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002114 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002115 def __add__(self, other):
2116 return self.__class__(super(octlong, self).__add__(other))
2117 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002118 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002119 # (Note that overriding __radd__ here only seems to work
2120 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002121 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002122 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002123 vereq(a, 12345)
2124 vereq(int(a), 12345)
2125 vereq(hash(a), hash(12345))
2126 verify(int(a).__class__ is int)
2127 verify((+a).__class__ is int)
2128 verify((-a).__class__ is int)
2129 verify((-octlong(0)).__class__ is int)
2130 verify((a >> 0).__class__ is int)
2131 verify((a << 0).__class__ is int)
2132 verify((a - 0).__class__ is int)
2133 verify((a * 1).__class__ is int)
2134 verify((a ** 1).__class__ is int)
2135 verify((a // 1).__class__ is int)
2136 verify((1 * a).__class__ is int)
2137 verify((a | 0).__class__ is int)
2138 verify((a ^ 0).__class__ is int)
2139 verify((a & -1).__class__ is int)
2140 verify((octlong(0) << 12).__class__ is int)
2141 verify((octlong(0) >> 12).__class__ is int)
2142 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002143
2144 # Because octlong overrides __add__, we can't check the absence of +0
2145 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002146 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002147 pass
2148 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002149 verify((a + 0).__class__ is int)
2150 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002151
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002152 # Check that negative clones don't segfault
2153 a = longclone(-1)
2154 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002155 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002156
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002157 class precfloat(float):
2158 __slots__ = ['prec']
2159 def __init__(self, value=0.0, prec=12):
2160 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002161 def __repr__(self):
2162 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002163 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002164 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002165 vereq(a, 12345.0)
2166 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002167 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002168 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002169 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002170
Tim Peters2400fa42001-09-12 19:12:49 +00002171 class madcomplex(complex):
2172 def __repr__(self):
2173 return "%.17gj%+.17g" % (self.imag, self.real)
2174 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002176 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002177 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(a, base)
2179 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002180 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002181 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002182 vereq(repr(a), "4j-3")
2183 vereq(a, base)
2184 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002185 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002186 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002187 veris((+a).__class__, complex)
2188 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002189 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002190 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002192 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002193 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002194 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002195 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002196
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002197 class madtuple(tuple):
2198 _rev = None
2199 def rev(self):
2200 if self._rev is not None:
2201 return self._rev
2202 L = list(self)
2203 L.reverse()
2204 self._rev = self.__class__(L)
2205 return self._rev
2206 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002207 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2208 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2209 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002210 for i in range(512):
2211 t = madtuple(range(i))
2212 u = t.rev()
2213 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002215 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002216 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002217 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002218 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002219 verify(a[:].__class__ is tuple)
2220 verify((a * 1).__class__ is tuple)
2221 verify((a * 0).__class__ is tuple)
2222 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002223 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002224 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002225 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002226 verify((a + a).__class__ is tuple)
2227 verify((a * 0).__class__ is tuple)
2228 verify((a * 1).__class__ is tuple)
2229 verify((a * 2).__class__ is tuple)
2230 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002231
2232 class madstring(str):
2233 _rev = None
2234 def rev(self):
2235 if self._rev is not None:
2236 return self._rev
2237 L = list(self)
2238 L.reverse()
2239 self._rev = self.__class__("".join(L))
2240 return self._rev
2241 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002242 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2243 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2244 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002245 for i in range(256):
2246 s = madstring("".join(map(chr, range(i))))
2247 t = s.rev()
2248 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002249 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002250 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002251 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002252 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002253
Tim Peters8fa5dd02001-09-12 02:18:30 +00002254 base = "\x00" * 5
2255 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(s, base)
2257 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002258 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002259 vereq(hash(s), hash(base))
2260 vereq({s: 1}[base], 1)
2261 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002262 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002263 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002264 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002265 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002266 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002267 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002268 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002269 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002270 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002272 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002273 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002274 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002275 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002276 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002277 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002278 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002279 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002280 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002282 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002283 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002285 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002287 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002289 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002291 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002292 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002293 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002294 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002295
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002296 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002297 _rev = None
2298 def rev(self):
2299 if self._rev is not None:
2300 return self._rev
2301 L = list(self)
2302 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002303 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002304 return self._rev
2305 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002306 vereq(u, "ABCDEF")
2307 vereq(u.rev(), madunicode("FEDCBA"))
2308 vereq(u.rev().rev(), madunicode("ABCDEF"))
2309 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002310 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002311 vereq(str(u), base)
2312 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002313 vereq(hash(u), hash(base))
2314 vereq({u: 1}[base], 1)
2315 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002316 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002317 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002318 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002319 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002320 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002321 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002322 verify(u.replace("x", "x").__class__ is str)
2323 vereq(u.replace("x", "x"), base)
2324 verify(u.replace("xy", "xy").__class__ is str)
2325 vereq(u.replace("xy", "xy"), base)
2326 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002328 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002329 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002330 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002331 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002332 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002333 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002334 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002335 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002336 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002337 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002338 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002340 verify((u + "").__class__ is str)
2341 vereq(u + "", base)
2342 verify(("" + u).__class__ is str)
2343 vereq("" + u, base)
2344 verify((u * 0).__class__ is str)
2345 vereq(u * 0, "")
2346 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002348 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002349 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002350 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002351 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002352 verify(u[0:0].__class__ is str)
2353 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002354
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002355 class sublist(list):
2356 pass
2357 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002358 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002359 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002360 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002361 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002362 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002363 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002364 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002365 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002366 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002367 del a[10:15]
2368 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002369 vereq(a, list(range(10)))
2370 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002371 vereq(a[0], 0)
2372 vereq(a[9], 9)
2373 vereq(a[-10], 0)
2374 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002375 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002376
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002377## class CountedInput(file):
2378## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002379
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002380## self.lineno is the 0-based ordinal of the last line read, up to
2381## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002382
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002383## self.ateof is true if and only if the final "" line has been read,
2384## at which point self.lineno stops incrementing, and further calls
2385## to readline() continue to return "".
2386## """
Tim Peters59c9a642001-09-13 05:38:56 +00002387
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002388## lineno = 0
2389## ateof = 0
2390## def readline(self):
2391## if self.ateof:
2392## return ""
2393## s = file.readline(self)
2394## # Next line works too.
2395## # s = super(CountedInput, self).readline()
2396## self.lineno += 1
2397## if s == "":
2398## self.ateof = 1
2399## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002400
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002401## f = open(name=TESTFN, mode='w')
2402## lines = ['a\n', 'b\n', 'c\n']
2403## try:
2404## f.writelines(lines)
2405## f.close()
2406## f = CountedInput(TESTFN)
2407## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2408## got = f.readline()
2409## vereq(expected, got)
2410## vereq(f.lineno, i)
2411## vereq(f.ateof, (i > len(lines)))
2412## f.close()
2413## finally:
2414## try:
2415## f.close()
2416## except:
2417## pass
2418## try:
2419## import os
2420## os.unlink(TESTFN)
2421## except:
2422## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002423
Tim Peters808b94e2001-09-13 19:33:07 +00002424def keywords():
2425 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002426 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002427 vereq(int(x=1), 1)
2428 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002429 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002430 vereq(complex(imag=42, real=666), complex(666, 42))
2431 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002432 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002433 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002434 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002435 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002436
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002437 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002438 try:
2439 constructor(bogus_keyword_arg=1)
2440 except TypeError:
2441 pass
2442 else:
2443 raise TestFailed("expected TypeError from bogus keyword "
2444 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002445
Tim Peters0ab085c2001-09-14 00:25:33 +00002446def str_subclass_as_dict_key():
2447 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002448 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002449
2450 class cistr(str):
2451 """Sublcass of str that computes __eq__ case-insensitively.
2452
2453 Also computes a hash code of the string in canonical form.
2454 """
2455
2456 def __init__(self, value):
2457 self.canonical = value.lower()
2458 self.hashcode = hash(self.canonical)
2459
2460 def __eq__(self, other):
2461 if not isinstance(other, cistr):
2462 other = cistr(other)
2463 return self.canonical == other.canonical
2464
2465 def __hash__(self):
2466 return self.hashcode
2467
Guido van Rossum45704552001-10-08 16:35:45 +00002468 vereq(cistr('ABC'), 'abc')
2469 vereq('aBc', cistr('ABC'))
2470 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002471
2472 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002473 vereq(d[cistr('one')], 1)
2474 vereq(d[cistr('tWo')], 2)
2475 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002476 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002477 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002478
Guido van Rossumab3b0342001-09-18 20:38:53 +00002479def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002480 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002481 class classic:
2482 pass
2483 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002484 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002485 class C(base):
2486 def __init__(self, value):
2487 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002488 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002489 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002490 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002491 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002492 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002493 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002494 def __ne__(self, other):
2495 if isinstance(other, C):
2496 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002497 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002498 return self.value != other
2499 return NotImplemented
2500 def __lt__(self, other):
2501 if isinstance(other, C):
2502 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002503 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002504 return self.value < other
2505 return NotImplemented
2506 def __le__(self, other):
2507 if isinstance(other, C):
2508 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002509 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002510 return self.value <= other
2511 return NotImplemented
2512 def __gt__(self, other):
2513 if isinstance(other, C):
2514 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002515 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002516 return self.value > other
2517 return NotImplemented
2518 def __ge__(self, other):
2519 if isinstance(other, C):
2520 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002521 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002522 return self.value >= other
2523 return NotImplemented
2524
Guido van Rossumab3b0342001-09-18 20:38:53 +00002525 c1 = C(1)
2526 c2 = C(2)
2527 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002528 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002529 c = {1: c1, 2: c2, 3: c3}
2530 for x in 1, 2, 3:
2531 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002532 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002533 for op in "<", "<=", "==", "!=", ">", ">=":
2534 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2535 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002536 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2537 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002538
Guido van Rossum0639f592001-09-18 21:06:04 +00002539def rich_comparisons():
2540 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002541 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002542 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002543 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002544 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002545 vereq(z, 1+0j)
2546 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002547 class ZZ(complex):
2548 def __eq__(self, other):
2549 try:
2550 return abs(self - other) <= 1e-6
2551 except:
2552 return NotImplemented
2553 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002554 vereq(zz, 1+0j)
2555 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002556
Guido van Rossum0639f592001-09-18 21:06:04 +00002557 class classic:
2558 pass
2559 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002560 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002561 class C(base):
2562 def __init__(self, value):
2563 self.value = int(value)
2564 def __cmp__(self, other):
Collin Winter3add4d72007-08-29 23:37:32 +00002565 raise TestFailed("shouldn't call __cmp__")
Guido van Rossum0639f592001-09-18 21:06:04 +00002566 def __eq__(self, other):
2567 if isinstance(other, C):
2568 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002569 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002570 return self.value == other
2571 return NotImplemented
2572 def __ne__(self, other):
2573 if isinstance(other, C):
2574 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002575 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002576 return self.value != other
2577 return NotImplemented
2578 def __lt__(self, other):
2579 if isinstance(other, C):
2580 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002581 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002582 return self.value < other
2583 return NotImplemented
2584 def __le__(self, other):
2585 if isinstance(other, C):
2586 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002587 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002588 return self.value <= other
2589 return NotImplemented
2590 def __gt__(self, other):
2591 if isinstance(other, C):
2592 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002593 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002594 return self.value > other
2595 return NotImplemented
2596 def __ge__(self, other):
2597 if isinstance(other, C):
2598 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002599 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002600 return self.value >= other
2601 return NotImplemented
2602 c1 = C(1)
2603 c2 = C(2)
2604 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002605 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002606 c = {1: c1, 2: c2, 3: c3}
2607 for x in 1, 2, 3:
2608 for y in 1, 2, 3:
2609 for op in "<", "<=", "==", "!=", ">", ">=":
2610 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2611 "x=%d, y=%d" % (x, y))
2612 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2613 "x=%d, y=%d" % (x, y))
2614 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2615 "x=%d, y=%d" % (x, y))
2616
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002617def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002618 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002619 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002620 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002621 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002622 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2623 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002624
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002625def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002626 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002627 class C(object): pass
2628 class D(object): pass
2629 class E(object): pass
2630 class F(D, E): pass
2631 for cls in C, D, E, F:
2632 for cls2 in C, D, E, F:
2633 x = cls()
2634 x.__class__ = cls2
2635 verify(x.__class__ is cls2)
2636 x.__class__ = cls
2637 verify(x.__class__ is cls)
2638 def cant(x, C):
2639 try:
2640 x.__class__ = C
2641 except TypeError:
2642 pass
2643 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002644 raise TestFailed("shouldn't allow %r.__class__ = %r" % (x, C))
Guido van Rossumb6b89422002-04-15 01:03:30 +00002645 try:
2646 delattr(x, "__class__")
2647 except TypeError:
2648 pass
2649 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002650 raise TestFailed("shouldn't allow del %r.__class__" % x)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002651 cant(C(), list)
2652 cant(list(), C)
2653 cant(C(), 1)
2654 cant(C(), object)
2655 cant(object(), list)
2656 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002657 class Int(int): __slots__ = []
2658 cant(2, Int)
2659 cant(Int(), int)
2660 cant(True, int)
2661 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002662 o = object()
2663 cant(o, type(1))
2664 cant(o, type(None))
2665 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002666 class G(object):
2667 __slots__ = ["a", "b"]
2668 class H(object):
2669 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002670 class I(object):
2671 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002672 class J(object):
2673 __slots__ = ["c", "b"]
2674 class K(object):
2675 __slots__ = ["a", "b", "d"]
2676 class L(H):
2677 __slots__ = ["e"]
2678 class M(I):
2679 __slots__ = ["e"]
2680 class N(J):
2681 __slots__ = ["__weakref__"]
2682 class P(J):
2683 __slots__ = ["__dict__"]
2684 class Q(J):
2685 pass
2686 class R(J):
2687 __slots__ = ["__dict__", "__weakref__"]
2688
2689 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2690 x = cls()
2691 x.a = 1
2692 x.__class__ = cls2
2693 verify(x.__class__ is cls2,
2694 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2695 vereq(x.a, 1)
2696 x.__class__ = cls
2697 verify(x.__class__ is cls,
2698 "assigning %r as __class__ for %r silently failed" % (cls, x))
2699 vereq(x.a, 1)
2700 for cls in G, J, K, L, M, N, P, R, list, Int:
2701 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2702 if cls is cls2:
2703 continue
2704 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002705
Guido van Rossum6661be32001-10-26 04:26:12 +00002706def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002707 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002708 class C(object): pass
2709 a = C()
2710 a.__dict__ = {'b': 1}
2711 vereq(a.b, 1)
2712 def cant(x, dict):
2713 try:
2714 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002715 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002716 pass
2717 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002718 raise TestFailed("shouldn't allow %r.__dict__ = %r" % (x, dict))
Guido van Rossum6661be32001-10-26 04:26:12 +00002719 cant(a, None)
2720 cant(a, [])
2721 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002722 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002723
2724 class Base(object):
2725 pass
2726 def verify_dict_readonly(x):
2727 """
2728 x has to be an instance of a class inheriting from Base.
2729 """
2730 cant(x, {})
2731 try:
2732 del x.__dict__
2733 except (AttributeError, TypeError):
2734 pass
2735 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002736 raise TestFailed("shouldn't allow del %r.__dict__" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002737 dict_descr = Base.__dict__["__dict__"]
2738 try:
2739 dict_descr.__set__(x, {})
2740 except (AttributeError, TypeError):
2741 pass
2742 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002743 raise TestFailed("dict_descr allowed access to %r's dict" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002744
2745 # Classes don't allow __dict__ assignment and have readonly dicts
2746 class Meta1(type, Base):
2747 pass
2748 class Meta2(Base, type):
2749 pass
2750 class D(object):
2751 __metaclass__ = Meta1
2752 class E(object):
2753 __metaclass__ = Meta2
2754 for cls in C, D, E:
2755 verify_dict_readonly(cls)
2756 class_dict = cls.__dict__
2757 try:
2758 class_dict["spam"] = "eggs"
2759 except TypeError:
2760 pass
2761 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002762 raise TestFailed("%r's __dict__ can be modified" % cls)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002763
2764 # Modules also disallow __dict__ assignment
2765 class Module1(types.ModuleType, Base):
2766 pass
2767 class Module2(Base, types.ModuleType):
2768 pass
2769 for ModuleType in Module1, Module2:
2770 mod = ModuleType("spam")
2771 verify_dict_readonly(mod)
2772 mod.__dict__["spam"] = "eggs"
2773
2774 # Exception's __dict__ can be replaced, but not deleted
2775 class Exception1(Exception, Base):
2776 pass
2777 class Exception2(Base, Exception):
2778 pass
2779 for ExceptionType in Exception, Exception1, Exception2:
2780 e = ExceptionType()
2781 e.__dict__ = {"a": 1}
2782 vereq(e.a, 1)
2783 try:
2784 del e.__dict__
2785 except (TypeError, AttributeError):
2786 pass
2787 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002788 raise TestFaied("%r's __dict__ can be deleted" % e)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002789
Guido van Rossum6661be32001-10-26 04:26:12 +00002790
Guido van Rossum3926a632001-09-25 16:25:58 +00002791def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002792 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002793 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002794 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002795
2796 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002797 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002798
2799 global C
2800 class C(object):
2801 def __init__(self, a, b):
2802 super(C, self).__init__()
2803 self.a = a
2804 self.b = b
2805 def __repr__(self):
2806 return "C(%r, %r)" % (self.a, self.b)
2807
2808 global C1
2809 class C1(list):
2810 def __new__(cls, a, b):
2811 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002812 def __getnewargs__(self):
2813 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002814 def __init__(self, a, b):
2815 self.a = a
2816 self.b = b
2817 def __repr__(self):
2818 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2819
2820 global C2
2821 class C2(int):
2822 def __new__(cls, a, b, val=0):
2823 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002824 def __getnewargs__(self):
2825 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002826 def __init__(self, a, b, val=0):
2827 self.a = a
2828 self.b = b
2829 def __repr__(self):
2830 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2831
Guido van Rossum90c45142001-11-24 21:07:01 +00002832 global C3
2833 class C3(object):
2834 def __init__(self, foo):
2835 self.foo = foo
2836 def __getstate__(self):
2837 return self.foo
2838 def __setstate__(self, foo):
2839 self.foo = foo
2840
2841 global C4classic, C4
2842 class C4classic: # classic
2843 pass
2844 class C4(C4classic, object): # mixed inheritance
2845 pass
2846
Guido van Rossum99603b02007-07-20 00:22:32 +00002847 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002848 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002849 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002850 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002851
2852 for cls in C, C1, C2:
2853 s = p.dumps(cls, bin)
2854 cls2 = p.loads(s)
2855 verify(cls2 is cls)
2856
2857 a = C1(1, 2); a.append(42); a.append(24)
2858 b = C2("hello", "world", 42)
2859 s = p.dumps((a, b), bin)
2860 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002861 vereq(x.__class__, a.__class__)
2862 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2863 vereq(y.__class__, b.__class__)
2864 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002865 vereq(repr(x), repr(a))
2866 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002867 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002868 print("a = x =", a)
2869 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002870 # Test for __getstate__ and __setstate__ on new style class
2871 u = C3(42)
2872 s = p.dumps(u, bin)
2873 v = p.loads(s)
2874 veris(u.__class__, v.__class__)
2875 vereq(u.foo, v.foo)
2876 # Test for picklability of hybrid class
2877 u = C4()
2878 u.foo = 42
2879 s = p.dumps(u, bin)
2880 v = p.loads(s)
2881 veris(u.__class__, v.__class__)
2882 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002883
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002884 # Testing copy.deepcopy()
2885 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002886 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002887 import copy
2888 for cls in C, C1, C2:
2889 cls2 = copy.deepcopy(cls)
2890 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002891
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002892 a = C1(1, 2); a.append(42); a.append(24)
2893 b = C2("hello", "world", 42)
2894 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002895 vereq(x.__class__, a.__class__)
2896 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2897 vereq(y.__class__, b.__class__)
2898 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002899 vereq(repr(x), repr(a))
2900 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002901 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002902 print("a = x =", a)
2903 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002904
Guido van Rossum8c842552002-03-14 23:05:54 +00002905def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002906 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002907 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002908 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002909 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002910 global B, C, D, E
2911 class B(object):
2912 pass
2913 for base in [object, B]:
2914 class C(base):
2915 __slots__ = ['a']
2916 class D(C):
2917 pass
2918 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002919 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002920 except TypeError:
2921 pass
2922 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002923 raise TestFailed("should fail: pickle C instance - %s" % base)
Guido van Rossum8c842552002-03-14 23:05:54 +00002924 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002925 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002926 except TypeError:
2927 pass
2928 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002929 raise TestFailed("should fail: pickle D instance - %s" % base)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002930 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002931 class C(base):
2932 __slots__ = ['a']
2933 def __getstate__(self):
2934 try:
2935 d = self.__dict__.copy()
2936 except AttributeError:
2937 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002938 for cls in self.__class__.__mro__:
2939 for sn in cls.__dict__.get('__slots__', ()):
2940 try:
2941 d[sn] = getattr(self, sn)
2942 except AttributeError:
2943 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002944 return d
2945 def __setstate__(self, d):
2946 for k, v in d.items():
2947 setattr(self, k, v)
2948 class D(C):
2949 pass
2950 # Now it should work
2951 x = C()
2952 y = pickle.loads(pickle.dumps(x))
2953 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002954 x.a = 42
2955 y = pickle.loads(pickle.dumps(x))
2956 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00002957 x = D()
2958 x.a = 42
2959 x.b = 100
2960 y = pickle.loads(pickle.dumps(x))
2961 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002962 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002963 class E(C):
2964 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002965 x = E()
2966 x.a = 42
2967 x.b = "foo"
2968 y = pickle.loads(pickle.dumps(x))
2969 vereq(y.a, x.a)
2970 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002971
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002972def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002973 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002974 import copy
2975 class C(object):
2976 pass
2977
2978 a = C()
2979 a.foo = 12
2980 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002981 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002982
2983 a.bar = [1,2,3]
2984 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002985 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002986 verify(c.bar is a.bar)
2987
2988 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002989 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002990 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002991 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002992
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002993def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002994 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002995 class I(int):
2996 def __repr__(self):
2997 return "I(%r)" % int(self)
2998 def __add__(self, other):
2999 return I(int(self) + int(other))
3000 __radd__ = __add__
3001 def __pow__(self, other, mod=None):
3002 if mod is None:
3003 return I(pow(int(self), int(other)))
3004 else:
3005 return I(pow(int(self), int(other), int(mod)))
3006 def __rpow__(self, other, mod=None):
3007 if mod is None:
3008 return I(pow(int(other), int(self), mod))
3009 else:
3010 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003011
Walter Dörwald70a6b492004-02-12 17:35:32 +00003012 vereq(repr(I(1) + I(2)), "I(3)")
3013 vereq(repr(I(1) + 2), "I(3)")
3014 vereq(repr(1 + I(2)), "I(3)")
3015 vereq(repr(I(2) ** I(3)), "I(8)")
3016 vereq(repr(2 ** I(3)), "I(8)")
3017 vereq(repr(I(2) ** 3), "I(8)")
3018 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003019 class S(str):
3020 def __eq__(self, other):
3021 return self.lower() == other.lower()
3022
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003023def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003024 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003025 class A(object):
3026 pass
3027 class B(A):
3028 pass
3029 class C(A):
3030 pass
3031 class D(B, C):
3032 pass
3033 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003034 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003035 A.__hash__ = lambda self: 42
3036 vereq(hash(d), 42)
3037 C.__hash__ = lambda self: 314
3038 vereq(hash(d), 314)
3039 B.__hash__ = lambda self: 144
3040 vereq(hash(d), 144)
3041 D.__hash__ = lambda self: 100
3042 vereq(hash(d), 100)
3043 del D.__hash__
3044 vereq(hash(d), 144)
3045 del B.__hash__
3046 vereq(hash(d), 314)
3047 del C.__hash__
3048 vereq(hash(d), 42)
3049 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003050 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003051 d.foo = 42
3052 d.bar = 42
3053 vereq(d.foo, 42)
3054 vereq(d.bar, 42)
3055 def __getattribute__(self, name):
3056 if name == "foo":
3057 return 24
3058 return object.__getattribute__(self, name)
3059 A.__getattribute__ = __getattribute__
3060 vereq(d.foo, 24)
3061 vereq(d.bar, 42)
3062 def __getattr__(self, name):
3063 if name in ("spam", "foo", "bar"):
3064 return "hello"
Collin Winter3add4d72007-08-29 23:37:32 +00003065 raise AttributeError(name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003066 B.__getattr__ = __getattr__
3067 vereq(d.spam, "hello")
3068 vereq(d.foo, 24)
3069 vereq(d.bar, 42)
3070 del A.__getattribute__
3071 vereq(d.foo, 42)
3072 del d.foo
3073 vereq(d.foo, "hello")
3074 vereq(d.bar, 42)
3075 del B.__getattr__
3076 try:
3077 d.foo
3078 except AttributeError:
3079 pass
3080 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003081 raise TestFailed("d.foo should be undefined now")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003082
Guido van Rossume7f3e242002-06-14 02:35:45 +00003083 # Test a nasty bug in recurse_down_subclasses()
3084 import gc
3085 class A(object):
3086 pass
3087 class B(A):
3088 pass
3089 del B
3090 gc.collect()
3091 A.__setitem__ = lambda *a: None # crash
3092
Tim Petersfc57ccb2001-10-12 02:38:24 +00003093def buffer_inherit():
3094 import binascii
3095 # SF bug [#470040] ParseTuple t# vs subclasses.
3096 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003097 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003098
3099 class MyStr(str):
3100 pass
3101 base = 'abc'
3102 m = MyStr(base)
3103 # b2a_hex uses the buffer interface to get its argument's value, via
3104 # PyArg_ParseTuple 't#' code.
3105 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3106
3107 # It's not clear that unicode will continue to support the character
3108 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003109 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003110 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003111 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003112 m = MyUni(base)
3113 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3114
3115 class MyInt(int):
3116 pass
3117 m = MyInt(42)
3118 try:
3119 binascii.b2a_hex(m)
3120 raise TestFailed('subclass of int should not have a buffer interface')
3121 except TypeError:
3122 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003123
Tim Petersc9933152001-10-16 20:18:24 +00003124def str_of_str_subclass():
3125 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003126 import io
Tim Petersc9933152001-10-16 20:18:24 +00003127
3128 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003129 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003130
3131 class octetstring(str):
3132 def __str__(self):
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003133 return str(binascii.b2a_hex(self))
Tim Petersc9933152001-10-16 20:18:24 +00003134 def __repr__(self):
3135 return self + " repr"
3136
3137 o = octetstring('A')
3138 vereq(type(o), octetstring)
3139 vereq(type(str(o)), str)
3140 vereq(type(repr(o)), str)
3141 vereq(ord(o), 0x41)
3142 vereq(str(o), '41')
3143 vereq(repr(o), 'A repr')
3144 vereq(o.__str__(), '41')
3145 vereq(o.__repr__(), 'A repr')
3146
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003147 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003148 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003149 print(o, file=capture)
3150 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003151 vereq(capture.getvalue(), '41\n41\n')
3152 capture.close()
3153
Guido van Rossumc8e56452001-10-22 00:43:43 +00003154def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003155 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003156 def f(a): return a
3157 vereq(f.__call__(a=42), 42)
3158 a = []
3159 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003160 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003161
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003162def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003163 if verbose: print(("Testing recursive __call__() by setting to instance of "
3164 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003165 class A(object):
3166 pass
3167
3168 A.__call__ = A()
3169 try:
3170 A()()
3171 except RuntimeError:
3172 pass
3173 else:
3174 raise TestFailed("Recursion limit should have been reached for "
3175 "__call__()")
3176
Guido van Rossumed87ad82001-10-30 02:33:02 +00003177def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003178 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003179 log = []
3180 class C(object):
3181 def __del__(self):
3182 log.append(1)
3183 c = C()
3184 vereq(log, [])
3185 del c
3186 vereq(log, [1])
3187
Guido van Rossum29d26062001-12-11 04:37:34 +00003188 class D(object): pass
3189 d = D()
3190 try: del d[0]
3191 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003192 else: raise TestFailed("invalid del() didn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003193
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003194def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003195 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003196
3197 class mydict(dict):
3198 pass
3199 d = mydict()
3200 try:
3201 hash(d)
3202 except TypeError:
3203 pass
3204 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003205 raise TestFailed("hash() of dict subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003206
3207 class mylist(list):
3208 pass
3209 d = mylist()
3210 try:
3211 hash(d)
3212 except TypeError:
3213 pass
3214 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003215 raise TestFailed("hash() of list subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003216
Guido van Rossum29d26062001-12-11 04:37:34 +00003217def strops():
3218 try: 'a' + 5
3219 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003220 else: raise TestFailed("'' + 5 doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003221
3222 try: ''.split('')
3223 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003224 else: raise TestFailed("''.split('') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003225
3226 try: ''.join([0])
3227 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003228 else: raise TestFailed("''.join([0]) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003229
3230 try: ''.rindex('5')
3231 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003232 else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003233
Guido van Rossum29d26062001-12-11 04:37:34 +00003234 try: '%(n)s' % None
3235 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003236 else: raise TestFailed("'%(n)s' % None doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003237
3238 try: '%(n' % {}
3239 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003240 else: raise TestFailed("'%(n' % {} '' doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003241
3242 try: '%*s' % ('abc')
3243 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003244 else: raise TestFailed("'%*s' % ('abc') doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003245
3246 try: '%*.*s' % ('abc', 5)
3247 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003248 else: raise TestFailed("'%*.*s' % ('abc', 5) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003249
3250 try: '%s' % (1, 2)
3251 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003252 else: raise TestFailed("'%s' % (1, 2) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003253
3254 try: '%' % None
3255 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003256 else: raise TestFailed("'%' % None doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003257
3258 vereq('534253'.isdigit(), 1)
3259 vereq('534253x'.isdigit(), 0)
3260 vereq('%c' % 5, '\x05')
3261 vereq('%c' % '5', '5')
3262
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003263def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003264 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003265 class Node:
3266 pass
3267 a = Node()
3268 b = Node()
3269 a.b = b
3270 b.a = a
3271 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003272
Guido van Rossumd7035672002-03-12 20:43:31 +00003273def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003274 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003275 from types import ModuleType as M
3276 m = M.__new__(M)
3277 str(m)
3278 vereq(hasattr(m, "__name__"), 0)
3279 vereq(hasattr(m, "__file__"), 0)
3280 vereq(hasattr(m, "foo"), 0)
3281 vereq(m.__dict__, None)
3282 m.foo = 1
3283 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003284
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003285def dictproxyiterkeys():
3286 class C(object):
3287 def meth(self):
3288 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003289 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003290 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003291 keys.sort()
3292 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3293
3294def dictproxyitervalues():
3295 class C(object):
3296 def meth(self):
3297 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003298 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003299 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003300 vereq(len(values), 5)
3301
3302def dictproxyiteritems():
3303 class C(object):
3304 def meth(self):
3305 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003306 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003307 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003308 keys.sort()
3309 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3310
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003311def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003312 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003313 class C(object):
3314 def __new__(cls, arg):
3315 if isinstance(arg, str): return [1, 2, 3]
3316 elif isinstance(arg, int): return object.__new__(D)
3317 else: return object.__new__(cls)
3318 class D(C):
3319 def __init__(self, arg):
3320 self.foo = arg
3321 vereq(C("1"), [1, 2, 3])
3322 vereq(D("1"), [1, 2, 3])
3323 d = D(None)
3324 veris(d.foo, None)
3325 d = C(1)
3326 vereq(isinstance(d, D), True)
3327 vereq(d.foo, 1)
3328 d = D(1)
3329 vereq(isinstance(d, D), True)
3330 vereq(d.foo, 1)
3331
Guido van Rossume8fc6402002-04-16 16:44:51 +00003332def imulbug():
3333 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003334 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003335 class C(object):
3336 def __imul__(self, other):
3337 return (self, other)
3338 x = C()
3339 y = x
3340 y *= 1.0
3341 vereq(y, (x, 1.0))
3342 y = x
3343 y *= 2
3344 vereq(y, (x, 2))
3345 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003346 y *= 3
3347 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003348 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003349 y *= 1<<100
3350 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003351 y = x
3352 y *= None
3353 vereq(y, (x, None))
3354 y = x
3355 y *= "foo"
3356 vereq(y, (x, "foo"))
3357
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003358def docdescriptor():
3359 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003360 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003361 class DocDescr(object):
3362 def __get__(self, object, otype):
3363 if object:
3364 object = object.__class__.__name__ + ' instance'
3365 if otype:
3366 otype = otype.__name__
3367 return 'object=%s; type=%s' % (object, otype)
3368 class OldClass:
3369 __doc__ = DocDescr()
3370 class NewClass(object):
3371 __doc__ = DocDescr()
3372 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3373 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3374 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3375 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3376
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003377def copy_setstate():
3378 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003379 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003380 import copy
3381 class C(object):
3382 def __init__(self, foo=None):
3383 self.foo = foo
3384 self.__foo = foo
3385 def setfoo(self, foo=None):
3386 self.foo = foo
3387 def getfoo(self):
3388 return self.__foo
3389 def __getstate__(self):
3390 return [self.foo]
3391 def __setstate__(self, lst):
3392 assert len(lst) == 1
3393 self.__foo = self.foo = lst[0]
3394 a = C(42)
3395 a.setfoo(24)
3396 vereq(a.foo, 24)
3397 vereq(a.getfoo(), 42)
3398 b = copy.copy(a)
3399 vereq(b.foo, 24)
3400 vereq(b.getfoo(), 24)
3401 b = copy.deepcopy(a)
3402 vereq(b.foo, 24)
3403 vereq(b.getfoo(), 24)
3404
Guido van Rossum09638c12002-06-13 19:17:46 +00003405def slices():
3406 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003407 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003408 # Strings
3409 vereq("hello"[:4], "hell")
3410 vereq("hello"[slice(4)], "hell")
3411 vereq(str.__getitem__("hello", slice(4)), "hell")
3412 class S(str):
3413 def __getitem__(self, x):
3414 return str.__getitem__(self, x)
3415 vereq(S("hello")[:4], "hell")
3416 vereq(S("hello")[slice(4)], "hell")
3417 vereq(S("hello").__getitem__(slice(4)), "hell")
3418 # Tuples
3419 vereq((1,2,3)[:2], (1,2))
3420 vereq((1,2,3)[slice(2)], (1,2))
3421 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3422 class T(tuple):
3423 def __getitem__(self, x):
3424 return tuple.__getitem__(self, x)
3425 vereq(T((1,2,3))[:2], (1,2))
3426 vereq(T((1,2,3))[slice(2)], (1,2))
3427 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3428 # Lists
3429 vereq([1,2,3][:2], [1,2])
3430 vereq([1,2,3][slice(2)], [1,2])
3431 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3432 class L(list):
3433 def __getitem__(self, x):
3434 return list.__getitem__(self, x)
3435 vereq(L([1,2,3])[:2], [1,2])
3436 vereq(L([1,2,3])[slice(2)], [1,2])
3437 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3438 # Now do lists and __setitem__
3439 a = L([1,2,3])
3440 a[slice(1, 3)] = [3,2]
3441 vereq(a, [1,3,2])
3442 a[slice(0, 2, 1)] = [3,1]
3443 vereq(a, [3,1,2])
3444 a.__setitem__(slice(1, 3), [2,1])
3445 vereq(a, [3,2,1])
3446 a.__setitem__(slice(0, 2, 1), [2,3])
3447 vereq(a, [2,3,1])
3448
Tim Peters2484aae2002-07-11 06:56:07 +00003449def subtype_resurrection():
3450 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003451 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003452
3453 class C(object):
3454 container = []
3455
3456 def __del__(self):
3457 # resurrect the instance
3458 C.container.append(self)
3459
3460 c = C()
3461 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003462 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003463 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003464 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003465
3466 # If that didn't blow up, it's also interesting to see whether clearing
3467 # the last container slot works: that will attempt to delete c again,
3468 # which will cause c to get appended back to the container again "during"
3469 # the del.
3470 del C.container[-1]
3471 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003472 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003473
Tim Peters14cb1e12002-07-11 18:26:21 +00003474 # Make c mortal again, so that the test framework with -l doesn't report
3475 # it as a leak.
3476 del C.__del__
3477
Guido van Rossum2d702462002-08-06 21:28:28 +00003478def slottrash():
3479 # Deallocating deeply nested slotted trash caused stack overflows
3480 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003481 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003482 class trash(object):
3483 __slots__ = ['x']
3484 def __init__(self, x):
3485 self.x = x
3486 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003487 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003488 o = trash(o)
3489 del o
3490
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003491def slotmultipleinheritance():
3492 # SF bug 575229, multiple inheritance w/ slots dumps core
3493 class A(object):
3494 __slots__=()
3495 class B(object):
3496 pass
3497 class C(A,B) :
3498 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003499 vereq(C.__basicsize__, B.__basicsize__)
3500 verify(hasattr(C, '__dict__'))
3501 verify(hasattr(C, '__weakref__'))
3502 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003503
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003504def testrmul():
3505 # SF patch 592646
3506 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003507 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003508 class C(object):
3509 def __mul__(self, other):
3510 return "mul"
3511 def __rmul__(self, other):
3512 return "rmul"
3513 a = C()
3514 vereq(a*2, "mul")
3515 vereq(a*2.2, "mul")
3516 vereq(2*a, "rmul")
3517 vereq(2.2*a, "rmul")
3518
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003519def testipow():
3520 # [SF bug 620179]
3521 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003522 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003523 class C(object):
3524 def __ipow__(self, other):
3525 pass
3526 a = C()
3527 a **= 2
3528
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003529def do_this_first():
3530 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003531 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003532 # This dumps core when SF bug 551412 isn't fixed --
3533 # but only when test_descr.py is run separately.
3534 # (That can't be helped -- as soon as PyType_Ready()
3535 # is called for PyLong_Type, the bug is gone.)
3536 class UserLong(object):
3537 def __pow__(self, *args):
3538 pass
3539 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003540 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003541 except:
3542 pass
3543
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003544 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003545 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003546 # Another segfault only when run early
3547 # (before PyType_Ready(tuple) is called)
3548 type.mro(tuple)
3549
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003550def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003551 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003552 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003553 # stuff that should work:
3554 class C(object):
3555 pass
3556 class C2(object):
3557 def __getattribute__(self, attr):
3558 if attr == 'a':
3559 return 2
3560 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003561 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003562 def meth(self):
3563 return 1
3564 class D(C):
3565 pass
3566 class E(D):
3567 pass
3568 d = D()
3569 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003570 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003571 D.__bases__ = (C2,)
3572 vereq(d.meth(), 1)
3573 vereq(e.meth(), 1)
3574 vereq(d.a, 2)
3575 vereq(e.a, 2)
3576 vereq(C2.__subclasses__(), [D])
3577
3578 # stuff that shouldn't:
3579 class L(list):
3580 pass
3581
3582 try:
3583 L.__bases__ = (dict,)
3584 except TypeError:
3585 pass
3586 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003587 raise TestFailed("shouldn't turn list subclass into dict subclass")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003588
3589 try:
3590 list.__bases__ = (dict,)
3591 except TypeError:
3592 pass
3593 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003594 raise TestFailed("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003595
3596 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003597 D.__bases__ = (C2, list)
3598 except TypeError:
3599 pass
3600 else:
3601 assert 0, "best_base calculation found wanting"
3602
3603 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003604 del D.__bases__
3605 except TypeError:
3606 pass
3607 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003608 raise TestFailed("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003609
3610 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003611 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003612 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003613 if str(msg) == "a new-style class can't have only classic bases":
Collin Winter3add4d72007-08-29 23:37:32 +00003614 raise TestFailed("wrong error message for .__bases__ = ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003615 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003616 raise TestFailed("shouldn't be able to set .__bases__ to ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003617
3618 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003619 D.__bases__ = (D,)
3620 except TypeError:
3621 pass
3622 else:
3623 # actually, we'll have crashed by here...
Collin Winter3add4d72007-08-29 23:37:32 +00003624 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003625
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003626 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003627 D.__bases__ = (C, C)
3628 except TypeError:
3629 pass
3630 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003631 raise TestFailed("didn't detect repeated base classes")
Michael W. Hudsone723e452003-08-07 14:58:10 +00003632
3633 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003634 D.__bases__ = (E,)
3635 except TypeError:
3636 pass
3637 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003638 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003639
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003640def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003641 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003642 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003643 class WorkOnce(type):
3644 def __new__(self, name, bases, ns):
3645 self.flag = 0
3646 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3647 def mro(self):
3648 if self.flag > 0:
Collin Winter3add4d72007-08-29 23:37:32 +00003649 raise RuntimeError("bozo")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003650 else:
3651 self.flag += 1
3652 return type.mro(self)
3653
3654 class WorkAlways(type):
3655 def mro(self):
3656 # this is here to make sure that .mro()s aren't called
3657 # with an exception set (which was possible at one point).
3658 # An error message will be printed in a debug build.
3659 # What's a good way to test for this?
3660 return type.mro(self)
3661
3662 class C(object):
3663 pass
3664
3665 class C2(object):
3666 pass
3667
3668 class D(C):
3669 pass
3670
3671 class E(D):
3672 pass
3673
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003674 class F(D, metaclass=WorkOnce):
3675 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003676
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003677 class G(D, metaclass=WorkAlways):
3678 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003679
3680 # Immediate subclasses have their mro's adjusted in alphabetical
3681 # order, so E's will get adjusted before adjusting F's fails. We
3682 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003683
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003684 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003685 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003686
3687 try:
3688 D.__bases__ = (C2,)
3689 except RuntimeError:
3690 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003691 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003692 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003693 raise TestFailed("exception not propagated")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003694
3695def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003696 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003697 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003698 class A(object):
3699 pass
3700
3701 class B(object):
3702 pass
3703
3704 class C(A, B):
3705 pass
3706
3707 class D(A, B):
3708 pass
3709
3710 class E(C, D):
3711 pass
3712
3713 try:
3714 C.__bases__ = (B, A)
3715 except TypeError:
3716 pass
3717 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003718 raise TestFailed("didn't catch MRO conflict")
Tim Peters6578dc92002-12-24 18:31:27 +00003719
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003720def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003721 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003722 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003723 class C(object):
3724 pass
3725
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003726 # C.__module__ could be 'test_descr' or '__main__'
3727 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003728
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003729 C.__name__ = 'D'
3730 vereq((C.__module__, C.__name__), (mod, 'D'))
3731
3732 C.__name__ = 'D.E'
3733 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003734
Guido van Rossum613f24f2003-01-06 23:00:59 +00003735def subclass_right_op():
3736 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003737 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003738
3739 # This code tests various cases where right-dispatch of a subclass
3740 # should be preferred over left-dispatch of a base class.
3741
3742 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3743
3744 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003745 def __floordiv__(self, other):
3746 return "B.__floordiv__"
3747 def __rfloordiv__(self, other):
3748 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003749
Guido van Rossumf389c772003-02-27 20:04:19 +00003750 vereq(B(1) // 1, "B.__floordiv__")
3751 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003752
3753 # Case 2: subclass of object; this is just the baseline for case 3
3754
3755 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003756 def __floordiv__(self, other):
3757 return "C.__floordiv__"
3758 def __rfloordiv__(self, other):
3759 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003760
Guido van Rossumf389c772003-02-27 20:04:19 +00003761 vereq(C() // 1, "C.__floordiv__")
3762 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003763
3764 # Case 3: subclass of new-style class; here it gets interesting
3765
3766 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003767 def __floordiv__(self, other):
3768 return "D.__floordiv__"
3769 def __rfloordiv__(self, other):
3770 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003771
Guido van Rossumf389c772003-02-27 20:04:19 +00003772 vereq(D() // C(), "D.__floordiv__")
3773 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003774
3775 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3776
3777 class E(C):
3778 pass
3779
Guido van Rossumf389c772003-02-27 20:04:19 +00003780 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003781
Guido van Rossumf389c772003-02-27 20:04:19 +00003782 vereq(E() // 1, "C.__floordiv__")
3783 vereq(1 // E(), "C.__rfloordiv__")
3784 vereq(E() // C(), "C.__floordiv__")
3785 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003786
Guido van Rossum373c7412003-01-07 13:41:37 +00003787def dict_type_with_metaclass():
3788 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003789 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003790
3791 class B(object):
3792 pass
3793 class M(type):
3794 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003795 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003796 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003797 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003798 veris(type(C.__dict__), type(B.__dict__))
3799
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003800def meth_class_get():
3801 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003802 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003803 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003804 # Baseline
3805 arg = [1, 2, 3]
3806 res = {1: None, 2: None, 3: None}
3807 vereq(dict.fromkeys(arg), res)
3808 vereq({}.fromkeys(arg), res)
3809 # Now get the descriptor
3810 descr = dict.__dict__["fromkeys"]
3811 # More baseline using the descriptor directly
3812 vereq(descr.__get__(None, dict)(arg), res)
3813 vereq(descr.__get__({})(arg), res)
3814 # Now check various error cases
3815 try:
3816 descr.__get__(None, None)
3817 except TypeError:
3818 pass
3819 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003820 raise TestFailed("shouldn't have allowed descr.__get__(None, None)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003821 try:
3822 descr.__get__(42)
3823 except TypeError:
3824 pass
3825 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003826 raise TestFailed("shouldn't have allowed descr.__get__(42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003827 try:
3828 descr.__get__(None, 42)
3829 except TypeError:
3830 pass
3831 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003832 raise TestFailed("shouldn't have allowed descr.__get__(None, 42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003833 try:
3834 descr.__get__(None, int)
3835 except TypeError:
3836 pass
3837 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003838 raise TestFailed("shouldn't have allowed descr.__get__(None, int)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003839
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003840def isinst_isclass():
3841 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003842 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003843 class Proxy(object):
3844 def __init__(self, obj):
3845 self.__obj = obj
3846 def __getattribute__(self, name):
3847 if name.startswith("_Proxy__"):
3848 return object.__getattribute__(self, name)
3849 else:
3850 return getattr(self.__obj, name)
3851 # Test with a classic class
3852 class C:
3853 pass
3854 a = C()
3855 pa = Proxy(a)
3856 verify(isinstance(a, C)) # Baseline
3857 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003858 # Test with a classic subclass
3859 class D(C):
3860 pass
3861 a = D()
3862 pa = Proxy(a)
3863 verify(isinstance(a, C)) # Baseline
3864 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003865 # Test with a new-style class
3866 class C(object):
3867 pass
3868 a = C()
3869 pa = Proxy(a)
3870 verify(isinstance(a, C)) # Baseline
3871 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003872 # Test with a new-style subclass
3873 class D(C):
3874 pass
3875 a = D()
3876 pa = Proxy(a)
3877 verify(isinstance(a, C)) # Baseline
3878 verify(isinstance(pa, C)) # Test
3879
3880def proxysuper():
3881 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003882 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003883 class Proxy(object):
3884 def __init__(self, obj):
3885 self.__obj = obj
3886 def __getattribute__(self, name):
3887 if name.startswith("_Proxy__"):
3888 return object.__getattribute__(self, name)
3889 else:
3890 return getattr(self.__obj, name)
3891
3892 class B(object):
3893 def f(self):
3894 return "B.f"
3895
3896 class C(B):
3897 def f(self):
3898 return super(C, self).f() + "->C.f"
3899
3900 obj = C()
3901 p = Proxy(obj)
3902 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003903
Guido van Rossum52b27052003-04-15 20:05:10 +00003904def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003905 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003906 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003907 try:
3908 object.__setattr__(str, "foo", 42)
3909 except TypeError:
3910 pass
3911 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003912 raise TestFailed("Carlo Verre __setattr__ suceeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003913 try:
3914 object.__delattr__(str, "lower")
3915 except TypeError:
3916 pass
3917 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003918 raise TestFailed("Carlo Verre __delattr__ succeeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003919
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003920def weakref_segfault():
3921 # SF 742911
3922 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003923 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003924
3925 import weakref
3926
3927 class Provoker:
3928 def __init__(self, referrent):
3929 self.ref = weakref.ref(referrent)
3930
3931 def __del__(self):
3932 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003933
3934 class Oops(object):
3935 pass
3936
3937 o = Oops()
3938 o.whatever = Provoker(o)
3939 del o
3940
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003941def wrapper_segfault():
3942 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003943 if verbose:
3944 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003945 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00003946 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003947 f = f.__call__
3948 f = None
3949
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003950# Fix SF #762455, segfault when sys.stdout is changed in getattr
3951def filefault():
3952 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003953 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003954 import sys
3955 class StdoutGuard:
3956 def __getattr__(self, attr):
3957 sys.stdout = sys.__stdout__
3958 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3959 sys.stdout = StdoutGuard()
3960 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003961 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003962 except RuntimeError:
3963 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003964
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003965def vicious_descriptor_nonsense():
3966 # A potential segfault spotted by Thomas Wouters in mail to
3967 # python-dev 2003-04-17, turned into an example & fixed by Michael
3968 # Hudson just less than four months later...
3969 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003970 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003971
3972 class Evil(object):
3973 def __hash__(self):
3974 return hash('attr')
3975 def __eq__(self, other):
3976 del C.attr
3977 return 0
3978
3979 class Descr(object):
3980 def __get__(self, ob, type=None):
3981 return 1
3982
3983 class C(object):
3984 attr = Descr()
3985
3986 c = C()
3987 c.__dict__[Evil()] = 0
3988
3989 vereq(c.attr, 1)
3990 # this makes a crash more likely:
3991 import gc; gc.collect()
3992 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00003993
Raymond Hettingerb67cc802005-03-03 16:45:19 +00003994def test_init():
3995 # SF 1155938
3996 class Foo(object):
3997 def __init__(self):
3998 return 10
3999 try:
4000 Foo()
4001 except TypeError:
4002 pass
4003 else:
Collin Winter3add4d72007-08-29 23:37:32 +00004004 raise TestFailed("did not test __init__() for None return")
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004005
Armin Rigoc6686b72005-11-07 08:38:00 +00004006def methodwrapper():
4007 # <type 'method-wrapper'> did not support any reflection before 2.5
4008 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004009 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004010
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004011 return # XXX should methods really support __eq__?
4012
Armin Rigoc6686b72005-11-07 08:38:00 +00004013 l = []
4014 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004015 vereq(l.__add__, [].__add__)
4016 verify(l.__add__ != [5].__add__)
4017 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004018 verify(l.__add__.__name__ == '__add__')
4019 verify(l.__add__.__self__ is l)
4020 verify(l.__add__.__objclass__ is list)
4021 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004022 try:
4023 hash(l.__add__)
4024 except TypeError:
4025 pass
4026 else:
4027 raise TestFailed("no TypeError from hash([].__add__)")
4028
4029 t = ()
4030 t += (7,)
4031 vereq(t.__add__, (7,).__add__)
4032 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004033
Armin Rigofd163f92005-12-29 15:59:19 +00004034def notimplemented():
4035 # all binary methods should be able to return a NotImplemented
4036 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004037 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004038
4039 import sys
4040 import types
4041 import operator
4042
4043 def specialmethod(self, other):
4044 return NotImplemented
4045
4046 def check(expr, x, y):
4047 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004048 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004049 except TypeError:
4050 pass
4051 else:
4052 raise TestFailed("no TypeError from %r" % (expr,))
4053
Guido van Rossume2a383d2007-01-15 16:59:06 +00004054 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004055 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4056 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004057 if 1:
4058 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004059 for name, expr, iexpr in [
4060 ('__add__', 'x + y', 'x += y'),
4061 ('__sub__', 'x - y', 'x -= y'),
4062 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004063 ('__truediv__', 'x / y', None),
4064 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004065 ('__mod__', 'x % y', 'x %= y'),
4066 ('__divmod__', 'divmod(x, y)', None),
4067 ('__pow__', 'x ** y', 'x **= y'),
4068 ('__lshift__', 'x << y', 'x <<= y'),
4069 ('__rshift__', 'x >> y', 'x >>= y'),
4070 ('__and__', 'x & y', 'x &= y'),
4071 ('__or__', 'x | y', 'x |= y'),
4072 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004073 ]:
4074 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004075 A = metaclass('A', (), {name: specialmethod})
4076 B = metaclass('B', (), {rname: specialmethod})
4077 a = A()
4078 b = B()
4079 check(expr, a, a)
4080 check(expr, a, b)
4081 check(expr, b, a)
4082 check(expr, b, b)
4083 check(expr, a, N1)
4084 check(expr, a, N2)
4085 check(expr, N1, b)
4086 check(expr, N2, b)
4087 if iexpr:
4088 check(iexpr, a, a)
4089 check(iexpr, a, b)
4090 check(iexpr, b, a)
4091 check(iexpr, b, b)
4092 check(iexpr, a, N1)
4093 check(iexpr, a, N2)
4094 iname = '__i' + name[2:]
4095 C = metaclass('C', (), {iname: specialmethod})
4096 c = C()
4097 check(iexpr, c, a)
4098 check(iexpr, c, b)
4099 check(iexpr, c, N1)
4100 check(iexpr, c, N2)
4101
Guido van Rossumd8faa362007-04-27 19:54:29 +00004102def test_assign_slice():
4103 # ceval.c's assign_slice used to check for
4104 # tp->tp_as_sequence->sq_slice instead of
4105 # tp->tp_as_sequence->sq_ass_slice
4106
4107 class C(object):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00004108 def __setitem__(self, idx, value):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004109 self.value = value
4110
4111 c = C()
4112 c[1:2] = 3
4113 vereq(c.value, 3)
4114
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004115def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004116 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004117 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004118 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004119 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004120 lists()
4121 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004122 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004123 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004124 ints()
4125 longs()
4126 floats()
4127 complexes()
4128 spamlists()
4129 spamdicts()
4130 pydicts()
4131 pylists()
4132 metaclass()
4133 pymods()
4134 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004135 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004136 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004137 ex5()
4138 monotonicity()
4139 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004140 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004141 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004142 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004143 dynamics()
4144 errors()
4145 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004146 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004147 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004148 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004149 classic()
4150 compattr()
4151 newslot()
4152 altmro()
4153 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004154 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004155 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004156 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004157 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004158 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004159 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004160 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004161 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004162 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004163 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004164 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004165 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004166 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004167 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004168 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004169 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004170 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004171 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004172 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004173 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004174 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004175 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004176 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004177 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004178 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004179 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004180 dictproxyiterkeys()
4181 dictproxyitervalues()
4182 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004183 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004184 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004185 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004186 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004187 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004188 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004189 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004190 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004191 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004192 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004193 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004194 test_mutable_bases()
4195 test_mutable_bases_with_failing_mro()
4196 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004197 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004198 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004199 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004200 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004201 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004202 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004203 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004204 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004205 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004206 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004207 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004208 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004209 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004210
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004211 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004212
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004213if __name__ == "__main__":
4214 test_main()