blob: 2132b8d4b03745be6fb577a9ef9e6428b95a2057 [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
Neal Norwitz1a997502003-01-13 20:13:12 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000016 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000017 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000029 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000030 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
Guido van Rossum45704552001-10-08 16:35:45 +000032 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000033 t = type(a)
34 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000035 while meth not in t.__dict__:
36 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000037 vereq(m, t.__dict__[meth])
38 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000040 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000041
42def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000043 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000045 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046 t = type(a)
47 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000048 while meth not in t.__dict__:
49 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000050 vereq(m, t.__dict__[meth])
51 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000053 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054
55def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000056 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000057 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000058 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000059 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000060 t = type(a)
61 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000062 while meth not in t.__dict__:
63 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000064 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000065 dict['a'] = deepcopy(a)
66 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000067 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000068 dict['a'] = deepcopy(a)
69 bm = getattr(dict['a'], meth)
70 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072
73def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000074 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000075 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000076 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000077 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000078 t = type(a)
79 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000080 while meth not in t.__dict__:
81 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000082 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000083 dict['a'] = deepcopy(a)
84 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000085 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000086 dict['a'] = deepcopy(a)
87 bm = getattr(dict['a'], meth)
88 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090
91def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000092 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000093 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000094 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000095 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000096 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000097 while meth not in t.__dict__:
98 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000099 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000100 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101 dict['a'] = deepcopy(a)
102 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000103 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000104 dict['a'] = deepcopy(a)
105 bm = getattr(dict['a'], meth)
106 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108
Tim Peters2f93e282001-10-04 05:27:00 +0000109def class_docstrings():
110 class Classic:
111 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000112 vereq(Classic.__doc__, "A classic docstring.")
113 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000114
115 class Classic2:
116 pass
117 verify(Classic2.__doc__ is None)
118
Tim Peters4fb1fe82001-10-04 05:48:13 +0000119 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000120 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000121 vereq(NewStatic.__doc__, "Another docstring.")
122 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000123
Tim Peters4fb1fe82001-10-04 05:48:13 +0000124 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000125 pass
126 verify(NewStatic2.__doc__ is None)
127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000130 vereq(NewDynamic.__doc__, "Another docstring.")
131 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000132
Tim Peters4fb1fe82001-10-04 05:48:13 +0000133 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000134 pass
135 verify(NewDynamic2.__doc__ is None)
136
Tim Peters6d6c1a32001-08-02 04:15:00 +0000137def lists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000138 if verbose: print("Testing list operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000139 testbinop([1], [2], [1,2], "a+b", "__add__")
140 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
141 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
142 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
143 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
144 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
145 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
146 testunop([1,2,3], 3, "len(a)", "__len__")
147 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
148 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
149 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
150 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
151
152def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000153 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000154 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000155 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
156 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
157 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
158 d = {1:2,3:4}
159 l1 = []
160 for i in d.keys(): l1.append(i)
161 l = []
162 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000163 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 l = []
165 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000166 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000167 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000168 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000169 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 d = {1:2, 3:4}
171 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000172 vereq(eval(repr(d), {}), d)
173 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
175
Tim Peters25786c02001-09-02 08:22:48 +0000176def dict_constructor():
177 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000178 print("Testing dict constructor ...")
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({})
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000186 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000187 d = dict({'one':1, 'two':2})
188 vereq(d, dict(one=1, two=2))
189 vereq(d, dict(**d))
190 vereq(d, dict({"one": 1}, two=2))
191 vereq(d, dict([("two", 2)], one=1))
192 vereq(d, dict([("one", 100), ("two", 200)], **d))
193 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000194 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000195 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000196 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000197 except TypeError:
198 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000199 except ValueError:
200 if badarg == "0":
201 # It's a sequence, and its elements are also sequences (gotta
202 # love strings <wink>), but they aren't of length 2, so this
203 # one seemed better as a ValueError than a TypeError.
204 pass
205 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 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000208 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000209
210 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000211 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000212 except TypeError:
213 pass
214 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000216
217 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000218 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000219 dict = {1:2, 3:4, 'a':1j}
220
Tim Peters25786c02001-09-02 08:22:48 +0000221 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000222 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000223 except TypeError:
224 pass
225 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000226 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000227
228 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000229 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000230 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000231 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000232
Tim Peters1fc240e2001-10-26 05:06:50 +0000233 # Init from sequence of iterable objects, each producing a 2-sequence.
234 class AddressBookEntry:
235 def __init__(self, first, last):
236 self.first = first
237 self.last = last
238 def __iter__(self):
239 return iter([self.first, self.last])
240
Tim Petersa427a2b2001-10-29 22:25:45 +0000241 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000242 AddressBookEntry('Barry', 'Peters'),
243 AddressBookEntry('Tim', 'Peters'),
244 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000245 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
246
Tim Petersa427a2b2001-10-29 22:25:45 +0000247 d = dict(zip(range(4), range(1, 5)))
248 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000249
250 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000251 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000252 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000253 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000254 except ValueError:
255 pass
256 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000257 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000258
Tim Peters5d2b77c2001-09-03 05:47:38 +0000259def test_dir():
260 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000261 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000262 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000263 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264 del junk
265
266 # Just make sure these don't blow up!
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000267 for arg in 2, 2, 2j, 2e0, [2], "2", "2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000268 dir(arg)
269
Thomas Wouters0725cf22006-04-15 09:04:57 +0000270 # Test dir on custom classes. Since these have object as a
271 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000272 def interesting(strings):
273 return [s for s in strings if not s.startswith('_')]
274
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275 class C(object):
276 Cdata = 1
277 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000278
279 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000281
282 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000284 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000285
286 c.cdata = 2
287 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000288 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000289 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000290
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291 class A(C):
292 Adata = 1
293 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000294
295 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000296 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000297 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000298 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000300 a.adata = 42
301 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000302 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000303 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000304
Tim Peterscaaff8d2001-09-10 23:12:14 +0000305 # Try a module subclass.
306 import sys
307 class M(type(sys)):
308 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000309 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000310 minstance.b = 2
311 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000312 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
313 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000314
315 class M2(M):
316 def getdict(self):
317 return "Not a dict!"
318 __dict__ = property(getdict)
319
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000320 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000321 m2instance.b = 2
322 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000323 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000324 try:
325 dir(m2instance)
326 except TypeError:
327 pass
328
Tim Peters9e6a3992001-10-30 05:45:26 +0000329 # Two essentially featureless objects, just inheriting stuff from
330 # object.
331 vereq(dir(None), dir(Ellipsis))
332
Guido van Rossum44022412002-05-13 18:29:46 +0000333 # Nasty test case for proxied objects
334 class Wrapper(object):
335 def __init__(self, obj):
336 self.__obj = obj
337 def __repr__(self):
338 return "Wrapper(%s)" % repr(self.__obj)
339 def __getitem__(self, key):
340 return Wrapper(self.__obj[key])
341 def __len__(self):
342 return len(self.__obj)
343 def __getattr__(self, name):
344 return Wrapper(getattr(self.__obj, name))
345
346 class C(object):
347 def __getclass(self):
348 return Wrapper(type(self))
349 __class__ = property(__getclass)
350
351 dir(C()) # This used to segfault
352
Tim Peters6d6c1a32001-08-02 04:15:00 +0000353binops = {
354 'add': '+',
355 'sub': '-',
356 'mul': '*',
357 'div': '/',
358 'mod': '%',
359 'divmod': 'divmod',
360 'pow': '**',
361 'lshift': '<<',
362 'rshift': '>>',
363 'and': '&',
364 'xor': '^',
365 'or': '|',
366 'cmp': 'cmp',
367 'lt': '<',
368 'le': '<=',
369 'eq': '==',
370 'ne': '!=',
371 'gt': '>',
372 'ge': '>=',
373 }
374
375for name, expr in binops.items():
376 if expr.islower():
377 expr = expr + "(a, b)"
378 else:
379 expr = 'a %s b' % expr
380 binops[name] = expr
381
382unops = {
383 'pos': '+',
384 'neg': '-',
385 'abs': 'abs',
386 'invert': '~',
387 'int': 'int',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000388 'float': 'float',
389 'oct': 'oct',
390 'hex': 'hex',
391 }
392
393for name, expr in unops.items():
394 if expr.islower():
395 expr = expr + "(a)"
396 else:
397 expr = '%s a' % expr
398 unops[name] = expr
399
400def numops(a, b, skip=[]):
401 dict = {'a': a, 'b': b}
402 for name, expr in binops.items():
403 if name not in skip:
404 name = "__%s__" % name
405 if hasattr(a, name):
406 res = eval(expr, dict)
407 testbinop(a, b, res, expr, name)
408 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000409 if name not in skip:
410 name = "__%s__" % name
411 if hasattr(a, name):
412 res = eval(expr, dict)
413 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000414
415def ints():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000416 if verbose: print("Testing int operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000417 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000418 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000419 vereq((1).__bool__(), True)
420 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000421 # This returns 'NotImplemented' in Python 2.2
422 class C(int):
423 def __add__(self, other):
424 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000425 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000426 try:
427 C() + ""
428 except TypeError:
429 pass
430 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000431 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000432
433def longs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000434 if verbose: print("Testing long operations...")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000435 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000436
437def floats():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000438 if verbose: print("Testing float operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000439 numops(100.0, 3.0)
440
441def complexes():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000442 if verbose: print("Testing complex operations...")
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000443 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
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__")
484 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
485 "a[b:c]", "__getslice__")
486 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__")
493 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
494 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
495 # 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):
608 return list.__getitem__(self, i) + 100
609 def __getslice__(self, i, j):
610 return (i, j)
611 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
Neal Norwitzb1295da2002-04-01 18:59:20 +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
817def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000818 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819 class C(object):
820 def __init__(self):
821 self.__state = 0
822 def getstate(self):
823 return self.__state
824 def setstate(self, state):
825 self.__state = state
826 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000827 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000829 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000830 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831 def __init__(self):
832 type({}).__init__(self)
833 C.__init__(self)
834 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000835 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000836 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000837 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000838 vereq(d["hello"], "world")
839 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000841 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000842 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843
Guido van Rossume45763a2001-08-10 21:28:46 +0000844 # SF bug #442833
845 class Node(object):
846 def __int__(self):
847 return int(self.foo())
848 def foo(self):
849 return "23"
850 class Frag(Node, list):
851 def foo(self):
852 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000853 vereq(Node().__int__(), 23)
854 vereq(int(Node()), 23)
855 vereq(Frag().__int__(), 42)
856 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000857
Tim Peters6d6c1a32001-08-02 04:15:00 +0000858def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000859 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 class A(object):
861 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000862 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000863 class B(A):
864 def boo(self): return "B"
865 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000866 vereq(B().spam(), "B")
867 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000868 class C(A):
869 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000870 vereq(C().spam(), "A")
871 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000872 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000873 vereq(D().spam(), "B")
874 vereq(D().boo(), "B")
875 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000876 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(E().spam(), "B")
878 vereq(E().boo(), "C")
879 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000880 # MRO order disagreement
881 try:
882 class F(D, E): pass
883 except TypeError:
884 pass
885 else:
886 raise TestFailed, "expected MRO order disagreement (F)"
887 try:
888 class G(E, D): pass
889 except TypeError:
890 pass
891 else:
892 raise TestFailed, "expected MRO order disagreement (G)"
893
894
895# see thread python-dev/2002-October/029035.html
896def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000897 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000898 class A(object): pass
899 class B(object): pass
900 class C(object): pass
901 class X(A): pass
902 class Y(A): pass
903 class Z(X,B,Y,C): pass
904 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
905
906# see "A Monotonic Superclass Linearization for Dylan",
907# by Kim Barrett et al. (OOPSLA 1996)
908def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000909 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000910 class Boat(object): pass
911 class DayBoat(Boat): pass
912 class WheelBoat(Boat): pass
913 class EngineLess(DayBoat): pass
914 class SmallMultihull(DayBoat): pass
915 class PedalWheelBoat(EngineLess,WheelBoat): pass
916 class SmallCatamaran(SmallMultihull): pass
917 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
918
919 vereq(PedalWheelBoat.__mro__,
920 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
921 object))
922 vereq(SmallCatamaran.__mro__,
923 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
924
925 vereq(Pedalo.__mro__,
926 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
927 SmallMultihull, DayBoat, WheelBoat, Boat, object))
928
929# see "A Monotonic Superclass Linearization for Dylan",
930# by Kim Barrett et al. (OOPSLA 1996)
931def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000932 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000933 class Pane(object): pass
934 class ScrollingMixin(object): pass
935 class EditingMixin(object): pass
936 class ScrollablePane(Pane,ScrollingMixin): pass
937 class EditablePane(Pane,EditingMixin): pass
938 class EditableScrollablePane(ScrollablePane,EditablePane): pass
939
940 vereq(EditableScrollablePane.__mro__,
941 (EditableScrollablePane, ScrollablePane, EditablePane,
942 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000943
Raymond Hettingerf394df42003-04-06 19:13:41 +0000944mro_err_msg = """Cannot create a consistent method resolution
945order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000946
Guido van Rossumd32047f2002-11-25 21:38:52 +0000947def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000948 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000949 def raises(exc, expected, callable, *args):
950 try:
951 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000952 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000953 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +0000954 raise TestFailed, "Message %r, expected %r" % (str(msg),
955 expected)
956 else:
957 raise TestFailed, "Expected %s" % exc
958 class A(object): pass
959 class B(A): pass
960 class C(object): pass
961 # Test some very simple errors
962 raises(TypeError, "duplicate base class A",
963 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000964 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000965 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000966 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000967 type, "X", (A, C, B), {})
968 # Test a slightly more complex error
969 class GridLayout(object): pass
970 class HorizontalGrid(GridLayout): pass
971 class VerticalGrid(GridLayout): pass
972 class HVGrid(HorizontalGrid, VerticalGrid): pass
973 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000974 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000975 type, "ConfusedGrid", (HVGrid, VHGrid), {})
976
Guido van Rossum37202612001-08-09 19:45:21 +0000977def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000978 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000979 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000980 vereq(a.__class__, object)
981 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000982 b = object()
983 verify(a is not b)
984 verify(not hasattr(a, "foo"))
985 try:
986 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000987 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000988 pass
989 else:
990 verify(0, "object() should not allow setting a foo attribute")
991 verify(not hasattr(object(), "__dict__"))
992
993 class Cdict(object):
994 pass
995 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000996 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000997 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000998 vereq(x.foo, 1)
999 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001000
Tim Peters6d6c1a32001-08-02 04:15:00 +00001001def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001002 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003 class C0(object):
1004 __slots__ = []
1005 x = C0()
1006 verify(not hasattr(x, "__dict__"))
1007 verify(not hasattr(x, "foo"))
1008
1009 class C1(object):
1010 __slots__ = ['a']
1011 x = C1()
1012 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001013 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001014 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001015 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001016 x.a = None
1017 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001018 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001019 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020
1021 class C3(object):
1022 __slots__ = ['a', 'b', 'c']
1023 x = C3()
1024 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001025 verify(not hasattr(x, 'a'))
1026 verify(not hasattr(x, 'b'))
1027 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001028 x.a = 1
1029 x.b = 2
1030 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001031 vereq(x.a, 1)
1032 vereq(x.b, 2)
1033 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001034
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001035 class C4(object):
1036 """Validate name mangling"""
1037 __slots__ = ['__a']
1038 def __init__(self, value):
1039 self.__a = value
1040 def get(self):
1041 return self.__a
1042 x = C4(5)
1043 verify(not hasattr(x, '__dict__'))
1044 verify(not hasattr(x, '__a'))
1045 vereq(x.get(), 5)
1046 try:
1047 x.__a = 6
1048 except AttributeError:
1049 pass
1050 else:
1051 raise TestFailed, "Double underscored names not mangled"
1052
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001053 # Make sure slot names are proper identifiers
1054 try:
1055 class C(object):
1056 __slots__ = [None]
1057 except TypeError:
1058 pass
1059 else:
1060 raise TestFailed, "[None] slots not caught"
1061 try:
1062 class C(object):
1063 __slots__ = ["foo bar"]
1064 except TypeError:
1065 pass
1066 else:
1067 raise TestFailed, "['foo bar'] slots not caught"
1068 try:
1069 class C(object):
1070 __slots__ = ["foo\0bar"]
1071 except TypeError:
1072 pass
1073 else:
1074 raise TestFailed, "['foo\\0bar'] slots not caught"
1075 try:
1076 class C(object):
1077 __slots__ = ["1"]
1078 except TypeError:
1079 pass
1080 else:
1081 raise TestFailed, "['1'] slots not caught"
1082 try:
1083 class C(object):
1084 __slots__ = [""]
1085 except TypeError:
1086 pass
1087 else:
1088 raise TestFailed, "[''] slots not caught"
1089 class C(object):
1090 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001091 # XXX(nnorwitz): was there supposed to be something tested
1092 # from the class above?
1093
1094 # Test a single string is not expanded as a sequence.
1095 class C(object):
1096 __slots__ = "abc"
1097 c = C()
1098 c.abc = 5
1099 vereq(c.abc, 5)
1100
1101 # Test unicode slot names
1102 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001103 str
Guido van Rossumd8faa362007-04-27 19:54:29 +00001104 except NameError:
1105 pass
1106 else:
1107 # Test a single unicode string is not expanded as a sequence.
1108 class C(object):
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001109 __slots__ = str("abc")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001110 c = C()
1111 c.abc = 5
1112 vereq(c.abc, 5)
1113
1114 # _unicode_to_string used to modify slots in certain circumstances
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001115 slots = (str("foo"), str("bar"))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001116 class C(object):
1117 __slots__ = slots
1118 x = C()
1119 x.foo = 5
1120 vereq(x.foo, 5)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001121 veris(type(slots[0]), str)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001122 # this used to leak references
1123 try:
1124 class C(object):
1125 __slots__ = [unichr(128)]
1126 except (TypeError, UnicodeEncodeError):
1127 pass
1128 else:
1129 raise TestFailed, "[unichr(128)] slots not caught"
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001130
Guido van Rossum33bab012001-12-05 22:45:48 +00001131 # Test leaks
1132 class Counted(object):
1133 counter = 0 # counts the number of instances alive
1134 def __init__(self):
1135 Counted.counter += 1
1136 def __del__(self):
1137 Counted.counter -= 1
1138 class C(object):
1139 __slots__ = ['a', 'b', 'c']
1140 x = C()
1141 x.a = Counted()
1142 x.b = Counted()
1143 x.c = Counted()
1144 vereq(Counted.counter, 3)
1145 del x
1146 vereq(Counted.counter, 0)
1147 class D(C):
1148 pass
1149 x = D()
1150 x.a = Counted()
1151 x.z = Counted()
1152 vereq(Counted.counter, 2)
1153 del x
1154 vereq(Counted.counter, 0)
1155 class E(D):
1156 __slots__ = ['e']
1157 x = E()
1158 x.a = Counted()
1159 x.z = Counted()
1160 x.e = Counted()
1161 vereq(Counted.counter, 3)
1162 del x
1163 vereq(Counted.counter, 0)
1164
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001165 # Test cyclical leaks [SF bug 519621]
1166 class F(object):
1167 __slots__ = ['a', 'b']
1168 log = []
1169 s = F()
1170 s.a = [Counted(), s]
1171 vereq(Counted.counter, 1)
1172 s = None
1173 import gc
1174 gc.collect()
1175 vereq(Counted.counter, 0)
1176
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001177 # Test lookup leaks [SF bug 572567]
1178 import sys,gc
1179 class G(object):
1180 def __cmp__(self, other):
1181 return 0
1182 g = G()
1183 orig_objects = len(gc.get_objects())
1184 for i in xrange(10):
1185 g==g
1186 new_objects = len(gc.get_objects())
1187 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001188 class H(object):
1189 __slots__ = ['a', 'b']
1190 def __init__(self):
1191 self.a = 1
1192 self.b = 2
1193 def __del__(self):
1194 assert self.a == 1
1195 assert self.b == 2
1196
1197 save_stderr = sys.stderr
1198 sys.stderr = sys.stdout
1199 h = H()
1200 try:
1201 del h
1202 finally:
1203 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001204
Guido van Rossum8b056da2002-08-13 18:26:26 +00001205def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001206 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001207
1208 class D(object):
1209 __slots__ = ["__dict__"]
1210 a = D()
1211 verify(hasattr(a, "__dict__"))
1212 verify(not hasattr(a, "__weakref__"))
1213 a.foo = 42
1214 vereq(a.__dict__, {"foo": 42})
1215
1216 class W(object):
1217 __slots__ = ["__weakref__"]
1218 a = W()
1219 verify(hasattr(a, "__weakref__"))
1220 verify(not hasattr(a, "__dict__"))
1221 try:
1222 a.foo = 42
1223 except AttributeError:
1224 pass
1225 else:
1226 raise TestFailed, "shouldn't be allowed to set a.foo"
1227
1228 class C1(W, D):
1229 __slots__ = []
1230 a = C1()
1231 verify(hasattr(a, "__dict__"))
1232 verify(hasattr(a, "__weakref__"))
1233 a.foo = 42
1234 vereq(a.__dict__, {"foo": 42})
1235
1236 class C2(D, W):
1237 __slots__ = []
1238 a = C2()
1239 verify(hasattr(a, "__dict__"))
1240 verify(hasattr(a, "__weakref__"))
1241 a.foo = 42
1242 vereq(a.__dict__, {"foo": 42})
1243
Guido van Rossum9a818922002-11-14 19:50:14 +00001244# MRO order disagreement
1245#
1246# class C3(C1, C2):
1247# __slots__ = []
1248#
1249# class C4(C2, C1):
1250# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001251
Tim Peters6d6c1a32001-08-02 04:15:00 +00001252def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001253 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001254 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001255 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001256 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001258 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001259 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001260 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001261 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001262 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001263 vereq(E.foo, 1)
1264 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001265 # Test dynamic instances
1266 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001267 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001268 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001269 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001270 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001271 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001272 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001273 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001274 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001275 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001276 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001277 vereq(int(a), 100)
1278 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001279 verify(not hasattr(a, "spam"))
1280 def mygetattr(self, name):
1281 if name == "spam":
1282 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001283 raise AttributeError
1284 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001285 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001286 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001287 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001288 def mysetattr(self, name, value):
1289 if name == "spam":
1290 raise AttributeError
1291 return object.__setattr__(self, name, value)
1292 C.__setattr__ = mysetattr
1293 try:
1294 a.spam = "not spam"
1295 except AttributeError:
1296 pass
1297 else:
1298 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001299 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001300 class D(C):
1301 pass
1302 d = D()
1303 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001304 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001305
Guido van Rossum7e35d572001-09-15 03:14:32 +00001306 # Test handling of int*seq and seq*int
1307 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001308 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001309 vereq("a"*I(2), "aa")
1310 vereq(I(2)*"a", "aa")
1311 vereq(2*I(3), 6)
1312 vereq(I(3)*2, 6)
1313 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001314
1315 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001316 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001317 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001318 vereq("a"*L(2), "aa")
1319 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001320 vereq(2*L(3), 6)
1321 vereq(L(3)*2, 6)
1322 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001323
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001324 # Test comparison of classes with dynamic metaclasses
1325 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001326 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001327 class someclass(metaclass=dynamicmetaclass):
1328 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001329 verify(someclass != object)
1330
Tim Peters6d6c1a32001-08-02 04:15:00 +00001331def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001332 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001333
1334 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001335 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336 pass
1337 except TypeError:
1338 pass
1339 else:
1340 verify(0, "inheritance from both list and dict should be illegal")
1341
1342 try:
1343 class C(object, None):
1344 pass
1345 except TypeError:
1346 pass
1347 else:
1348 verify(0, "inheritance from non-type should be illegal")
1349 class Classic:
1350 pass
1351
1352 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001353 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001354 pass
1355 except TypeError:
1356 pass
1357 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001358 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001359
1360 try:
1361 class C(object):
1362 __slots__ = 1
1363 except TypeError:
1364 pass
1365 else:
1366 verify(0, "__slots__ = 1 should be illegal")
1367
1368 try:
1369 class C(object):
1370 __slots__ = [1]
1371 except TypeError:
1372 pass
1373 else:
1374 verify(0, "__slots__ = [1] should be illegal")
1375
Guido van Rossumd8faa362007-04-27 19:54:29 +00001376 class M1(type):
1377 pass
1378 class M2(type):
1379 pass
1380 class A1(object, metaclass=M1):
1381 pass
1382 class A2(object, metaclass=M2):
1383 pass
1384 try:
1385 class B(A1, A2):
1386 pass
1387 except TypeError:
1388 pass
1389 else:
1390 verify(0, "finding the most derived metaclass should have failed")
1391
Tim Peters6d6c1a32001-08-02 04:15:00 +00001392def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001393 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001394 class C(object):
1395 def foo(*a): return a
1396 goo = classmethod(foo)
1397 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001398 vereq(C.goo(1), (C, 1))
1399 vereq(c.goo(1), (C, 1))
1400 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001401 class D(C):
1402 pass
1403 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001404 vereq(D.goo(1), (D, 1))
1405 vereq(d.goo(1), (D, 1))
1406 vereq(d.foo(1), (d, 1))
1407 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001408 # Test for a specific crash (SF bug 528132)
1409 def f(cls, arg): return (cls, arg)
1410 ff = classmethod(f)
1411 vereq(ff.__get__(0, int)(42), (int, 42))
1412 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001413
Guido van Rossum155db9a2002-04-02 17:53:47 +00001414 # Test super() with classmethods (SF bug 535444)
1415 veris(C.goo.im_self, C)
1416 veris(D.goo.im_self, D)
1417 veris(super(D,D).goo.im_self, D)
1418 veris(super(D,d).goo.im_self, D)
1419 vereq(super(D,D).goo(), (D,))
1420 vereq(super(D,d).goo(), (D,))
1421
Raymond Hettingerbe971532003-06-18 01:13:41 +00001422 # Verify that argument is checked for callability (SF bug 753451)
1423 try:
1424 classmethod(1).__get__(1)
1425 except TypeError:
1426 pass
1427 else:
1428 raise TestFailed, "classmethod should check for callability"
1429
Georg Brandl6a29c322006-02-21 22:17:46 +00001430 # Verify that classmethod() doesn't allow keyword args
1431 try:
1432 classmethod(f, kw=1)
1433 except TypeError:
1434 pass
1435 else:
1436 raise TestFailed, "classmethod shouldn't accept keyword args"
1437
Fred Drakef841aa62002-03-28 15:49:54 +00001438def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001439 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001440 import xxsubtype as spam
1441 a = (1, 2, 3)
1442 d = {'abc': 123}
1443 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001444 veris(x, spam.spamlist)
1445 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001446 vereq(d, d1)
1447 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001448 veris(x, spam.spamlist)
1449 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001450 vereq(d, d1)
1451
Tim Peters6d6c1a32001-08-02 04:15:00 +00001452def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001453 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001454 class C(object):
1455 def foo(*a): return a
1456 goo = staticmethod(foo)
1457 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001458 vereq(C.goo(1), (1,))
1459 vereq(c.goo(1), (1,))
1460 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001461 class D(C):
1462 pass
1463 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001464 vereq(D.goo(1), (1,))
1465 vereq(d.goo(1), (1,))
1466 vereq(d.foo(1), (d, 1))
1467 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001468
Fred Drakef841aa62002-03-28 15:49:54 +00001469def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001470 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001471 import xxsubtype as spam
1472 a = (1, 2, 3)
1473 d = {"abc": 123}
1474 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1475 veris(x, None)
1476 vereq(a, a1)
1477 vereq(d, d1)
1478 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1479 veris(x, None)
1480 vereq(a, a1)
1481 vereq(d, d1)
1482
Tim Peters6d6c1a32001-08-02 04:15:00 +00001483def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001484 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001485 class C:
1486 def foo(*a): return a
1487 goo = classmethod(foo)
1488 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001489 vereq(C.goo(1), (C, 1))
1490 vereq(c.goo(1), (C, 1))
1491 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001492 class D(C):
1493 pass
1494 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(D.goo(1), (D, 1))
1496 vereq(d.goo(1), (D, 1))
1497 vereq(d.foo(1), (d, 1))
1498 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001499 class E: # *not* subclassing from C
1500 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001501 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001502 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001503
1504def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001505 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001506 class C(object):
1507 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001508 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509 self.__get = get
1510 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001511 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512 def __get__(self, obj, type=None):
1513 return self.__get(obj)
1514 def __set__(self, obj, value):
1515 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001516 def __delete__(self, obj):
1517 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001518 def __init__(self):
1519 self.__x = 0
1520 def __get_x(self):
1521 x = self.__x
1522 self.__x = x+1
1523 return x
1524 def __set_x(self, x):
1525 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001526 def __delete_x(self):
1527 del self.__x
1528 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001529 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001530 vereq(a.x, 0)
1531 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001532 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001533 vereq(a.x, 10)
1534 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001535 del a.x
1536 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001537
1538def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001539 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001540 class C(list):
1541 def __new__(cls):
1542 self = list.__new__(cls)
1543 self.foo = 1
1544 return self
1545 def __init__(self):
1546 self.foo = self.foo + 2
1547 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001548 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001549 verify(a.__class__ is C)
1550 class D(C):
1551 pass
1552 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001553 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001554 verify(b.__class__ is D)
1555
Tim Peters6d6c1a32001-08-02 04:15:00 +00001556def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001557 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001558 class A(object):
1559 def f(self): return "A"
1560 class B(A):
1561 pass
1562 class C(A):
1563 def f(self): return "C"
1564 class D(B, C):
1565 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001566 vereq(D.mro(), [D, B, C, A, object])
1567 vereq(D.__mro__, (D, B, C, A, object))
1568 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001569
Guido van Rossumd3077402001-08-12 05:24:18 +00001570 class PerverseMetaType(type):
1571 def mro(cls):
1572 L = type.mro(cls)
1573 L.reverse()
1574 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001575 class X(D,B,C,A, metaclass=PerverseMetaType):
1576 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001577 vereq(X.__mro__, (object, A, C, B, D, X))
1578 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001579
Armin Rigo037d1e02005-12-29 17:07:39 +00001580 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001581 class _metaclass(type):
1582 def mro(self):
1583 return [self, dict, object]
1584 class X(object, metaclass=_metaclass):
1585 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001586 except TypeError:
1587 pass
1588 else:
1589 raise TestFailed, "devious mro() return not caught"
1590
1591 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001592 class _metaclass(type):
1593 def mro(self):
1594 return [1]
1595 class X(object, metaclass=_metaclass):
1596 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001597 except TypeError:
1598 pass
1599 else:
1600 raise TestFailed, "non-class mro() return not caught"
1601
1602 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001603 class _metaclass(type):
1604 def mro(self):
1605 return 1
1606 class X(object, metaclass=_metaclass):
1607 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001608 except TypeError:
1609 pass
1610 else:
1611 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001612
Armin Rigo037d1e02005-12-29 17:07:39 +00001613
Tim Peters6d6c1a32001-08-02 04:15:00 +00001614def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001615 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001616
1617 class B(object):
1618 "Intermediate class because object doesn't have a __setattr__"
1619
1620 class C(B):
1621
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001622 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623 if name == "foo":
1624 return ("getattr", name)
1625 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001626 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001627 def __setattr__(self, name, value):
1628 if name == "foo":
1629 self.setattr = (name, value)
1630 else:
1631 return B.__setattr__(self, name, value)
1632 def __delattr__(self, name):
1633 if name == "foo":
1634 self.delattr = name
1635 else:
1636 return B.__delattr__(self, name)
1637
1638 def __getitem__(self, key):
1639 return ("getitem", key)
1640 def __setitem__(self, key, value):
1641 self.setitem = (key, value)
1642 def __delitem__(self, key):
1643 self.delitem = key
1644
1645 def __getslice__(self, i, j):
1646 return ("getslice", i, j)
1647 def __setslice__(self, i, j, value):
1648 self.setslice = (i, j, value)
1649 def __delslice__(self, i, j):
1650 self.delslice = (i, j)
1651
1652 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
Guido van Rossum45704552001-10-08 16:35:45 +00001665 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001666 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001668 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001669 vereq(a.delslice, (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
Guido van Rossum45704552001-10-08 16:35:45 +00001689 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001690 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001691
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001692def specials():
1693 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001694 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001695 # Test the default behavior for static classes
1696 class C(object):
1697 def __getitem__(self, i):
1698 if 0 <= i < 10: return i
1699 raise IndexError
1700 c1 = C()
1701 c2 = C()
1702 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001703 verify(id(c1) != id(c2))
1704 hash(c1)
1705 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001706 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001707 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001708 verify(c1 != c2)
1709 verify(not c1 != c1)
1710 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001711 # Note that the module name appears in str/repr, and that varies
1712 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001713 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001714 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001715 verify(-1 not in c1)
1716 for i in range(10):
1717 verify(i in c1)
1718 verify(10 not in c1)
1719 # Test the default behavior for dynamic classes
1720 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001721 def __getitem__(self, i):
1722 if 0 <= i < 10: return i
1723 raise IndexError
1724 d1 = D()
1725 d2 = D()
1726 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001727 verify(id(d1) != id(d2))
1728 hash(d1)
1729 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001730 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001731 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001732 verify(d1 != d2)
1733 verify(not d1 != d1)
1734 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001735 # Note that the module name appears in str/repr, and that varies
1736 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001737 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001738 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001739 verify(-1 not in d1)
1740 for i in range(10):
1741 verify(i in d1)
1742 verify(10 not in d1)
1743 # Test overridden behavior for static classes
1744 class Proxy(object):
1745 def __init__(self, x):
1746 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001747 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001748 return not not self.x
1749 def __hash__(self):
1750 return hash(self.x)
1751 def __eq__(self, other):
1752 return self.x == other
1753 def __ne__(self, other):
1754 return self.x != other
1755 def __cmp__(self, other):
1756 return cmp(self.x, other.x)
1757 def __str__(self):
1758 return "Proxy:%s" % self.x
1759 def __repr__(self):
1760 return "Proxy(%r)" % self.x
1761 def __contains__(self, value):
1762 return value in self.x
1763 p0 = Proxy(0)
1764 p1 = Proxy(1)
1765 p_1 = Proxy(-1)
1766 verify(not p0)
1767 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(hash(p0), hash(0))
1769 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001770 verify(p0 != p1)
1771 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001772 vereq(not p0, p1)
1773 vereq(cmp(p0, p1), -1)
1774 vereq(cmp(p0, p0), 0)
1775 vereq(cmp(p0, p_1), 1)
1776 vereq(str(p0), "Proxy:0")
1777 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001778 p10 = Proxy(range(10))
1779 verify(-1 not in p10)
1780 for i in range(10):
1781 verify(i in p10)
1782 verify(10 not in p10)
1783 # Test overridden behavior for dynamic classes
1784 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001785 def __init__(self, x):
1786 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001787 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001788 return not not self.x
1789 def __hash__(self):
1790 return hash(self.x)
1791 def __eq__(self, other):
1792 return self.x == other
1793 def __ne__(self, other):
1794 return self.x != other
1795 def __cmp__(self, other):
1796 return cmp(self.x, other.x)
1797 def __str__(self):
1798 return "DProxy:%s" % self.x
1799 def __repr__(self):
1800 return "DProxy(%r)" % self.x
1801 def __contains__(self, value):
1802 return value in self.x
1803 p0 = DProxy(0)
1804 p1 = DProxy(1)
1805 p_1 = DProxy(-1)
1806 verify(not p0)
1807 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001808 vereq(hash(p0), hash(0))
1809 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001810 verify(p0 != p1)
1811 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001812 vereq(not p0, p1)
1813 vereq(cmp(p0, p1), -1)
1814 vereq(cmp(p0, p0), 0)
1815 vereq(cmp(p0, p_1), 1)
1816 vereq(str(p0), "DProxy:0")
1817 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001818 p10 = DProxy(range(10))
1819 verify(-1 not in p10)
1820 for i in range(10):
1821 verify(i in p10)
1822 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001823## # Safety test for __cmp__
1824## def unsafecmp(a, b):
1825## try:
1826## a.__class__.__cmp__(a, b)
1827## except TypeError:
1828## pass
1829## else:
1830## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1831## a.__class__, a, b)
1832## unsafecmp(u"123", "123")
1833## unsafecmp("123", u"123")
1834## unsafecmp(1, 1.0)
1835## unsafecmp(1.0, 1)
1836## unsafecmp(1, 1L)
1837## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001838
Neal Norwitz1a997502003-01-13 20:13:12 +00001839 class Letter(str):
1840 def __new__(cls, letter):
1841 if letter == 'EPS':
1842 return str.__new__(cls)
1843 return str.__new__(cls, letter)
1844 def __str__(self):
1845 if not self:
1846 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001847 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001848
1849 # sys.stdout needs to be the original to trigger the recursion bug
1850 import sys
1851 test_stdout = sys.stdout
1852 sys.stdout = get_original_stdout()
1853 try:
1854 # nothing should actually be printed, this should raise an exception
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001855 print(Letter('w'))
Neal Norwitz1a997502003-01-13 20:13:12 +00001856 except RuntimeError:
1857 pass
1858 else:
1859 raise TestFailed, "expected a RuntimeError for print recursion"
1860 sys.stdout = test_stdout
1861
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001862def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001863 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001864 import weakref
1865 class C(object):
1866 pass
1867 c = C()
1868 r = weakref.ref(c)
1869 verify(r() is c)
1870 del c
1871 verify(r() is None)
1872 del r
1873 class NoWeak(object):
1874 __slots__ = ['foo']
1875 no = NoWeak()
1876 try:
1877 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001878 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001879 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001880 else:
1881 verify(0, "weakref.ref(no) should be illegal")
1882 class Weak(object):
1883 __slots__ = ['foo', '__weakref__']
1884 yes = Weak()
1885 r = weakref.ref(yes)
1886 verify(r() is yes)
1887 del yes
1888 verify(r() is None)
1889 del r
1890
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001891def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001892 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001893 class C(object):
1894 def getx(self):
1895 return self.__x
1896 def setx(self, value):
1897 self.__x = value
1898 def delx(self):
1899 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001900 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001901 a = C()
1902 verify(not hasattr(a, "x"))
1903 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001904 vereq(a._C__x, 42)
1905 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001906 del a.x
1907 verify(not hasattr(a, "x"))
1908 verify(not hasattr(a, "_C__x"))
1909 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001911 C.x.__delete__(a)
1912 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001913
Tim Peters66c1a522001-09-24 21:17:50 +00001914 raw = C.__dict__['x']
1915 verify(isinstance(raw, property))
1916
1917 attrs = dir(raw)
1918 verify("__doc__" in attrs)
1919 verify("fget" in attrs)
1920 verify("fset" in attrs)
1921 verify("fdel" in attrs)
1922
Guido van Rossum45704552001-10-08 16:35:45 +00001923 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001924 verify(raw.fget is C.__dict__['getx'])
1925 verify(raw.fset is C.__dict__['setx'])
1926 verify(raw.fdel is C.__dict__['delx'])
1927
1928 for attr in "__doc__", "fget", "fset", "fdel":
1929 try:
1930 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001931 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001932 if str(msg).find('readonly') < 0:
1933 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001934 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001935 "msg %r" % (attr, str(msg)))
1936 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001937 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001938 "readonly %r attr on a property" % attr)
1939
Neal Norwitz673cd822002-10-18 16:33:13 +00001940 class D(object):
1941 __getitem__ = property(lambda s: 1/0)
1942
1943 d = D()
1944 try:
1945 for i in d:
1946 str(i)
1947 except ZeroDivisionError:
1948 pass
1949 else:
1950 raise TestFailed, "expected ZeroDivisionError from bad property"
1951
Georg Brandl533ff6f2006-03-08 18:09:27 +00001952 class E(object):
1953 def getter(self):
1954 "getter method"
1955 return 0
1956 def setter(self, value):
1957 "setter method"
1958 pass
1959 prop = property(getter)
1960 vereq(prop.__doc__, "getter method")
1961 prop2 = property(fset=setter)
1962 vereq(prop2.__doc__, None)
1963
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001964 # this segfaulted in 2.5b2
1965 try:
1966 import _testcapi
1967 except ImportError:
1968 pass
1969 else:
1970 class X(object):
1971 p = property(_testcapi.test_with_docstring)
1972
1973
Guido van Rossumc4a18802001-08-24 16:55:27 +00001974def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001975 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001976
1977 class A(object):
1978 def meth(self, a):
1979 return "A(%r)" % a
1980
Guido van Rossum45704552001-10-08 16:35:45 +00001981 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001982
1983 class B(A):
1984 def __init__(self):
1985 self.__super = super(B, self)
1986 def meth(self, a):
1987 return "B(%r)" % a + self.__super.meth(a)
1988
Guido van Rossum45704552001-10-08 16:35:45 +00001989 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001990
1991 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001992 def meth(self, a):
1993 return "C(%r)" % a + self.__super.meth(a)
1994 C._C__super = super(C)
1995
Guido van Rossum45704552001-10-08 16:35:45 +00001996 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001997
1998 class D(C, B):
1999 def meth(self, a):
2000 return "D(%r)" % a + super(D, self).meth(a)
2001
Guido van Rossum5b443c62001-12-03 15:38:28 +00002002 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2003
2004 # Test for subclassing super
2005
2006 class mysuper(super):
2007 def __init__(self, *args):
2008 return super(mysuper, self).__init__(*args)
2009
2010 class E(D):
2011 def meth(self, a):
2012 return "E(%r)" % a + mysuper(E, self).meth(a)
2013
2014 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2015
2016 class F(E):
2017 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002018 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002019 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2020 F._F__super = mysuper(F)
2021
2022 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2023
2024 # Make sure certain errors are raised
2025
2026 try:
2027 super(D, 42)
2028 except TypeError:
2029 pass
2030 else:
2031 raise TestFailed, "shouldn't allow super(D, 42)"
2032
2033 try:
2034 super(D, C())
2035 except TypeError:
2036 pass
2037 else:
2038 raise TestFailed, "shouldn't allow super(D, C())"
2039
2040 try:
2041 super(D).__get__(12)
2042 except TypeError:
2043 pass
2044 else:
2045 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2046
2047 try:
2048 super(D).__get__(C())
2049 except TypeError:
2050 pass
2051 else:
2052 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002053
Guido van Rossuma4541a32003-04-16 20:02:22 +00002054 # Make sure data descriptors can be overridden and accessed via super
2055 # (new feature in Python 2.3)
2056
2057 class DDbase(object):
2058 def getx(self): return 42
2059 x = property(getx)
2060
2061 class DDsub(DDbase):
2062 def getx(self): return "hello"
2063 x = property(getx)
2064
2065 dd = DDsub()
2066 vereq(dd.x, "hello")
2067 vereq(super(DDsub, dd).x, 42)
2068
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002069 # Ensure that super() lookup of descriptor from classmethod
2070 # works (SF ID# 743627)
2071
2072 class Base(object):
2073 aProp = property(lambda self: "foo")
2074
2075 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002076 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002077 def test(klass):
2078 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002079
2080 veris(Sub.test(), Base.aProp)
2081
Thomas Wouters89f507f2006-12-13 04:49:30 +00002082 # Verify that super() doesn't allow keyword args
2083 try:
2084 super(Base, kw=1)
2085 except TypeError:
2086 pass
2087 else:
2088 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002089
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002090def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002091 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002092
2093 class hexint(int):
2094 def __repr__(self):
2095 return hex(self)
2096 def __add__(self, other):
2097 return hexint(int.__add__(self, other))
2098 # (Note that overriding __radd__ doesn't work,
2099 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002100 vereq(repr(hexint(7) + 9), "0x10")
2101 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002102 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002103 vereq(a, 12345)
2104 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002105 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002106 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002107 verify((+a).__class__ is int)
2108 verify((a >> 0).__class__ is int)
2109 verify((a << 0).__class__ is int)
2110 verify((hexint(0) << 12).__class__ is int)
2111 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002112
Guido van Rossume2a383d2007-01-15 16:59:06 +00002113 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002114 __slots__ = []
2115 def __str__(self):
2116 s = oct(self)
2117 if s[-1] == 'L':
2118 s = s[:-1]
2119 return s
2120 def __add__(self, other):
2121 return self.__class__(super(octlong, self).__add__(other))
2122 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002123 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002124 # (Note that overriding __radd__ here only seems to work
2125 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002126 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002127 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002128 vereq(a, 12345)
2129 vereq(int(a), 12345)
2130 vereq(hash(a), hash(12345))
2131 verify(int(a).__class__ is int)
2132 verify((+a).__class__ is int)
2133 verify((-a).__class__ is int)
2134 verify((-octlong(0)).__class__ is int)
2135 verify((a >> 0).__class__ is int)
2136 verify((a << 0).__class__ is int)
2137 verify((a - 0).__class__ is int)
2138 verify((a * 1).__class__ is int)
2139 verify((a ** 1).__class__ is int)
2140 verify((a // 1).__class__ is int)
2141 verify((1 * a).__class__ is int)
2142 verify((a | 0).__class__ is int)
2143 verify((a ^ 0).__class__ is int)
2144 verify((a & -1).__class__ is int)
2145 verify((octlong(0) << 12).__class__ is int)
2146 verify((octlong(0) >> 12).__class__ is int)
2147 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002148
2149 # Because octlong overrides __add__, we can't check the absence of +0
2150 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002151 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002152 pass
2153 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002154 verify((a + 0).__class__ is int)
2155 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002156
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002157 # Check that negative clones don't segfault
2158 a = longclone(-1)
2159 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002160 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002161
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002162 class precfloat(float):
2163 __slots__ = ['prec']
2164 def __init__(self, value=0.0, prec=12):
2165 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002166 def __repr__(self):
2167 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002168 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002169 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002170 vereq(a, 12345.0)
2171 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002172 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002173 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002174 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002175
Tim Peters2400fa42001-09-12 19:12:49 +00002176 class madcomplex(complex):
2177 def __repr__(self):
2178 return "%.17gj%+.17g" % (self.imag, self.real)
2179 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002180 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002181 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002182 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(a, base)
2184 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002185 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002186 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(repr(a), "4j-3")
2188 vereq(a, base)
2189 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002190 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002192 veris((+a).__class__, complex)
2193 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002194 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002195 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002196 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002197 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002198 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002199 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002201
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002202 class madtuple(tuple):
2203 _rev = None
2204 def rev(self):
2205 if self._rev is not None:
2206 return self._rev
2207 L = list(self)
2208 L.reverse()
2209 self._rev = self.__class__(L)
2210 return self._rev
2211 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002212 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2213 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2214 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002215 for i in range(512):
2216 t = madtuple(range(i))
2217 u = t.rev()
2218 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002219 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002220 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002222 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002223 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002224 verify(a[:].__class__ is tuple)
2225 verify((a * 1).__class__ is tuple)
2226 verify((a * 0).__class__ is tuple)
2227 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002228 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002229 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002230 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002231 verify((a + a).__class__ is tuple)
2232 verify((a * 0).__class__ is tuple)
2233 verify((a * 1).__class__ is tuple)
2234 verify((a * 2).__class__ is tuple)
2235 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002236
2237 class madstring(str):
2238 _rev = None
2239 def rev(self):
2240 if self._rev is not None:
2241 return self._rev
2242 L = list(self)
2243 L.reverse()
2244 self._rev = self.__class__("".join(L))
2245 return self._rev
2246 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002247 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2248 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2249 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002250 for i in range(256):
2251 s = madstring("".join(map(chr, range(i))))
2252 t = s.rev()
2253 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002254 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002255 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002257 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002258
Tim Peters8fa5dd02001-09-12 02:18:30 +00002259 base = "\x00" * 5
2260 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002261 vereq(s, base)
2262 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002263 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(hash(s), hash(base))
2265 vereq({s: 1}[base], 1)
2266 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002267 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002269 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002271 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002273 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002275 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002277 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002279 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002281 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002283 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002285 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002287 identitytab = ''.join([chr(i) for i in range(256)])
2288 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002290 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002291 vereq(s.translate(identitytab, "x"), base)
2292 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002293 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002294 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002295 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002296 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002297 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002298 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002299 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002300 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002301 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002302 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002303
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002304 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002305 _rev = None
2306 def rev(self):
2307 if self._rev is not None:
2308 return self._rev
2309 L = list(self)
2310 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002311 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002312 return self._rev
2313 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002314 vereq(u, "ABCDEF")
2315 vereq(u.rev(), madunicode("FEDCBA"))
2316 vereq(u.rev().rev(), madunicode("ABCDEF"))
2317 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002318 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002319 vereq(str(u), base)
2320 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002321 vereq(hash(u), hash(base))
2322 vereq({u: 1}[base], 1)
2323 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002324 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002326 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002328 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002329 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002330 verify(u.replace("x", "x").__class__ is str)
2331 vereq(u.replace("x", "x"), base)
2332 verify(u.replace("xy", "xy").__class__ is str)
2333 vereq(u.replace("xy", "xy"), base)
2334 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002335 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002336 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002337 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002338 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002340 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002341 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002342 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002344 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002345 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002346 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002348 verify((u + "").__class__ is str)
2349 vereq(u + "", base)
2350 verify(("" + u).__class__ is str)
2351 vereq("" + u, base)
2352 verify((u * 0).__class__ is str)
2353 vereq(u * 0, "")
2354 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002356 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002358 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002359 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002360 verify(u[0:0].__class__ is str)
2361 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002362
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002363 class sublist(list):
2364 pass
2365 a = sublist(range(5))
2366 vereq(a, range(5))
2367 a.append("hello")
2368 vereq(a, range(5) + ["hello"])
2369 a[5] = 5
2370 vereq(a, range(6))
2371 a.extend(range(6, 20))
2372 vereq(a, range(20))
2373 a[-5:] = []
2374 vereq(a, range(15))
2375 del a[10:15]
2376 vereq(len(a), 10)
2377 vereq(a, range(10))
2378 vereq(list(a), range(10))
2379 vereq(a[0], 0)
2380 vereq(a[9], 9)
2381 vereq(a[-10], 0)
2382 vereq(a[-1], 9)
2383 vereq(a[:5], range(5))
2384
Tim Peters59c9a642001-09-13 05:38:56 +00002385 class CountedInput(file):
2386 """Counts lines read by self.readline().
2387
2388 self.lineno is the 0-based ordinal of the last line read, up to
2389 a maximum of one greater than the number of lines in the file.
2390
2391 self.ateof is true if and only if the final "" line has been read,
2392 at which point self.lineno stops incrementing, and further calls
2393 to readline() continue to return "".
2394 """
2395
2396 lineno = 0
2397 ateof = 0
2398 def readline(self):
2399 if self.ateof:
2400 return ""
2401 s = file.readline(self)
2402 # Next line works too.
2403 # s = super(CountedInput, self).readline()
2404 self.lineno += 1
2405 if s == "":
2406 self.ateof = 1
2407 return s
2408
Alex Martelli01c77c62006-08-24 02:58:11 +00002409 f = open(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002410 lines = ['a\n', 'b\n', 'c\n']
2411 try:
2412 f.writelines(lines)
2413 f.close()
2414 f = CountedInput(TESTFN)
2415 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2416 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002417 vereq(expected, got)
2418 vereq(f.lineno, i)
2419 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002420 f.close()
2421 finally:
2422 try:
2423 f.close()
2424 except:
2425 pass
2426 try:
2427 import os
2428 os.unlink(TESTFN)
2429 except:
2430 pass
2431
Tim Peters808b94e2001-09-13 19:33:07 +00002432def keywords():
2433 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002434 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002435 vereq(int(x=1), 1)
2436 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002437 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(complex(imag=42, real=666), complex(666, 42))
2439 vereq(str(object=500), '500')
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002440 vereq(str(string='abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002441 vereq(tuple(sequence=range(3)), (0, 1, 2))
2442 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002443 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002444
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002445 for constructor in (int, float, int, complex, str, str,
Just van Rossuma797d812002-11-23 09:45:04 +00002446 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002447 try:
2448 constructor(bogus_keyword_arg=1)
2449 except TypeError:
2450 pass
2451 else:
2452 raise TestFailed("expected TypeError from bogus keyword "
2453 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002454
Tim Peters8fa45672001-09-13 21:01:29 +00002455def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002456 # XXX This test is disabled because rexec is not deemed safe
2457 return
Tim Peters8fa45672001-09-13 21:01:29 +00002458 import rexec
2459 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002460 print("Testing interaction with restricted execution ...")
Tim Peters8fa45672001-09-13 21:01:29 +00002461
2462 sandbox = rexec.RExec()
2463
2464 code1 = """f = open(%r, 'w')""" % TESTFN
Alex Martelli01c77c62006-08-24 02:58:11 +00002465 code2 = """f = open(%r, 'w')""" % TESTFN
Tim Peters8fa45672001-09-13 21:01:29 +00002466 code3 = """\
2467f = open(%r)
2468t = type(f) # a sneaky way to get the file() constructor
2469f.close()
2470f = t(%r, 'w') # rexec can't catch this by itself
2471""" % (TESTFN, TESTFN)
2472
2473 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2474 f.close()
2475
2476 try:
2477 for code in code1, code2, code3:
2478 try:
2479 sandbox.r_exec(code)
Guido van Rossumb940e112007-01-10 16:19:56 +00002480 except IOError as msg:
Tim Peters8fa45672001-09-13 21:01:29 +00002481 if str(msg).find("restricted") >= 0:
2482 outcome = "OK"
2483 else:
2484 outcome = "got an exception, but not an expected one"
2485 else:
2486 outcome = "expected a restricted-execution exception"
2487
2488 if outcome != "OK":
2489 raise TestFailed("%s, in %r" % (outcome, code))
2490
2491 finally:
2492 try:
2493 import os
2494 os.unlink(TESTFN)
2495 except:
2496 pass
2497
Tim Peters0ab085c2001-09-14 00:25:33 +00002498def str_subclass_as_dict_key():
2499 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002500 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002501
2502 class cistr(str):
2503 """Sublcass of str that computes __eq__ case-insensitively.
2504
2505 Also computes a hash code of the string in canonical form.
2506 """
2507
2508 def __init__(self, value):
2509 self.canonical = value.lower()
2510 self.hashcode = hash(self.canonical)
2511
2512 def __eq__(self, other):
2513 if not isinstance(other, cistr):
2514 other = cistr(other)
2515 return self.canonical == other.canonical
2516
2517 def __hash__(self):
2518 return self.hashcode
2519
Guido van Rossum45704552001-10-08 16:35:45 +00002520 vereq(cistr('ABC'), 'abc')
2521 vereq('aBc', cistr('ABC'))
2522 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002523
2524 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002525 vereq(d[cistr('one')], 1)
2526 vereq(d[cistr('tWo')], 2)
2527 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002528 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002529 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002530
Guido van Rossumab3b0342001-09-18 20:38:53 +00002531def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002532 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002533 class classic:
2534 pass
2535 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002536 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002537 class C(base):
2538 def __init__(self, value):
2539 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002540 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002541 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002542 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002543 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002544 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002545 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002546 def __ne__(self, other):
2547 if isinstance(other, C):
2548 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002549 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002550 return self.value != other
2551 return NotImplemented
2552 def __lt__(self, other):
2553 if isinstance(other, C):
2554 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002555 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002556 return self.value < other
2557 return NotImplemented
2558 def __le__(self, other):
2559 if isinstance(other, C):
2560 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002561 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002562 return self.value <= other
2563 return NotImplemented
2564 def __gt__(self, other):
2565 if isinstance(other, C):
2566 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002567 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002568 return self.value > other
2569 return NotImplemented
2570 def __ge__(self, other):
2571 if isinstance(other, C):
2572 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002573 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002574 return self.value >= other
2575 return NotImplemented
2576
Guido van Rossumab3b0342001-09-18 20:38:53 +00002577 c1 = C(1)
2578 c2 = C(2)
2579 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002580 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002581 c = {1: c1, 2: c2, 3: c3}
2582 for x in 1, 2, 3:
2583 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002584 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002585 for op in "<", "<=", "==", "!=", ">", ">=":
2586 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2587 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002588 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2589 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002590
Guido van Rossum0639f592001-09-18 21:06:04 +00002591def rich_comparisons():
2592 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002593 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002594 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002595 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002596 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002597 vereq(z, 1+0j)
2598 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002599 class ZZ(complex):
2600 def __eq__(self, other):
2601 try:
2602 return abs(self - other) <= 1e-6
2603 except:
2604 return NotImplemented
2605 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002606 vereq(zz, 1+0j)
2607 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002608
Guido van Rossum0639f592001-09-18 21:06:04 +00002609 class classic:
2610 pass
2611 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002612 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002613 class C(base):
2614 def __init__(self, value):
2615 self.value = int(value)
2616 def __cmp__(self, other):
2617 raise TestFailed, "shouldn't call __cmp__"
2618 def __eq__(self, other):
2619 if isinstance(other, C):
2620 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002621 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002622 return self.value == other
2623 return NotImplemented
2624 def __ne__(self, other):
2625 if isinstance(other, C):
2626 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002627 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002628 return self.value != other
2629 return NotImplemented
2630 def __lt__(self, other):
2631 if isinstance(other, C):
2632 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002633 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002634 return self.value < other
2635 return NotImplemented
2636 def __le__(self, other):
2637 if isinstance(other, C):
2638 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002639 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002640 return self.value <= other
2641 return NotImplemented
2642 def __gt__(self, other):
2643 if isinstance(other, C):
2644 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002645 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002646 return self.value > other
2647 return NotImplemented
2648 def __ge__(self, other):
2649 if isinstance(other, C):
2650 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002651 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002652 return self.value >= other
2653 return NotImplemented
2654 c1 = C(1)
2655 c2 = C(2)
2656 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002657 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002658 c = {1: c1, 2: c2, 3: c3}
2659 for x in 1, 2, 3:
2660 for y in 1, 2, 3:
2661 for op in "<", "<=", "==", "!=", ">", ">=":
2662 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2663 "x=%d, y=%d" % (x, y))
2664 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2665 "x=%d, y=%d" % (x, y))
2666 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2667 "x=%d, y=%d" % (x, y))
2668
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002669def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002670 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002671 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002672 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002673 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002674 check(file.name, "file name") # member descriptor
2675
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002676def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002677 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002678 class C(object): pass
2679 class D(object): pass
2680 class E(object): pass
2681 class F(D, E): pass
2682 for cls in C, D, E, F:
2683 for cls2 in C, D, E, F:
2684 x = cls()
2685 x.__class__ = cls2
2686 verify(x.__class__ is cls2)
2687 x.__class__ = cls
2688 verify(x.__class__ is cls)
2689 def cant(x, C):
2690 try:
2691 x.__class__ = C
2692 except TypeError:
2693 pass
2694 else:
2695 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002696 try:
2697 delattr(x, "__class__")
2698 except TypeError:
2699 pass
2700 else:
2701 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002702 cant(C(), list)
2703 cant(list(), C)
2704 cant(C(), 1)
2705 cant(C(), object)
2706 cant(object(), list)
2707 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002708 class Int(int): __slots__ = []
2709 cant(2, Int)
2710 cant(Int(), int)
2711 cant(True, int)
2712 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002713 o = object()
2714 cant(o, type(1))
2715 cant(o, type(None))
2716 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002717 class G(object):
2718 __slots__ = ["a", "b"]
2719 class H(object):
2720 __slots__ = ["b", "a"]
2721 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002722 str
Guido van Rossumd8faa362007-04-27 19:54:29 +00002723 except NameError:
2724 class I(object):
2725 __slots__ = ["a", "b"]
2726 else:
2727 class I(object):
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002728 __slots__ = [str("a"), str("b")]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002729 class J(object):
2730 __slots__ = ["c", "b"]
2731 class K(object):
2732 __slots__ = ["a", "b", "d"]
2733 class L(H):
2734 __slots__ = ["e"]
2735 class M(I):
2736 __slots__ = ["e"]
2737 class N(J):
2738 __slots__ = ["__weakref__"]
2739 class P(J):
2740 __slots__ = ["__dict__"]
2741 class Q(J):
2742 pass
2743 class R(J):
2744 __slots__ = ["__dict__", "__weakref__"]
2745
2746 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2747 x = cls()
2748 x.a = 1
2749 x.__class__ = cls2
2750 verify(x.__class__ is cls2,
2751 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2752 vereq(x.a, 1)
2753 x.__class__ = cls
2754 verify(x.__class__ is cls,
2755 "assigning %r as __class__ for %r silently failed" % (cls, x))
2756 vereq(x.a, 1)
2757 for cls in G, J, K, L, M, N, P, R, list, Int:
2758 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2759 if cls is cls2:
2760 continue
2761 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002762
Guido van Rossum6661be32001-10-26 04:26:12 +00002763def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002764 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002765 class C(object): pass
2766 a = C()
2767 a.__dict__ = {'b': 1}
2768 vereq(a.b, 1)
2769 def cant(x, dict):
2770 try:
2771 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002772 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002773 pass
2774 else:
2775 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2776 cant(a, None)
2777 cant(a, [])
2778 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002779 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002780 # Classes don't allow __dict__ assignment
2781 cant(C, {})
2782
Guido van Rossum3926a632001-09-25 16:25:58 +00002783def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002784 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002785 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002786 import pickle
2787 try:
2788 import cPickle
2789 except ImportError:
2790 cPickle = None
Guido van Rossum3926a632001-09-25 16:25:58 +00002791
2792 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002793 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002794
2795 global C
2796 class C(object):
2797 def __init__(self, a, b):
2798 super(C, self).__init__()
2799 self.a = a
2800 self.b = b
2801 def __repr__(self):
2802 return "C(%r, %r)" % (self.a, self.b)
2803
2804 global C1
2805 class C1(list):
2806 def __new__(cls, a, b):
2807 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002808 def __getnewargs__(self):
2809 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002810 def __init__(self, a, b):
2811 self.a = a
2812 self.b = b
2813 def __repr__(self):
2814 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2815
2816 global C2
2817 class C2(int):
2818 def __new__(cls, a, b, val=0):
2819 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002820 def __getnewargs__(self):
2821 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002822 def __init__(self, a, b, val=0):
2823 self.a = a
2824 self.b = b
2825 def __repr__(self):
2826 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2827
Guido van Rossum90c45142001-11-24 21:07:01 +00002828 global C3
2829 class C3(object):
2830 def __init__(self, foo):
2831 self.foo = foo
2832 def __getstate__(self):
2833 return self.foo
2834 def __setstate__(self, foo):
2835 self.foo = foo
2836
2837 global C4classic, C4
2838 class C4classic: # classic
2839 pass
2840 class C4(C4classic, object): # mixed inheritance
2841 pass
2842
Guido van Rossum3926a632001-09-25 16:25:58 +00002843 for p in pickle, cPickle:
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002844 if p is None:
2845 continue # cPickle not found -- skip it
Guido van Rossum3926a632001-09-25 16:25:58 +00002846 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002847 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002848 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002849
2850 for cls in C, C1, C2:
2851 s = p.dumps(cls, bin)
2852 cls2 = p.loads(s)
2853 verify(cls2 is cls)
2854
2855 a = C1(1, 2); a.append(42); a.append(24)
2856 b = C2("hello", "world", 42)
2857 s = p.dumps((a, b), bin)
2858 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002859 vereq(x.__class__, a.__class__)
2860 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2861 vereq(y.__class__, b.__class__)
2862 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002863 vereq(repr(x), repr(a))
2864 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002865 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002866 print("a = x =", a)
2867 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002868 # Test for __getstate__ and __setstate__ on new style class
2869 u = C3(42)
2870 s = p.dumps(u, bin)
2871 v = p.loads(s)
2872 veris(u.__class__, v.__class__)
2873 vereq(u.foo, v.foo)
2874 # Test for picklability of hybrid class
2875 u = C4()
2876 u.foo = 42
2877 s = p.dumps(u, bin)
2878 v = p.loads(s)
2879 veris(u.__class__, v.__class__)
2880 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002881
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002882 # Testing copy.deepcopy()
2883 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002884 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002885 import copy
2886 for cls in C, C1, C2:
2887 cls2 = copy.deepcopy(cls)
2888 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002889
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002890 a = C1(1, 2); a.append(42); a.append(24)
2891 b = C2("hello", "world", 42)
2892 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002893 vereq(x.__class__, a.__class__)
2894 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2895 vereq(y.__class__, b.__class__)
2896 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002897 vereq(repr(x), repr(a))
2898 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002899 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002900 print("a = x =", a)
2901 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002902
Guido van Rossum8c842552002-03-14 23:05:54 +00002903def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002904 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002905 import pickle, pickle as cPickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002906 # Pickling of classes with __slots__ but without __getstate__ should fail
2907 global B, C, D, E
2908 class B(object):
2909 pass
2910 for base in [object, B]:
2911 class C(base):
2912 __slots__ = ['a']
2913 class D(C):
2914 pass
2915 try:
2916 pickle.dumps(C())
2917 except TypeError:
2918 pass
2919 else:
2920 raise TestFailed, "should fail: pickle C instance - %s" % base
2921 try:
2922 cPickle.dumps(C())
2923 except TypeError:
2924 pass
2925 else:
2926 raise TestFailed, "should fail: cPickle C instance - %s" % base
2927 try:
2928 pickle.dumps(C())
2929 except TypeError:
2930 pass
2931 else:
2932 raise TestFailed, "should fail: pickle D instance - %s" % base
2933 try:
2934 cPickle.dumps(D())
2935 except TypeError:
2936 pass
2937 else:
2938 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002939 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002940 class C(base):
2941 __slots__ = ['a']
2942 def __getstate__(self):
2943 try:
2944 d = self.__dict__.copy()
2945 except AttributeError:
2946 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002947 for cls in self.__class__.__mro__:
2948 for sn in cls.__dict__.get('__slots__', ()):
2949 try:
2950 d[sn] = getattr(self, sn)
2951 except AttributeError:
2952 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002953 return d
2954 def __setstate__(self, d):
2955 for k, v in d.items():
2956 setattr(self, k, v)
2957 class D(C):
2958 pass
2959 # Now it should work
2960 x = C()
2961 y = pickle.loads(pickle.dumps(x))
2962 vereq(hasattr(y, 'a'), 0)
2963 y = cPickle.loads(cPickle.dumps(x))
2964 vereq(hasattr(y, 'a'), 0)
2965 x.a = 42
2966 y = pickle.loads(pickle.dumps(x))
2967 vereq(y.a, 42)
2968 y = cPickle.loads(cPickle.dumps(x))
2969 vereq(y.a, 42)
2970 x = D()
2971 x.a = 42
2972 x.b = 100
2973 y = pickle.loads(pickle.dumps(x))
2974 vereq(y.a + y.b, 142)
2975 y = cPickle.loads(cPickle.dumps(x))
2976 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002977 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002978 class E(C):
2979 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002980 x = E()
2981 x.a = 42
2982 x.b = "foo"
2983 y = pickle.loads(pickle.dumps(x))
2984 vereq(y.a, x.a)
2985 vereq(y.b, x.b)
2986 y = cPickle.loads(cPickle.dumps(x))
2987 vereq(y.a, x.a)
2988 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002989
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002990def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002991 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002992 import copy
2993 class C(object):
2994 pass
2995
2996 a = C()
2997 a.foo = 12
2998 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002999 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003000
3001 a.bar = [1,2,3]
3002 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003003 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003004 verify(c.bar is a.bar)
3005
3006 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00003007 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003008 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00003009 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00003010
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003011def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003012 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003013 class I(int):
3014 def __repr__(self):
3015 return "I(%r)" % int(self)
3016 def __add__(self, other):
3017 return I(int(self) + int(other))
3018 __radd__ = __add__
3019 def __pow__(self, other, mod=None):
3020 if mod is None:
3021 return I(pow(int(self), int(other)))
3022 else:
3023 return I(pow(int(self), int(other), int(mod)))
3024 def __rpow__(self, other, mod=None):
3025 if mod is None:
3026 return I(pow(int(other), int(self), mod))
3027 else:
3028 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00003029
Walter Dörwald70a6b492004-02-12 17:35:32 +00003030 vereq(repr(I(1) + I(2)), "I(3)")
3031 vereq(repr(I(1) + 2), "I(3)")
3032 vereq(repr(1 + I(2)), "I(3)")
3033 vereq(repr(I(2) ** I(3)), "I(8)")
3034 vereq(repr(2 ** I(3)), "I(8)")
3035 vereq(repr(I(2) ** 3), "I(8)")
3036 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00003037 class S(str):
3038 def __eq__(self, other):
3039 return self.lower() == other.lower()
3040
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003041def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003042 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003043 class A(object):
3044 pass
3045 class B(A):
3046 pass
3047 class C(A):
3048 pass
3049 class D(B, C):
3050 pass
3051 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003052 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003053 A.__hash__ = lambda self: 42
3054 vereq(hash(d), 42)
3055 C.__hash__ = lambda self: 314
3056 vereq(hash(d), 314)
3057 B.__hash__ = lambda self: 144
3058 vereq(hash(d), 144)
3059 D.__hash__ = lambda self: 100
3060 vereq(hash(d), 100)
3061 del D.__hash__
3062 vereq(hash(d), 144)
3063 del B.__hash__
3064 vereq(hash(d), 314)
3065 del C.__hash__
3066 vereq(hash(d), 42)
3067 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003068 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003069 d.foo = 42
3070 d.bar = 42
3071 vereq(d.foo, 42)
3072 vereq(d.bar, 42)
3073 def __getattribute__(self, name):
3074 if name == "foo":
3075 return 24
3076 return object.__getattribute__(self, name)
3077 A.__getattribute__ = __getattribute__
3078 vereq(d.foo, 24)
3079 vereq(d.bar, 42)
3080 def __getattr__(self, name):
3081 if name in ("spam", "foo", "bar"):
3082 return "hello"
3083 raise AttributeError, name
3084 B.__getattr__ = __getattr__
3085 vereq(d.spam, "hello")
3086 vereq(d.foo, 24)
3087 vereq(d.bar, 42)
3088 del A.__getattribute__
3089 vereq(d.foo, 42)
3090 del d.foo
3091 vereq(d.foo, "hello")
3092 vereq(d.bar, 42)
3093 del B.__getattr__
3094 try:
3095 d.foo
3096 except AttributeError:
3097 pass
3098 else:
3099 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003100
Guido van Rossume7f3e242002-06-14 02:35:45 +00003101 # Test a nasty bug in recurse_down_subclasses()
3102 import gc
3103 class A(object):
3104 pass
3105 class B(A):
3106 pass
3107 del B
3108 gc.collect()
3109 A.__setitem__ = lambda *a: None # crash
3110
Tim Petersfc57ccb2001-10-12 02:38:24 +00003111def buffer_inherit():
3112 import binascii
3113 # SF bug [#470040] ParseTuple t# vs subclasses.
3114 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003115 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003116
3117 class MyStr(str):
3118 pass
3119 base = 'abc'
3120 m = MyStr(base)
3121 # b2a_hex uses the buffer interface to get its argument's value, via
3122 # PyArg_ParseTuple 't#' code.
3123 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3124
3125 # It's not clear that unicode will continue to support the character
3126 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003127 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003128 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003129 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003130 m = MyUni(base)
3131 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3132
3133 class MyInt(int):
3134 pass
3135 m = MyInt(42)
3136 try:
3137 binascii.b2a_hex(m)
3138 raise TestFailed('subclass of int should not have a buffer interface')
3139 except TypeError:
3140 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003141
Tim Petersc9933152001-10-16 20:18:24 +00003142def str_of_str_subclass():
3143 import binascii
3144 import cStringIO
3145
3146 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003147 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003148
3149 class octetstring(str):
3150 def __str__(self):
3151 return binascii.b2a_hex(self)
3152 def __repr__(self):
3153 return self + " repr"
3154
3155 o = octetstring('A')
3156 vereq(type(o), octetstring)
3157 vereq(type(str(o)), str)
3158 vereq(type(repr(o)), str)
3159 vereq(ord(o), 0x41)
3160 vereq(str(o), '41')
3161 vereq(repr(o), 'A repr')
3162 vereq(o.__str__(), '41')
3163 vereq(o.__repr__(), 'A repr')
3164
3165 capture = cStringIO.StringIO()
3166 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003167 print(o, file=capture)
3168 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003169 vereq(capture.getvalue(), '41\n41\n')
3170 capture.close()
3171
Guido van Rossumc8e56452001-10-22 00:43:43 +00003172def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003173 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003174 def f(a): return a
3175 vereq(f.__call__(a=42), 42)
3176 a = []
3177 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003178 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003179
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003180def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003181 if verbose: print(("Testing recursive __call__() by setting to instance of "
3182 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003183 class A(object):
3184 pass
3185
3186 A.__call__ = A()
3187 try:
3188 A()()
3189 except RuntimeError:
3190 pass
3191 else:
3192 raise TestFailed("Recursion limit should have been reached for "
3193 "__call__()")
3194
Guido van Rossumed87ad82001-10-30 02:33:02 +00003195def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003196 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003197 log = []
3198 class C(object):
3199 def __del__(self):
3200 log.append(1)
3201 c = C()
3202 vereq(log, [])
3203 del c
3204 vereq(log, [1])
3205
Guido van Rossum29d26062001-12-11 04:37:34 +00003206 class D(object): pass
3207 d = D()
3208 try: del d[0]
3209 except TypeError: pass
3210 else: raise TestFailed, "invalid del() didn't raise TypeError"
3211
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003212def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003213 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003214
3215 class mydict(dict):
3216 pass
3217 d = mydict()
3218 try:
3219 hash(d)
3220 except TypeError:
3221 pass
3222 else:
3223 raise TestFailed, "hash() of dict subclass should fail"
3224
3225 class mylist(list):
3226 pass
3227 d = mylist()
3228 try:
3229 hash(d)
3230 except TypeError:
3231 pass
3232 else:
3233 raise TestFailed, "hash() of list subclass should fail"
3234
Guido van Rossum29d26062001-12-11 04:37:34 +00003235def strops():
3236 try: 'a' + 5
3237 except TypeError: pass
3238 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3239
3240 try: ''.split('')
3241 except ValueError: pass
3242 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3243
3244 try: ''.join([0])
3245 except TypeError: pass
3246 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3247
3248 try: ''.rindex('5')
3249 except ValueError: pass
3250 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3251
Guido van Rossum29d26062001-12-11 04:37:34 +00003252 try: '%(n)s' % None
3253 except TypeError: pass
3254 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3255
3256 try: '%(n' % {}
3257 except ValueError: pass
3258 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3259
3260 try: '%*s' % ('abc')
3261 except TypeError: pass
3262 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3263
3264 try: '%*.*s' % ('abc', 5)
3265 except TypeError: pass
3266 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3267
3268 try: '%s' % (1, 2)
3269 except TypeError: pass
3270 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3271
3272 try: '%' % None
3273 except ValueError: pass
3274 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3275
3276 vereq('534253'.isdigit(), 1)
3277 vereq('534253x'.isdigit(), 0)
3278 vereq('%c' % 5, '\x05')
3279 vereq('%c' % '5', '5')
3280
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003281def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003282 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003283 class Node:
3284 pass
3285 a = Node()
3286 b = Node()
3287 a.b = b
3288 b.a = a
3289 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003290
Guido van Rossumd7035672002-03-12 20:43:31 +00003291def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003292 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003293 from types import ModuleType as M
3294 m = M.__new__(M)
3295 str(m)
3296 vereq(hasattr(m, "__name__"), 0)
3297 vereq(hasattr(m, "__file__"), 0)
3298 vereq(hasattr(m, "foo"), 0)
3299 vereq(m.__dict__, None)
3300 m.foo = 1
3301 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003302
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003303def dictproxyiterkeys():
3304 class C(object):
3305 def meth(self):
3306 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003307 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003308 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003309 keys.sort()
3310 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3311
3312def dictproxyitervalues():
3313 class C(object):
3314 def meth(self):
3315 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003316 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003317 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003318 vereq(len(values), 5)
3319
3320def dictproxyiteritems():
3321 class C(object):
3322 def meth(self):
3323 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003324 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003325 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003326 keys.sort()
3327 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3328
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003329def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003330 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003331 class C(object):
3332 def __new__(cls, arg):
3333 if isinstance(arg, str): return [1, 2, 3]
3334 elif isinstance(arg, int): return object.__new__(D)
3335 else: return object.__new__(cls)
3336 class D(C):
3337 def __init__(self, arg):
3338 self.foo = arg
3339 vereq(C("1"), [1, 2, 3])
3340 vereq(D("1"), [1, 2, 3])
3341 d = D(None)
3342 veris(d.foo, None)
3343 d = C(1)
3344 vereq(isinstance(d, D), True)
3345 vereq(d.foo, 1)
3346 d = D(1)
3347 vereq(isinstance(d, D), True)
3348 vereq(d.foo, 1)
3349
Guido van Rossume8fc6402002-04-16 16:44:51 +00003350def imulbug():
3351 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003352 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003353 class C(object):
3354 def __imul__(self, other):
3355 return (self, other)
3356 x = C()
3357 y = x
3358 y *= 1.0
3359 vereq(y, (x, 1.0))
3360 y = x
3361 y *= 2
3362 vereq(y, (x, 2))
3363 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003364 y *= 3
3365 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003366 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003367 y *= 1<<100
3368 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003369 y = x
3370 y *= None
3371 vereq(y, (x, None))
3372 y = x
3373 y *= "foo"
3374 vereq(y, (x, "foo"))
3375
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003376def docdescriptor():
3377 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003378 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003379 class DocDescr(object):
3380 def __get__(self, object, otype):
3381 if object:
3382 object = object.__class__.__name__ + ' instance'
3383 if otype:
3384 otype = otype.__name__
3385 return 'object=%s; type=%s' % (object, otype)
3386 class OldClass:
3387 __doc__ = DocDescr()
3388 class NewClass(object):
3389 __doc__ = DocDescr()
3390 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3391 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3392 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3393 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3394
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003395def copy_setstate():
3396 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003397 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003398 import copy
3399 class C(object):
3400 def __init__(self, foo=None):
3401 self.foo = foo
3402 self.__foo = foo
3403 def setfoo(self, foo=None):
3404 self.foo = foo
3405 def getfoo(self):
3406 return self.__foo
3407 def __getstate__(self):
3408 return [self.foo]
3409 def __setstate__(self, lst):
3410 assert len(lst) == 1
3411 self.__foo = self.foo = lst[0]
3412 a = C(42)
3413 a.setfoo(24)
3414 vereq(a.foo, 24)
3415 vereq(a.getfoo(), 42)
3416 b = copy.copy(a)
3417 vereq(b.foo, 24)
3418 vereq(b.getfoo(), 24)
3419 b = copy.deepcopy(a)
3420 vereq(b.foo, 24)
3421 vereq(b.getfoo(), 24)
3422
Guido van Rossum09638c12002-06-13 19:17:46 +00003423def slices():
3424 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003425 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003426 # Strings
3427 vereq("hello"[:4], "hell")
3428 vereq("hello"[slice(4)], "hell")
3429 vereq(str.__getitem__("hello", slice(4)), "hell")
3430 class S(str):
3431 def __getitem__(self, x):
3432 return str.__getitem__(self, x)
3433 vereq(S("hello")[:4], "hell")
3434 vereq(S("hello")[slice(4)], "hell")
3435 vereq(S("hello").__getitem__(slice(4)), "hell")
3436 # Tuples
3437 vereq((1,2,3)[:2], (1,2))
3438 vereq((1,2,3)[slice(2)], (1,2))
3439 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3440 class T(tuple):
3441 def __getitem__(self, x):
3442 return tuple.__getitem__(self, x)
3443 vereq(T((1,2,3))[:2], (1,2))
3444 vereq(T((1,2,3))[slice(2)], (1,2))
3445 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3446 # Lists
3447 vereq([1,2,3][:2], [1,2])
3448 vereq([1,2,3][slice(2)], [1,2])
3449 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3450 class L(list):
3451 def __getitem__(self, x):
3452 return list.__getitem__(self, x)
3453 vereq(L([1,2,3])[:2], [1,2])
3454 vereq(L([1,2,3])[slice(2)], [1,2])
3455 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3456 # Now do lists and __setitem__
3457 a = L([1,2,3])
3458 a[slice(1, 3)] = [3,2]
3459 vereq(a, [1,3,2])
3460 a[slice(0, 2, 1)] = [3,1]
3461 vereq(a, [3,1,2])
3462 a.__setitem__(slice(1, 3), [2,1])
3463 vereq(a, [3,2,1])
3464 a.__setitem__(slice(0, 2, 1), [2,3])
3465 vereq(a, [2,3,1])
3466
Tim Peters2484aae2002-07-11 06:56:07 +00003467def subtype_resurrection():
3468 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003469 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003470
3471 class C(object):
3472 container = []
3473
3474 def __del__(self):
3475 # resurrect the instance
3476 C.container.append(self)
3477
3478 c = C()
3479 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003480 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003481 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003482 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003483
3484 # If that didn't blow up, it's also interesting to see whether clearing
3485 # the last container slot works: that will attempt to delete c again,
3486 # which will cause c to get appended back to the container again "during"
3487 # the del.
3488 del C.container[-1]
3489 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003490 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003491
Tim Peters14cb1e12002-07-11 18:26:21 +00003492 # Make c mortal again, so that the test framework with -l doesn't report
3493 # it as a leak.
3494 del C.__del__
3495
Guido van Rossum2d702462002-08-06 21:28:28 +00003496def slottrash():
3497 # Deallocating deeply nested slotted trash caused stack overflows
3498 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003499 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003500 class trash(object):
3501 __slots__ = ['x']
3502 def __init__(self, x):
3503 self.x = x
3504 o = None
3505 for i in xrange(50000):
3506 o = trash(o)
3507 del o
3508
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003509def slotmultipleinheritance():
3510 # SF bug 575229, multiple inheritance w/ slots dumps core
3511 class A(object):
3512 __slots__=()
3513 class B(object):
3514 pass
3515 class C(A,B) :
3516 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003517 vereq(C.__basicsize__, B.__basicsize__)
3518 verify(hasattr(C, '__dict__'))
3519 verify(hasattr(C, '__weakref__'))
3520 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003521
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003522def testrmul():
3523 # SF patch 592646
3524 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003525 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003526 class C(object):
3527 def __mul__(self, other):
3528 return "mul"
3529 def __rmul__(self, other):
3530 return "rmul"
3531 a = C()
3532 vereq(a*2, "mul")
3533 vereq(a*2.2, "mul")
3534 vereq(2*a, "rmul")
3535 vereq(2.2*a, "rmul")
3536
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003537def testipow():
3538 # [SF bug 620179]
3539 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003540 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003541 class C(object):
3542 def __ipow__(self, other):
3543 pass
3544 a = C()
3545 a **= 2
3546
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003547def do_this_first():
3548 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003549 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003550 # This dumps core when SF bug 551412 isn't fixed --
3551 # but only when test_descr.py is run separately.
3552 # (That can't be helped -- as soon as PyType_Ready()
3553 # is called for PyLong_Type, the bug is gone.)
3554 class UserLong(object):
3555 def __pow__(self, *args):
3556 pass
3557 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003558 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003559 except:
3560 pass
3561
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003562 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003563 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003564 # Another segfault only when run early
3565 # (before PyType_Ready(tuple) is called)
3566 type.mro(tuple)
3567
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003568def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003569 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003570 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003571 # stuff that should work:
3572 class C(object):
3573 pass
3574 class C2(object):
3575 def __getattribute__(self, attr):
3576 if attr == 'a':
3577 return 2
3578 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003579 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003580 def meth(self):
3581 return 1
3582 class D(C):
3583 pass
3584 class E(D):
3585 pass
3586 d = D()
3587 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003588 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003589 D.__bases__ = (C2,)
3590 vereq(d.meth(), 1)
3591 vereq(e.meth(), 1)
3592 vereq(d.a, 2)
3593 vereq(e.a, 2)
3594 vereq(C2.__subclasses__(), [D])
3595
3596 # stuff that shouldn't:
3597 class L(list):
3598 pass
3599
3600 try:
3601 L.__bases__ = (dict,)
3602 except TypeError:
3603 pass
3604 else:
3605 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3606
3607 try:
3608 list.__bases__ = (dict,)
3609 except TypeError:
3610 pass
3611 else:
3612 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3613
3614 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003615 D.__bases__ = (C2, list)
3616 except TypeError:
3617 pass
3618 else:
3619 assert 0, "best_base calculation found wanting"
3620
3621 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003622 del D.__bases__
3623 except TypeError:
3624 pass
3625 else:
3626 raise TestFailed, "shouldn't be able to delete .__bases__"
3627
3628 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003629 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003630 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003631 if str(msg) == "a new-style class can't have only classic bases":
3632 raise TestFailed, "wrong error message for .__bases__ = ()"
3633 else:
3634 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3635
3636 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003637 D.__bases__ = (D,)
3638 except TypeError:
3639 pass
3640 else:
3641 # actually, we'll have crashed by here...
3642 raise TestFailed, "shouldn't be able to create inheritance cycles"
3643
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003644 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003645 D.__bases__ = (C, C)
3646 except TypeError:
3647 pass
3648 else:
3649 raise TestFailed, "didn't detect repeated base classes"
3650
3651 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003652 D.__bases__ = (E,)
3653 except TypeError:
3654 pass
3655 else:
3656 raise TestFailed, "shouldn't be able to create inheritance cycles"
3657
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003658def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003659 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003660 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003661 class WorkOnce(type):
3662 def __new__(self, name, bases, ns):
3663 self.flag = 0
3664 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3665 def mro(self):
3666 if self.flag > 0:
3667 raise RuntimeError, "bozo"
3668 else:
3669 self.flag += 1
3670 return type.mro(self)
3671
3672 class WorkAlways(type):
3673 def mro(self):
3674 # this is here to make sure that .mro()s aren't called
3675 # with an exception set (which was possible at one point).
3676 # An error message will be printed in a debug build.
3677 # What's a good way to test for this?
3678 return type.mro(self)
3679
3680 class C(object):
3681 pass
3682
3683 class C2(object):
3684 pass
3685
3686 class D(C):
3687 pass
3688
3689 class E(D):
3690 pass
3691
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003692 class F(D, metaclass=WorkOnce):
3693 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003694
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003695 class G(D, metaclass=WorkAlways):
3696 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003697
3698 # Immediate subclasses have their mro's adjusted in alphabetical
3699 # order, so E's will get adjusted before adjusting F's fails. We
3700 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003701
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003702 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003703 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003704
3705 try:
3706 D.__bases__ = (C2,)
3707 except RuntimeError:
3708 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003709 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003710 else:
3711 raise TestFailed, "exception not propagated"
3712
3713def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003714 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003715 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003716 class A(object):
3717 pass
3718
3719 class B(object):
3720 pass
3721
3722 class C(A, B):
3723 pass
3724
3725 class D(A, B):
3726 pass
3727
3728 class E(C, D):
3729 pass
3730
3731 try:
3732 C.__bases__ = (B, A)
3733 except TypeError:
3734 pass
3735 else:
3736 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003737
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003738def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003739 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003740 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003741 class C(object):
3742 pass
3743
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003744 # C.__module__ could be 'test_descr' or '__main__'
3745 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003746
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003747 C.__name__ = 'D'
3748 vereq((C.__module__, C.__name__), (mod, 'D'))
3749
3750 C.__name__ = 'D.E'
3751 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003752
Guido van Rossum613f24f2003-01-06 23:00:59 +00003753def subclass_right_op():
3754 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003755 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003756
3757 # This code tests various cases where right-dispatch of a subclass
3758 # should be preferred over left-dispatch of a base class.
3759
3760 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3761
3762 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003763 def __floordiv__(self, other):
3764 return "B.__floordiv__"
3765 def __rfloordiv__(self, other):
3766 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003767
Guido van Rossumf389c772003-02-27 20:04:19 +00003768 vereq(B(1) // 1, "B.__floordiv__")
3769 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003770
3771 # Case 2: subclass of object; this is just the baseline for case 3
3772
3773 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003774 def __floordiv__(self, other):
3775 return "C.__floordiv__"
3776 def __rfloordiv__(self, other):
3777 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003778
Guido van Rossumf389c772003-02-27 20:04:19 +00003779 vereq(C() // 1, "C.__floordiv__")
3780 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003781
3782 # Case 3: subclass of new-style class; here it gets interesting
3783
3784 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003785 def __floordiv__(self, other):
3786 return "D.__floordiv__"
3787 def __rfloordiv__(self, other):
3788 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003789
Guido van Rossumf389c772003-02-27 20:04:19 +00003790 vereq(D() // C(), "D.__floordiv__")
3791 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003792
3793 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3794
3795 class E(C):
3796 pass
3797
Guido van Rossumf389c772003-02-27 20:04:19 +00003798 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003799
Guido van Rossumf389c772003-02-27 20:04:19 +00003800 vereq(E() // 1, "C.__floordiv__")
3801 vereq(1 // E(), "C.__rfloordiv__")
3802 vereq(E() // C(), "C.__floordiv__")
3803 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003804
Guido van Rossum373c7412003-01-07 13:41:37 +00003805def dict_type_with_metaclass():
3806 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003807 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003808
3809 class B(object):
3810 pass
3811 class M(type):
3812 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003813 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003814 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003815 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003816 veris(type(C.__dict__), type(B.__dict__))
3817
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003818def meth_class_get():
3819 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003820 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003821 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003822 # Baseline
3823 arg = [1, 2, 3]
3824 res = {1: None, 2: None, 3: None}
3825 vereq(dict.fromkeys(arg), res)
3826 vereq({}.fromkeys(arg), res)
3827 # Now get the descriptor
3828 descr = dict.__dict__["fromkeys"]
3829 # More baseline using the descriptor directly
3830 vereq(descr.__get__(None, dict)(arg), res)
3831 vereq(descr.__get__({})(arg), res)
3832 # Now check various error cases
3833 try:
3834 descr.__get__(None, None)
3835 except TypeError:
3836 pass
3837 else:
3838 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3839 try:
3840 descr.__get__(42)
3841 except TypeError:
3842 pass
3843 else:
3844 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3845 try:
3846 descr.__get__(None, 42)
3847 except TypeError:
3848 pass
3849 else:
3850 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3851 try:
3852 descr.__get__(None, int)
3853 except TypeError:
3854 pass
3855 else:
3856 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3857
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003858def isinst_isclass():
3859 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003860 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003861 class Proxy(object):
3862 def __init__(self, obj):
3863 self.__obj = obj
3864 def __getattribute__(self, name):
3865 if name.startswith("_Proxy__"):
3866 return object.__getattribute__(self, name)
3867 else:
3868 return getattr(self.__obj, name)
3869 # Test with a classic class
3870 class C:
3871 pass
3872 a = C()
3873 pa = Proxy(a)
3874 verify(isinstance(a, C)) # Baseline
3875 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003876 # Test with a classic subclass
3877 class D(C):
3878 pass
3879 a = D()
3880 pa = Proxy(a)
3881 verify(isinstance(a, C)) # Baseline
3882 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003883 # Test with a new-style class
3884 class C(object):
3885 pass
3886 a = C()
3887 pa = Proxy(a)
3888 verify(isinstance(a, C)) # Baseline
3889 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003890 # Test with a new-style subclass
3891 class D(C):
3892 pass
3893 a = D()
3894 pa = Proxy(a)
3895 verify(isinstance(a, C)) # Baseline
3896 verify(isinstance(pa, C)) # Test
3897
3898def proxysuper():
3899 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003900 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003901 class Proxy(object):
3902 def __init__(self, obj):
3903 self.__obj = obj
3904 def __getattribute__(self, name):
3905 if name.startswith("_Proxy__"):
3906 return object.__getattribute__(self, name)
3907 else:
3908 return getattr(self.__obj, name)
3909
3910 class B(object):
3911 def f(self):
3912 return "B.f"
3913
3914 class C(B):
3915 def f(self):
3916 return super(C, self).f() + "->C.f"
3917
3918 obj = C()
3919 p = Proxy(obj)
3920 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003921
Guido van Rossum52b27052003-04-15 20:05:10 +00003922def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003923 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003924 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003925 try:
3926 object.__setattr__(str, "foo", 42)
3927 except TypeError:
3928 pass
3929 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003930 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003931 try:
3932 object.__delattr__(str, "lower")
3933 except TypeError:
3934 pass
3935 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003936 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003937
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003938def weakref_segfault():
3939 # SF 742911
3940 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003941 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003942
3943 import weakref
3944
3945 class Provoker:
3946 def __init__(self, referrent):
3947 self.ref = weakref.ref(referrent)
3948
3949 def __del__(self):
3950 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003951
3952 class Oops(object):
3953 pass
3954
3955 o = Oops()
3956 o.whatever = Provoker(o)
3957 del o
3958
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003959def wrapper_segfault():
3960 # SF 927248: deeply nested wrappers could cause stack overflow
3961 f = lambda:None
3962 for i in xrange(1000000):
3963 f = f.__call__
3964 f = None
3965
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003966# Fix SF #762455, segfault when sys.stdout is changed in getattr
3967def filefault():
3968 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003969 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003970 import sys
3971 class StdoutGuard:
3972 def __getattr__(self, attr):
3973 sys.stdout = sys.__stdout__
3974 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3975 sys.stdout = StdoutGuard()
3976 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003977 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003978 except RuntimeError:
3979 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003980
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003981def vicious_descriptor_nonsense():
3982 # A potential segfault spotted by Thomas Wouters in mail to
3983 # python-dev 2003-04-17, turned into an example & fixed by Michael
3984 # Hudson just less than four months later...
3985 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003986 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003987
3988 class Evil(object):
3989 def __hash__(self):
3990 return hash('attr')
3991 def __eq__(self, other):
3992 del C.attr
3993 return 0
3994
3995 class Descr(object):
3996 def __get__(self, ob, type=None):
3997 return 1
3998
3999 class C(object):
4000 attr = Descr()
4001
4002 c = C()
4003 c.__dict__[Evil()] = 0
4004
4005 vereq(c.attr, 1)
4006 # this makes a crash more likely:
4007 import gc; gc.collect()
4008 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00004009
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004010def test_init():
4011 # SF 1155938
4012 class Foo(object):
4013 def __init__(self):
4014 return 10
4015 try:
4016 Foo()
4017 except TypeError:
4018 pass
4019 else:
4020 raise TestFailed, "did not test __init__() for None return"
4021
Armin Rigoc6686b72005-11-07 08:38:00 +00004022def methodwrapper():
4023 # <type 'method-wrapper'> did not support any reflection before 2.5
4024 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004025 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00004026
Guido van Rossum47b9ff62006-08-24 00:41:19 +00004027 return # XXX should methods really support __eq__?
4028
Armin Rigoc6686b72005-11-07 08:38:00 +00004029 l = []
4030 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004031 vereq(l.__add__, [].__add__)
4032 verify(l.__add__ != [5].__add__)
4033 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00004034 verify(l.__add__.__name__ == '__add__')
4035 verify(l.__add__.__self__ is l)
4036 verify(l.__add__.__objclass__ is list)
4037 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004038 try:
4039 hash(l.__add__)
4040 except TypeError:
4041 pass
4042 else:
4043 raise TestFailed("no TypeError from hash([].__add__)")
4044
4045 t = ()
4046 t += (7,)
4047 vereq(t.__add__, (7,).__add__)
4048 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004049
Armin Rigofd163f92005-12-29 15:59:19 +00004050def notimplemented():
4051 # all binary methods should be able to return a NotImplemented
4052 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004053 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004054
4055 import sys
4056 import types
4057 import operator
4058
4059 def specialmethod(self, other):
4060 return NotImplemented
4061
4062 def check(expr, x, y):
4063 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004064 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004065 except TypeError:
4066 pass
4067 else:
4068 raise TestFailed("no TypeError from %r" % (expr,))
4069
Guido van Rossume2a383d2007-01-15 16:59:06 +00004070 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004071 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4072 # ValueErrors instead of TypeErrors
4073 for metaclass in [type, types.ClassType]:
4074 for name, expr, iexpr in [
4075 ('__add__', 'x + y', 'x += y'),
4076 ('__sub__', 'x - y', 'x -= y'),
4077 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004078 ('__truediv__', 'x / y', None),
4079 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004080 ('__mod__', 'x % y', 'x %= y'),
4081 ('__divmod__', 'divmod(x, y)', None),
4082 ('__pow__', 'x ** y', 'x **= y'),
4083 ('__lshift__', 'x << y', 'x <<= y'),
4084 ('__rshift__', 'x >> y', 'x >>= y'),
4085 ('__and__', 'x & y', 'x &= y'),
4086 ('__or__', 'x | y', 'x |= y'),
4087 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004088 ]:
4089 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004090 A = metaclass('A', (), {name: specialmethod})
4091 B = metaclass('B', (), {rname: specialmethod})
4092 a = A()
4093 b = B()
4094 check(expr, a, a)
4095 check(expr, a, b)
4096 check(expr, b, a)
4097 check(expr, b, b)
4098 check(expr, a, N1)
4099 check(expr, a, N2)
4100 check(expr, N1, b)
4101 check(expr, N2, b)
4102 if iexpr:
4103 check(iexpr, a, a)
4104 check(iexpr, a, b)
4105 check(iexpr, b, a)
4106 check(iexpr, b, b)
4107 check(iexpr, a, N1)
4108 check(iexpr, a, N2)
4109 iname = '__i' + name[2:]
4110 C = metaclass('C', (), {iname: specialmethod})
4111 c = C()
4112 check(iexpr, c, a)
4113 check(iexpr, c, b)
4114 check(iexpr, c, N1)
4115 check(iexpr, c, N2)
4116
Guido van Rossumd8faa362007-04-27 19:54:29 +00004117def test_assign_slice():
4118 # ceval.c's assign_slice used to check for
4119 # tp->tp_as_sequence->sq_slice instead of
4120 # tp->tp_as_sequence->sq_ass_slice
4121
4122 class C(object):
4123 def __setslice__(self, start, stop, value):
4124 self.value = value
4125
4126 c = C()
4127 c[1:2] = 3
4128 vereq(c.value, 3)
4129
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004130def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004131 weakref_segfault() # Must be first, somehow
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004132 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004133 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004134 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004135 lists()
4136 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004137 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004138 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004139 ints()
4140 longs()
4141 floats()
4142 complexes()
4143 spamlists()
4144 spamdicts()
4145 pydicts()
4146 pylists()
4147 metaclass()
4148 pymods()
4149 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004150 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004151 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004152 ex5()
4153 monotonicity()
4154 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004155 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004156 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004157 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004158 dynamics()
4159 errors()
4160 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004161 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004162 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004163 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004164 classic()
4165 compattr()
4166 newslot()
4167 altmro()
4168 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004169 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004170 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004171 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004172 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004173 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004174 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004175 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004176 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004177 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004178 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004179 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004180 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004181 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004182 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004183 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004184 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004185 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004186 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004187 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004188 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004189 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004190 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004191 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004192 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004193 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004194 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004195 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004196 dictproxyiterkeys()
4197 dictproxyitervalues()
4198 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004199 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004200 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004201 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004202 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004203 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004204 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004205 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004206 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004207 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004208 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004209 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004210 test_mutable_bases()
4211 test_mutable_bases_with_failing_mro()
4212 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004213 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004214 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004215 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004216 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004217 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004218 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004219 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004220 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004221 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004222 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004223 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004224 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004225 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004226
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004227 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004228
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004229if __name__ == "__main__":
4230 test_main()