blob: aa01805a98fa04167f8adaa030f47b71122fdbe1 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Guido van Rossum25d0bd62007-07-20 17:10:16 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN
4from test.test_support import get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00005from copy import deepcopy
Guido van Rossum360e4b82007-05-14 22:51:27 +00006import types
Tim Peters4d9b4662002-04-16 01:59:17 +00007
Guido van Rossum875eeaa2001-10-11 18:33:53 +00008def veris(a, b):
9 if a is not b:
Collin Winter3add4d72007-08-29 23:37:32 +000010 raise TestFailed("%r is %r" % (a, b))
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011
Tim Peters6d6c1a32001-08-02 04:15:00 +000012def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000013 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000014 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000015 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000016 t = type(a)
17 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000018 while meth not in t.__dict__:
19 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000020 vereq(m, t.__dict__[meth])
21 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000022 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000024
25def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000026 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000028
Guido van Rossum45704552001-10-08 16:35:45 +000029 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000030 t = type(a)
31 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000032 while meth not in t.__dict__:
33 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000034 vereq(m, t.__dict__[meth])
35 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000036 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000037 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000038
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000039def testsliceop(a, b, c, res, expr="a[b:c]", meth="__getitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000040 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000041 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000042 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000043 t = type(a)
44 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000045 while meth not in t.__dict__:
46 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000047 vereq(m, t.__dict__[meth])
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000048 vereq(m(a, slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000049 bm = getattr(a, meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000050 vereq(bm(slice(b, c)), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000051
52def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000053 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000055 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000056 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000057 t = type(a)
58 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000059 while meth not in t.__dict__:
60 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000061 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000062 dict['a'] = deepcopy(a)
63 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000064 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000065 dict['a'] = deepcopy(a)
66 bm = getattr(dict['a'], meth)
67 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000068 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000069
70def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000071 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000073 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000074 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000075 t = type(a)
76 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000077 while meth not in t.__dict__:
78 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000079 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000080 dict['a'] = deepcopy(a)
81 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000082 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000083 dict['a'] = deepcopy(a)
84 bm = getattr(dict['a'], meth)
85 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000086 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000087
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000088def testsetsliceop(a, b, c, d, res, stmt="a[b:c]=d", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000089 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000091 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000092 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000093 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000094 while meth not in t.__dict__:
95 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000096 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000097 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000098 dict['a'] = deepcopy(a)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +000099 m(dict['a'], slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000100 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101 dict['a'] = deepcopy(a)
102 bm = getattr(dict['a'], meth)
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000103 bm(slice(b, c), d)
Guido van Rossum45704552001-10-08 16:35:45 +0000104 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000105
Tim Peters2f93e282001-10-04 05:27:00 +0000106def class_docstrings():
107 class Classic:
108 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000109 vereq(Classic.__doc__, "A classic docstring.")
110 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000111
112 class Classic2:
113 pass
114 verify(Classic2.__doc__ is None)
115
Tim Peters4fb1fe82001-10-04 05:48:13 +0000116 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000117 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000118 vereq(NewStatic.__doc__, "Another docstring.")
119 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000120
Tim Peters4fb1fe82001-10-04 05:48:13 +0000121 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000122 pass
123 verify(NewStatic2.__doc__ is None)
124
Tim Peters4fb1fe82001-10-04 05:48:13 +0000125 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000126 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000127 vereq(NewDynamic.__doc__, "Another docstring.")
128 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000129
Tim Peters4fb1fe82001-10-04 05:48:13 +0000130 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000131 pass
132 verify(NewDynamic2.__doc__ is None)
133
Tim Peters6d6c1a32001-08-02 04:15:00 +0000134def lists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000135 if verbose: print("Testing list operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000136 testbinop([1], [2], [1,2], "a+b", "__add__")
137 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
138 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
139 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000140 testsliceop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
142 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
143 testunop([1,2,3], 3, "len(a)", "__len__")
144 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
145 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
146 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
Thomas Woutersd2cf20e2007-08-30 22:57:53 +0000147 testsetsliceop([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d",
148 "__setitem__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000149
150def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000151 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000152 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000153 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
154 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
155 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
156 d = {1:2,3:4}
157 l1 = []
158 for i in d.keys(): l1.append(i)
159 l = []
160 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000161 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000162 l = []
163 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000164 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000165 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000166 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000167 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168 d = {1:2, 3:4}
169 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000170 vereq(eval(repr(d), {}), d)
171 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000172 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
173
Tim Peters25786c02001-09-02 08:22:48 +0000174def dict_constructor():
175 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000176 print("Testing dict constructor ...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000177 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000178 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000179 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000180 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000181 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000184 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000185 d = dict({'one':1, 'two':2})
186 vereq(d, dict(one=1, two=2))
187 vereq(d, dict(**d))
188 vereq(d, dict({"one": 1}, two=2))
189 vereq(d, dict([("two", 2)], one=1))
190 vereq(d, dict([("one", 100), ("two", 200)], **d))
191 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000192 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000193 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000194 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000195 except TypeError:
196 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000197 except ValueError:
198 if badarg == "0":
199 # It's a sequence, and its elements are also sequences (gotta
200 # love strings <wink>), but they aren't of length 2, so this
201 # one seemed better as a ValueError than a TypeError.
202 pass
203 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000204 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000205 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000206 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000207
208 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000209 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000210 except TypeError:
211 pass
212 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000213 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000214
215 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000216 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000217 dict = {1:2, 3:4, 'a':1j}
218
Tim Peters25786c02001-09-02 08:22:48 +0000219 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000220 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000221 except TypeError:
222 pass
223 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000224 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000225
226 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000227 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000228 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000229 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000230
Tim Peters1fc240e2001-10-26 05:06:50 +0000231 # Init from sequence of iterable objects, each producing a 2-sequence.
232 class AddressBookEntry:
233 def __init__(self, first, last):
234 self.first = first
235 self.last = last
236 def __iter__(self):
237 return iter([self.first, self.last])
238
Tim Petersa427a2b2001-10-29 22:25:45 +0000239 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000240 AddressBookEntry('Barry', 'Peters'),
241 AddressBookEntry('Tim', 'Peters'),
242 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000243 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
244
Tim Petersa427a2b2001-10-29 22:25:45 +0000245 d = dict(zip(range(4), range(1, 5)))
246 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000247
248 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000249 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000250 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000251 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000252 except ValueError:
253 pass
254 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000255 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000256
Tim Peters5d2b77c2001-09-03 05:47:38 +0000257def test_dir():
258 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000259 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000260 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000261 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000262 del junk
263
264 # Just make sure these don't blow up!
Walter Dörwald5de48bd2007-06-11 21:38:39 +0000265 for arg in 2, 2, 2j, 2e0, [2], "2", b"2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000266 dir(arg)
267
Thomas Wouters0725cf22006-04-15 09:04:57 +0000268 # Test dir on custom classes. Since these have object as a
269 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000270 def interesting(strings):
271 return [s for s in strings if not s.startswith('_')]
272
Tim Peters5d2b77c2001-09-03 05:47:38 +0000273 class C(object):
274 Cdata = 1
275 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000276
277 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000278 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000279
280 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000281 vereq(interesting(dir(c)), cstuff)
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():
1979 class C:
1980 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
1994 assert c.foo == 42
1995 del c.foo
1996 assert not hasattr(c, "foo")
1997
1998 class D(C):
1999 @C.foo.deleter
2000 def foo(self):
2001 try:
2002 del self._foo
2003 except AttributeError:
2004 pass
2005 d = D()
2006 d.foo = 24
2007 assert d.foo == 24
2008 del d.foo
2009 del d.foo
2010
2011 class E:
2012 @property
2013 def foo(self):
2014 return self._foo
2015 @foo.setter
2016 def foo (self, value):
2017 raise RuntimeError
2018 @foo.setter
2019 @foo.deleter
2020 def foo(self, value=None):
2021 if value is None:
2022 del self._foo
2023 else:
2024 self._foo = abs(value)
2025 e = E()
2026 e.foo = -42
2027 assert e.foo == 42
2028 del e.foo
2029
2030 class F(E):
2031 @E.foo.deleter
2032 def foo(self):
2033 del self._foo
2034 @foo.setter
2035 def foo(self, value):
2036 self._foo = max(0, value)
2037 f = F()
2038 f.foo = -10
2039 assert f.foo == 0
2040 del f.foo
2041
2042
Guido van Rossumc4a18802001-08-24 16:55:27 +00002043def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002044 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002045
2046 class A(object):
2047 def meth(self, a):
2048 return "A(%r)" % a
2049
Guido van Rossum45704552001-10-08 16:35:45 +00002050 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002051
2052 class B(A):
2053 def __init__(self):
2054 self.__super = super(B, self)
2055 def meth(self, a):
2056 return "B(%r)" % a + self.__super.meth(a)
2057
Guido van Rossum45704552001-10-08 16:35:45 +00002058 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002059
2060 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00002061 def meth(self, a):
2062 return "C(%r)" % a + self.__super.meth(a)
2063 C._C__super = super(C)
2064
Guido van Rossum45704552001-10-08 16:35:45 +00002065 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002066
2067 class D(C, B):
2068 def meth(self, a):
2069 return "D(%r)" % a + super(D, self).meth(a)
2070
Guido van Rossum5b443c62001-12-03 15:38:28 +00002071 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2072
2073 # Test for subclassing super
2074
2075 class mysuper(super):
2076 def __init__(self, *args):
2077 return super(mysuper, self).__init__(*args)
2078
2079 class E(D):
2080 def meth(self, a):
2081 return "E(%r)" % a + mysuper(E, self).meth(a)
2082
2083 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2084
2085 class F(E):
2086 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002087 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002088 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2089 F._F__super = mysuper(F)
2090
2091 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2092
2093 # Make sure certain errors are raised
2094
2095 try:
2096 super(D, 42)
2097 except TypeError:
2098 pass
2099 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002100 raise TestFailed("shouldn't allow super(D, 42)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002101
2102 try:
2103 super(D, C())
2104 except TypeError:
2105 pass
2106 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002107 raise TestFailed("shouldn't allow super(D, C())")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002108
2109 try:
2110 super(D).__get__(12)
2111 except TypeError:
2112 pass
2113 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002114 raise TestFailed("shouldn't allow super(D).__get__(12)")
Guido van Rossum5b443c62001-12-03 15:38:28 +00002115
2116 try:
2117 super(D).__get__(C())
2118 except TypeError:
2119 pass
2120 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002121 raise TestFailed("shouldn't allow super(D).__get__(C())")
Guido van Rossumc4a18802001-08-24 16:55:27 +00002122
Guido van Rossuma4541a32003-04-16 20:02:22 +00002123 # Make sure data descriptors can be overridden and accessed via super
2124 # (new feature in Python 2.3)
2125
2126 class DDbase(object):
2127 def getx(self): return 42
2128 x = property(getx)
2129
2130 class DDsub(DDbase):
2131 def getx(self): return "hello"
2132 x = property(getx)
2133
2134 dd = DDsub()
2135 vereq(dd.x, "hello")
2136 vereq(super(DDsub, dd).x, 42)
2137
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002138 # Ensure that super() lookup of descriptor from classmethod
2139 # works (SF ID# 743627)
2140
2141 class Base(object):
2142 aProp = property(lambda self: "foo")
2143
2144 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002145 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002146 def test(klass):
2147 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002148
2149 veris(Sub.test(), Base.aProp)
2150
Thomas Wouters89f507f2006-12-13 04:49:30 +00002151 # Verify that super() doesn't allow keyword args
2152 try:
2153 super(Base, kw=1)
2154 except TypeError:
2155 pass
2156 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002157 raise TestFailed("super shouldn't accept keyword args")
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002158
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002159def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002160 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002161
2162 class hexint(int):
2163 def __repr__(self):
2164 return hex(self)
2165 def __add__(self, other):
2166 return hexint(int.__add__(self, other))
2167 # (Note that overriding __radd__ doesn't work,
2168 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002169 vereq(repr(hexint(7) + 9), "0x10")
2170 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002171 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002172 vereq(a, 12345)
2173 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002174 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002176 verify((+a).__class__ is int)
2177 verify((a >> 0).__class__ is int)
2178 verify((a << 0).__class__ is int)
2179 verify((hexint(0) << 12).__class__ is int)
2180 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002181
Guido van Rossume2a383d2007-01-15 16:59:06 +00002182 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002183 __slots__ = []
2184 def __str__(self):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002185 return oct(self)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002186 def __add__(self, other):
2187 return self.__class__(super(octlong, self).__add__(other))
2188 __radd__ = __add__
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002189 vereq(str(octlong(3) + 5), "0o10")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002190 # (Note that overriding __radd__ here only seems to work
2191 # because the example uses a short int left argument.)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002192 vereq(str(5 + octlong(3000)), "0o5675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002193 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002194 vereq(a, 12345)
2195 vereq(int(a), 12345)
2196 vereq(hash(a), hash(12345))
2197 verify(int(a).__class__ is int)
2198 verify((+a).__class__ is int)
2199 verify((-a).__class__ is int)
2200 verify((-octlong(0)).__class__ is int)
2201 verify((a >> 0).__class__ is int)
2202 verify((a << 0).__class__ is int)
2203 verify((a - 0).__class__ is int)
2204 verify((a * 1).__class__ is int)
2205 verify((a ** 1).__class__ is int)
2206 verify((a // 1).__class__ is int)
2207 verify((1 * a).__class__ is int)
2208 verify((a | 0).__class__ is int)
2209 verify((a ^ 0).__class__ is int)
2210 verify((a & -1).__class__ is int)
2211 verify((octlong(0) << 12).__class__ is int)
2212 verify((octlong(0) >> 12).__class__ is int)
2213 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002214
2215 # Because octlong overrides __add__, we can't check the absence of +0
2216 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002217 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002218 pass
2219 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002220 verify((a + 0).__class__ is int)
2221 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002222
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002223 # Check that negative clones don't segfault
2224 a = longclone(-1)
2225 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002226 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002227
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002228 class precfloat(float):
2229 __slots__ = ['prec']
2230 def __init__(self, value=0.0, prec=12):
2231 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002232 def __repr__(self):
2233 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002234 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002235 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002236 vereq(a, 12345.0)
2237 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002238 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002239 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002240 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002241
Tim Peters2400fa42001-09-12 19:12:49 +00002242 class madcomplex(complex):
2243 def __repr__(self):
2244 return "%.17gj%+.17g" % (self.imag, self.real)
2245 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002246 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002247 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002248 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002249 vereq(a, base)
2250 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002251 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002252 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002253 vereq(repr(a), "4j-3")
2254 vereq(a, base)
2255 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002256 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002257 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002258 veris((+a).__class__, complex)
2259 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002261 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002263 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002265 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002267
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002268 class madtuple(tuple):
2269 _rev = None
2270 def rev(self):
2271 if self._rev is not None:
2272 return self._rev
2273 L = list(self)
2274 L.reverse()
2275 self._rev = self.__class__(L)
2276 return self._rev
2277 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2279 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2280 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002281 for i in range(512):
2282 t = madtuple(range(i))
2283 u = t.rev()
2284 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002285 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002286 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002288 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002290 verify(a[:].__class__ is tuple)
2291 verify((a * 1).__class__ is tuple)
2292 verify((a * 0).__class__ is tuple)
2293 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002294 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002295 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002296 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002297 verify((a + a).__class__ is tuple)
2298 verify((a * 0).__class__ is tuple)
2299 verify((a * 1).__class__ is tuple)
2300 verify((a * 2).__class__ is tuple)
2301 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002302
2303 class madstring(str):
2304 _rev = None
2305 def rev(self):
2306 if self._rev is not None:
2307 return self._rev
2308 L = list(self)
2309 L.reverse()
2310 self._rev = self.__class__("".join(L))
2311 return self._rev
2312 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002313 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2314 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2315 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002316 for i in range(256):
2317 s = madstring("".join(map(chr, range(i))))
2318 t = s.rev()
2319 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002320 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002321 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002322 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002323 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002324
Tim Peters8fa5dd02001-09-12 02:18:30 +00002325 base = "\x00" * 5
2326 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(s, base)
2328 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002329 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002330 vereq(hash(s), hash(base))
2331 vereq({s: 1}[base], 1)
2332 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002333 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002334 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002335 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002336 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002337 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002338 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002339 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002340 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002341 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002342 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002343 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002344 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002345 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002346 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002347 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002349 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002350 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002351 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002352 vereq(s.rstrip(), base)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002353 identitytab = {}
Tim Peters8fa5dd02001-09-12 02:18:30 +00002354 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002356 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002358 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002359 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002360 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002361 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002362 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002363 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002364 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002365 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002366
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002367 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002368 _rev = None
2369 def rev(self):
2370 if self._rev is not None:
2371 return self._rev
2372 L = list(self)
2373 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002374 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002375 return self._rev
2376 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002377 vereq(u, "ABCDEF")
2378 vereq(u.rev(), madunicode("FEDCBA"))
2379 vereq(u.rev().rev(), madunicode("ABCDEF"))
2380 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002381 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002382 vereq(str(u), base)
2383 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002384 vereq(hash(u), hash(base))
2385 vereq({u: 1}[base], 1)
2386 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002387 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002388 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002389 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002390 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002391 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002392 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002393 verify(u.replace("x", "x").__class__ is str)
2394 vereq(u.replace("x", "x"), base)
2395 verify(u.replace("xy", "xy").__class__ is str)
2396 vereq(u.replace("xy", "xy"), base)
2397 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002398 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002399 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002400 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002401 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002402 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002403 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002404 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002405 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002406 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002407 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002408 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002409 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002410 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002411 verify((u + "").__class__ is str)
2412 vereq(u + "", base)
2413 verify(("" + u).__class__ is str)
2414 vereq("" + u, base)
2415 verify((u * 0).__class__ is str)
2416 vereq(u * 0, "")
2417 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002418 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002419 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002420 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002421 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002422 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002423 verify(u[0:0].__class__ is str)
2424 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002425
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002426 class sublist(list):
2427 pass
2428 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002429 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002430 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002431 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002432 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002433 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002434 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002435 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002436 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002437 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002438 del a[10:15]
2439 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002440 vereq(a, list(range(10)))
2441 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002442 vereq(a[0], 0)
2443 vereq(a[9], 9)
2444 vereq(a[-10], 0)
2445 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002446 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002447
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002448## class CountedInput(file):
2449## """Counts lines read by self.readline().
Tim Peters59c9a642001-09-13 05:38:56 +00002450
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002451## self.lineno is the 0-based ordinal of the last line read, up to
2452## a maximum of one greater than the number of lines in the file.
Tim Peters59c9a642001-09-13 05:38:56 +00002453
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002454## self.ateof is true if and only if the final "" line has been read,
2455## at which point self.lineno stops incrementing, and further calls
2456## to readline() continue to return "".
2457## """
Tim Peters59c9a642001-09-13 05:38:56 +00002458
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002459## lineno = 0
2460## ateof = 0
2461## def readline(self):
2462## if self.ateof:
2463## return ""
2464## s = file.readline(self)
2465## # Next line works too.
2466## # s = super(CountedInput, self).readline()
2467## self.lineno += 1
2468## if s == "":
2469## self.ateof = 1
2470## return s
Tim Peters59c9a642001-09-13 05:38:56 +00002471
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002472## f = open(name=TESTFN, mode='w')
2473## lines = ['a\n', 'b\n', 'c\n']
2474## try:
2475## f.writelines(lines)
2476## f.close()
2477## f = CountedInput(TESTFN)
2478## for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
2479## got = f.readline()
2480## vereq(expected, got)
2481## vereq(f.lineno, i)
2482## vereq(f.ateof, (i > len(lines)))
2483## f.close()
2484## finally:
2485## try:
2486## f.close()
2487## except:
2488## pass
2489## try:
2490## import os
2491## os.unlink(TESTFN)
2492## except:
2493## pass
Tim Peters59c9a642001-09-13 05:38:56 +00002494
Tim Peters808b94e2001-09-13 19:33:07 +00002495def keywords():
2496 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002497 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002498 vereq(int(x=1), 1)
2499 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002500 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002501 vereq(complex(imag=42, real=666), complex(666, 42))
2502 vereq(str(object=500), '500')
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002503 vereq(str(object=b'abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002504 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002505 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002506 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002507
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002508 for constructor in (int, float, int, complex, str, str, tuple, list):
Tim Peters808b94e2001-09-13 19:33:07 +00002509 try:
2510 constructor(bogus_keyword_arg=1)
2511 except TypeError:
2512 pass
2513 else:
2514 raise TestFailed("expected TypeError from bogus keyword "
2515 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002516
Tim Peters0ab085c2001-09-14 00:25:33 +00002517def str_subclass_as_dict_key():
2518 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002519 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002520
2521 class cistr(str):
2522 """Sublcass of str that computes __eq__ case-insensitively.
2523
2524 Also computes a hash code of the string in canonical form.
2525 """
2526
2527 def __init__(self, value):
2528 self.canonical = value.lower()
2529 self.hashcode = hash(self.canonical)
2530
2531 def __eq__(self, other):
2532 if not isinstance(other, cistr):
2533 other = cistr(other)
2534 return self.canonical == other.canonical
2535
2536 def __hash__(self):
2537 return self.hashcode
2538
Guido van Rossum45704552001-10-08 16:35:45 +00002539 vereq(cistr('ABC'), 'abc')
2540 vereq('aBc', cistr('ABC'))
2541 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002542
2543 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002544 vereq(d[cistr('one')], 1)
2545 vereq(d[cistr('tWo')], 2)
2546 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002547 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002548 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002549
Guido van Rossumab3b0342001-09-18 20:38:53 +00002550def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002551 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002552 class classic:
2553 pass
2554 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002555 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002556 class C(base):
2557 def __init__(self, value):
2558 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002559 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002560 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002561 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002562 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002563 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002564 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002565 def __ne__(self, other):
2566 if isinstance(other, C):
2567 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002568 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002569 return self.value != other
2570 return NotImplemented
2571 def __lt__(self, other):
2572 if isinstance(other, C):
2573 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002574 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002575 return self.value < other
2576 return NotImplemented
2577 def __le__(self, other):
2578 if isinstance(other, C):
2579 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002580 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002581 return self.value <= other
2582 return NotImplemented
2583 def __gt__(self, other):
2584 if isinstance(other, C):
2585 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002586 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002587 return self.value > other
2588 return NotImplemented
2589 def __ge__(self, other):
2590 if isinstance(other, C):
2591 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002592 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002593 return self.value >= other
2594 return NotImplemented
2595
Guido van Rossumab3b0342001-09-18 20:38:53 +00002596 c1 = C(1)
2597 c2 = C(2)
2598 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002599 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002600 c = {1: c1, 2: c2, 3: c3}
2601 for x in 1, 2, 3:
2602 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002603 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002604 for op in "<", "<=", "==", "!=", ">", ">=":
2605 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2606 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002607 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2608 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002609
Guido van Rossum0639f592001-09-18 21:06:04 +00002610def rich_comparisons():
2611 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002612 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002613 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002614 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002615 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002616 vereq(z, 1+0j)
2617 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002618 class ZZ(complex):
2619 def __eq__(self, other):
2620 try:
2621 return abs(self - other) <= 1e-6
2622 except:
2623 return NotImplemented
2624 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002625 vereq(zz, 1+0j)
2626 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002627
Guido van Rossum0639f592001-09-18 21:06:04 +00002628 class classic:
2629 pass
2630 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002631 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002632 class C(base):
2633 def __init__(self, value):
2634 self.value = int(value)
2635 def __cmp__(self, other):
Collin Winter3add4d72007-08-29 23:37:32 +00002636 raise TestFailed("shouldn't call __cmp__")
Guido van Rossum0639f592001-09-18 21:06:04 +00002637 def __eq__(self, other):
2638 if isinstance(other, C):
2639 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002640 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002641 return self.value == other
2642 return NotImplemented
2643 def __ne__(self, other):
2644 if isinstance(other, C):
2645 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002646 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002647 return self.value != other
2648 return NotImplemented
2649 def __lt__(self, other):
2650 if isinstance(other, C):
2651 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002652 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002653 return self.value < other
2654 return NotImplemented
2655 def __le__(self, other):
2656 if isinstance(other, C):
2657 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002658 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002659 return self.value <= other
2660 return NotImplemented
2661 def __gt__(self, other):
2662 if isinstance(other, C):
2663 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002664 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002665 return self.value > other
2666 return NotImplemented
2667 def __ge__(self, other):
2668 if isinstance(other, C):
2669 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002670 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002671 return self.value >= other
2672 return NotImplemented
2673 c1 = C(1)
2674 c2 = C(2)
2675 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002676 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002677 c = {1: c1, 2: c2, 3: c3}
2678 for x in 1, 2, 3:
2679 for y in 1, 2, 3:
2680 for op in "<", "<=", "==", "!=", ">", ">=":
2681 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2682 "x=%d, y=%d" % (x, y))
2683 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2684 "x=%d, y=%d" % (x, y))
2685 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2686 "x=%d, y=%d" % (x, y))
2687
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002688def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002689 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002690 from _fileio import _FileIO
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002691 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002692 vereq(descr.__doc__, what)
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002693 check(_FileIO.closed, "True if the file is closed") # getset descriptor
2694 check(complex.real, "the real part of a complex number") # member descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002695
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002696def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002697 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002698 class C(object): pass
2699 class D(object): pass
2700 class E(object): pass
2701 class F(D, E): pass
2702 for cls in C, D, E, F:
2703 for cls2 in C, D, E, F:
2704 x = cls()
2705 x.__class__ = cls2
2706 verify(x.__class__ is cls2)
2707 x.__class__ = cls
2708 verify(x.__class__ is cls)
2709 def cant(x, C):
2710 try:
2711 x.__class__ = C
2712 except TypeError:
2713 pass
2714 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002715 raise TestFailed("shouldn't allow %r.__class__ = %r" % (x, C))
Guido van Rossumb6b89422002-04-15 01:03:30 +00002716 try:
2717 delattr(x, "__class__")
2718 except TypeError:
2719 pass
2720 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002721 raise TestFailed("shouldn't allow del %r.__class__" % x)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002722 cant(C(), list)
2723 cant(list(), C)
2724 cant(C(), 1)
2725 cant(C(), object)
2726 cant(object(), list)
2727 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002728 class Int(int): __slots__ = []
2729 cant(2, Int)
2730 cant(Int(), int)
2731 cant(True, int)
2732 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002733 o = object()
2734 cant(o, type(1))
2735 cant(o, type(None))
2736 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002737 class G(object):
2738 __slots__ = ["a", "b"]
2739 class H(object):
2740 __slots__ = ["b", "a"]
Walter Dörwald5de48bd2007-06-11 21:38:39 +00002741 class I(object):
2742 __slots__ = ["a", "b"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002743 class J(object):
2744 __slots__ = ["c", "b"]
2745 class K(object):
2746 __slots__ = ["a", "b", "d"]
2747 class L(H):
2748 __slots__ = ["e"]
2749 class M(I):
2750 __slots__ = ["e"]
2751 class N(J):
2752 __slots__ = ["__weakref__"]
2753 class P(J):
2754 __slots__ = ["__dict__"]
2755 class Q(J):
2756 pass
2757 class R(J):
2758 __slots__ = ["__dict__", "__weakref__"]
2759
2760 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2761 x = cls()
2762 x.a = 1
2763 x.__class__ = cls2
2764 verify(x.__class__ is cls2,
2765 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2766 vereq(x.a, 1)
2767 x.__class__ = cls
2768 verify(x.__class__ is cls,
2769 "assigning %r as __class__ for %r silently failed" % (cls, x))
2770 vereq(x.a, 1)
2771 for cls in G, J, K, L, M, N, P, R, list, Int:
2772 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2773 if cls is cls2:
2774 continue
2775 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002776
Guido van Rossum6661be32001-10-26 04:26:12 +00002777def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002778 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002779 class C(object): pass
2780 a = C()
2781 a.__dict__ = {'b': 1}
2782 vereq(a.b, 1)
2783 def cant(x, dict):
2784 try:
2785 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002786 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002787 pass
2788 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002789 raise TestFailed("shouldn't allow %r.__dict__ = %r" % (x, dict))
Guido van Rossum6661be32001-10-26 04:26:12 +00002790 cant(a, None)
2791 cant(a, [])
2792 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002793 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum360e4b82007-05-14 22:51:27 +00002794
2795 class Base(object):
2796 pass
2797 def verify_dict_readonly(x):
2798 """
2799 x has to be an instance of a class inheriting from Base.
2800 """
2801 cant(x, {})
2802 try:
2803 del x.__dict__
2804 except (AttributeError, TypeError):
2805 pass
2806 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002807 raise TestFailed("shouldn't allow del %r.__dict__" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002808 dict_descr = Base.__dict__["__dict__"]
2809 try:
2810 dict_descr.__set__(x, {})
2811 except (AttributeError, TypeError):
2812 pass
2813 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002814 raise TestFailed("dict_descr allowed access to %r's dict" % x)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002815
2816 # Classes don't allow __dict__ assignment and have readonly dicts
2817 class Meta1(type, Base):
2818 pass
2819 class Meta2(Base, type):
2820 pass
2821 class D(object):
2822 __metaclass__ = Meta1
2823 class E(object):
2824 __metaclass__ = Meta2
2825 for cls in C, D, E:
2826 verify_dict_readonly(cls)
2827 class_dict = cls.__dict__
2828 try:
2829 class_dict["spam"] = "eggs"
2830 except TypeError:
2831 pass
2832 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002833 raise TestFailed("%r's __dict__ can be modified" % cls)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002834
2835 # Modules also disallow __dict__ assignment
2836 class Module1(types.ModuleType, Base):
2837 pass
2838 class Module2(Base, types.ModuleType):
2839 pass
2840 for ModuleType in Module1, Module2:
2841 mod = ModuleType("spam")
2842 verify_dict_readonly(mod)
2843 mod.__dict__["spam"] = "eggs"
2844
2845 # Exception's __dict__ can be replaced, but not deleted
2846 class Exception1(Exception, Base):
2847 pass
2848 class Exception2(Base, Exception):
2849 pass
2850 for ExceptionType in Exception, Exception1, Exception2:
2851 e = ExceptionType()
2852 e.__dict__ = {"a": 1}
2853 vereq(e.a, 1)
2854 try:
2855 del e.__dict__
2856 except (TypeError, AttributeError):
2857 pass
2858 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002859 raise TestFaied("%r's __dict__ can be deleted" % e)
Guido van Rossum360e4b82007-05-14 22:51:27 +00002860
Guido van Rossum6661be32001-10-26 04:26:12 +00002861
Guido van Rossum3926a632001-09-25 16:25:58 +00002862def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002863 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002864 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002865 import pickle
Guido van Rossum3926a632001-09-25 16:25:58 +00002866
2867 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002868 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002869
2870 global C
2871 class C(object):
2872 def __init__(self, a, b):
2873 super(C, self).__init__()
2874 self.a = a
2875 self.b = b
2876 def __repr__(self):
2877 return "C(%r, %r)" % (self.a, self.b)
2878
2879 global C1
2880 class C1(list):
2881 def __new__(cls, a, b):
2882 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002883 def __getnewargs__(self):
2884 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002885 def __init__(self, a, b):
2886 self.a = a
2887 self.b = b
2888 def __repr__(self):
2889 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2890
2891 global C2
2892 class C2(int):
2893 def __new__(cls, a, b, val=0):
2894 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002895 def __getnewargs__(self):
2896 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002897 def __init__(self, a, b, val=0):
2898 self.a = a
2899 self.b = b
2900 def __repr__(self):
2901 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2902
Guido van Rossum90c45142001-11-24 21:07:01 +00002903 global C3
2904 class C3(object):
2905 def __init__(self, foo):
2906 self.foo = foo
2907 def __getstate__(self):
2908 return self.foo
2909 def __setstate__(self, foo):
2910 self.foo = foo
2911
2912 global C4classic, C4
2913 class C4classic: # classic
2914 pass
2915 class C4(C4classic, object): # mixed inheritance
2916 pass
2917
Guido van Rossum99603b02007-07-20 00:22:32 +00002918 for p in [pickle]:
Guido van Rossum3926a632001-09-25 16:25:58 +00002919 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002920 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002921 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002922
2923 for cls in C, C1, C2:
2924 s = p.dumps(cls, bin)
2925 cls2 = p.loads(s)
2926 verify(cls2 is cls)
2927
2928 a = C1(1, 2); a.append(42); a.append(24)
2929 b = C2("hello", "world", 42)
2930 s = p.dumps((a, b), bin)
2931 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002932 vereq(x.__class__, a.__class__)
2933 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2934 vereq(y.__class__, b.__class__)
2935 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002936 vereq(repr(x), repr(a))
2937 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002938 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002939 print("a = x =", a)
2940 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002941 # Test for __getstate__ and __setstate__ on new style class
2942 u = C3(42)
2943 s = p.dumps(u, bin)
2944 v = p.loads(s)
2945 veris(u.__class__, v.__class__)
2946 vereq(u.foo, v.foo)
2947 # Test for picklability of hybrid class
2948 u = C4()
2949 u.foo = 42
2950 s = p.dumps(u, bin)
2951 v = p.loads(s)
2952 veris(u.__class__, v.__class__)
2953 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002954
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002955 # Testing copy.deepcopy()
2956 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002957 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002958 import copy
2959 for cls in C, C1, C2:
2960 cls2 = copy.deepcopy(cls)
2961 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002962
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002963 a = C1(1, 2); a.append(42); a.append(24)
2964 b = C2("hello", "world", 42)
2965 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002966 vereq(x.__class__, a.__class__)
2967 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2968 vereq(y.__class__, b.__class__)
2969 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002970 vereq(repr(x), repr(a))
2971 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002972 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002973 print("a = x =", a)
2974 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002975
Guido van Rossum8c842552002-03-14 23:05:54 +00002976def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002977 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossum99603b02007-07-20 00:22:32 +00002978 import pickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002979 # Pickling of classes with __slots__ but without __getstate__ should fail
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002980 # (when using protocols 0 or 1)
Guido van Rossum8c842552002-03-14 23:05:54 +00002981 global B, C, D, E
2982 class B(object):
2983 pass
2984 for base in [object, B]:
2985 class C(base):
2986 __slots__ = ['a']
2987 class D(C):
2988 pass
2989 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002990 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002991 except TypeError:
2992 pass
2993 else:
Collin Winter3add4d72007-08-29 23:37:32 +00002994 raise TestFailed("should fail: pickle C instance - %s" % base)
Guido van Rossum8c842552002-03-14 23:05:54 +00002995 try:
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00002996 pickle.dumps(C(), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00002997 except TypeError:
2998 pass
2999 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003000 raise TestFailed("should fail: pickle D instance - %s" % base)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003001 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00003002 class C(base):
3003 __slots__ = ['a']
3004 def __getstate__(self):
3005 try:
3006 d = self.__dict__.copy()
3007 except AttributeError:
3008 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003009 for cls in self.__class__.__mro__:
3010 for sn in cls.__dict__.get('__slots__', ()):
3011 try:
3012 d[sn] = getattr(self, sn)
3013 except AttributeError:
3014 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00003015 return d
3016 def __setstate__(self, d):
3017 for k, v in d.items():
3018 setattr(self, k, v)
3019 class D(C):
3020 pass
3021 # Now it should work
3022 x = C()
3023 y = pickle.loads(pickle.dumps(x))
3024 vereq(hasattr(y, 'a'), 0)
Guido van Rossum8c842552002-03-14 23:05:54 +00003025 x.a = 42
3026 y = pickle.loads(pickle.dumps(x))
3027 vereq(y.a, 42)
Guido van Rossum8c842552002-03-14 23:05:54 +00003028 x = D()
3029 x.a = 42
3030 x.b = 100
3031 y = pickle.loads(pickle.dumps(x))
3032 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003033 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00003034 class E(C):
3035 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00003036 x = E()
3037 x.a = 42
3038 x.b = "foo"
3039 y = pickle.loads(pickle.dumps(x))
3040 vereq(y.a, x.a)
3041 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00003042
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003043def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003044 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003045 import copy
3046 class C(object):
3047 pass
3048
3049 a = C()
3050 a.foo = 12
3051 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003052 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003053
3054 a.bar = [1,2,3]
3055 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003056 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003057 verify(c.bar is a.bar)
3058
3059 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003060 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003061 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003062 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003063
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003064def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003065 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003066 class I(int):
3067 def __repr__(self):
3068 return "I(%r)" % int(self)
3069 def __add__(self, other):
3070 return I(int(self) + int(other))
3071 __radd__ = __add__
3072 def __pow__(self, other, mod=None):
3073 if mod is None:
3074 return I(pow(int(self), int(other)))
3075 else:
3076 return I(pow(int(self), int(other), int(mod)))
3077 def __rpow__(self, other, mod=None):
3078 if mod is None:
3079 return I(pow(int(other), int(self), mod))
3080 else:
3081 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003082
Walter Dörwald70a6b492004-02-12 17:35:32 +00003083 vereq(repr(I(1) + I(2)), "I(3)")
3084 vereq(repr(I(1) + 2), "I(3)")
3085 vereq(repr(1 + I(2)), "I(3)")
3086 vereq(repr(I(2) ** I(3)), "I(8)")
3087 vereq(repr(2 ** I(3)), "I(8)")
3088 vereq(repr(I(2) ** 3), "I(8)")
3089 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003090 class S(str):
3091 def __eq__(self, other):
3092 return self.lower() == other.lower()
3093
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003094def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003095 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003096 class A(object):
3097 pass
3098 class B(A):
3099 pass
3100 class C(A):
3101 pass
3102 class D(B, C):
3103 pass
3104 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003105 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003106 A.__hash__ = lambda self: 42
3107 vereq(hash(d), 42)
3108 C.__hash__ = lambda self: 314
3109 vereq(hash(d), 314)
3110 B.__hash__ = lambda self: 144
3111 vereq(hash(d), 144)
3112 D.__hash__ = lambda self: 100
3113 vereq(hash(d), 100)
3114 del D.__hash__
3115 vereq(hash(d), 144)
3116 del B.__hash__
3117 vereq(hash(d), 314)
3118 del C.__hash__
3119 vereq(hash(d), 42)
3120 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003121 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003122 d.foo = 42
3123 d.bar = 42
3124 vereq(d.foo, 42)
3125 vereq(d.bar, 42)
3126 def __getattribute__(self, name):
3127 if name == "foo":
3128 return 24
3129 return object.__getattribute__(self, name)
3130 A.__getattribute__ = __getattribute__
3131 vereq(d.foo, 24)
3132 vereq(d.bar, 42)
3133 def __getattr__(self, name):
3134 if name in ("spam", "foo", "bar"):
3135 return "hello"
Collin Winter3add4d72007-08-29 23:37:32 +00003136 raise AttributeError(name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003137 B.__getattr__ = __getattr__
3138 vereq(d.spam, "hello")
3139 vereq(d.foo, 24)
3140 vereq(d.bar, 42)
3141 del A.__getattribute__
3142 vereq(d.foo, 42)
3143 del d.foo
3144 vereq(d.foo, "hello")
3145 vereq(d.bar, 42)
3146 del B.__getattr__
3147 try:
3148 d.foo
3149 except AttributeError:
3150 pass
3151 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003152 raise TestFailed("d.foo should be undefined now")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003153
Guido van Rossume7f3e242002-06-14 02:35:45 +00003154 # Test a nasty bug in recurse_down_subclasses()
3155 import gc
3156 class A(object):
3157 pass
3158 class B(A):
3159 pass
3160 del B
3161 gc.collect()
3162 A.__setitem__ = lambda *a: None # crash
3163
Tim Petersfc57ccb2001-10-12 02:38:24 +00003164def buffer_inherit():
3165 import binascii
3166 # SF bug [#470040] ParseTuple t# vs subclasses.
3167 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003168 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003169
3170 class MyStr(str):
3171 pass
3172 base = 'abc'
3173 m = MyStr(base)
3174 # b2a_hex uses the buffer interface to get its argument's value, via
3175 # PyArg_ParseTuple 't#' code.
3176 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3177
3178 # It's not clear that unicode will continue to support the character
3179 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003180 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003181 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003182 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003183 m = MyUni(base)
3184 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3185
3186 class MyInt(int):
3187 pass
3188 m = MyInt(42)
3189 try:
3190 binascii.b2a_hex(m)
3191 raise TestFailed('subclass of int should not have a buffer interface')
3192 except TypeError:
3193 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003194
Tim Petersc9933152001-10-16 20:18:24 +00003195def str_of_str_subclass():
3196 import binascii
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003197 import io
Tim Petersc9933152001-10-16 20:18:24 +00003198
3199 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003200 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003201
3202 class octetstring(str):
3203 def __str__(self):
Guido van Rossum98297ee2007-11-06 21:34:58 +00003204 return binascii.b2a_hex(self).decode("ascii")
Tim Petersc9933152001-10-16 20:18:24 +00003205 def __repr__(self):
3206 return self + " repr"
3207
3208 o = octetstring('A')
3209 vereq(type(o), octetstring)
3210 vereq(type(str(o)), str)
3211 vereq(type(repr(o)), str)
3212 vereq(ord(o), 0x41)
3213 vereq(str(o), '41')
3214 vereq(repr(o), 'A repr')
3215 vereq(o.__str__(), '41')
3216 vereq(o.__repr__(), 'A repr')
3217
Guido van Rossum55b4a7b2007-07-11 09:28:11 +00003218 capture = io.StringIO()
Tim Petersc9933152001-10-16 20:18:24 +00003219 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003220 print(o, file=capture)
3221 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003222 vereq(capture.getvalue(), '41\n41\n')
3223 capture.close()
3224
Guido van Rossumc8e56452001-10-22 00:43:43 +00003225def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003226 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003227 def f(a): return a
3228 vereq(f.__call__(a=42), 42)
3229 a = []
3230 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003231 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003232
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003233def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003234 if verbose: print(("Testing recursive __call__() by setting to instance of "
3235 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003236 class A(object):
3237 pass
3238
3239 A.__call__ = A()
3240 try:
3241 A()()
3242 except RuntimeError:
3243 pass
3244 else:
3245 raise TestFailed("Recursion limit should have been reached for "
3246 "__call__()")
3247
Guido van Rossumed87ad82001-10-30 02:33:02 +00003248def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003249 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003250 log = []
3251 class C(object):
3252 def __del__(self):
3253 log.append(1)
3254 c = C()
3255 vereq(log, [])
3256 del c
3257 vereq(log, [1])
3258
Guido van Rossum29d26062001-12-11 04:37:34 +00003259 class D(object): pass
3260 d = D()
3261 try: del d[0]
3262 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003263 else: raise TestFailed("invalid del() didn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003264
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003265def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003266 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003267
3268 class mydict(dict):
3269 pass
3270 d = mydict()
3271 try:
3272 hash(d)
3273 except TypeError:
3274 pass
3275 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003276 raise TestFailed("hash() of dict subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003277
3278 class mylist(list):
3279 pass
3280 d = mylist()
3281 try:
3282 hash(d)
3283 except TypeError:
3284 pass
3285 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003286 raise TestFailed("hash() of list subclass should fail")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003287
Guido van Rossum29d26062001-12-11 04:37:34 +00003288def strops():
3289 try: 'a' + 5
3290 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003291 else: raise TestFailed("'' + 5 doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003292
3293 try: ''.split('')
3294 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003295 else: raise TestFailed("''.split('') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003296
Guido van Rossum29d26062001-12-11 04:37:34 +00003297 try: ''.rindex('5')
3298 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003299 else: raise TestFailed("''.rindex('5') doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003300
Guido van Rossum29d26062001-12-11 04:37:34 +00003301 try: '%(n)s' % None
3302 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003303 else: raise TestFailed("'%(n)s' % None doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003304
3305 try: '%(n' % {}
3306 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003307 else: raise TestFailed("'%(n' % {} '' doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003308
3309 try: '%*s' % ('abc')
3310 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003311 else: raise TestFailed("'%*s' % ('abc') doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003312
3313 try: '%*.*s' % ('abc', 5)
3314 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003315 else: raise TestFailed("'%*.*s' % ('abc', 5) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003316
3317 try: '%s' % (1, 2)
3318 except TypeError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003319 else: raise TestFailed("'%s' % (1, 2) doesn't raise TypeError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003320
3321 try: '%' % None
3322 except ValueError: pass
Collin Winter3add4d72007-08-29 23:37:32 +00003323 else: raise TestFailed("'%' % None doesn't raise ValueError")
Guido van Rossum29d26062001-12-11 04:37:34 +00003324
3325 vereq('534253'.isdigit(), 1)
3326 vereq('534253x'.isdigit(), 0)
3327 vereq('%c' % 5, '\x05')
3328 vereq('%c' % '5', '5')
3329
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003330def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003331 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003332 class Node:
3333 pass
3334 a = Node()
3335 b = Node()
3336 a.b = b
3337 b.a = a
3338 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003339
Guido van Rossumd7035672002-03-12 20:43:31 +00003340def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003341 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003342 from types import ModuleType as M
3343 m = M.__new__(M)
3344 str(m)
3345 vereq(hasattr(m, "__name__"), 0)
3346 vereq(hasattr(m, "__file__"), 0)
3347 vereq(hasattr(m, "foo"), 0)
3348 vereq(m.__dict__, None)
3349 m.foo = 1
3350 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003351
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003352def dictproxyiterkeys():
3353 class C(object):
3354 def meth(self):
3355 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003356 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003357 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003358 keys.sort()
3359 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3360
3361def dictproxyitervalues():
3362 class C(object):
3363 def meth(self):
3364 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003365 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003366 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003367 vereq(len(values), 5)
3368
3369def dictproxyiteritems():
3370 class C(object):
3371 def meth(self):
3372 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003373 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003374 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003375 keys.sort()
3376 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3377
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003378def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003379 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003380 class C(object):
3381 def __new__(cls, arg):
3382 if isinstance(arg, str): return [1, 2, 3]
3383 elif isinstance(arg, int): return object.__new__(D)
3384 else: return object.__new__(cls)
3385 class D(C):
3386 def __init__(self, arg):
3387 self.foo = arg
3388 vereq(C("1"), [1, 2, 3])
3389 vereq(D("1"), [1, 2, 3])
3390 d = D(None)
3391 veris(d.foo, None)
3392 d = C(1)
3393 vereq(isinstance(d, D), True)
3394 vereq(d.foo, 1)
3395 d = D(1)
3396 vereq(isinstance(d, D), True)
3397 vereq(d.foo, 1)
3398
Guido van Rossume8fc6402002-04-16 16:44:51 +00003399def imulbug():
3400 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003401 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003402 class C(object):
3403 def __imul__(self, other):
3404 return (self, other)
3405 x = C()
3406 y = x
3407 y *= 1.0
3408 vereq(y, (x, 1.0))
3409 y = x
3410 y *= 2
3411 vereq(y, (x, 2))
3412 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003413 y *= 3
3414 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003415 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003416 y *= 1<<100
3417 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003418 y = x
3419 y *= None
3420 vereq(y, (x, None))
3421 y = x
3422 y *= "foo"
3423 vereq(y, (x, "foo"))
3424
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003425def docdescriptor():
3426 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003427 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003428 class DocDescr(object):
3429 def __get__(self, object, otype):
3430 if object:
3431 object = object.__class__.__name__ + ' instance'
3432 if otype:
3433 otype = otype.__name__
3434 return 'object=%s; type=%s' % (object, otype)
3435 class OldClass:
3436 __doc__ = DocDescr()
3437 class NewClass(object):
3438 __doc__ = DocDescr()
3439 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3440 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3441 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3442 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3443
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003444def copy_setstate():
3445 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003446 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003447 import copy
3448 class C(object):
3449 def __init__(self, foo=None):
3450 self.foo = foo
3451 self.__foo = foo
3452 def setfoo(self, foo=None):
3453 self.foo = foo
3454 def getfoo(self):
3455 return self.__foo
3456 def __getstate__(self):
3457 return [self.foo]
3458 def __setstate__(self, lst):
3459 assert len(lst) == 1
3460 self.__foo = self.foo = lst[0]
3461 a = C(42)
3462 a.setfoo(24)
3463 vereq(a.foo, 24)
3464 vereq(a.getfoo(), 42)
3465 b = copy.copy(a)
3466 vereq(b.foo, 24)
3467 vereq(b.getfoo(), 24)
3468 b = copy.deepcopy(a)
3469 vereq(b.foo, 24)
3470 vereq(b.getfoo(), 24)
3471
Guido van Rossum09638c12002-06-13 19:17:46 +00003472def slices():
3473 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003474 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003475 # Strings
3476 vereq("hello"[:4], "hell")
3477 vereq("hello"[slice(4)], "hell")
3478 vereq(str.__getitem__("hello", slice(4)), "hell")
3479 class S(str):
3480 def __getitem__(self, x):
3481 return str.__getitem__(self, x)
3482 vereq(S("hello")[:4], "hell")
3483 vereq(S("hello")[slice(4)], "hell")
3484 vereq(S("hello").__getitem__(slice(4)), "hell")
3485 # Tuples
3486 vereq((1,2,3)[:2], (1,2))
3487 vereq((1,2,3)[slice(2)], (1,2))
3488 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3489 class T(tuple):
3490 def __getitem__(self, x):
3491 return tuple.__getitem__(self, x)
3492 vereq(T((1,2,3))[:2], (1,2))
3493 vereq(T((1,2,3))[slice(2)], (1,2))
3494 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3495 # Lists
3496 vereq([1,2,3][:2], [1,2])
3497 vereq([1,2,3][slice(2)], [1,2])
3498 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3499 class L(list):
3500 def __getitem__(self, x):
3501 return list.__getitem__(self, x)
3502 vereq(L([1,2,3])[:2], [1,2])
3503 vereq(L([1,2,3])[slice(2)], [1,2])
3504 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3505 # Now do lists and __setitem__
3506 a = L([1,2,3])
3507 a[slice(1, 3)] = [3,2]
3508 vereq(a, [1,3,2])
3509 a[slice(0, 2, 1)] = [3,1]
3510 vereq(a, [3,1,2])
3511 a.__setitem__(slice(1, 3), [2,1])
3512 vereq(a, [3,2,1])
3513 a.__setitem__(slice(0, 2, 1), [2,3])
3514 vereq(a, [2,3,1])
3515
Tim Peters2484aae2002-07-11 06:56:07 +00003516def subtype_resurrection():
3517 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003518 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003519
3520 class C(object):
3521 container = []
3522
3523 def __del__(self):
3524 # resurrect the instance
3525 C.container.append(self)
3526
3527 c = C()
3528 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003529 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003530 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003531 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003532
3533 # If that didn't blow up, it's also interesting to see whether clearing
3534 # the last container slot works: that will attempt to delete c again,
3535 # which will cause c to get appended back to the container again "during"
3536 # the del.
3537 del C.container[-1]
3538 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003539 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003540
Tim Peters14cb1e12002-07-11 18:26:21 +00003541 # Make c mortal again, so that the test framework with -l doesn't report
3542 # it as a leak.
3543 del C.__del__
3544
Guido van Rossum2d702462002-08-06 21:28:28 +00003545def slottrash():
3546 # Deallocating deeply nested slotted trash caused stack overflows
3547 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003548 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003549 class trash(object):
3550 __slots__ = ['x']
3551 def __init__(self, x):
3552 self.x = x
3553 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003554 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003555 o = trash(o)
3556 del o
3557
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003558def slotmultipleinheritance():
3559 # SF bug 575229, multiple inheritance w/ slots dumps core
3560 class A(object):
3561 __slots__=()
3562 class B(object):
3563 pass
3564 class C(A,B) :
3565 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003566 vereq(C.__basicsize__, B.__basicsize__)
3567 verify(hasattr(C, '__dict__'))
3568 verify(hasattr(C, '__weakref__'))
3569 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003570
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003571def testrmul():
3572 # SF patch 592646
3573 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003574 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003575 class C(object):
3576 def __mul__(self, other):
3577 return "mul"
3578 def __rmul__(self, other):
3579 return "rmul"
3580 a = C()
3581 vereq(a*2, "mul")
3582 vereq(a*2.2, "mul")
3583 vereq(2*a, "rmul")
3584 vereq(2.2*a, "rmul")
3585
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003586def testipow():
3587 # [SF bug 620179]
3588 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003589 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003590 class C(object):
3591 def __ipow__(self, other):
3592 pass
3593 a = C()
3594 a **= 2
3595
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003596def do_this_first():
3597 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003598 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003599 # This dumps core when SF bug 551412 isn't fixed --
3600 # but only when test_descr.py is run separately.
3601 # (That can't be helped -- as soon as PyType_Ready()
3602 # is called for PyLong_Type, the bug is gone.)
3603 class UserLong(object):
3604 def __pow__(self, *args):
3605 pass
3606 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003607 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003608 except:
3609 pass
3610
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003611 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003612 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003613 # Another segfault only when run early
3614 # (before PyType_Ready(tuple) is called)
3615 type.mro(tuple)
3616
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003617def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003618 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003619 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003620 # stuff that should work:
3621 class C(object):
3622 pass
3623 class C2(object):
3624 def __getattribute__(self, attr):
3625 if attr == 'a':
3626 return 2
3627 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003628 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003629 def meth(self):
3630 return 1
3631 class D(C):
3632 pass
3633 class E(D):
3634 pass
3635 d = D()
3636 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003637 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003638 D.__bases__ = (C2,)
3639 vereq(d.meth(), 1)
3640 vereq(e.meth(), 1)
3641 vereq(d.a, 2)
3642 vereq(e.a, 2)
3643 vereq(C2.__subclasses__(), [D])
3644
3645 # stuff that shouldn't:
3646 class L(list):
3647 pass
3648
3649 try:
3650 L.__bases__ = (dict,)
3651 except TypeError:
3652 pass
3653 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003654 raise TestFailed("shouldn't turn list subclass into dict subclass")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003655
3656 try:
3657 list.__bases__ = (dict,)
3658 except TypeError:
3659 pass
3660 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003661 raise TestFailed("shouldn't be able to assign to list.__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003662
3663 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003664 D.__bases__ = (C2, list)
3665 except TypeError:
3666 pass
3667 else:
3668 assert 0, "best_base calculation found wanting"
3669
3670 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003671 del D.__bases__
3672 except TypeError:
3673 pass
3674 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003675 raise TestFailed("shouldn't be able to delete .__bases__")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003676
3677 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003678 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003679 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003680 if str(msg) == "a new-style class can't have only classic bases":
Collin Winter3add4d72007-08-29 23:37:32 +00003681 raise TestFailed("wrong error message for .__bases__ = ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003682 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003683 raise TestFailed("shouldn't be able to set .__bases__ to ()")
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003684
3685 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003686 D.__bases__ = (D,)
3687 except TypeError:
3688 pass
3689 else:
3690 # actually, we'll have crashed by here...
Collin Winter3add4d72007-08-29 23:37:32 +00003691 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003692
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003693 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003694 D.__bases__ = (C, C)
3695 except TypeError:
3696 pass
3697 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003698 raise TestFailed("didn't detect repeated base classes")
Michael W. Hudsone723e452003-08-07 14:58:10 +00003699
3700 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003701 D.__bases__ = (E,)
3702 except TypeError:
3703 pass
3704 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003705 raise TestFailed("shouldn't be able to create inheritance cycles")
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003706
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003707def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003708 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003709 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003710 class WorkOnce(type):
3711 def __new__(self, name, bases, ns):
3712 self.flag = 0
3713 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3714 def mro(self):
3715 if self.flag > 0:
Collin Winter3add4d72007-08-29 23:37:32 +00003716 raise RuntimeError("bozo")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003717 else:
3718 self.flag += 1
3719 return type.mro(self)
3720
3721 class WorkAlways(type):
3722 def mro(self):
3723 # this is here to make sure that .mro()s aren't called
3724 # with an exception set (which was possible at one point).
3725 # An error message will be printed in a debug build.
3726 # What's a good way to test for this?
3727 return type.mro(self)
3728
3729 class C(object):
3730 pass
3731
3732 class C2(object):
3733 pass
3734
3735 class D(C):
3736 pass
3737
3738 class E(D):
3739 pass
3740
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003741 class F(D, metaclass=WorkOnce):
3742 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003743
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003744 class G(D, metaclass=WorkAlways):
3745 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003746
3747 # Immediate subclasses have their mro's adjusted in alphabetical
3748 # order, so E's will get adjusted before adjusting F's fails. We
3749 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003750
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003751 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003752 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003753
3754 try:
3755 D.__bases__ = (C2,)
3756 except RuntimeError:
3757 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003758 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003759 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003760 raise TestFailed("exception not propagated")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003761
3762def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003763 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003764 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003765 class A(object):
3766 pass
3767
3768 class B(object):
3769 pass
3770
3771 class C(A, B):
3772 pass
3773
3774 class D(A, B):
3775 pass
3776
3777 class E(C, D):
3778 pass
3779
3780 try:
3781 C.__bases__ = (B, A)
3782 except TypeError:
3783 pass
3784 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003785 raise TestFailed("didn't catch MRO conflict")
Tim Peters6578dc92002-12-24 18:31:27 +00003786
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003787def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003788 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003789 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003790 class C(object):
3791 pass
3792
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003793 # C.__module__ could be 'test_descr' or '__main__'
3794 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003795
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003796 C.__name__ = 'D'
3797 vereq((C.__module__, C.__name__), (mod, 'D'))
3798
3799 C.__name__ = 'D.E'
3800 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003801
Guido van Rossum613f24f2003-01-06 23:00:59 +00003802def subclass_right_op():
3803 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003804 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003805
3806 # This code tests various cases where right-dispatch of a subclass
3807 # should be preferred over left-dispatch of a base class.
3808
3809 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3810
3811 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003812 def __floordiv__(self, other):
3813 return "B.__floordiv__"
3814 def __rfloordiv__(self, other):
3815 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003816
Guido van Rossumf389c772003-02-27 20:04:19 +00003817 vereq(B(1) // 1, "B.__floordiv__")
3818 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003819
3820 # Case 2: subclass of object; this is just the baseline for case 3
3821
3822 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003823 def __floordiv__(self, other):
3824 return "C.__floordiv__"
3825 def __rfloordiv__(self, other):
3826 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003827
Guido van Rossumf389c772003-02-27 20:04:19 +00003828 vereq(C() // 1, "C.__floordiv__")
3829 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003830
3831 # Case 3: subclass of new-style class; here it gets interesting
3832
3833 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003834 def __floordiv__(self, other):
3835 return "D.__floordiv__"
3836 def __rfloordiv__(self, other):
3837 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003838
Guido van Rossumf389c772003-02-27 20:04:19 +00003839 vereq(D() // C(), "D.__floordiv__")
3840 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003841
3842 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3843
3844 class E(C):
3845 pass
3846
Guido van Rossumf389c772003-02-27 20:04:19 +00003847 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003848
Guido van Rossumf389c772003-02-27 20:04:19 +00003849 vereq(E() // 1, "C.__floordiv__")
3850 vereq(1 // E(), "C.__rfloordiv__")
3851 vereq(E() // C(), "C.__floordiv__")
3852 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003853
Guido van Rossum373c7412003-01-07 13:41:37 +00003854def dict_type_with_metaclass():
3855 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003856 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003857
3858 class B(object):
3859 pass
3860 class M(type):
3861 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003862 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003863 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003864 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003865 veris(type(C.__dict__), type(B.__dict__))
3866
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003867def meth_class_get():
3868 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003869 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003870 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003871 # Baseline
3872 arg = [1, 2, 3]
3873 res = {1: None, 2: None, 3: None}
3874 vereq(dict.fromkeys(arg), res)
3875 vereq({}.fromkeys(arg), res)
3876 # Now get the descriptor
3877 descr = dict.__dict__["fromkeys"]
3878 # More baseline using the descriptor directly
3879 vereq(descr.__get__(None, dict)(arg), res)
3880 vereq(descr.__get__({})(arg), res)
3881 # Now check various error cases
3882 try:
3883 descr.__get__(None, None)
3884 except TypeError:
3885 pass
3886 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003887 raise TestFailed("shouldn't have allowed descr.__get__(None, None)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003888 try:
3889 descr.__get__(42)
3890 except TypeError:
3891 pass
3892 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003893 raise TestFailed("shouldn't have allowed descr.__get__(42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003894 try:
3895 descr.__get__(None, 42)
3896 except TypeError:
3897 pass
3898 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003899 raise TestFailed("shouldn't have allowed descr.__get__(None, 42)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003900 try:
3901 descr.__get__(None, int)
3902 except TypeError:
3903 pass
3904 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003905 raise TestFailed("shouldn't have allowed descr.__get__(None, int)")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003906
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003907def isinst_isclass():
3908 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003909 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003910 class Proxy(object):
3911 def __init__(self, obj):
3912 self.__obj = obj
3913 def __getattribute__(self, name):
3914 if name.startswith("_Proxy__"):
3915 return object.__getattribute__(self, name)
3916 else:
3917 return getattr(self.__obj, name)
3918 # Test with a classic class
3919 class C:
3920 pass
3921 a = C()
3922 pa = Proxy(a)
3923 verify(isinstance(a, C)) # Baseline
3924 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003925 # Test with a classic subclass
3926 class D(C):
3927 pass
3928 a = D()
3929 pa = Proxy(a)
3930 verify(isinstance(a, C)) # Baseline
3931 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003932 # Test with a new-style class
3933 class C(object):
3934 pass
3935 a = C()
3936 pa = Proxy(a)
3937 verify(isinstance(a, C)) # Baseline
3938 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003939 # Test with a new-style subclass
3940 class D(C):
3941 pass
3942 a = D()
3943 pa = Proxy(a)
3944 verify(isinstance(a, C)) # Baseline
3945 verify(isinstance(pa, C)) # Test
3946
3947def proxysuper():
3948 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003949 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003950 class Proxy(object):
3951 def __init__(self, obj):
3952 self.__obj = obj
3953 def __getattribute__(self, name):
3954 if name.startswith("_Proxy__"):
3955 return object.__getattribute__(self, name)
3956 else:
3957 return getattr(self.__obj, name)
3958
3959 class B(object):
3960 def f(self):
3961 return "B.f"
3962
3963 class C(B):
3964 def f(self):
3965 return super(C, self).f() + "->C.f"
3966
3967 obj = C()
3968 p = Proxy(obj)
3969 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003970
Guido van Rossum52b27052003-04-15 20:05:10 +00003971def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003972 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003973 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003974 try:
3975 object.__setattr__(str, "foo", 42)
3976 except TypeError:
3977 pass
3978 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003979 raise TestFailed("Carlo Verre __setattr__ suceeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003980 try:
3981 object.__delattr__(str, "lower")
3982 except TypeError:
3983 pass
3984 else:
Collin Winter3add4d72007-08-29 23:37:32 +00003985 raise TestFailed("Carlo Verre __delattr__ succeeded!")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003986
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003987def weakref_segfault():
3988 # SF 742911
3989 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003990 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003991
3992 import weakref
3993
3994 class Provoker:
3995 def __init__(self, referrent):
3996 self.ref = weakref.ref(referrent)
3997
3998 def __del__(self):
3999 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004000
4001 class Oops(object):
4002 pass
4003
4004 o = Oops()
4005 o.whatever = Provoker(o)
4006 del o
4007
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004008def wrapper_segfault():
4009 # SF 927248: deeply nested wrappers could cause stack overflow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004010 if verbose:
4011 print("Testing wrapper segfault...")
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004012 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00004013 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004014 f = f.__call__
4015 f = None
4016
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004017# Fix SF #762455, segfault when sys.stdout is changed in getattr
4018def filefault():
4019 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004020 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004021 import sys
4022 class StdoutGuard:
4023 def __getattr__(self, attr):
4024 sys.stdout = sys.__stdout__
4025 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
4026 sys.stdout = StdoutGuard()
4027 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004028 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004029 except RuntimeError:
4030 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004031
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004032def vicious_descriptor_nonsense():
4033 # A potential segfault spotted by Thomas Wouters in mail to
4034 # python-dev 2003-04-17, turned into an example & fixed by Michael
4035 # Hudson just less than four months later...
4036 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004037 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004038
4039 class Evil(object):
4040 def __hash__(self):
4041 return hash('attr')
4042 def __eq__(self, other):
4043 del C.attr
4044 return 0
4045
4046 class Descr(object):
4047 def __get__(self, ob, type=None):
4048 return 1
4049
4050 class C(object):
4051 attr = Descr()
4052
4053 c = C()
4054 c.__dict__[Evil()] = 0
4055
4056 vereq(c.attr, 1)
4057 # this makes a crash more likely:
4058 import gc; gc.collect()
4059 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004060
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004061def test_init():
4062 # SF 1155938
4063 class Foo(object):
4064 def __init__(self):
4065 return 10
4066 try:
4067 Foo()
4068 except TypeError:
4069 pass
4070 else:
Collin Winter3add4d72007-08-29 23:37:32 +00004071 raise TestFailed("did not test __init__() for None return")
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004072
Armin Rigoc6686b72005-11-07 08:38:00 +00004073def methodwrapper():
4074 # <type 'method-wrapper'> did not support any reflection before 2.5
4075 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004076 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004077
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004078 return # XXX should methods really support __eq__?
4079
Armin Rigoc6686b72005-11-07 08:38:00 +00004080 l = []
4081 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004082 vereq(l.__add__, [].__add__)
4083 verify(l.__add__ != [5].__add__)
4084 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004085 verify(l.__add__.__name__ == '__add__')
4086 verify(l.__add__.__self__ is l)
4087 verify(l.__add__.__objclass__ is list)
4088 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004089 try:
4090 hash(l.__add__)
4091 except TypeError:
4092 pass
4093 else:
4094 raise TestFailed("no TypeError from hash([].__add__)")
4095
4096 t = ()
4097 t += (7,)
4098 vereq(t.__add__, (7,).__add__)
4099 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004100
Armin Rigofd163f92005-12-29 15:59:19 +00004101def notimplemented():
4102 # all binary methods should be able to return a NotImplemented
4103 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004104 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004105
4106 import sys
4107 import types
4108 import operator
4109
4110 def specialmethod(self, other):
4111 return NotImplemented
4112
4113 def check(expr, x, y):
4114 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004115 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004116 except TypeError:
4117 pass
4118 else:
4119 raise TestFailed("no TypeError from %r" % (expr,))
4120
Guido van Rossume2a383d2007-01-15 16:59:06 +00004121 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004122 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4123 # ValueErrors instead of TypeErrors
Guido van Rossum13257902007-06-07 23:15:56 +00004124 if 1:
4125 metaclass = type
Armin Rigofd163f92005-12-29 15:59:19 +00004126 for name, expr, iexpr in [
4127 ('__add__', 'x + y', 'x += y'),
4128 ('__sub__', 'x - y', 'x -= y'),
4129 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004130 ('__truediv__', 'x / y', None),
4131 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004132 ('__mod__', 'x % y', 'x %= y'),
4133 ('__divmod__', 'divmod(x, y)', None),
4134 ('__pow__', 'x ** y', 'x **= y'),
4135 ('__lshift__', 'x << y', 'x <<= y'),
4136 ('__rshift__', 'x >> y', 'x >>= y'),
4137 ('__and__', 'x & y', 'x &= y'),
4138 ('__or__', 'x | y', 'x |= y'),
4139 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004140 ]:
4141 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004142 A = metaclass('A', (), {name: specialmethod})
4143 B = metaclass('B', (), {rname: specialmethod})
4144 a = A()
4145 b = B()
4146 check(expr, a, a)
4147 check(expr, a, b)
4148 check(expr, b, a)
4149 check(expr, b, b)
4150 check(expr, a, N1)
4151 check(expr, a, N2)
4152 check(expr, N1, b)
4153 check(expr, N2, b)
4154 if iexpr:
4155 check(iexpr, a, a)
4156 check(iexpr, a, b)
4157 check(iexpr, b, a)
4158 check(iexpr, b, b)
4159 check(iexpr, a, N1)
4160 check(iexpr, a, N2)
4161 iname = '__i' + name[2:]
4162 C = metaclass('C', (), {iname: specialmethod})
4163 c = C()
4164 check(iexpr, c, a)
4165 check(iexpr, c, b)
4166 check(iexpr, c, N1)
4167 check(iexpr, c, N2)
4168
Guido van Rossumd8faa362007-04-27 19:54:29 +00004169def test_assign_slice():
4170 # ceval.c's assign_slice used to check for
4171 # tp->tp_as_sequence->sq_slice instead of
4172 # tp->tp_as_sequence->sq_ass_slice
4173
4174 class C(object):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00004175 def __setitem__(self, idx, value):
Guido van Rossumd8faa362007-04-27 19:54:29 +00004176 self.value = value
4177
4178 c = C()
4179 c[1:2] = 3
4180 vereq(c.value, 3)
4181
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004182def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004183 weakref_segfault() # Must be first, somehow
Guido van Rossum25d0bd62007-07-20 17:10:16 +00004184 wrapper_segfault() # NB This one is slow
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004185 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004186 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004187 lists()
4188 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004189 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004190 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004191 ints()
4192 longs()
4193 floats()
4194 complexes()
4195 spamlists()
4196 spamdicts()
4197 pydicts()
4198 pylists()
4199 metaclass()
4200 pymods()
4201 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004202 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004203 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004204 ex5()
4205 monotonicity()
4206 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004207 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004208 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004209 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004210 dynamics()
4211 errors()
4212 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004213 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004214 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004215 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004216 classic()
4217 compattr()
4218 newslot()
4219 altmro()
4220 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004221 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004222 specials()
Thomas Wouters89d996e2007-09-08 17:39:28 +00004223 recursions()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004224 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004225 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004226 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004227 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004228 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004229 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004230 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004231 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004232 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004233 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004234 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004235 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004236 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004237 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004238 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004239 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004240 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004241 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004242 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004243 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004244 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004245 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004246 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004247 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004248 dictproxyiterkeys()
4249 dictproxyitervalues()
4250 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004251 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004252 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004253 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004254 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004255 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004256 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004257 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004258 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004259 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004260 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004261 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004262 test_mutable_bases()
4263 test_mutable_bases_with_failing_mro()
4264 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004265 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004266 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004267 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004268 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004269 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004270 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004271 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004272 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004273 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004274 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004275 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004276 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004277 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004278
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004279 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004280
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004281if __name__ == "__main__":
4282 test_main()