blob: 8670ff9ccf6a51319c6558e6d6d83e8a110f5e7b [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
Christian Heimesbbffeb62008-01-24 09:42:52 +00003# XXX Please, please, please, someone convert this to unittest style!
4from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, 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)
Christian Heimesff737952007-11-27 10:40:20 +0000282 #verify('__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'])
Christian Heimesff737952007-11-27 10:40:20 +0000287 #verify('__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)
Christian Heimesff737952007-11-27 10:40:20 +0000295 #verify('__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'])
Christian Heimesff737952007-11-27 10:40:20 +0000301 #verify('__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)
Christian Heimesff737952007-11-27 10:40:20 +00001420 veris(C.goo.__self__, C)
1421 veris(D.goo.__self__, D)
1422 veris(super(D,D).goo.__self__, D)
1423 veris(super(D,d).goo.__self__, D)
Guido van Rossum155db9a2002-04-02 17:53:47 +00001424 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
Christian Heimes4a22b5d2007-11-25 09:39:14 +00001506 r = repr(E().foo)
1507 verify(r.startswith("<bound method E.foo "), r)
1508 r = repr(C.foo.__get__(C()))
Christian Heimesff737952007-11-27 10:40:20 +00001509 verify(r.startswith("<bound method "), r)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001510
1511def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001512 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513 class C(object):
1514 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001515 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001516 self.__get = get
1517 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001518 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001519 def __get__(self, obj, type=None):
1520 return self.__get(obj)
1521 def __set__(self, obj, value):
1522 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001523 def __delete__(self, obj):
1524 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001525 def __init__(self):
1526 self.__x = 0
1527 def __get_x(self):
1528 x = self.__x
1529 self.__x = x+1
1530 return x
1531 def __set_x(self, x):
1532 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001533 def __delete_x(self):
1534 del self.__x
1535 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001536 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001537 vereq(a.x, 0)
1538 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001539 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001540 vereq(a.x, 10)
1541 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001542 del a.x
1543 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001544
1545def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001546 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001547 class C(list):
1548 def __new__(cls):
1549 self = list.__new__(cls)
1550 self.foo = 1
1551 return self
1552 def __init__(self):
1553 self.foo = self.foo + 2
1554 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001555 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001556 verify(a.__class__ is C)
1557 class D(C):
1558 pass
1559 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001560 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001561 verify(b.__class__ is D)
1562
Tim Peters6d6c1a32001-08-02 04:15:00 +00001563def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001564 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001565 class A(object):
1566 def f(self): return "A"
1567 class B(A):
1568 pass
1569 class C(A):
1570 def f(self): return "C"
1571 class D(B, C):
1572 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001573 vereq(D.mro(), [D, B, C, A, object])
1574 vereq(D.__mro__, (D, B, C, A, object))
1575 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001576
Guido van Rossumd3077402001-08-12 05:24:18 +00001577 class PerverseMetaType(type):
1578 def mro(cls):
1579 L = type.mro(cls)
1580 L.reverse()
1581 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001582 class X(D,B,C,A, metaclass=PerverseMetaType):
1583 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001584 vereq(X.__mro__, (object, A, C, B, D, X))
1585 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001586
Armin Rigo037d1e02005-12-29 17:07:39 +00001587 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001588 class _metaclass(type):
1589 def mro(self):
1590 return [self, dict, object]
1591 class X(object, metaclass=_metaclass):
1592 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001593 except TypeError:
1594 pass
1595 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001596 raise TestFailed("devious mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001597
1598 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001599 class _metaclass(type):
1600 def mro(self):
1601 return [1]
1602 class X(object, metaclass=_metaclass):
1603 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001604 except TypeError:
1605 pass
1606 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001607 raise TestFailed("non-class mro() return not caught")
Armin Rigo037d1e02005-12-29 17:07:39 +00001608
1609 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001610 class _metaclass(type):
1611 def mro(self):
1612 return 1
1613 class X(object, metaclass=_metaclass):
1614 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001615 except TypeError:
1616 pass
1617 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001618 raise TestFailed("non-sequence mro() return not caught")
Tim Peters1b27f862005-12-30 18:42:42 +00001619
Armin Rigo037d1e02005-12-29 17:07:39 +00001620
Tim Peters6d6c1a32001-08-02 04:15:00 +00001621def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001622 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623
1624 class B(object):
1625 "Intermediate class because object doesn't have a __setattr__"
1626
1627 class C(B):
1628
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001629 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001630 if name == "foo":
1631 return ("getattr", name)
1632 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001633 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001634 def __setattr__(self, name, value):
1635 if name == "foo":
1636 self.setattr = (name, value)
1637 else:
1638 return B.__setattr__(self, name, value)
1639 def __delattr__(self, name):
1640 if name == "foo":
1641 self.delattr = name
1642 else:
1643 return B.__delattr__(self, name)
1644
1645 def __getitem__(self, key):
1646 return ("getitem", key)
1647 def __setitem__(self, key, value):
1648 self.setitem = (key, value)
1649 def __delitem__(self, key):
1650 self.delitem = key
1651
Tim Peters6d6c1a32001-08-02 04:15:00 +00001652 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001654 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001655 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001656 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001657 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001658
Guido van Rossum45704552001-10-08 16:35:45 +00001659 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001660 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001661 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001662 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001663 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001664
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001665 vereq(a[0:10], ("getitem", slice(0, 10)))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001666 a[0:10] = "foo"
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001667 vereq(a.setitem, (slice(0, 10), "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001668 del a[0:10]
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001669 vereq(a.delitem, slice(0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001670
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001671def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001672 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001673 class C(object):
1674 def __init__(self, x):
1675 self.x = x
1676 def foo(self):
1677 return self.x
1678 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001679 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001680 class D(C):
1681 boo = C.foo
1682 goo = c1.foo
1683 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001684 vereq(d2.foo(), 2)
1685 vereq(d2.boo(), 2)
1686 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001687 class E(object):
1688 foo = C.foo
Christian Heimesff737952007-11-27 10:40:20 +00001689 vereq(E().foo.__func__, C.foo) # i.e., unbound
Christian Heimes4a22b5d2007-11-25 09:39:14 +00001690 r = repr(C.foo.__get__(C(1)))
1691 verify(r.startswith("<bound method "), r)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001692
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001693def specials():
1694 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001695 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001696 # Test the default behavior for static classes
1697 class C(object):
1698 def __getitem__(self, i):
1699 if 0 <= i < 10: return i
1700 raise IndexError
1701 c1 = C()
1702 c2 = C()
1703 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001704 verify(id(c1) != id(c2))
1705 hash(c1)
1706 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001707 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001708 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001709 verify(c1 != c2)
1710 verify(not c1 != c1)
1711 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001712 # Note that the module name appears in str/repr, and that varies
1713 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001714 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001715 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001716 verify(-1 not in c1)
1717 for i in range(10):
1718 verify(i in c1)
1719 verify(10 not in c1)
1720 # Test the default behavior for dynamic classes
1721 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001722 def __getitem__(self, i):
1723 if 0 <= i < 10: return i
1724 raise IndexError
1725 d1 = D()
1726 d2 = D()
1727 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001728 verify(id(d1) != id(d2))
1729 hash(d1)
1730 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001731 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001732 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001733 verify(d1 != d2)
1734 verify(not d1 != d1)
1735 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001736 # Note that the module name appears in str/repr, and that varies
1737 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001738 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001739 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001740 verify(-1 not in d1)
1741 for i in range(10):
1742 verify(i in d1)
1743 verify(10 not in d1)
1744 # Test overridden behavior for static classes
1745 class Proxy(object):
1746 def __init__(self, x):
1747 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001748 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001749 return not not self.x
1750 def __hash__(self):
1751 return hash(self.x)
1752 def __eq__(self, other):
1753 return self.x == other
1754 def __ne__(self, other):
1755 return self.x != other
1756 def __cmp__(self, other):
1757 return cmp(self.x, other.x)
1758 def __str__(self):
1759 return "Proxy:%s" % self.x
1760 def __repr__(self):
1761 return "Proxy(%r)" % self.x
1762 def __contains__(self, value):
1763 return value in self.x
1764 p0 = Proxy(0)
1765 p1 = Proxy(1)
1766 p_1 = Proxy(-1)
1767 verify(not p0)
1768 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001769 vereq(hash(p0), hash(0))
1770 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001771 verify(p0 != p1)
1772 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001773 vereq(not p0, p1)
1774 vereq(cmp(p0, p1), -1)
1775 vereq(cmp(p0, p0), 0)
1776 vereq(cmp(p0, p_1), 1)
1777 vereq(str(p0), "Proxy:0")
1778 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001779 p10 = Proxy(range(10))
1780 verify(-1 not in p10)
1781 for i in range(10):
1782 verify(i in p10)
1783 verify(10 not in p10)
1784 # Test overridden behavior for dynamic classes
1785 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001786 def __init__(self, x):
1787 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001788 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001789 return not not self.x
1790 def __hash__(self):
1791 return hash(self.x)
1792 def __eq__(self, other):
1793 return self.x == other
1794 def __ne__(self, other):
1795 return self.x != other
1796 def __cmp__(self, other):
1797 return cmp(self.x, other.x)
1798 def __str__(self):
1799 return "DProxy:%s" % self.x
1800 def __repr__(self):
1801 return "DProxy(%r)" % self.x
1802 def __contains__(self, value):
1803 return value in self.x
1804 p0 = DProxy(0)
1805 p1 = DProxy(1)
1806 p_1 = DProxy(-1)
1807 verify(not p0)
1808 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001809 vereq(hash(p0), hash(0))
1810 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001811 verify(p0 != p1)
1812 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(not p0, p1)
1814 vereq(cmp(p0, p1), -1)
1815 vereq(cmp(p0, p0), 0)
1816 vereq(cmp(p0, p_1), 1)
1817 vereq(str(p0), "DProxy:0")
1818 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001819 p10 = DProxy(range(10))
1820 verify(-1 not in p10)
1821 for i in range(10):
1822 verify(i in p10)
1823 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001824## # Safety test for __cmp__
1825## def unsafecmp(a, b):
1826## try:
1827## a.__class__.__cmp__(a, b)
1828## except TypeError:
1829## pass
1830## else:
1831## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1832## a.__class__, a, b)
1833## unsafecmp(u"123", "123")
1834## unsafecmp("123", u"123")
1835## unsafecmp(1, 1.0)
1836## unsafecmp(1.0, 1)
1837## unsafecmp(1, 1L)
1838## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001839
Thomas Wouters89d996e2007-09-08 17:39:28 +00001840def recursions():
1841 if verbose:
1842 print("Testing recursion checks ...")
1843
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001844## class Letter(str):
1845## def __new__(cls, letter):
1846## if letter == 'EPS':
1847## return str.__new__(cls)
1848## return str.__new__(cls, letter)
1849## def __str__(self):
1850## if not self:
1851## return 'EPS'
1852## return self
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00001853## # sys.stdout needs to be the original to trigger the recursion bug
1854## import sys
1855## test_stdout = sys.stdout
1856## sys.stdout = get_original_stdout()
1857## try:
1858## # nothing should actually be printed, this should raise an exception
1859## print(Letter('w'))
1860## except RuntimeError:
1861## pass
1862## else:
1863## raise TestFailed, "expected a RuntimeError for print recursion"
1864## sys.stdout = test_stdout
Neal Norwitz1a997502003-01-13 20:13:12 +00001865
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001866def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001867 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001868 import weakref
1869 class C(object):
1870 pass
1871 c = C()
1872 r = weakref.ref(c)
1873 verify(r() is c)
1874 del c
1875 verify(r() is None)
1876 del r
1877 class NoWeak(object):
1878 __slots__ = ['foo']
1879 no = NoWeak()
1880 try:
1881 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001882 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001883 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001884 else:
1885 verify(0, "weakref.ref(no) should be illegal")
1886 class Weak(object):
1887 __slots__ = ['foo', '__weakref__']
1888 yes = Weak()
1889 r = weakref.ref(yes)
1890 verify(r() is yes)
1891 del yes
1892 verify(r() is None)
1893 del r
1894
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001895def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001896 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001897 class C(object):
1898 def getx(self):
1899 return self.__x
1900 def setx(self, value):
1901 self.__x = value
1902 def delx(self):
1903 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001904 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001905 a = C()
1906 verify(not hasattr(a, "x"))
1907 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001908 vereq(a._C__x, 42)
1909 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001910 del a.x
1911 verify(not hasattr(a, "x"))
1912 verify(not hasattr(a, "_C__x"))
1913 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001914 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001915 C.x.__delete__(a)
1916 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001917
Tim Peters66c1a522001-09-24 21:17:50 +00001918 raw = C.__dict__['x']
1919 verify(isinstance(raw, property))
1920
1921 attrs = dir(raw)
1922 verify("__doc__" in attrs)
1923 verify("fget" in attrs)
1924 verify("fset" in attrs)
1925 verify("fdel" in attrs)
1926
Guido van Rossum45704552001-10-08 16:35:45 +00001927 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001928 verify(raw.fget is C.__dict__['getx'])
1929 verify(raw.fset is C.__dict__['setx'])
1930 verify(raw.fdel is C.__dict__['delx'])
1931
1932 for attr in "__doc__", "fget", "fset", "fdel":
1933 try:
1934 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001935 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001936 if str(msg).find('readonly') < 0:
1937 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001938 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001939 "msg %r" % (attr, str(msg)))
1940 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001941 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001942 "readonly %r attr on a property" % attr)
1943
Neal Norwitz673cd822002-10-18 16:33:13 +00001944 class D(object):
1945 __getitem__ = property(lambda s: 1/0)
1946
1947 d = D()
1948 try:
1949 for i in d:
1950 str(i)
1951 except ZeroDivisionError:
1952 pass
1953 else:
Collin Winter3add4d72007-08-29 23:37:32 +00001954 raise TestFailed("expected ZeroDivisionError from bad property")
Neal Norwitz673cd822002-10-18 16:33:13 +00001955
Georg Brandl533ff6f2006-03-08 18:09:27 +00001956 class E(object):
1957 def getter(self):
1958 "getter method"
1959 return 0
1960 def setter(self, value):
1961 "setter method"
1962 pass
1963 prop = property(getter)
1964 vereq(prop.__doc__, "getter method")
1965 prop2 = property(fset=setter)
1966 vereq(prop2.__doc__, None)
1967
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001968 # this segfaulted in 2.5b2
1969 try:
1970 import _testcapi
1971 except ImportError:
1972 pass
1973 else:
1974 class X(object):
1975 p = property(_testcapi.test_with_docstring)
1976
1977
Guido van Rossum58da9312007-11-10 23:39:45 +00001978def properties_plus():
Christian Heimes9a371592007-12-28 14:08:13 +00001979 class C(object):
Guido van Rossum58da9312007-11-10 23:39:45 +00001980 foo = property(doc="hello")
1981 @foo.getter
1982 def foo(self):
1983 return self._foo
1984 @foo.setter
1985 def foo(self, value):
1986 self._foo = abs(value)
1987 @foo.deleter
1988 def foo(self):
1989 del self._foo
1990 c = C()
1991 assert C.foo.__doc__ == "hello"
1992 assert not hasattr(c, "foo")
1993 c.foo = -42
Christian Heimes9a371592007-12-28 14:08:13 +00001994 assert hasattr(c, '_foo')
1995 assert c._foo == 42
Guido van Rossum58da9312007-11-10 23:39:45 +00001996 assert c.foo == 42
1997 del c.foo
Christian Heimes9a371592007-12-28 14:08:13 +00001998 assert not hasattr(c, '_foo')
Guido van Rossum58da9312007-11-10 23:39:45 +00001999 assert not hasattr(c, "foo")
2000
2001 class D(C):
2002 @C.foo.deleter
2003 def foo(self):
2004 try:
2005 del self._foo
2006 except AttributeError:
2007 pass
2008 d = D()
2009 d.foo = 24
2010 assert d.foo == 24
2011 del d.foo
2012 del d.foo
2013
Christian Heimes9a371592007-12-28 14:08:13 +00002014 class E(object):
Guido van Rossum58da9312007-11-10 23:39:45 +00002015 @property
2016 def foo(self):
2017 return self._foo
2018 @foo.setter
Christian Heimes9a371592007-12-28 14:08:13 +00002019 def foo(self, value):
Guido van Rossum58da9312007-11-10 23:39:45 +00002020 raise RuntimeError
2021 @foo.setter
Christian Heimes9a371592007-12-28 14:08:13 +00002022 def foo(self, value):
2023 self._foo = abs(value)
Guido van Rossum58da9312007-11-10 23:39:45 +00002024 @foo.deleter
2025 def foo(self, value=None):
Christian Heimes9a371592007-12-28 14:08:13 +00002026 del self._foo
2027
Guido van Rossum58da9312007-11-10 23:39:45 +00002028 e = E()
2029 e.foo = -42
2030 assert e.foo == 42
2031 del e.foo
2032
2033 class F(E):
2034 @E.foo.deleter
2035 def foo(self):
2036 del self._foo
2037 @foo.setter
2038 def foo(self, value):
2039 self._foo = max(0, value)
2040 f = F()
2041 f.foo = -10
2042 assert f.foo == 0
2043 del f.foo
2044
2045
Guido van Rossumc4a18802001-08-24 16:55:27 +00002046def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002047 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002048
2049 class A(object):
2050 def meth(self, a):
2051 return "A(%r)" % a
2052
Guido van Rossum45704552001-10-08 16:35:45 +00002053 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002054
2055 class B(A):
2056 def __init__(self):
2057 self.__super = super(B, self)
2058 def meth(self, a):
2059 return "B(%r)" % a + self.__super.meth(a)
2060
Guido van Rossum45704552001-10-08 16:35:45 +00002061 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002062
2063 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002064 def meth(self, a):
2065 return "C(%r)" % a + self.__super.meth(a)
2066 C._C__super = super(C)
2067
Guido van Rossum45704552001-10-08 16:35:45 +00002068 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002069
2070 class D(C, B):
2071 def meth(self, a):
2072 return "D(%r)" % a + super(D, self).meth(a)
2073
Guido van Rossum5b443c62001-12-03 15:38:28 +00002074 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2075
2076 # Test for subclassing super
2077
2078 class mysuper(super):
2079 def __init__(self, *args):
2080 return super(mysuper, self).__init__(*args)
2081
2082 class E(D):
2083 def meth(self, a):
2084 return "E(%r)" % a + mysuper(E, self).meth(a)
2085
2086 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2087
2088 class F(E):
2089 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002090 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002091 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2092 F._F__super = mysuper(F)
2093
2094 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2095
2096 # Make sure certain errors are raised
2097
2098 try:
2099 super(D, 42)
2100 except TypeError:
2101 pass
2102 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002103 raise TestFailed("shouldn't allow super(D, 42)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002104
2105 try:
2106 super(D, C())
2107 except TypeError:
2108 pass
2109 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002110 raise TestFailed("shouldn't allow super(D, C())")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002111
2112 try:
2113 super(D).__get__(12)
2114 except TypeError:
2115 pass
2116 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002117 raise TestFailed("shouldn't allow super(D).__get__(12)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002118
2119 try:
2120 super(D).__get__(C())
2121 except TypeError:
2122 pass
2123 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002124 raise TestFailed("shouldn't allow super(D).__get__(C())")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002125
Guido van Rossuma4541a32003-04-16 20:02:22 +00002126 # Make sure data descriptors can be overridden and accessed via super
2127 # (new feature in Python 2.3)
2128
2129 class DDbase(object):
2130 def getx(self): return 42
2131 x = property(getx)
2132
2133 class DDsub(DDbase):
2134 def getx(self): return "hello"
2135 x = property(getx)
2136
2137 dd = DDsub()
2138 vereq(dd.x, "hello")
2139 vereq(super(DDsub, dd).x, 42)
2140
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002141 # Ensure that super() lookup of descriptor from classmethod
2142 # works (SF ID# 743627)
2143
2144 class Base(object):
2145 aProp = property(lambda self: "foo")
2146
2147 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002148 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002149 def test(klass):
2150 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002151
2152 veris(Sub.test(), Base.aProp)
2153
Thomas Wouters89f507f2006-12-13 04:49:30 +00002154 # Verify that super() doesn't allow keyword args
2155 try:
2156 super(Base, kw=1)
2157 except TypeError:
2158 pass
2159 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002160 raise TestFailed("super shouldn't accept keyword args")
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002161
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002162def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002163 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002164
2165 class hexint(int):
2166 def __repr__(self):
2167 return hex(self)
2168 def __add__(self, other):
2169 return hexint(int.__add__(self, other))
2170 # (Note that overriding __radd__ doesn't work,
2171 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002172 vereq(repr(hexint(7) + 9), "0x10")
2173 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002174 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(a, 12345)
2176 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002177 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002179 verify((+a).__class__ is int)
2180 verify((a >> 0).__class__ is int)
2181 verify((a << 0).__class__ is int)
2182 verify((hexint(0) << 12).__class__ is int)
2183 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002184
Guido van Rossume2a383d2007-01-15 16:59:06 +00002185 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002186 __slots__ = []
2187 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002188 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002189 def __add__(self, other):
2190 return self.__class__(super(octlong, self).__add__(other))
2191 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002192 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002193 # (Note that overriding __radd__ here only seems to work
2194 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002195 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002196 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002197 vereq(a, 12345)
2198 vereq(int(a), 12345)
2199 vereq(hash(a), hash(12345))
2200 verify(int(a).__class__ is int)
2201 verify((+a).__class__ is int)
2202 verify((-a).__class__ is int)
2203 verify((-octlong(0)).__class__ is int)
2204 verify((a >> 0).__class__ is int)
2205 verify((a << 0).__class__ is int)
2206 verify((a - 0).__class__ is int)
2207 verify((a * 1).__class__ is int)
2208 verify((a ** 1).__class__ is int)
2209 verify((a // 1).__class__ is int)
2210 verify((1 * a).__class__ is int)
2211 verify((a | 0).__class__ is int)
2212 verify((a ^ 0).__class__ is int)
2213 verify((a & -1).__class__ is int)
2214 verify((octlong(0) << 12).__class__ is int)
2215 verify((octlong(0) >> 12).__class__ is int)
2216 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002217
2218 # Because octlong overrides __add__, we can't check the absence of +0
2219 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002220 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002221 pass
2222 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002223 verify((a + 0).__class__ is int)
2224 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002225
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002226 # Check that negative clones don't segfault
2227 a = longclone(-1)
2228 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002229 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002230
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002231 class precfloat(float):
2232 __slots__ = ['prec']
2233 def __init__(self, value=0.0, prec=12):
2234 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002235 def __repr__(self):
2236 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002237 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002238 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002239 vereq(a, 12345.0)
2240 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002241 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002242 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002243 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002244
Tim Peters2400fa42001-09-12 19:12:49 +00002245 class madcomplex(complex):
2246 def __repr__(self):
2247 return "%.17gj%+.17g" % (self.imag, self.real)
2248 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002249 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002250 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002251 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002252 vereq(a, base)
2253 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002254 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002255 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(repr(a), "4j-3")
2257 vereq(a, base)
2258 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002259 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002261 veris((+a).__class__, complex)
2262 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002263 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002264 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002265 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002266 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002267 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002268 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002269 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002270
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002271 class madtuple(tuple):
2272 _rev = None
2273 def rev(self):
2274 if self._rev is not None:
2275 return self._rev
2276 L = list(self)
2277 L.reverse()
2278 self._rev = self.__class__(L)
2279 return self._rev
2280 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2282 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2283 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002284 for i in range(512):
2285 t = madtuple(range(i))
2286 u = t.rev()
2287 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002289 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002291 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002292 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002293 verify(a[:].__class__ is tuple)
2294 verify((a * 1).__class__ is tuple)
2295 verify((a * 0).__class__ is tuple)
2296 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002297 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002298 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002299 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002300 verify((a + a).__class__ is tuple)
2301 verify((a * 0).__class__ is tuple)
2302 verify((a * 1).__class__ is tuple)
2303 verify((a * 2).__class__ is tuple)
2304 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002305
2306 class madstring(str):
2307 _rev = None
2308 def rev(self):
2309 if self._rev is not None:
2310 return self._rev
2311 L = list(self)
2312 L.reverse()
2313 self._rev = self.__class__("".join(L))
2314 return self._rev
2315 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002316 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2317 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2318 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002319 for i in range(256):
2320 s = madstring("".join(map(chr, range(i))))
2321 t = s.rev()
2322 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002323 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002324 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002326 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002327
Tim Peters8fa5dd02001-09-12 02:18:30 +00002328 base = "\x00" * 5
2329 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002330 vereq(s, base)
2331 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002332 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002333 vereq(hash(s), hash(base))
2334 vereq({s: 1}[base], 1)
2335 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002336 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002337 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002338 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002340 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002341 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002342 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002344 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002345 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002346 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002348 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002349 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002350 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002351 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002352 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002353 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002354 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002356 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002357 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002358 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002359 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002360 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002361 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002362 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002363 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002364 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002365 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002366 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002367 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002368 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002369
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002370 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002371 _rev = None
2372 def rev(self):
2373 if self._rev is not None:
2374 return self._rev
2375 L = list(self)
2376 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002377 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002378 return self._rev
2379 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002380 vereq(u, "ABCDEF")
2381 vereq(u.rev(), madunicode("FEDCBA"))
2382 vereq(u.rev().rev(), madunicode("ABCDEF"))
2383 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002384 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002385 vereq(str(u), base)
2386 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002387 vereq(hash(u), hash(base))
2388 vereq({u: 1}[base], 1)
2389 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002390 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002391 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002392 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002393 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002394 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002395 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002396 verify(u.replace("x", "x").__class__ is str)
2397 vereq(u.replace("x", "x"), base)
2398 verify(u.replace("xy", "xy").__class__ is str)
2399 vereq(u.replace("xy", "xy"), base)
2400 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002401 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002402 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002403 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002404 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002405 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002406 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002407 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002408 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002409 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002410 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002411 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002412 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002413 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002414 verify((u + "").__class__ is str)
2415 vereq(u + "", base)
2416 verify(("" + u).__class__ is str)
2417 vereq("" + u, base)
2418 verify((u * 0).__class__ is str)
2419 vereq(u * 0, "")
2420 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002421 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002422 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002423 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002424 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002425 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002426 verify(u[0:0].__class__ is str)
2427 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002428
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002429 class sublist(list):
2430 pass
2431 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002432 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002433 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002434 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002435 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002436 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002437 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002438 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002439 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002440 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002441 del a[10:15]
2442 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002443 vereq(a, list(range(10)))
2444 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002445 vereq(a[0], 0)
2446 vereq(a[9], 9)
2447 vereq(a[-10], 0)
2448 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002449 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002450
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002451## class CountedInput(file):
2452## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002453
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002454## self.lineno is the 0-based ordinal of the last line read, up to
2455## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002456
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002457## self.ateof is true if and only if the final "" line has been read,
2458## at which point self.lineno stops incrementing, and further calls
2459## to readline() continue to return "".
2460## """
Tim Peters59c9a642001-09-13 05:38:56 +00002461
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002462## lineno = 0
2463## ateof = 0
2464## def readline(self):
2465## if self.ateof:
2466## return ""
2467## s = file.readline(self)
2468## # Next line works too.
2469## # s = super(CountedInput, self).readline()
2470## self.lineno += 1
2471## if s == "":
2472## self.ateof = 1
2473## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002474
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002475## f = open(name=TESTFN, mode='w')
2476## lines = ['a\n', 'b\n', 'c\n']
2477## try:
2478## f.writelines(lines)
2479## f.close()
2480## f = CountedInput(TESTFN)
2481## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2482## got = f.readline()
2483## vereq(expected, got)
2484## vereq(f.lineno, i)
2485## vereq(f.ateof, (i > len(lines)))
2486## f.close()
2487## finally:
2488## try:
2489## f.close()
2490## except:
2491## pass
2492## try:
2493## import os
2494## os.unlink(TESTFN)
2495## except:
2496## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002497
Tim Peters808b94e2001-09-13 19:33:07 +00002498def keywords():
2499 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002500 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002501 vereq(int(x=1), 1)
2502 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002503 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002504 vereq(complex(imag=42, real=666), complex(666, 42))
2505 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002506 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002507 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002508 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002509 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002510
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002511 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002512 try:
2513 constructor(bogus_keyword_arg=1)
2514 except TypeError:
2515 pass
2516 else:
2517 raise TestFailed("expected TypeError from bogus keyword "
2518 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002519
Tim Peters0ab085c2001-09-14 00:25:33 +00002520def str_subclass_as_dict_key():
2521 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002522 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002523
2524 class cistr(str):
2525 """Sublcass of str that computes __eq__ case-insensitively.
2526
2527 Also computes a hash code of the string in canonical form.
2528 """
2529
2530 def __init__(self, value):
2531 self.canonical = value.lower()
2532 self.hashcode = hash(self.canonical)
2533
2534 def __eq__(self, other):
2535 if not isinstance(other, cistr):
2536 other = cistr(other)
2537 return self.canonical == other.canonical
2538
2539 def __hash__(self):
2540 return self.hashcode
2541
Guido van Rossum45704552001-10-08 16:35:45 +00002542 vereq(cistr('ABC'), 'abc')
2543 vereq('aBc', cistr('ABC'))
2544 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002545
2546 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002547 vereq(d[cistr('one')], 1)
2548 vereq(d[cistr('tWo')], 2)
2549 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002550 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002551 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002552
Guido van Rossumab3b0342001-09-18 20:38:53 +00002553def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002554 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002555 class classic:
2556 pass
2557 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002558 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002559 class C(base):
2560 def __init__(self, value):
2561 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002562 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002563 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002564 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002565 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002566 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002567 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002568 def __ne__(self, other):
2569 if isinstance(other, C):
2570 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002571 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002572 return self.value != other
2573 return NotImplemented
2574 def __lt__(self, other):
2575 if isinstance(other, C):
2576 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002577 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002578 return self.value < other
2579 return NotImplemented
2580 def __le__(self, other):
2581 if isinstance(other, C):
2582 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002583 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002584 return self.value <= other
2585 return NotImplemented
2586 def __gt__(self, other):
2587 if isinstance(other, C):
2588 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002589 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002590 return self.value > other
2591 return NotImplemented
2592 def __ge__(self, other):
2593 if isinstance(other, C):
2594 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002595 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002596 return self.value >= other
2597 return NotImplemented
2598
Guido van Rossumab3b0342001-09-18 20:38:53 +00002599 c1 = C(1)
2600 c2 = C(2)
2601 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002602 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002603 c = {1: c1, 2: c2, 3: c3}
2604 for x in 1, 2, 3:
2605 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002606 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002607 for op in "<", "<=", "==", "!=", ">", ">=":
2608 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2609 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002610 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2611 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002612
Guido van Rossum0639f592001-09-18 21:06:04 +00002613def rich_comparisons():
2614 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002615 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002616 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002617 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002618 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002619 vereq(z, 1+0j)
2620 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002621 class ZZ(complex):
2622 def __eq__(self, other):
2623 try:
2624 return abs(self - other) <= 1e-6
2625 except:
2626 return NotImplemented
2627 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002628 vereq(zz, 1+0j)
2629 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002630
Guido van Rossum0639f592001-09-18 21:06:04 +00002631 class classic:
2632 pass
2633 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002634 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002635 class C(base):
2636 def __init__(self, value):
2637 self.value = int(value)
2638 def __cmp__(self, other):
Collin Winter3add4d72007-08-29 23:37:32 +00002639 raise TestFailed("shouldn't call __cmp__")
Guido van Rossum0639f592001-09-18 21:06:04 +00002640 def __eq__(self, other):
2641 if isinstance(other, C):
2642 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002643 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002644 return self.value == other
2645 return NotImplemented
2646 def __ne__(self, other):
2647 if isinstance(other, C):
2648 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002649 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002650 return self.value != other
2651 return NotImplemented
2652 def __lt__(self, other):
2653 if isinstance(other, C):
2654 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002655 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002656 return self.value < other
2657 return NotImplemented
2658 def __le__(self, other):
2659 if isinstance(other, C):
2660 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002661 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002662 return self.value <= other
2663 return NotImplemented
2664 def __gt__(self, other):
2665 if isinstance(other, C):
2666 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002667 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002668 return self.value > other
2669 return NotImplemented
2670 def __ge__(self, other):
2671 if isinstance(other, C):
2672 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002673 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002674 return self.value >= other
2675 return NotImplemented
2676 c1 = C(1)
2677 c2 = C(2)
2678 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002679 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002680 c = {1: c1, 2: c2, 3: c3}
2681 for x in 1, 2, 3:
2682 for y in 1, 2, 3:
2683 for op in "<", "<=", "==", "!=", ">", ">=":
2684 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2685 "x=%d, y=%d" % (x, y))
2686 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2687 "x=%d, y=%d" % (x, y))
2688 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2689 "x=%d, y=%d" % (x, y))
2690
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002691def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002692 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002693 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002694 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002695 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002696 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2697 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002698
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002699def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002700 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002701 class C(object): pass
2702 class D(object): pass
2703 class E(object): pass
2704 class F(D, E): pass
2705 for cls in C, D, E, F:
2706 for cls2 in C, D, E, F:
2707 x = cls()
2708 x.__class__ = cls2
2709 verify(x.__class__ is cls2)
2710 x.__class__ = cls
2711 verify(x.__class__ is cls)
2712 def cant(x, C):
2713 try:
2714 x.__class__ = C
2715 except TypeError:
2716 pass
2717 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002718 raise TestFailed("shouldn't allow %r.__class__ = %r" % (x, C))
Guido van Rossumb6b89422002-04-15 01:03:30 +00002719 try:
2720 delattr(x, "__class__")
2721 except TypeError:
2722 pass
2723 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002724 raise TestFailed("shouldn't allow del %r.__class__" % x)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002725 cant(C(), list)
2726 cant(list(), C)
2727 cant(C(), 1)
2728 cant(C(), object)
2729 cant(object(), list)
2730 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002731 class Int(int): __slots__ = []
2732 cant(2, Int)
2733 cant(Int(), int)
2734 cant(True, int)
2735 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002736 o = object()
2737 cant(o, type(1))
2738 cant(o, type(None))
2739 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002740 class G(object):
2741 __slots__ = ["a", "b"]
2742 class H(object):
2743 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002744 class I(object):
2745 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002746 class J(object):
2747 __slots__ = ["c", "b"]
2748 class K(object):
2749 __slots__ = ["a", "b", "d"]
2750 class L(H):
2751 __slots__ = ["e"]
2752 class M(I):
2753 __slots__ = ["e"]
2754 class N(J):
2755 __slots__ = ["__weakref__"]
2756 class P(J):
2757 __slots__ = ["__dict__"]
2758 class Q(J):
2759 pass
2760 class R(J):
2761 __slots__ = ["__dict__", "__weakref__"]
2762
2763 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2764 x = cls()
2765 x.a = 1
2766 x.__class__ = cls2
2767 verify(x.__class__ is cls2,
2768 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2769 vereq(x.a, 1)
2770 x.__class__ = cls
2771 verify(x.__class__ is cls,
2772 "assigning %r as __class__ for %r silently failed" % (cls, x))
2773 vereq(x.a, 1)
2774 for cls in G, J, K, L, M, N, P, R, list, Int:
2775 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2776 if cls is cls2:
2777 continue
2778 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002779
Guido van Rossum6661be32001-10-26 04:26:12 +00002780def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002781 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002782 class C(object): pass
2783 a = C()
2784 a.__dict__ = {'b': 1}
2785 vereq(a.b, 1)
2786 def cant(x, dict):
2787 try:
2788 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002789 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002790 pass
2791 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002792 raise TestFailed("shouldn't allow %r.__dict__ = %r" % (x, dict))
Guido van Rossum6661be32001-10-26 04:26:12 +00002793 cant(a, None)
2794 cant(a, [])
2795 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002796 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002797
2798 class Base(object):
2799 pass
2800 def verify_dict_readonly(x):
2801 """
2802 x has to be an instance of a class inheriting from Base.
2803 """
2804 cant(x, {})
2805 try:
2806 del x.__dict__
2807 except (AttributeError, TypeError):
2808 pass
2809 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002810 raise TestFailed("shouldn't allow del %r.__dict__" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002811 dict_descr = Base.__dict__["__dict__"]
2812 try:
2813 dict_descr.__set__(x, {})
2814 except (AttributeError, TypeError):
2815 pass
2816 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002817 raise TestFailed("dict_descr allowed access to %r's dict" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002818
2819 # Classes don't allow __dict__ assignment and have readonly dicts
2820 class Meta1(type, Base):
2821 pass
2822 class Meta2(Base, type):
2823 pass
2824 class D(object):
2825 __metaclass__ = Meta1
2826 class E(object):
2827 __metaclass__ = Meta2
2828 for cls in C, D, E:
2829 verify_dict_readonly(cls)
2830 class_dict = cls.__dict__
2831 try:
2832 class_dict["spam"] = "eggs"
2833 except TypeError:
2834 pass
2835 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002836 raise TestFailed("%r's __dict__ can be modified" % cls)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002837
2838 # Modules also disallow __dict__ assignment
2839 class Module1(types.ModuleType, Base):
2840 pass
2841 class Module2(Base, types.ModuleType):
2842 pass
2843 for ModuleType in Module1, Module2:
2844 mod = ModuleType("spam")
2845 verify_dict_readonly(mod)
2846 mod.__dict__["spam"] = "eggs"
2847
2848 # Exception's __dict__ can be replaced, but not deleted
2849 class Exception1(Exception, Base):
2850 pass
2851 class Exception2(Base, Exception):
2852 pass
2853 for ExceptionType in Exception, Exception1, Exception2:
2854 e = ExceptionType()
2855 e.__dict__ = {"a": 1}
2856 vereq(e.a, 1)
2857 try:
2858 del e.__dict__
2859 except (TypeError, AttributeError):
2860 pass
2861 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002862 raise TestFaied("%r's __dict__ can be deleted" % e)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002863
Guido van Rossum6661be32001-10-26 04:26:12 +00002864
Guido van Rossum3926a632001-09-25 16:25:58 +00002865def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002866 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002867 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002868 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002869
2870 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002871 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002872
2873 global C
2874 class C(object):
2875 def __init__(self, a, b):
2876 super(C, self).__init__()
2877 self.a = a
2878 self.b = b
2879 def __repr__(self):
2880 return "C(%r, %r)" % (self.a, self.b)
2881
2882 global C1
2883 class C1(list):
2884 def __new__(cls, a, b):
2885 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002886 def __getnewargs__(self):
2887 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002888 def __init__(self, a, b):
2889 self.a = a
2890 self.b = b
2891 def __repr__(self):
2892 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2893
2894 global C2
2895 class C2(int):
2896 def __new__(cls, a, b, val=0):
2897 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002898 def __getnewargs__(self):
2899 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002900 def __init__(self, a, b, val=0):
2901 self.a = a
2902 self.b = b
2903 def __repr__(self):
2904 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2905
Guido van Rossum90c45142001-11-24 21:07:01 +00002906 global C3
2907 class C3(object):
2908 def __init__(self, foo):
2909 self.foo = foo
2910 def __getstate__(self):
2911 return self.foo
2912 def __setstate__(self, foo):
2913 self.foo = foo
2914
2915 global C4classic, C4
2916 class C4classic: # classic
2917 pass
2918 class C4(C4classic, object): # mixed inheritance
2919 pass
2920
Guido van Rossum99603b02007-07-20 00:22:32 +00002921 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002922 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002923 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002924 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002925
2926 for cls in C, C1, C2:
2927 s = p.dumps(cls, bin)
2928 cls2 = p.loads(s)
2929 verify(cls2 is cls)
2930
2931 a = C1(1, 2); a.append(42); a.append(24)
2932 b = C2("hello", "world", 42)
2933 s = p.dumps((a, b), bin)
2934 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002935 vereq(x.__class__, a.__class__)
2936 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2937 vereq(y.__class__, b.__class__)
2938 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002939 vereq(repr(x), repr(a))
2940 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002941 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002942 print("a = x =", a)
2943 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002944 # Test for __getstate__ and __setstate__ on new style class
2945 u = C3(42)
2946 s = p.dumps(u, bin)
2947 v = p.loads(s)
2948 veris(u.__class__, v.__class__)
2949 vereq(u.foo, v.foo)
2950 # Test for picklability of hybrid class
2951 u = C4()
2952 u.foo = 42
2953 s = p.dumps(u, bin)
2954 v = p.loads(s)
2955 veris(u.__class__, v.__class__)
2956 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002957
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002958 # Testing copy.deepcopy()
2959 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002960 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002961 import copy
2962 for cls in C, C1, C2:
2963 cls2 = copy.deepcopy(cls)
2964 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002965
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002966 a = C1(1, 2); a.append(42); a.append(24)
2967 b = C2("hello", "world", 42)
2968 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002969 vereq(x.__class__, a.__class__)
2970 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2971 vereq(y.__class__, b.__class__)
2972 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002973 vereq(repr(x), repr(a))
2974 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002975 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002976 print("a = x =", a)
2977 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002978
Guido van Rossum8c842552002-03-14 23:05:54 +00002979def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002980 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002981 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002982 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002983 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002984 global B, C, D, E
2985 class B(object):
2986 pass
2987 for base in [object, B]:
2988 class C(base):
2989 __slots__ = ['a']
2990 class D(C):
2991 pass
2992 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002993 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002994 except TypeError:
2995 pass
2996 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002997 raise TestFailed("should fail: pickle C instance - %s" % base)
Guido van Rossum8c842552002-03-14 23:05:54 +00002998 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002999 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003000 except TypeError:
3001 pass
3002 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003003 raise TestFailed("should fail: pickle D instance - %s" % base)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003004 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003005 class C(base):
3006 __slots__ = ['a']
3007 def __getstate__(self):
3008 try:
3009 d = self.__dict__.copy()
3010 except AttributeError:
3011 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003012 for cls in self.__class__.__mro__:
3013 for sn in cls.__dict__.get('__slots__', ()):
3014 try:
3015 d[sn] = getattr(self, sn)
3016 except AttributeError:
3017 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003018 return d
3019 def __setstate__(self, d):
3020 for k, v in d.items():
3021 setattr(self, k, v)
3022 class D(C):
3023 pass
3024 # Now it should work
3025 x = C()
3026 y = pickle.loads(pickle.dumps(x))
3027 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003028 x.a = 42
3029 y = pickle.loads(pickle.dumps(x))
3030 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00003031 x = D()
3032 x.a = 42
3033 x.b = 100
3034 y = pickle.loads(pickle.dumps(x))
3035 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003036 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003037 class E(C):
3038 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003039 x = E()
3040 x.a = 42
3041 x.b = "foo"
3042 y = pickle.loads(pickle.dumps(x))
3043 vereq(y.a, x.a)
3044 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003045
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003046def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003047 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003048 import copy
3049 class C(object):
3050 pass
3051
3052 a = C()
3053 a.foo = 12
3054 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003055 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003056
3057 a.bar = [1,2,3]
3058 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003059 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003060 verify(c.bar is a.bar)
3061
3062 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003063 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003064 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003065 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003066
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003067def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003068 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003069 class I(int):
3070 def __repr__(self):
3071 return "I(%r)" % int(self)
3072 def __add__(self, other):
3073 return I(int(self) + int(other))
3074 __radd__ = __add__
3075 def __pow__(self, other, mod=None):
3076 if mod is None:
3077 return I(pow(int(self), int(other)))
3078 else:
3079 return I(pow(int(self), int(other), int(mod)))
3080 def __rpow__(self, other, mod=None):
3081 if mod is None:
3082 return I(pow(int(other), int(self), mod))
3083 else:
3084 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003085
Walter Dörwald70a6b492004-02-12 17:35:32 +00003086 vereq(repr(I(1) + I(2)), "I(3)")
3087 vereq(repr(I(1) + 2), "I(3)")
3088 vereq(repr(1 + I(2)), "I(3)")
3089 vereq(repr(I(2) ** I(3)), "I(8)")
3090 vereq(repr(2 ** I(3)), "I(8)")
3091 vereq(repr(I(2) ** 3), "I(8)")
3092 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003093 class S(str):
3094 def __eq__(self, other):
3095 return self.lower() == other.lower()
3096
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003097def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003098 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003099 class A(object):
3100 pass
3101 class B(A):
3102 pass
3103 class C(A):
3104 pass
3105 class D(B, C):
3106 pass
3107 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003108 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003109 A.__hash__ = lambda self: 42
3110 vereq(hash(d), 42)
3111 C.__hash__ = lambda self: 314
3112 vereq(hash(d), 314)
3113 B.__hash__ = lambda self: 144
3114 vereq(hash(d), 144)
3115 D.__hash__ = lambda self: 100
3116 vereq(hash(d), 100)
3117 del D.__hash__
3118 vereq(hash(d), 144)
3119 del B.__hash__
3120 vereq(hash(d), 314)
3121 del C.__hash__
3122 vereq(hash(d), 42)
3123 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003124 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003125 d.foo = 42
3126 d.bar = 42
3127 vereq(d.foo, 42)
3128 vereq(d.bar, 42)
3129 def __getattribute__(self, name):
3130 if name == "foo":
3131 return 24
3132 return object.__getattribute__(self, name)
3133 A.__getattribute__ = __getattribute__
3134 vereq(d.foo, 24)
3135 vereq(d.bar, 42)
3136 def __getattr__(self, name):
3137 if name in ("spam", "foo", "bar"):
3138 return "hello"
Collin Winter3add4d72007-08-29 23:37:32 +00003139 raise AttributeError(name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003140 B.__getattr__ = __getattr__
3141 vereq(d.spam, "hello")
3142 vereq(d.foo, 24)
3143 vereq(d.bar, 42)
3144 del A.__getattribute__
3145 vereq(d.foo, 42)
3146 del d.foo
3147 vereq(d.foo, "hello")
3148 vereq(d.bar, 42)
3149 del B.__getattr__
3150 try:
3151 d.foo
3152 except AttributeError:
3153 pass
3154 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003155 raise TestFailed("d.foo should be undefined now")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003156
Guido van Rossume7f3e242002-06-14 02:35:45 +00003157 # Test a nasty bug in recurse_down_subclasses()
3158 import gc
3159 class A(object):
3160 pass
3161 class B(A):
3162 pass
3163 del B
3164 gc.collect()
3165 A.__setitem__ = lambda *a: None # crash
3166
Tim Petersfc57ccb2001-10-12 02:38:24 +00003167def buffer_inherit():
3168 import binascii
3169 # SF bug [#470040] ParseTuple t# vs subclasses.
3170 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003171 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003172
3173 class MyStr(str):
3174 pass
3175 base = 'abc'
3176 m = MyStr(base)
3177 # b2a_hex uses the buffer interface to get its argument's value, via
3178 # PyArg_ParseTuple 't#' code.
3179 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3180
3181 # It's not clear that unicode will continue to support the character
3182 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003183 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003184 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003185 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003186 m = MyUni(base)
3187 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3188
3189 class MyInt(int):
3190 pass
3191 m = MyInt(42)
3192 try:
3193 binascii.b2a_hex(m)
3194 raise TestFailed('subclass of int should not have a buffer interface')
3195 except TypeError:
3196 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003197
Tim Petersc9933152001-10-16 20:18:24 +00003198def str_of_str_subclass():
3199 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003200 import io
Tim Petersc9933152001-10-16 20:18:24 +00003201
3202 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003203 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003204
3205 class octetstring(str):
3206 def __str__(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +00003207 return binascii.b2a_hex(self).decode("ascii")
Tim Petersc9933152001-10-16 20:18:24 +00003208 def __repr__(self):
3209 return self + " repr"
3210
3211 o = octetstring('A')
3212 vereq(type(o), octetstring)
3213 vereq(type(str(o)), str)
3214 vereq(type(repr(o)), str)
3215 vereq(ord(o), 0x41)
3216 vereq(str(o), '41')
3217 vereq(repr(o), 'A repr')
3218 vereq(o.__str__(), '41')
3219 vereq(o.__repr__(), 'A repr')
3220
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003221 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003222 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003223 print(o, file=capture)
3224 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003225 vereq(capture.getvalue(), '41\n41\n')
3226 capture.close()
3227
Guido van Rossumc8e56452001-10-22 00:43:43 +00003228def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003229 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003230 def f(a): return a
3231 vereq(f.__call__(a=42), 42)
3232 a = []
3233 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003234 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003235
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003236def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003237 if verbose: print(("Testing recursive __call__() by setting to instance of "
3238 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003239 class A(object):
3240 pass
3241
3242 A.__call__ = A()
3243 try:
3244 A()()
3245 except RuntimeError:
3246 pass
3247 else:
3248 raise TestFailed("Recursion limit should have been reached for "
3249 "__call__()")
3250
Guido van Rossumed87ad82001-10-30 02:33:02 +00003251def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003252 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003253 log = []
3254 class C(object):
3255 def __del__(self):
3256 log.append(1)
3257 c = C()
3258 vereq(log, [])
3259 del c
3260 vereq(log, [1])
3261
Guido van Rossum29d26062001-12-11 04:37:34 +00003262 class D(object): pass
3263 d = D()
3264 try: del d[0]
3265 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003266 else: raise TestFailed("invalid del() didn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003267
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003268def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003269 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003270
3271 class mydict(dict):
3272 pass
3273 d = mydict()
3274 try:
3275 hash(d)
3276 except TypeError:
3277 pass
3278 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003279 raise TestFailed("hash() of dict subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003280
3281 class mylist(list):
3282 pass
3283 d = mylist()
3284 try:
3285 hash(d)
3286 except TypeError:
3287 pass
3288 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003289 raise TestFailed("hash() of list subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003290
Guido van Rossum29d26062001-12-11 04:37:34 +00003291def strops():
3292 try: 'a' + 5
3293 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003294 else: raise TestFailed("'' + 5 doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003295
3296 try: ''.split('')
3297 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003298 else: raise TestFailed("''.split('') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003299
Guido van Rossum29d26062001-12-11 04:37:34 +00003300 try: ''.rindex('5')
3301 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003302 else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003303
Guido van Rossum29d26062001-12-11 04:37:34 +00003304 try: '%(n)s' % None
3305 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003306 else: raise TestFailed("'%(n)s' % None doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003307
3308 try: '%(n' % {}
3309 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003310 else: raise TestFailed("'%(n' % {} '' doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003311
3312 try: '%*s' % ('abc')
3313 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003314 else: raise TestFailed("'%*s' % ('abc') doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003315
3316 try: '%*.*s' % ('abc', 5)
3317 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003318 else: raise TestFailed("'%*.*s' % ('abc', 5) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003319
3320 try: '%s' % (1, 2)
3321 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003322 else: raise TestFailed("'%s' % (1, 2) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003323
3324 try: '%' % None
3325 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003326 else: raise TestFailed("'%' % None doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003327
3328 vereq('534253'.isdigit(), 1)
3329 vereq('534253x'.isdigit(), 0)
3330 vereq('%c' % 5, '\x05')
3331 vereq('%c' % '5', '5')
3332
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003333def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003334 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003335 class Node:
3336 pass
3337 a = Node()
3338 b = Node()
3339 a.b = b
3340 b.a = a
3341 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003342
Guido van Rossumd7035672002-03-12 20:43:31 +00003343def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003344 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003345 from types import ModuleType as M
3346 m = M.__new__(M)
3347 str(m)
3348 vereq(hasattr(m, "__name__"), 0)
3349 vereq(hasattr(m, "__file__"), 0)
3350 vereq(hasattr(m, "foo"), 0)
3351 vereq(m.__dict__, None)
3352 m.foo = 1
3353 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003354
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003355def dictproxyiterkeys():
3356 class C(object):
3357 def meth(self):
3358 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003359 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003360 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003361 keys.sort()
3362 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3363
3364def dictproxyitervalues():
3365 class C(object):
3366 def meth(self):
3367 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003368 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003369 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003370 vereq(len(values), 5)
3371
3372def dictproxyiteritems():
3373 class C(object):
3374 def meth(self):
3375 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003376 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003377 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003378 keys.sort()
3379 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3380
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003381def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003382 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003383 class C(object):
3384 def __new__(cls, arg):
3385 if isinstance(arg, str): return [1, 2, 3]
3386 elif isinstance(arg, int): return object.__new__(D)
3387 else: return object.__new__(cls)
3388 class D(C):
3389 def __init__(self, arg):
3390 self.foo = arg
3391 vereq(C("1"), [1, 2, 3])
3392 vereq(D("1"), [1, 2, 3])
3393 d = D(None)
3394 veris(d.foo, None)
3395 d = C(1)
3396 vereq(isinstance(d, D), True)
3397 vereq(d.foo, 1)
3398 d = D(1)
3399 vereq(isinstance(d, D), True)
3400 vereq(d.foo, 1)
3401
Guido van Rossume8fc6402002-04-16 16:44:51 +00003402def imulbug():
3403 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003404 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003405 class C(object):
3406 def __imul__(self, other):
3407 return (self, other)
3408 x = C()
3409 y = x
3410 y *= 1.0
3411 vereq(y, (x, 1.0))
3412 y = x
3413 y *= 2
3414 vereq(y, (x, 2))
3415 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003416 y *= 3
3417 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003418 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003419 y *= 1<<100
3420 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003421 y = x
3422 y *= None
3423 vereq(y, (x, None))
3424 y = x
3425 y *= "foo"
3426 vereq(y, (x, "foo"))
3427
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003428def docdescriptor():
3429 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003430 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003431 class DocDescr(object):
3432 def __get__(self, object, otype):
3433 if object:
3434 object = object.__class__.__name__ + ' instance'
3435 if otype:
3436 otype = otype.__name__
3437 return 'object=%s; type=%s' % (object, otype)
3438 class OldClass:
3439 __doc__ = DocDescr()
3440 class NewClass(object):
3441 __doc__ = DocDescr()
3442 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3443 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3444 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3445 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3446
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003447def copy_setstate():
3448 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003449 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003450 import copy
3451 class C(object):
3452 def __init__(self, foo=None):
3453 self.foo = foo
3454 self.__foo = foo
3455 def setfoo(self, foo=None):
3456 self.foo = foo
3457 def getfoo(self):
3458 return self.__foo
3459 def __getstate__(self):
3460 return [self.foo]
3461 def __setstate__(self, lst):
3462 assert len(lst) == 1
3463 self.__foo = self.foo = lst[0]
3464 a = C(42)
3465 a.setfoo(24)
3466 vereq(a.foo, 24)
3467 vereq(a.getfoo(), 42)
3468 b = copy.copy(a)
3469 vereq(b.foo, 24)
3470 vereq(b.getfoo(), 24)
3471 b = copy.deepcopy(a)
3472 vereq(b.foo, 24)
3473 vereq(b.getfoo(), 24)
3474
Guido van Rossum09638c12002-06-13 19:17:46 +00003475def slices():
3476 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003477 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003478 # Strings
3479 vereq("hello"[:4], "hell")
3480 vereq("hello"[slice(4)], "hell")
3481 vereq(str.__getitem__("hello", slice(4)), "hell")
3482 class S(str):
3483 def __getitem__(self, x):
3484 return str.__getitem__(self, x)
3485 vereq(S("hello")[:4], "hell")
3486 vereq(S("hello")[slice(4)], "hell")
3487 vereq(S("hello").__getitem__(slice(4)), "hell")
3488 # Tuples
3489 vereq((1,2,3)[:2], (1,2))
3490 vereq((1,2,3)[slice(2)], (1,2))
3491 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3492 class T(tuple):
3493 def __getitem__(self, x):
3494 return tuple.__getitem__(self, x)
3495 vereq(T((1,2,3))[:2], (1,2))
3496 vereq(T((1,2,3))[slice(2)], (1,2))
3497 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3498 # Lists
3499 vereq([1,2,3][:2], [1,2])
3500 vereq([1,2,3][slice(2)], [1,2])
3501 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3502 class L(list):
3503 def __getitem__(self, x):
3504 return list.__getitem__(self, x)
3505 vereq(L([1,2,3])[:2], [1,2])
3506 vereq(L([1,2,3])[slice(2)], [1,2])
3507 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3508 # Now do lists and __setitem__
3509 a = L([1,2,3])
3510 a[slice(1, 3)] = [3,2]
3511 vereq(a, [1,3,2])
3512 a[slice(0, 2, 1)] = [3,1]
3513 vereq(a, [3,1,2])
3514 a.__setitem__(slice(1, 3), [2,1])
3515 vereq(a, [3,2,1])
3516 a.__setitem__(slice(0, 2, 1), [2,3])
3517 vereq(a, [2,3,1])
3518
Tim Peters2484aae2002-07-11 06:56:07 +00003519def subtype_resurrection():
3520 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003521 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003522
3523 class C(object):
3524 container = []
3525
3526 def __del__(self):
3527 # resurrect the instance
3528 C.container.append(self)
3529
3530 c = C()
3531 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003532 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003533 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003534 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003535
3536 # If that didn't blow up, it's also interesting to see whether clearing
3537 # the last container slot works: that will attempt to delete c again,
3538 # which will cause c to get appended back to the container again "during"
3539 # the del.
3540 del C.container[-1]
3541 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003542 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003543
Tim Peters14cb1e12002-07-11 18:26:21 +00003544 # Make c mortal again, so that the test framework with -l doesn't report
3545 # it as a leak.
3546 del C.__del__
3547
Guido van Rossum2d702462002-08-06 21:28:28 +00003548def slottrash():
3549 # Deallocating deeply nested slotted trash caused stack overflows
3550 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003551 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003552 class trash(object):
3553 __slots__ = ['x']
3554 def __init__(self, x):
3555 self.x = x
3556 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003557 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003558 o = trash(o)
3559 del o
3560
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003561def slotmultipleinheritance():
3562 # SF bug 575229, multiple inheritance w/ slots dumps core
3563 class A(object):
3564 __slots__=()
3565 class B(object):
3566 pass
3567 class C(A,B) :
3568 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003569 vereq(C.__basicsize__, B.__basicsize__)
3570 verify(hasattr(C, '__dict__'))
3571 verify(hasattr(C, '__weakref__'))
3572 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003573
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003574def testrmul():
3575 # SF patch 592646
3576 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003577 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003578 class C(object):
3579 def __mul__(self, other):
3580 return "mul"
3581 def __rmul__(self, other):
3582 return "rmul"
3583 a = C()
3584 vereq(a*2, "mul")
3585 vereq(a*2.2, "mul")
3586 vereq(2*a, "rmul")
3587 vereq(2.2*a, "rmul")
3588
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003589def testipow():
3590 # [SF bug 620179]
3591 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003592 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003593 class C(object):
3594 def __ipow__(self, other):
3595 pass
3596 a = C()
3597 a **= 2
3598
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003599def do_this_first():
3600 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003601 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003602 # This dumps core when SF bug 551412 isn't fixed --
3603 # but only when test_descr.py is run separately.
3604 # (That can't be helped -- as soon as PyType_Ready()
3605 # is called for PyLong_Type, the bug is gone.)
3606 class UserLong(object):
3607 def __pow__(self, *args):
3608 pass
3609 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003610 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003611 except:
3612 pass
3613
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003614 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003615 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003616 # Another segfault only when run early
3617 # (before PyType_Ready(tuple) is called)
3618 type.mro(tuple)
3619
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003620def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003621 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003622 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003623 # stuff that should work:
3624 class C(object):
3625 pass
3626 class C2(object):
3627 def __getattribute__(self, attr):
3628 if attr == 'a':
3629 return 2
3630 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003631 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003632 def meth(self):
3633 return 1
3634 class D(C):
3635 pass
3636 class E(D):
3637 pass
3638 d = D()
3639 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003640 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003641 D.__bases__ = (C2,)
3642 vereq(d.meth(), 1)
3643 vereq(e.meth(), 1)
3644 vereq(d.a, 2)
3645 vereq(e.a, 2)
3646 vereq(C2.__subclasses__(), [D])
3647
3648 # stuff that shouldn't:
3649 class L(list):
3650 pass
3651
3652 try:
3653 L.__bases__ = (dict,)
3654 except TypeError:
3655 pass
3656 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003657 raise TestFailed("shouldn't turn list subclass into dict subclass")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003658
3659 try:
3660 list.__bases__ = (dict,)
3661 except TypeError:
3662 pass
3663 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003664 raise TestFailed("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003665
3666 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003667 D.__bases__ = (C2, list)
3668 except TypeError:
3669 pass
3670 else:
3671 assert 0, "best_base calculation found wanting"
3672
3673 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003674 del D.__bases__
3675 except TypeError:
3676 pass
3677 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003678 raise TestFailed("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003679
3680 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003681 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003682 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003683 if str(msg) == "a new-style class can't have only classic bases":
Collin Winter3add4d72007-08-29 23:37:32 +00003684 raise TestFailed("wrong error message for .__bases__ = ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003685 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003686 raise TestFailed("shouldn't be able to set .__bases__ to ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003687
3688 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003689 D.__bases__ = (D,)
3690 except TypeError:
3691 pass
3692 else:
3693 # actually, we'll have crashed by here...
Collin Winter3add4d72007-08-29 23:37:32 +00003694 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003695
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003696 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003697 D.__bases__ = (C, C)
3698 except TypeError:
3699 pass
3700 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003701 raise TestFailed("didn't detect repeated base classes")
Michael W. Hudsone723e452003-08-07 14:58:10 +00003702
3703 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003704 D.__bases__ = (E,)
3705 except TypeError:
3706 pass
3707 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003708 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003709
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003710def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003711 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003712 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003713 class WorkOnce(type):
3714 def __new__(self, name, bases, ns):
3715 self.flag = 0
3716 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3717 def mro(self):
3718 if self.flag > 0:
Collin Winter3add4d72007-08-29 23:37:32 +00003719 raise RuntimeError("bozo")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003720 else:
3721 self.flag += 1
3722 return type.mro(self)
3723
3724 class WorkAlways(type):
3725 def mro(self):
3726 # this is here to make sure that .mro()s aren't called
3727 # with an exception set (which was possible at one point).
3728 # An error message will be printed in a debug build.
3729 # What's a good way to test for this?
3730 return type.mro(self)
3731
3732 class C(object):
3733 pass
3734
3735 class C2(object):
3736 pass
3737
3738 class D(C):
3739 pass
3740
3741 class E(D):
3742 pass
3743
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003744 class F(D, metaclass=WorkOnce):
3745 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003746
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003747 class G(D, metaclass=WorkAlways):
3748 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003749
3750 # Immediate subclasses have their mro's adjusted in alphabetical
3751 # order, so E's will get adjusted before adjusting F's fails. We
3752 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003753
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003754 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003755 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003756
3757 try:
3758 D.__bases__ = (C2,)
3759 except RuntimeError:
3760 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003761 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003762 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003763 raise TestFailed("exception not propagated")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003764
3765def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003766 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003767 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003768 class A(object):
3769 pass
3770
3771 class B(object):
3772 pass
3773
3774 class C(A, B):
3775 pass
3776
3777 class D(A, B):
3778 pass
3779
3780 class E(C, D):
3781 pass
3782
3783 try:
3784 C.__bases__ = (B, A)
3785 except TypeError:
3786 pass
3787 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003788 raise TestFailed("didn't catch MRO conflict")
Tim Peters6578dc92002-12-24 18:31:27 +00003789
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003790def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003791 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003792 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003793 class C(object):
3794 pass
3795
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003796 # C.__module__ could be 'test_descr' or '__main__'
3797 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003798
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003799 C.__name__ = 'D'
3800 vereq((C.__module__, C.__name__), (mod, 'D'))
3801
3802 C.__name__ = 'D.E'
3803 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003804
Guido van Rossum613f24f2003-01-06 23:00:59 +00003805def subclass_right_op():
3806 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003807 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003808
3809 # This code tests various cases where right-dispatch of a subclass
3810 # should be preferred over left-dispatch of a base class.
3811
3812 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3813
3814 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003815 def __floordiv__(self, other):
3816 return "B.__floordiv__"
3817 def __rfloordiv__(self, other):
3818 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003819
Guido van Rossumf389c772003-02-27 20:04:19 +00003820 vereq(B(1) // 1, "B.__floordiv__")
3821 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003822
3823 # Case 2: subclass of object; this is just the baseline for case 3
3824
3825 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003826 def __floordiv__(self, other):
3827 return "C.__floordiv__"
3828 def __rfloordiv__(self, other):
3829 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003830
Guido van Rossumf389c772003-02-27 20:04:19 +00003831 vereq(C() // 1, "C.__floordiv__")
3832 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003833
3834 # Case 3: subclass of new-style class; here it gets interesting
3835
3836 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003837 def __floordiv__(self, other):
3838 return "D.__floordiv__"
3839 def __rfloordiv__(self, other):
3840 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003841
Guido van Rossumf389c772003-02-27 20:04:19 +00003842 vereq(D() // C(), "D.__floordiv__")
3843 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003844
3845 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3846
3847 class E(C):
3848 pass
3849
Guido van Rossumf389c772003-02-27 20:04:19 +00003850 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003851
Guido van Rossumf389c772003-02-27 20:04:19 +00003852 vereq(E() // 1, "C.__floordiv__")
3853 vereq(1 // E(), "C.__rfloordiv__")
3854 vereq(E() // C(), "C.__floordiv__")
3855 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003856
Guido van Rossum373c7412003-01-07 13:41:37 +00003857def dict_type_with_metaclass():
3858 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003859 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003860
3861 class B(object):
3862 pass
3863 class M(type):
3864 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003865 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003866 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003867 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003868 veris(type(C.__dict__), type(B.__dict__))
3869
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003870def meth_class_get():
3871 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003872 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003873 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003874 # Baseline
3875 arg = [1, 2, 3]
3876 res = {1: None, 2: None, 3: None}
3877 vereq(dict.fromkeys(arg), res)
3878 vereq({}.fromkeys(arg), res)
3879 # Now get the descriptor
3880 descr = dict.__dict__["fromkeys"]
3881 # More baseline using the descriptor directly
3882 vereq(descr.__get__(None, dict)(arg), res)
3883 vereq(descr.__get__({})(arg), res)
3884 # Now check various error cases
3885 try:
3886 descr.__get__(None, None)
3887 except TypeError:
3888 pass
3889 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003890 raise TestFailed("shouldn't have allowed descr.__get__(None, None)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003891 try:
3892 descr.__get__(42)
3893 except TypeError:
3894 pass
3895 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003896 raise TestFailed("shouldn't have allowed descr.__get__(42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003897 try:
3898 descr.__get__(None, 42)
3899 except TypeError:
3900 pass
3901 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003902 raise TestFailed("shouldn't have allowed descr.__get__(None, 42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003903 try:
3904 descr.__get__(None, int)
3905 except TypeError:
3906 pass
3907 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003908 raise TestFailed("shouldn't have allowed descr.__get__(None, int)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003909
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003910def isinst_isclass():
3911 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003912 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003913 class Proxy(object):
3914 def __init__(self, obj):
3915 self.__obj = obj
3916 def __getattribute__(self, name):
3917 if name.startswith("_Proxy__"):
3918 return object.__getattribute__(self, name)
3919 else:
3920 return getattr(self.__obj, name)
3921 # Test with a classic class
3922 class C:
3923 pass
3924 a = C()
3925 pa = Proxy(a)
3926 verify(isinstance(a, C)) # Baseline
3927 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003928 # Test with a classic subclass
3929 class D(C):
3930 pass
3931 a = D()
3932 pa = Proxy(a)
3933 verify(isinstance(a, C)) # Baseline
3934 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003935 # Test with a new-style class
3936 class C(object):
3937 pass
3938 a = C()
3939 pa = Proxy(a)
3940 verify(isinstance(a, C)) # Baseline
3941 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003942 # Test with a new-style subclass
3943 class D(C):
3944 pass
3945 a = D()
3946 pa = Proxy(a)
3947 verify(isinstance(a, C)) # Baseline
3948 verify(isinstance(pa, C)) # Test
3949
3950def proxysuper():
3951 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003952 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003953 class Proxy(object):
3954 def __init__(self, obj):
3955 self.__obj = obj
3956 def __getattribute__(self, name):
3957 if name.startswith("_Proxy__"):
3958 return object.__getattribute__(self, name)
3959 else:
3960 return getattr(self.__obj, name)
3961
3962 class B(object):
3963 def f(self):
3964 return "B.f"
3965
3966 class C(B):
3967 def f(self):
3968 return super(C, self).f() + "->C.f"
3969
3970 obj = C()
3971 p = Proxy(obj)
3972 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003973
Guido van Rossum52b27052003-04-15 20:05:10 +00003974def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003975 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003976 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003977 try:
3978 object.__setattr__(str, "foo", 42)
3979 except TypeError:
3980 pass
3981 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003982 raise TestFailed("Carlo Verre __setattr__ suceeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003983 try:
3984 object.__delattr__(str, "lower")
3985 except TypeError:
3986 pass
3987 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003988 raise TestFailed("Carlo Verre __delattr__ succeeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003989
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003990def weakref_segfault():
3991 # SF 742911
3992 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003993 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003994
3995 import weakref
3996
3997 class Provoker:
3998 def __init__(self, referrent):
3999 self.ref = weakref.ref(referrent)
4000
4001 def __del__(self):
4002 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004003
4004 class Oops(object):
4005 pass
4006
4007 o = Oops()
4008 o.whatever = Provoker(o)
4009 del o
4010
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004011def wrapper_segfault():
4012 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004013 if verbose:
4014 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004015 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00004016 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004017 f = f.__call__
4018 f = None
4019
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004020# Fix SF #762455, segfault when sys.stdout is changed in getattr
4021def filefault():
4022 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004023 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004024 import sys
4025 class StdoutGuard:
4026 def __getattr__(self, attr):
4027 sys.stdout = sys.__stdout__
4028 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4029 sys.stdout = StdoutGuard()
4030 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004031 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004032 except RuntimeError:
4033 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004034
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004035def vicious_descriptor_nonsense():
4036 # A potential segfault spotted by Thomas Wouters in mail to
4037 # python-dev 2003-04-17, turned into an example & fixed by Michael
4038 # Hudson just less than four months later...
4039 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004040 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004041
4042 class Evil(object):
4043 def __hash__(self):
4044 return hash('attr')
4045 def __eq__(self, other):
4046 del C.attr
4047 return 0
4048
4049 class Descr(object):
4050 def __get__(self, ob, type=None):
4051 return 1
4052
4053 class C(object):
4054 attr = Descr()
4055
4056 c = C()
4057 c.__dict__[Evil()] = 0
4058
4059 vereq(c.attr, 1)
4060 # this makes a crash more likely:
4061 import gc; gc.collect()
4062 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004063
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004064def test_init():
4065 # SF 1155938
4066 class Foo(object):
4067 def __init__(self):
4068 return 10
4069 try:
4070 Foo()
4071 except TypeError:
4072 pass
4073 else:
Collin Winter3add4d72007-08-29 23:37:32 +00004074 raise TestFailed("did not test __init__() for None return")
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004075
Armin Rigoc6686b72005-11-07 08:38:00 +00004076def methodwrapper():
4077 # <type 'method-wrapper'> did not support any reflection before 2.5
4078 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004079 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004080
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004081 return # XXX should methods really support __eq__?
4082
Armin Rigoc6686b72005-11-07 08:38:00 +00004083 l = []
4084 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004085 vereq(l.__add__, [].__add__)
4086 verify(l.__add__ != [5].__add__)
4087 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004088 verify(l.__add__.__name__ == '__add__')
4089 verify(l.__add__.__self__ is l)
4090 verify(l.__add__.__objclass__ is list)
4091 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004092 try:
4093 hash(l.__add__)
4094 except TypeError:
4095 pass
4096 else:
4097 raise TestFailed("no TypeError from hash([].__add__)")
4098
4099 t = ()
4100 t += (7,)
4101 vereq(t.__add__, (7,).__add__)
4102 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004103
Armin Rigofd163f92005-12-29 15:59:19 +00004104def notimplemented():
4105 # all binary methods should be able to return a NotImplemented
4106 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004107 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004108
4109 import sys
4110 import types
4111 import operator
4112
4113 def specialmethod(self, other):
4114 return NotImplemented
4115
4116 def check(expr, x, y):
4117 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004118 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004119 except TypeError:
4120 pass
4121 else:
4122 raise TestFailed("no TypeError from %r" % (expr,))
4123
Christian Heimesa37d4c62007-12-04 23:02:19 +00004124 N1 = sys.maxsize + 1 # might trigger OverflowErrors instead of TypeErrors
4125 N2 = sys.maxsize # if sizeof(int) < sizeof(long), might trigger
Armin Rigofd163f92005-12-29 15:59:19 +00004126 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004127 if 1:
4128 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004129 for name, expr, iexpr in [
4130 ('__add__', 'x + y', 'x += y'),
4131 ('__sub__', 'x - y', 'x -= y'),
4132 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004133 ('__truediv__', 'x / y', None),
4134 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004135 ('__mod__', 'x % y', 'x %= y'),
4136 ('__divmod__', 'divmod(x, y)', None),
4137 ('__pow__', 'x ** y', 'x **= y'),
4138 ('__lshift__', 'x << y', 'x <<= y'),
4139 ('__rshift__', 'x >> y', 'x >>= y'),
4140 ('__and__', 'x & y', 'x &= y'),
4141 ('__or__', 'x | y', 'x |= y'),
4142 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004143 ]:
4144 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004145 A = metaclass('A', (), {name: specialmethod})
4146 B = metaclass('B', (), {rname: specialmethod})
4147 a = A()
4148 b = B()
4149 check(expr, a, a)
4150 check(expr, a, b)
4151 check(expr, b, a)
4152 check(expr, b, b)
4153 check(expr, a, N1)
4154 check(expr, a, N2)
4155 check(expr, N1, b)
4156 check(expr, N2, b)
4157 if iexpr:
4158 check(iexpr, a, a)
4159 check(iexpr, a, b)
4160 check(iexpr, b, a)
4161 check(iexpr, b, b)
4162 check(iexpr, a, N1)
4163 check(iexpr, a, N2)
4164 iname = '__i' + name[2:]
4165 C = metaclass('C', (), {iname: specialmethod})
4166 c = C()
4167 check(iexpr, c, a)
4168 check(iexpr, c, b)
4169 check(iexpr, c, N1)
4170 check(iexpr, c, N2)
4171
Guido van Rossumd8faa362007-04-27 19:54:29 +00004172def test_assign_slice():
4173 # ceval.c's assign_slice used to check for
4174 # tp->tp_as_sequence->sq_slice instead of
4175 # tp->tp_as_sequence->sq_ass_slice
Christian Heimesbbffeb62008-01-24 09:42:52 +00004176 if verbose:
4177 print("Testing assign_slice...")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004178
4179 class C(object):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00004180 def __setitem__(self, idx, value):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004181 self.value = value
4182
4183 c = C()
4184 c[1:2] = 3
4185 vereq(c.value, 3)
4186
Christian Heimesbbffeb62008-01-24 09:42:52 +00004187def test_weakref_in_del_segfault():
4188 # This used to segfault until r60057
4189 if verbose:
4190 print("Testing weakref in del segfault...")
4191
4192 import weakref
4193 global ref
4194
4195 class Target():
4196 def __del__(self):
4197 global ref
4198 ref = weakref.ref(self)
4199
4200 w = Target()
4201 del w
4202 del ref
4203
4204def test_borrowed_ref_3_segfault():
4205 # This used to segfault until r60224
4206 if verbose:
4207 print("Testing borrowed ref 3 segfault...")
4208
4209 class KeyFunc(object):
4210 def __call__(self, n):
4211 del d['key']
4212 return 1
4213
4214 d = {'key': KeyFunc()}
4215 try:
4216 min(range(10), **d)
4217 except:
4218 pass
4219
4220def test_borrowed_ref_4_segfault():
4221 # This used to segfault until r60224
4222 if verbose:
4223 print("Testing borrowed ref 4 segfault...")
4224
4225 import types
4226 import builtins
4227
4228 class X(object):
4229 def __getattr__(self, name):
4230 # this is called with name == '__bases__' by PyObject_IsInstance()
4231 # during the unbound method call -- it frees the unbound method
4232 # itself before it invokes its im_func.
4233 del builtins.__import__
4234 return ()
4235
4236 pseudoclass = X()
4237
4238 class Y(object):
4239 def __call__(self, *args):
4240 # 'self' was freed already
4241 return (self, args)
4242
4243 # make an unbound method
4244 orig_import = __import__
4245 try:
4246 builtins.__import__ = types.MethodType(Y(), (pseudoclass, str))
4247 import spam
4248 finally:
4249 builtins.__import__ = orig_import
4250
Christian Heimes969fe572008-01-25 11:23:10 +00004251def test_losing_dict_ref_segfault():
4252 # This used to segfault;
4253 # derived from issue #1303614, test67.py
4254 if verbose:
4255 print("Testing losing dict ref segfault...")
4256
4257 class Strange(object):
4258 def __hash__(self):
4259 return hash('hello')
4260
4261 def __eq__(self, other):
4262 x.__dict__ = {} # the old x.__dict__ is deallocated
4263 return False
4264
4265 class X(object):
4266 pass
4267
4268 v = 123
4269 x = X()
4270 x.__dict__ = {Strange(): 42, 'hello': v+456}
4271 x.hello
4272
4273
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004274def test_main():
Christian Heimese7a15bb2008-01-24 16:21:45 +00004275 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004276 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004277 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004278 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004279 lists()
4280 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004281 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004282 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004283 ints()
4284 longs()
4285 floats()
4286 complexes()
4287 spamlists()
4288 spamdicts()
4289 pydicts()
4290 pylists()
4291 metaclass()
4292 pymods()
4293 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004294 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004295 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004296 ex5()
4297 monotonicity()
4298 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004299 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004300 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004301 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004302 dynamics()
4303 errors()
4304 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004305 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004306 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004307 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004308 classic()
4309 compattr()
4310 newslot()
4311 altmro()
4312 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004313 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004314 specials()
Thomas Wouters89d996e2007-09-08 17:39:28 +00004315 recursions()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004316 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004317 properties()
Christian Heimes9a371592007-12-28 14:08:13 +00004318 properties_plus()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004319 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004320 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004321 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004322 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004323 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004324 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004325 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004326 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004327 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004328 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004329 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004330 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004331 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004332 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004333 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004334 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004335 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004336 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004337 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004338 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004339 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004340 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004341 dictproxyiterkeys()
4342 dictproxyitervalues()
4343 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004344 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004345 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004346 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004347 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004348 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004349 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004350 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004351 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004352 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004353 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004354 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004355 test_mutable_bases()
4356 test_mutable_bases_with_failing_mro()
4357 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004358 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004359 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004360 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004361 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004362 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004363 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004364 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004365 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004366 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004367 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004368 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004369 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004370 test_assign_slice()
Christian Heimesbbffeb62008-01-24 09:42:52 +00004371 test_weakref_in_del_segfault()
4372 test_borrowed_ref_3_segfault()
4373 test_borrowed_ref_4_segfault()
Christian Heimes969fe572008-01-25 11:23:10 +00004374 test_losing_dict_ref_segfault()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004375
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004376 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004377
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004378if __name__ == "__main__":
4379 test_main()