blob: 6cd8ccd8c32ce8d741878e9f6a1e7a68dc57f085 [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 Rossume2a383d2007-01-15 16:59:06 +0000267 for arg in 2, 2, 2j, 2e0, [2], "2", u"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
Tim Peters6d6c1a32001-08-02 04:15:00 +0000776def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000777 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000778 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000779 import sys
780 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000781 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000782 def __init__(self, name):
783 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000784 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000785 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000786 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000787 def __setattr__(self, name, value):
788 log.append(("setattr", name, value))
789 MT.__setattr__(self, name, value)
790 def __delattr__(self, name):
791 log.append(("delattr", name))
792 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000793 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000794 a.foo = 12
795 x = a.foo
796 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000797 vereq(log, [("setattr", "foo", 12),
798 ("getattr", "foo"),
799 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000800
801def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000802 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803 class C(object):
804 def __init__(self):
805 self.__state = 0
806 def getstate(self):
807 return self.__state
808 def setstate(self, state):
809 self.__state = state
810 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000811 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000812 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000813 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000814 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000815 def __init__(self):
816 type({}).__init__(self)
817 C.__init__(self)
818 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000819 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000820 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000821 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000822 vereq(d["hello"], "world")
823 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000824 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000825 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000826 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000827
Guido van Rossume45763a2001-08-10 21:28:46 +0000828 # SF bug #442833
829 class Node(object):
830 def __int__(self):
831 return int(self.foo())
832 def foo(self):
833 return "23"
834 class Frag(Node, list):
835 def foo(self):
836 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000837 vereq(Node().__int__(), 23)
838 vereq(int(Node()), 23)
839 vereq(Frag().__int__(), 42)
840 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000841
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000843 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000844 class A(object):
845 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000846 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847 class B(A):
848 def boo(self): return "B"
849 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000850 vereq(B().spam(), "B")
851 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000852 class C(A):
853 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000854 vereq(C().spam(), "A")
855 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000856 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000857 vereq(D().spam(), "B")
858 vereq(D().boo(), "B")
859 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000861 vereq(E().spam(), "B")
862 vereq(E().boo(), "C")
863 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000864 # MRO order disagreement
865 try:
866 class F(D, E): pass
867 except TypeError:
868 pass
869 else:
870 raise TestFailed, "expected MRO order disagreement (F)"
871 try:
872 class G(E, D): pass
873 except TypeError:
874 pass
875 else:
876 raise TestFailed, "expected MRO order disagreement (G)"
877
878
879# see thread python-dev/2002-October/029035.html
880def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000881 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000882 class A(object): pass
883 class B(object): pass
884 class C(object): pass
885 class X(A): pass
886 class Y(A): pass
887 class Z(X,B,Y,C): pass
888 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
889
890# see "A Monotonic Superclass Linearization for Dylan",
891# by Kim Barrett et al. (OOPSLA 1996)
892def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000893 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000894 class Boat(object): pass
895 class DayBoat(Boat): pass
896 class WheelBoat(Boat): pass
897 class EngineLess(DayBoat): pass
898 class SmallMultihull(DayBoat): pass
899 class PedalWheelBoat(EngineLess,WheelBoat): pass
900 class SmallCatamaran(SmallMultihull): pass
901 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
902
903 vereq(PedalWheelBoat.__mro__,
904 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
905 object))
906 vereq(SmallCatamaran.__mro__,
907 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
908
909 vereq(Pedalo.__mro__,
910 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
911 SmallMultihull, DayBoat, WheelBoat, Boat, object))
912
913# see "A Monotonic Superclass Linearization for Dylan",
914# by Kim Barrett et al. (OOPSLA 1996)
915def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000916 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000917 class Pane(object): pass
918 class ScrollingMixin(object): pass
919 class EditingMixin(object): pass
920 class ScrollablePane(Pane,ScrollingMixin): pass
921 class EditablePane(Pane,EditingMixin): pass
922 class EditableScrollablePane(ScrollablePane,EditablePane): pass
923
924 vereq(EditableScrollablePane.__mro__,
925 (EditableScrollablePane, ScrollablePane, EditablePane,
926 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000927
Raymond Hettingerf394df42003-04-06 19:13:41 +0000928mro_err_msg = """Cannot create a consistent method resolution
929order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000930
Guido van Rossumd32047f2002-11-25 21:38:52 +0000931def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000932 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000933 def raises(exc, expected, callable, *args):
934 try:
935 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000936 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000937 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +0000938 raise TestFailed, "Message %r, expected %r" % (str(msg),
939 expected)
940 else:
941 raise TestFailed, "Expected %s" % exc
942 class A(object): pass
943 class B(A): pass
944 class C(object): pass
945 # Test some very simple errors
946 raises(TypeError, "duplicate base class A",
947 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000948 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000949 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000950 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000951 type, "X", (A, C, B), {})
952 # Test a slightly more complex error
953 class GridLayout(object): pass
954 class HorizontalGrid(GridLayout): pass
955 class VerticalGrid(GridLayout): pass
956 class HVGrid(HorizontalGrid, VerticalGrid): pass
957 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000958 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000959 type, "ConfusedGrid", (HVGrid, VHGrid), {})
960
Guido van Rossum37202612001-08-09 19:45:21 +0000961def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000962 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000963 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000964 vereq(a.__class__, object)
965 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000966 b = object()
967 verify(a is not b)
968 verify(not hasattr(a, "foo"))
969 try:
970 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000971 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000972 pass
973 else:
974 verify(0, "object() should not allow setting a foo attribute")
975 verify(not hasattr(object(), "__dict__"))
976
977 class Cdict(object):
978 pass
979 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000980 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000981 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000982 vereq(x.foo, 1)
983 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000984
Tim Peters6d6c1a32001-08-02 04:15:00 +0000985def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000986 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000987 class C0(object):
988 __slots__ = []
989 x = C0()
990 verify(not hasattr(x, "__dict__"))
991 verify(not hasattr(x, "foo"))
992
993 class C1(object):
994 __slots__ = ['a']
995 x = C1()
996 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +0000997 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000998 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000999 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001000 x.a = None
1001 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001002 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001003 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001004
1005 class C3(object):
1006 __slots__ = ['a', 'b', 'c']
1007 x = C3()
1008 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001009 verify(not hasattr(x, 'a'))
1010 verify(not hasattr(x, 'b'))
1011 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001012 x.a = 1
1013 x.b = 2
1014 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001015 vereq(x.a, 1)
1016 vereq(x.b, 2)
1017 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001018
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001019 class C4(object):
1020 """Validate name mangling"""
1021 __slots__ = ['__a']
1022 def __init__(self, value):
1023 self.__a = value
1024 def get(self):
1025 return self.__a
1026 x = C4(5)
1027 verify(not hasattr(x, '__dict__'))
1028 verify(not hasattr(x, '__a'))
1029 vereq(x.get(), 5)
1030 try:
1031 x.__a = 6
1032 except AttributeError:
1033 pass
1034 else:
1035 raise TestFailed, "Double underscored names not mangled"
1036
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001037 # Make sure slot names are proper identifiers
1038 try:
1039 class C(object):
1040 __slots__ = [None]
1041 except TypeError:
1042 pass
1043 else:
1044 raise TestFailed, "[None] slots not caught"
1045 try:
1046 class C(object):
1047 __slots__ = ["foo bar"]
1048 except TypeError:
1049 pass
1050 else:
1051 raise TestFailed, "['foo bar'] slots not caught"
1052 try:
1053 class C(object):
1054 __slots__ = ["foo\0bar"]
1055 except TypeError:
1056 pass
1057 else:
1058 raise TestFailed, "['foo\\0bar'] slots not caught"
1059 try:
1060 class C(object):
1061 __slots__ = ["1"]
1062 except TypeError:
1063 pass
1064 else:
1065 raise TestFailed, "['1'] slots not caught"
1066 try:
1067 class C(object):
1068 __slots__ = [""]
1069 except TypeError:
1070 pass
1071 else:
1072 raise TestFailed, "[''] slots not caught"
1073 class C(object):
1074 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1075
Guido van Rossum33bab012001-12-05 22:45:48 +00001076 # Test leaks
1077 class Counted(object):
1078 counter = 0 # counts the number of instances alive
1079 def __init__(self):
1080 Counted.counter += 1
1081 def __del__(self):
1082 Counted.counter -= 1
1083 class C(object):
1084 __slots__ = ['a', 'b', 'c']
1085 x = C()
1086 x.a = Counted()
1087 x.b = Counted()
1088 x.c = Counted()
1089 vereq(Counted.counter, 3)
1090 del x
1091 vereq(Counted.counter, 0)
1092 class D(C):
1093 pass
1094 x = D()
1095 x.a = Counted()
1096 x.z = Counted()
1097 vereq(Counted.counter, 2)
1098 del x
1099 vereq(Counted.counter, 0)
1100 class E(D):
1101 __slots__ = ['e']
1102 x = E()
1103 x.a = Counted()
1104 x.z = Counted()
1105 x.e = Counted()
1106 vereq(Counted.counter, 3)
1107 del x
1108 vereq(Counted.counter, 0)
1109
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001110 # Test cyclical leaks [SF bug 519621]
1111 class F(object):
1112 __slots__ = ['a', 'b']
1113 log = []
1114 s = F()
1115 s.a = [Counted(), s]
1116 vereq(Counted.counter, 1)
1117 s = None
1118 import gc
1119 gc.collect()
1120 vereq(Counted.counter, 0)
1121
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001122 # Test lookup leaks [SF bug 572567]
1123 import sys,gc
1124 class G(object):
1125 def __cmp__(self, other):
1126 return 0
1127 g = G()
1128 orig_objects = len(gc.get_objects())
1129 for i in xrange(10):
1130 g==g
1131 new_objects = len(gc.get_objects())
1132 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001133 class H(object):
1134 __slots__ = ['a', 'b']
1135 def __init__(self):
1136 self.a = 1
1137 self.b = 2
1138 def __del__(self):
1139 assert self.a == 1
1140 assert self.b == 2
1141
1142 save_stderr = sys.stderr
1143 sys.stderr = sys.stdout
1144 h = H()
1145 try:
1146 del h
1147 finally:
1148 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001149
Guido van Rossum8b056da2002-08-13 18:26:26 +00001150def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001151 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001152
1153 class D(object):
1154 __slots__ = ["__dict__"]
1155 a = D()
1156 verify(hasattr(a, "__dict__"))
1157 verify(not hasattr(a, "__weakref__"))
1158 a.foo = 42
1159 vereq(a.__dict__, {"foo": 42})
1160
1161 class W(object):
1162 __slots__ = ["__weakref__"]
1163 a = W()
1164 verify(hasattr(a, "__weakref__"))
1165 verify(not hasattr(a, "__dict__"))
1166 try:
1167 a.foo = 42
1168 except AttributeError:
1169 pass
1170 else:
1171 raise TestFailed, "shouldn't be allowed to set a.foo"
1172
1173 class C1(W, D):
1174 __slots__ = []
1175 a = C1()
1176 verify(hasattr(a, "__dict__"))
1177 verify(hasattr(a, "__weakref__"))
1178 a.foo = 42
1179 vereq(a.__dict__, {"foo": 42})
1180
1181 class C2(D, W):
1182 __slots__ = []
1183 a = C2()
1184 verify(hasattr(a, "__dict__"))
1185 verify(hasattr(a, "__weakref__"))
1186 a.foo = 42
1187 vereq(a.__dict__, {"foo": 42})
1188
Guido van Rossum9a818922002-11-14 19:50:14 +00001189# MRO order disagreement
1190#
1191# class C3(C1, C2):
1192# __slots__ = []
1193#
1194# class C4(C2, C1):
1195# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001196
Tim Peters6d6c1a32001-08-02 04:15:00 +00001197def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001198 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001199 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001200 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001201 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001202 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001203 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001206 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001207 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001208 vereq(E.foo, 1)
1209 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001210 # Test dynamic instances
1211 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001212 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001213 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001214 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001215 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001216 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001217 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001218 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001219 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001220 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001221 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001222 vereq(int(a), 100)
1223 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001224 verify(not hasattr(a, "spam"))
1225 def mygetattr(self, name):
1226 if name == "spam":
1227 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001228 raise AttributeError
1229 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001230 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001231 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001232 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001233 def mysetattr(self, name, value):
1234 if name == "spam":
1235 raise AttributeError
1236 return object.__setattr__(self, name, value)
1237 C.__setattr__ = mysetattr
1238 try:
1239 a.spam = "not spam"
1240 except AttributeError:
1241 pass
1242 else:
1243 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001244 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001245 class D(C):
1246 pass
1247 d = D()
1248 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001249 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001250
Guido van Rossum7e35d572001-09-15 03:14:32 +00001251 # Test handling of int*seq and seq*int
1252 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001253 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001254 vereq("a"*I(2), "aa")
1255 vereq(I(2)*"a", "aa")
1256 vereq(2*I(3), 6)
1257 vereq(I(3)*2, 6)
1258 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001259
1260 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001261 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001262 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001263 vereq("a"*L(2), "aa")
1264 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001265 vereq(2*L(3), 6)
1266 vereq(L(3)*2, 6)
1267 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001268
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001269 # Test comparison of classes with dynamic metaclasses
1270 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001271 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001272 class someclass(metaclass=dynamicmetaclass):
1273 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001274 verify(someclass != object)
1275
Tim Peters6d6c1a32001-08-02 04:15:00 +00001276def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001277 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001278
1279 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001280 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001281 pass
1282 except TypeError:
1283 pass
1284 else:
1285 verify(0, "inheritance from both list and dict should be illegal")
1286
1287 try:
1288 class C(object, None):
1289 pass
1290 except TypeError:
1291 pass
1292 else:
1293 verify(0, "inheritance from non-type should be illegal")
1294 class Classic:
1295 pass
1296
1297 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001298 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001299 pass
1300 except TypeError:
1301 pass
1302 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001303 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001304
1305 try:
1306 class C(object):
1307 __slots__ = 1
1308 except TypeError:
1309 pass
1310 else:
1311 verify(0, "__slots__ = 1 should be illegal")
1312
1313 try:
1314 class C(object):
1315 __slots__ = [1]
1316 except TypeError:
1317 pass
1318 else:
1319 verify(0, "__slots__ = [1] should be illegal")
1320
1321def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001322 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001323 class C(object):
1324 def foo(*a): return a
1325 goo = classmethod(foo)
1326 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001327 vereq(C.goo(1), (C, 1))
1328 vereq(c.goo(1), (C, 1))
1329 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001330 class D(C):
1331 pass
1332 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001333 vereq(D.goo(1), (D, 1))
1334 vereq(d.goo(1), (D, 1))
1335 vereq(d.foo(1), (d, 1))
1336 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001337 # Test for a specific crash (SF bug 528132)
1338 def f(cls, arg): return (cls, arg)
1339 ff = classmethod(f)
1340 vereq(ff.__get__(0, int)(42), (int, 42))
1341 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001342
Guido van Rossum155db9a2002-04-02 17:53:47 +00001343 # Test super() with classmethods (SF bug 535444)
1344 veris(C.goo.im_self, C)
1345 veris(D.goo.im_self, D)
1346 veris(super(D,D).goo.im_self, D)
1347 veris(super(D,d).goo.im_self, D)
1348 vereq(super(D,D).goo(), (D,))
1349 vereq(super(D,d).goo(), (D,))
1350
Raymond Hettingerbe971532003-06-18 01:13:41 +00001351 # Verify that argument is checked for callability (SF bug 753451)
1352 try:
1353 classmethod(1).__get__(1)
1354 except TypeError:
1355 pass
1356 else:
1357 raise TestFailed, "classmethod should check for callability"
1358
Georg Brandl6a29c322006-02-21 22:17:46 +00001359 # Verify that classmethod() doesn't allow keyword args
1360 try:
1361 classmethod(f, kw=1)
1362 except TypeError:
1363 pass
1364 else:
1365 raise TestFailed, "classmethod shouldn't accept keyword args"
1366
Fred Drakef841aa62002-03-28 15:49:54 +00001367def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001368 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001369 import xxsubtype as spam
1370 a = (1, 2, 3)
1371 d = {'abc': 123}
1372 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001373 veris(x, spam.spamlist)
1374 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001375 vereq(d, d1)
1376 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001377 veris(x, spam.spamlist)
1378 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001379 vereq(d, d1)
1380
Tim Peters6d6c1a32001-08-02 04:15:00 +00001381def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001382 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001383 class C(object):
1384 def foo(*a): return a
1385 goo = staticmethod(foo)
1386 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001387 vereq(C.goo(1), (1,))
1388 vereq(c.goo(1), (1,))
1389 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001390 class D(C):
1391 pass
1392 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001393 vereq(D.goo(1), (1,))
1394 vereq(d.goo(1), (1,))
1395 vereq(d.foo(1), (d, 1))
1396 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001397
Fred Drakef841aa62002-03-28 15:49:54 +00001398def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001399 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001400 import xxsubtype as spam
1401 a = (1, 2, 3)
1402 d = {"abc": 123}
1403 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1404 veris(x, None)
1405 vereq(a, a1)
1406 vereq(d, d1)
1407 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1408 veris(x, None)
1409 vereq(a, a1)
1410 vereq(d, d1)
1411
Tim Peters6d6c1a32001-08-02 04:15:00 +00001412def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001413 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001414 class C:
1415 def foo(*a): return a
1416 goo = classmethod(foo)
1417 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001418 vereq(C.goo(1), (C, 1))
1419 vereq(c.goo(1), (C, 1))
1420 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001421 class D(C):
1422 pass
1423 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001424 vereq(D.goo(1), (D, 1))
1425 vereq(d.goo(1), (D, 1))
1426 vereq(d.foo(1), (d, 1))
1427 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001428 class E: # *not* subclassing from C
1429 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001430 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001431 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001432
1433def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001434 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001435 class C(object):
1436 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001437 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001438 self.__get = get
1439 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001440 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001441 def __get__(self, obj, type=None):
1442 return self.__get(obj)
1443 def __set__(self, obj, value):
1444 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001445 def __delete__(self, obj):
1446 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001447 def __init__(self):
1448 self.__x = 0
1449 def __get_x(self):
1450 x = self.__x
1451 self.__x = x+1
1452 return x
1453 def __set_x(self, x):
1454 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001455 def __delete_x(self):
1456 del self.__x
1457 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001458 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001459 vereq(a.x, 0)
1460 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001461 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001462 vereq(a.x, 10)
1463 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001464 del a.x
1465 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001466
1467def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001468 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001469 class C(list):
1470 def __new__(cls):
1471 self = list.__new__(cls)
1472 self.foo = 1
1473 return self
1474 def __init__(self):
1475 self.foo = self.foo + 2
1476 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001477 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001478 verify(a.__class__ is C)
1479 class D(C):
1480 pass
1481 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001482 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001483 verify(b.__class__ is D)
1484
Tim Peters6d6c1a32001-08-02 04:15:00 +00001485def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001486 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001487 class A(object):
1488 def f(self): return "A"
1489 class B(A):
1490 pass
1491 class C(A):
1492 def f(self): return "C"
1493 class D(B, C):
1494 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(D.mro(), [D, B, C, A, object])
1496 vereq(D.__mro__, (D, B, C, A, object))
1497 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001498
Guido van Rossumd3077402001-08-12 05:24:18 +00001499 class PerverseMetaType(type):
1500 def mro(cls):
1501 L = type.mro(cls)
1502 L.reverse()
1503 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001504 class X(D,B,C,A, metaclass=PerverseMetaType):
1505 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001506 vereq(X.__mro__, (object, A, C, B, D, X))
1507 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001508
Armin Rigo037d1e02005-12-29 17:07:39 +00001509 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001510 class _metaclass(type):
1511 def mro(self):
1512 return [self, dict, object]
1513 class X(object, metaclass=_metaclass):
1514 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001515 except TypeError:
1516 pass
1517 else:
1518 raise TestFailed, "devious mro() return not caught"
1519
1520 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001521 class _metaclass(type):
1522 def mro(self):
1523 return [1]
1524 class X(object, metaclass=_metaclass):
1525 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001526 except TypeError:
1527 pass
1528 else:
1529 raise TestFailed, "non-class mro() return not caught"
1530
1531 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001532 class _metaclass(type):
1533 def mro(self):
1534 return 1
1535 class X(object, metaclass=_metaclass):
1536 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001537 except TypeError:
1538 pass
1539 else:
1540 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001541
Armin Rigo037d1e02005-12-29 17:07:39 +00001542
Tim Peters6d6c1a32001-08-02 04:15:00 +00001543def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001544 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001545
1546 class B(object):
1547 "Intermediate class because object doesn't have a __setattr__"
1548
1549 class C(B):
1550
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001551 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001552 if name == "foo":
1553 return ("getattr", name)
1554 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001555 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001556 def __setattr__(self, name, value):
1557 if name == "foo":
1558 self.setattr = (name, value)
1559 else:
1560 return B.__setattr__(self, name, value)
1561 def __delattr__(self, name):
1562 if name == "foo":
1563 self.delattr = name
1564 else:
1565 return B.__delattr__(self, name)
1566
1567 def __getitem__(self, key):
1568 return ("getitem", key)
1569 def __setitem__(self, key, value):
1570 self.setitem = (key, value)
1571 def __delitem__(self, key):
1572 self.delitem = key
1573
1574 def __getslice__(self, i, j):
1575 return ("getslice", i, j)
1576 def __setslice__(self, i, j, value):
1577 self.setslice = (i, j, value)
1578 def __delslice__(self, i, j):
1579 self.delslice = (i, j)
1580
1581 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001582 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001583 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001584 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001585 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001586 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001587
Guido van Rossum45704552001-10-08 16:35:45 +00001588 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001589 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001590 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001591 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001592 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001593
Guido van Rossum45704552001-10-08 16:35:45 +00001594 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001595 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001596 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001597 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001598 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001599
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001600def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001601 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001602 class C(object):
1603 def __init__(self, x):
1604 self.x = x
1605 def foo(self):
1606 return self.x
1607 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001608 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001609 class D(C):
1610 boo = C.foo
1611 goo = c1.foo
1612 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001613 vereq(d2.foo(), 2)
1614 vereq(d2.boo(), 2)
1615 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001616 class E(object):
1617 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001618 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001619 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001620
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001621def specials():
1622 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001623 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001624 # Test the default behavior for static classes
1625 class C(object):
1626 def __getitem__(self, i):
1627 if 0 <= i < 10: return i
1628 raise IndexError
1629 c1 = C()
1630 c2 = C()
1631 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001632 verify(id(c1) != id(c2))
1633 hash(c1)
1634 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001635 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001636 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001637 verify(c1 != c2)
1638 verify(not c1 != c1)
1639 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001640 # Note that the module name appears in str/repr, and that varies
1641 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001642 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001643 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001644 verify(-1 not in c1)
1645 for i in range(10):
1646 verify(i in c1)
1647 verify(10 not in c1)
1648 # Test the default behavior for dynamic classes
1649 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001650 def __getitem__(self, i):
1651 if 0 <= i < 10: return i
1652 raise IndexError
1653 d1 = D()
1654 d2 = D()
1655 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001656 verify(id(d1) != id(d2))
1657 hash(d1)
1658 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001659 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001660 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001661 verify(d1 != d2)
1662 verify(not d1 != d1)
1663 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001664 # Note that the module name appears in str/repr, and that varies
1665 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001666 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001668 verify(-1 not in d1)
1669 for i in range(10):
1670 verify(i in d1)
1671 verify(10 not in d1)
1672 # Test overridden behavior for static classes
1673 class Proxy(object):
1674 def __init__(self, x):
1675 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001676 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001677 return not not self.x
1678 def __hash__(self):
1679 return hash(self.x)
1680 def __eq__(self, other):
1681 return self.x == other
1682 def __ne__(self, other):
1683 return self.x != other
1684 def __cmp__(self, other):
1685 return cmp(self.x, other.x)
1686 def __str__(self):
1687 return "Proxy:%s" % self.x
1688 def __repr__(self):
1689 return "Proxy(%r)" % self.x
1690 def __contains__(self, value):
1691 return value in self.x
1692 p0 = Proxy(0)
1693 p1 = Proxy(1)
1694 p_1 = Proxy(-1)
1695 verify(not p0)
1696 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001697 vereq(hash(p0), hash(0))
1698 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001699 verify(p0 != p1)
1700 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001701 vereq(not p0, p1)
1702 vereq(cmp(p0, p1), -1)
1703 vereq(cmp(p0, p0), 0)
1704 vereq(cmp(p0, p_1), 1)
1705 vereq(str(p0), "Proxy:0")
1706 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001707 p10 = Proxy(range(10))
1708 verify(-1 not in p10)
1709 for i in range(10):
1710 verify(i in p10)
1711 verify(10 not in p10)
1712 # Test overridden behavior for dynamic classes
1713 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001714 def __init__(self, x):
1715 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001716 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001717 return not not self.x
1718 def __hash__(self):
1719 return hash(self.x)
1720 def __eq__(self, other):
1721 return self.x == other
1722 def __ne__(self, other):
1723 return self.x != other
1724 def __cmp__(self, other):
1725 return cmp(self.x, other.x)
1726 def __str__(self):
1727 return "DProxy:%s" % self.x
1728 def __repr__(self):
1729 return "DProxy(%r)" % self.x
1730 def __contains__(self, value):
1731 return value in self.x
1732 p0 = DProxy(0)
1733 p1 = DProxy(1)
1734 p_1 = DProxy(-1)
1735 verify(not p0)
1736 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001737 vereq(hash(p0), hash(0))
1738 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001739 verify(p0 != p1)
1740 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001741 vereq(not p0, p1)
1742 vereq(cmp(p0, p1), -1)
1743 vereq(cmp(p0, p0), 0)
1744 vereq(cmp(p0, p_1), 1)
1745 vereq(str(p0), "DProxy:0")
1746 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001747 p10 = DProxy(range(10))
1748 verify(-1 not in p10)
1749 for i in range(10):
1750 verify(i in p10)
1751 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001752## # Safety test for __cmp__
1753## def unsafecmp(a, b):
1754## try:
1755## a.__class__.__cmp__(a, b)
1756## except TypeError:
1757## pass
1758## else:
1759## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1760## a.__class__, a, b)
1761## unsafecmp(u"123", "123")
1762## unsafecmp("123", u"123")
1763## unsafecmp(1, 1.0)
1764## unsafecmp(1.0, 1)
1765## unsafecmp(1, 1L)
1766## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001767
Neal Norwitz1a997502003-01-13 20:13:12 +00001768 class Letter(str):
1769 def __new__(cls, letter):
1770 if letter == 'EPS':
1771 return str.__new__(cls)
1772 return str.__new__(cls, letter)
1773 def __str__(self):
1774 if not self:
1775 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001776 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001777
1778 # sys.stdout needs to be the original to trigger the recursion bug
1779 import sys
1780 test_stdout = sys.stdout
1781 sys.stdout = get_original_stdout()
1782 try:
1783 # nothing should actually be printed, this should raise an exception
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001784 print(Letter('w'))
Neal Norwitz1a997502003-01-13 20:13:12 +00001785 except RuntimeError:
1786 pass
1787 else:
1788 raise TestFailed, "expected a RuntimeError for print recursion"
1789 sys.stdout = test_stdout
1790
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001791def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001792 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001793 import weakref
1794 class C(object):
1795 pass
1796 c = C()
1797 r = weakref.ref(c)
1798 verify(r() is c)
1799 del c
1800 verify(r() is None)
1801 del r
1802 class NoWeak(object):
1803 __slots__ = ['foo']
1804 no = NoWeak()
1805 try:
1806 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001807 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001808 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001809 else:
1810 verify(0, "weakref.ref(no) should be illegal")
1811 class Weak(object):
1812 __slots__ = ['foo', '__weakref__']
1813 yes = Weak()
1814 r = weakref.ref(yes)
1815 verify(r() is yes)
1816 del yes
1817 verify(r() is None)
1818 del r
1819
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001820def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001821 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001822 class C(object):
1823 def getx(self):
1824 return self.__x
1825 def setx(self, value):
1826 self.__x = value
1827 def delx(self):
1828 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001829 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001830 a = C()
1831 verify(not hasattr(a, "x"))
1832 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001833 vereq(a._C__x, 42)
1834 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001835 del a.x
1836 verify(not hasattr(a, "x"))
1837 verify(not hasattr(a, "_C__x"))
1838 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001839 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001840 C.x.__delete__(a)
1841 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001842
Tim Peters66c1a522001-09-24 21:17:50 +00001843 raw = C.__dict__['x']
1844 verify(isinstance(raw, property))
1845
1846 attrs = dir(raw)
1847 verify("__doc__" in attrs)
1848 verify("fget" in attrs)
1849 verify("fset" in attrs)
1850 verify("fdel" in attrs)
1851
Guido van Rossum45704552001-10-08 16:35:45 +00001852 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001853 verify(raw.fget is C.__dict__['getx'])
1854 verify(raw.fset is C.__dict__['setx'])
1855 verify(raw.fdel is C.__dict__['delx'])
1856
1857 for attr in "__doc__", "fget", "fset", "fdel":
1858 try:
1859 setattr(raw, attr, 42)
Guido van Rossumb940e112007-01-10 16:19:56 +00001860 except TypeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001861 if str(msg).find('readonly') < 0:
1862 raise TestFailed("when setting readonly attr %r on a "
1863 "property, got unexpected TypeError "
1864 "msg %r" % (attr, str(msg)))
1865 else:
1866 raise TestFailed("expected TypeError from trying to set "
1867 "readonly %r attr on a property" % attr)
1868
Neal Norwitz673cd822002-10-18 16:33:13 +00001869 class D(object):
1870 __getitem__ = property(lambda s: 1/0)
1871
1872 d = D()
1873 try:
1874 for i in d:
1875 str(i)
1876 except ZeroDivisionError:
1877 pass
1878 else:
1879 raise TestFailed, "expected ZeroDivisionError from bad property"
1880
Georg Brandl533ff6f2006-03-08 18:09:27 +00001881 class E(object):
1882 def getter(self):
1883 "getter method"
1884 return 0
1885 def setter(self, value):
1886 "setter method"
1887 pass
1888 prop = property(getter)
1889 vereq(prop.__doc__, "getter method")
1890 prop2 = property(fset=setter)
1891 vereq(prop2.__doc__, None)
1892
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001893 # this segfaulted in 2.5b2
1894 try:
1895 import _testcapi
1896 except ImportError:
1897 pass
1898 else:
1899 class X(object):
1900 p = property(_testcapi.test_with_docstring)
1901
1902
Guido van Rossumc4a18802001-08-24 16:55:27 +00001903def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001904 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001905
1906 class A(object):
1907 def meth(self, a):
1908 return "A(%r)" % a
1909
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001911
1912 class B(A):
1913 def __init__(self):
1914 self.__super = super(B, self)
1915 def meth(self, a):
1916 return "B(%r)" % a + self.__super.meth(a)
1917
Guido van Rossum45704552001-10-08 16:35:45 +00001918 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001919
1920 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001921 def meth(self, a):
1922 return "C(%r)" % a + self.__super.meth(a)
1923 C._C__super = super(C)
1924
Guido van Rossum45704552001-10-08 16:35:45 +00001925 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001926
1927 class D(C, B):
1928 def meth(self, a):
1929 return "D(%r)" % a + super(D, self).meth(a)
1930
Guido van Rossum5b443c62001-12-03 15:38:28 +00001931 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1932
1933 # Test for subclassing super
1934
1935 class mysuper(super):
1936 def __init__(self, *args):
1937 return super(mysuper, self).__init__(*args)
1938
1939 class E(D):
1940 def meth(self, a):
1941 return "E(%r)" % a + mysuper(E, self).meth(a)
1942
1943 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1944
1945 class F(E):
1946 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00001947 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00001948 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1949 F._F__super = mysuper(F)
1950
1951 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1952
1953 # Make sure certain errors are raised
1954
1955 try:
1956 super(D, 42)
1957 except TypeError:
1958 pass
1959 else:
1960 raise TestFailed, "shouldn't allow super(D, 42)"
1961
1962 try:
1963 super(D, C())
1964 except TypeError:
1965 pass
1966 else:
1967 raise TestFailed, "shouldn't allow super(D, C())"
1968
1969 try:
1970 super(D).__get__(12)
1971 except TypeError:
1972 pass
1973 else:
1974 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1975
1976 try:
1977 super(D).__get__(C())
1978 except TypeError:
1979 pass
1980 else:
1981 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001982
Guido van Rossuma4541a32003-04-16 20:02:22 +00001983 # Make sure data descriptors can be overridden and accessed via super
1984 # (new feature in Python 2.3)
1985
1986 class DDbase(object):
1987 def getx(self): return 42
1988 x = property(getx)
1989
1990 class DDsub(DDbase):
1991 def getx(self): return "hello"
1992 x = property(getx)
1993
1994 dd = DDsub()
1995 vereq(dd.x, "hello")
1996 vereq(super(DDsub, dd).x, 42)
1997
Phillip J. Eby91a968a2004-03-25 02:19:34 +00001998 # Ensure that super() lookup of descriptor from classmethod
1999 # works (SF ID# 743627)
2000
2001 class Base(object):
2002 aProp = property(lambda self: "foo")
2003
2004 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002005 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002006 def test(klass):
2007 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002008
2009 veris(Sub.test(), Base.aProp)
2010
Thomas Wouters89f507f2006-12-13 04:49:30 +00002011 # Verify that super() doesn't allow keyword args
2012 try:
2013 super(Base, kw=1)
2014 except TypeError:
2015 pass
2016 else:
2017 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002018
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002019def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002020 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002021
2022 class hexint(int):
2023 def __repr__(self):
2024 return hex(self)
2025 def __add__(self, other):
2026 return hexint(int.__add__(self, other))
2027 # (Note that overriding __radd__ doesn't work,
2028 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002029 vereq(repr(hexint(7) + 9), "0x10")
2030 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002031 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002032 vereq(a, 12345)
2033 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002034 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002035 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002036 verify((+a).__class__ is int)
2037 verify((a >> 0).__class__ is int)
2038 verify((a << 0).__class__ is int)
2039 verify((hexint(0) << 12).__class__ is int)
2040 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002041
Guido van Rossume2a383d2007-01-15 16:59:06 +00002042 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002043 __slots__ = []
2044 def __str__(self):
2045 s = oct(self)
2046 if s[-1] == 'L':
2047 s = s[:-1]
2048 return s
2049 def __add__(self, other):
2050 return self.__class__(super(octlong, self).__add__(other))
2051 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002052 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002053 # (Note that overriding __radd__ here only seems to work
2054 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002055 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002056 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002057 vereq(a, 12345)
2058 vereq(int(a), 12345)
2059 vereq(hash(a), hash(12345))
2060 verify(int(a).__class__ is int)
2061 verify((+a).__class__ is int)
2062 verify((-a).__class__ is int)
2063 verify((-octlong(0)).__class__ is int)
2064 verify((a >> 0).__class__ is int)
2065 verify((a << 0).__class__ is int)
2066 verify((a - 0).__class__ is int)
2067 verify((a * 1).__class__ is int)
2068 verify((a ** 1).__class__ is int)
2069 verify((a // 1).__class__ is int)
2070 verify((1 * a).__class__ is int)
2071 verify((a | 0).__class__ is int)
2072 verify((a ^ 0).__class__ is int)
2073 verify((a & -1).__class__ is int)
2074 verify((octlong(0) << 12).__class__ is int)
2075 verify((octlong(0) >> 12).__class__ is int)
2076 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002077
2078 # Because octlong overrides __add__, we can't check the absence of +0
2079 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002080 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002081 pass
2082 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002083 verify((a + 0).__class__ is int)
2084 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002085
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002086 # Check that negative clones don't segfault
2087 a = longclone(-1)
2088 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002089 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002090
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002091 class precfloat(float):
2092 __slots__ = ['prec']
2093 def __init__(self, value=0.0, prec=12):
2094 self.prec = int(prec)
Thomas Wouterscf297e42007-02-23 15:07:44 +00002095 float.__init__(self, value)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002096 def __repr__(self):
2097 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002098 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002099 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002100 vereq(a, 12345.0)
2101 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002102 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002103 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002104 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002105
Tim Peters2400fa42001-09-12 19:12:49 +00002106 class madcomplex(complex):
2107 def __repr__(self):
2108 return "%.17gj%+.17g" % (self.imag, self.real)
2109 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002110 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002111 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002112 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002113 vereq(a, base)
2114 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002115 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002116 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002117 vereq(repr(a), "4j-3")
2118 vereq(a, base)
2119 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002120 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002121 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002122 veris((+a).__class__, complex)
2123 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002124 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002125 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002126 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002127 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002128 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002129 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002130 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002131
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002132 class madtuple(tuple):
2133 _rev = None
2134 def rev(self):
2135 if self._rev is not None:
2136 return self._rev
2137 L = list(self)
2138 L.reverse()
2139 self._rev = self.__class__(L)
2140 return self._rev
2141 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002142 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2143 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2144 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002145 for i in range(512):
2146 t = madtuple(range(i))
2147 u = t.rev()
2148 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002149 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002150 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002151 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002152 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002153 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002154 verify(a[:].__class__ is tuple)
2155 verify((a * 1).__class__ is tuple)
2156 verify((a * 0).__class__ is tuple)
2157 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002158 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002159 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002160 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002161 verify((a + a).__class__ is tuple)
2162 verify((a * 0).__class__ is tuple)
2163 verify((a * 1).__class__ is tuple)
2164 verify((a * 2).__class__ is tuple)
2165 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002166
2167 class madstring(str):
2168 _rev = None
2169 def rev(self):
2170 if self._rev is not None:
2171 return self._rev
2172 L = list(self)
2173 L.reverse()
2174 self._rev = self.__class__("".join(L))
2175 return self._rev
2176 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002177 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2178 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2179 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002180 for i in range(256):
2181 s = madstring("".join(map(chr, range(i))))
2182 t = s.rev()
2183 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002184 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002185 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002186 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002187 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002188
Tim Peters8fa5dd02001-09-12 02:18:30 +00002189 base = "\x00" * 5
2190 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(s, base)
2192 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002193 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002194 vereq(hash(s), hash(base))
2195 vereq({s: 1}[base], 1)
2196 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002197 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002198 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002199 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002201 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002202 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002203 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002204 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002205 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002206 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002207 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002208 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002209 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002210 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002211 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002212 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002213 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002214 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002215 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002216 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002217 identitytab = ''.join([chr(i) for i in range(256)])
2218 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002219 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002220 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(s.translate(identitytab, "x"), base)
2222 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002223 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002224 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002225 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002226 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002227 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002228 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002229 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002230 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002231 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002232 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002233
Guido van Rossum91ee7982001-08-30 20:52:40 +00002234 class madunicode(unicode):
2235 _rev = None
2236 def rev(self):
2237 if self._rev is not None:
2238 return self._rev
2239 L = list(self)
2240 L.reverse()
2241 self._rev = self.__class__(u"".join(L))
2242 return self._rev
2243 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002244 vereq(u, u"ABCDEF")
2245 vereq(u.rev(), madunicode(u"FEDCBA"))
2246 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002247 base = u"12345"
2248 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002249 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002250 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002251 vereq(hash(u), hash(base))
2252 vereq({u: 1}[base], 1)
2253 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002254 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002255 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002256 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002257 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002258 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002259 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002260 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002261 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002262 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002263 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002264 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002265 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002266 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002267 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002268 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002269 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002270 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002271 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002272 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002273 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002274 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002275 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002276 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002277 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002278 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002279 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002280 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002282 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002283 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002284 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002285 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002286 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002287 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002288 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002290 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002291 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002292
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002293 class sublist(list):
2294 pass
2295 a = sublist(range(5))
2296 vereq(a, range(5))
2297 a.append("hello")
2298 vereq(a, range(5) + ["hello"])
2299 a[5] = 5
2300 vereq(a, range(6))
2301 a.extend(range(6, 20))
2302 vereq(a, range(20))
2303 a[-5:] = []
2304 vereq(a, range(15))
2305 del a[10:15]
2306 vereq(len(a), 10)
2307 vereq(a, range(10))
2308 vereq(list(a), range(10))
2309 vereq(a[0], 0)
2310 vereq(a[9], 9)
2311 vereq(a[-10], 0)
2312 vereq(a[-1], 9)
2313 vereq(a[:5], range(5))
2314
Tim Peters59c9a642001-09-13 05:38:56 +00002315 class CountedInput(file):
2316 """Counts lines read by self.readline().
2317
2318 self.lineno is the 0-based ordinal of the last line read, up to
2319 a maximum of one greater than the number of lines in the file.
2320
2321 self.ateof is true if and only if the final "" line has been read,
2322 at which point self.lineno stops incrementing, and further calls
2323 to readline() continue to return "".
2324 """
2325
2326 lineno = 0
2327 ateof = 0
2328 def readline(self):
2329 if self.ateof:
2330 return ""
2331 s = file.readline(self)
2332 # Next line works too.
2333 # s = super(CountedInput, self).readline()
2334 self.lineno += 1
2335 if s == "":
2336 self.ateof = 1
2337 return s
2338
Alex Martelli01c77c62006-08-24 02:58:11 +00002339 f = open(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002340 lines = ['a\n', 'b\n', 'c\n']
2341 try:
2342 f.writelines(lines)
2343 f.close()
2344 f = CountedInput(TESTFN)
2345 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2346 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(expected, got)
2348 vereq(f.lineno, i)
2349 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002350 f.close()
2351 finally:
2352 try:
2353 f.close()
2354 except:
2355 pass
2356 try:
2357 import os
2358 os.unlink(TESTFN)
2359 except:
2360 pass
2361
Tim Peters808b94e2001-09-13 19:33:07 +00002362def keywords():
2363 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002364 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002365 vereq(int(x=1), 1)
2366 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002367 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002368 vereq(complex(imag=42, real=666), complex(666, 42))
2369 vereq(str(object=500), '500')
2370 vereq(unicode(string='abc', errors='strict'), u'abc')
2371 vereq(tuple(sequence=range(3)), (0, 1, 2))
2372 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002373 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002374
Guido van Rossume2a383d2007-01-15 16:59:06 +00002375 for constructor in (int, float, int, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002376 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002377 try:
2378 constructor(bogus_keyword_arg=1)
2379 except TypeError:
2380 pass
2381 else:
2382 raise TestFailed("expected TypeError from bogus keyword "
2383 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002384
Tim Peters8fa45672001-09-13 21:01:29 +00002385def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002386 # XXX This test is disabled because rexec is not deemed safe
2387 return
Tim Peters8fa45672001-09-13 21:01:29 +00002388 import rexec
2389 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002390 print("Testing interaction with restricted execution ...")
Tim Peters8fa45672001-09-13 21:01:29 +00002391
2392 sandbox = rexec.RExec()
2393
2394 code1 = """f = open(%r, 'w')""" % TESTFN
Alex Martelli01c77c62006-08-24 02:58:11 +00002395 code2 = """f = open(%r, 'w')""" % TESTFN
Tim Peters8fa45672001-09-13 21:01:29 +00002396 code3 = """\
2397f = open(%r)
2398t = type(f) # a sneaky way to get the file() constructor
2399f.close()
2400f = t(%r, 'w') # rexec can't catch this by itself
2401""" % (TESTFN, TESTFN)
2402
2403 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2404 f.close()
2405
2406 try:
2407 for code in code1, code2, code3:
2408 try:
2409 sandbox.r_exec(code)
Guido van Rossumb940e112007-01-10 16:19:56 +00002410 except IOError as msg:
Tim Peters8fa45672001-09-13 21:01:29 +00002411 if str(msg).find("restricted") >= 0:
2412 outcome = "OK"
2413 else:
2414 outcome = "got an exception, but not an expected one"
2415 else:
2416 outcome = "expected a restricted-execution exception"
2417
2418 if outcome != "OK":
2419 raise TestFailed("%s, in %r" % (outcome, code))
2420
2421 finally:
2422 try:
2423 import os
2424 os.unlink(TESTFN)
2425 except:
2426 pass
2427
Tim Peters0ab085c2001-09-14 00:25:33 +00002428def str_subclass_as_dict_key():
2429 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002430 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002431
2432 class cistr(str):
2433 """Sublcass of str that computes __eq__ case-insensitively.
2434
2435 Also computes a hash code of the string in canonical form.
2436 """
2437
2438 def __init__(self, value):
2439 self.canonical = value.lower()
2440 self.hashcode = hash(self.canonical)
2441
2442 def __eq__(self, other):
2443 if not isinstance(other, cistr):
2444 other = cistr(other)
2445 return self.canonical == other.canonical
2446
2447 def __hash__(self):
2448 return self.hashcode
2449
Guido van Rossum45704552001-10-08 16:35:45 +00002450 vereq(cistr('ABC'), 'abc')
2451 vereq('aBc', cistr('ABC'))
2452 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002453
2454 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002455 vereq(d[cistr('one')], 1)
2456 vereq(d[cistr('tWo')], 2)
2457 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002458 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002459 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002460
Guido van Rossumab3b0342001-09-18 20:38:53 +00002461def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002462 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002463 class classic:
2464 pass
2465 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002466 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002467 class C(base):
2468 def __init__(self, value):
2469 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002470 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002471 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002472 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002473 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002474 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002475 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002476 def __ne__(self, other):
2477 if isinstance(other, C):
2478 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002479 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002480 return self.value != other
2481 return NotImplemented
2482 def __lt__(self, other):
2483 if isinstance(other, C):
2484 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002485 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002486 return self.value < other
2487 return NotImplemented
2488 def __le__(self, other):
2489 if isinstance(other, C):
2490 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002491 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002492 return self.value <= other
2493 return NotImplemented
2494 def __gt__(self, other):
2495 if isinstance(other, C):
2496 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002497 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002498 return self.value > other
2499 return NotImplemented
2500 def __ge__(self, other):
2501 if isinstance(other, C):
2502 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002503 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002504 return self.value >= other
2505 return NotImplemented
2506
Guido van Rossumab3b0342001-09-18 20:38:53 +00002507 c1 = C(1)
2508 c2 = C(2)
2509 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002510 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002511 c = {1: c1, 2: c2, 3: c3}
2512 for x in 1, 2, 3:
2513 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002514 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002515 for op in "<", "<=", "==", "!=", ">", ">=":
2516 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2517 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002518 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2519 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002520
Guido van Rossum0639f592001-09-18 21:06:04 +00002521def rich_comparisons():
2522 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002523 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002524 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002525 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002526 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002527 vereq(z, 1+0j)
2528 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002529 class ZZ(complex):
2530 def __eq__(self, other):
2531 try:
2532 return abs(self - other) <= 1e-6
2533 except:
2534 return NotImplemented
2535 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002536 vereq(zz, 1+0j)
2537 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002538
Guido van Rossum0639f592001-09-18 21:06:04 +00002539 class classic:
2540 pass
2541 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002542 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002543 class C(base):
2544 def __init__(self, value):
2545 self.value = int(value)
2546 def __cmp__(self, other):
2547 raise TestFailed, "shouldn't call __cmp__"
2548 def __eq__(self, other):
2549 if isinstance(other, C):
2550 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002551 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002552 return self.value == other
2553 return NotImplemented
2554 def __ne__(self, other):
2555 if isinstance(other, C):
2556 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002557 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002558 return self.value != other
2559 return NotImplemented
2560 def __lt__(self, other):
2561 if isinstance(other, C):
2562 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002563 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002564 return self.value < other
2565 return NotImplemented
2566 def __le__(self, other):
2567 if isinstance(other, C):
2568 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002569 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002570 return self.value <= other
2571 return NotImplemented
2572 def __gt__(self, other):
2573 if isinstance(other, C):
2574 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002575 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002576 return self.value > other
2577 return NotImplemented
2578 def __ge__(self, other):
2579 if isinstance(other, C):
2580 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002581 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002582 return self.value >= other
2583 return NotImplemented
2584 c1 = C(1)
2585 c2 = C(2)
2586 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002587 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002588 c = {1: c1, 2: c2, 3: c3}
2589 for x in 1, 2, 3:
2590 for y in 1, 2, 3:
2591 for op in "<", "<=", "==", "!=", ">", ">=":
2592 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2593 "x=%d, y=%d" % (x, y))
2594 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2595 "x=%d, y=%d" % (x, y))
2596 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2597 "x=%d, y=%d" % (x, y))
2598
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002599def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002600 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002601 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002602 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002603 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002604 check(file.name, "file name") # member descriptor
2605
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002606def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002607 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002608 class C(object): pass
2609 class D(object): pass
2610 class E(object): pass
2611 class F(D, E): pass
2612 for cls in C, D, E, F:
2613 for cls2 in C, D, E, F:
2614 x = cls()
2615 x.__class__ = cls2
2616 verify(x.__class__ is cls2)
2617 x.__class__ = cls
2618 verify(x.__class__ is cls)
2619 def cant(x, C):
2620 try:
2621 x.__class__ = C
2622 except TypeError:
2623 pass
2624 else:
2625 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002626 try:
2627 delattr(x, "__class__")
2628 except TypeError:
2629 pass
2630 else:
2631 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002632 cant(C(), list)
2633 cant(list(), C)
2634 cant(C(), 1)
2635 cant(C(), object)
2636 cant(object(), list)
2637 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002638 class Int(int): __slots__ = []
2639 cant(2, Int)
2640 cant(Int(), int)
2641 cant(True, int)
2642 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002643 o = object()
2644 cant(o, type(1))
2645 cant(o, type(None))
2646 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002647
Guido van Rossum6661be32001-10-26 04:26:12 +00002648def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002649 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002650 class C(object): pass
2651 a = C()
2652 a.__dict__ = {'b': 1}
2653 vereq(a.b, 1)
2654 def cant(x, dict):
2655 try:
2656 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002657 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002658 pass
2659 else:
2660 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2661 cant(a, None)
2662 cant(a, [])
2663 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002664 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002665 # Classes don't allow __dict__ assignment
2666 cant(C, {})
2667
Guido van Rossum3926a632001-09-25 16:25:58 +00002668def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002669 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002670 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002671 import pickle
2672 try:
2673 import cPickle
2674 except ImportError:
2675 cPickle = None
Guido van Rossum3926a632001-09-25 16:25:58 +00002676
2677 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002678 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002679
2680 global C
2681 class C(object):
2682 def __init__(self, a, b):
2683 super(C, self).__init__()
2684 self.a = a
2685 self.b = b
2686 def __repr__(self):
2687 return "C(%r, %r)" % (self.a, self.b)
2688
2689 global C1
2690 class C1(list):
2691 def __new__(cls, a, b):
2692 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002693 def __getnewargs__(self):
2694 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002695 def __init__(self, a, b):
2696 self.a = a
2697 self.b = b
2698 def __repr__(self):
2699 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2700
2701 global C2
2702 class C2(int):
2703 def __new__(cls, a, b, val=0):
2704 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002705 def __getnewargs__(self):
2706 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002707 def __init__(self, a, b, val=0):
2708 self.a = a
2709 self.b = b
2710 def __repr__(self):
2711 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2712
Guido van Rossum90c45142001-11-24 21:07:01 +00002713 global C3
2714 class C3(object):
2715 def __init__(self, foo):
2716 self.foo = foo
2717 def __getstate__(self):
2718 return self.foo
2719 def __setstate__(self, foo):
2720 self.foo = foo
2721
2722 global C4classic, C4
2723 class C4classic: # classic
2724 pass
2725 class C4(C4classic, object): # mixed inheritance
2726 pass
2727
Guido van Rossum3926a632001-09-25 16:25:58 +00002728 for p in pickle, cPickle:
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002729 if p is None:
2730 continue # cPickle not found -- skip it
Guido van Rossum3926a632001-09-25 16:25:58 +00002731 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002732 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002733 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002734
2735 for cls in C, C1, C2:
2736 s = p.dumps(cls, bin)
2737 cls2 = p.loads(s)
2738 verify(cls2 is cls)
2739
2740 a = C1(1, 2); a.append(42); a.append(24)
2741 b = C2("hello", "world", 42)
2742 s = p.dumps((a, b), bin)
2743 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002744 vereq(x.__class__, a.__class__)
2745 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2746 vereq(y.__class__, b.__class__)
2747 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002748 vereq(repr(x), repr(a))
2749 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002750 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002751 print("a = x =", a)
2752 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002753 # Test for __getstate__ and __setstate__ on new style class
2754 u = C3(42)
2755 s = p.dumps(u, bin)
2756 v = p.loads(s)
2757 veris(u.__class__, v.__class__)
2758 vereq(u.foo, v.foo)
2759 # Test for picklability of hybrid class
2760 u = C4()
2761 u.foo = 42
2762 s = p.dumps(u, bin)
2763 v = p.loads(s)
2764 veris(u.__class__, v.__class__)
2765 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002766
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002767 # Testing copy.deepcopy()
2768 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002769 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002770 import copy
2771 for cls in C, C1, C2:
2772 cls2 = copy.deepcopy(cls)
2773 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002774
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002775 a = C1(1, 2); a.append(42); a.append(24)
2776 b = C2("hello", "world", 42)
2777 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002778 vereq(x.__class__, a.__class__)
2779 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2780 vereq(y.__class__, b.__class__)
2781 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002782 vereq(repr(x), repr(a))
2783 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002784 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002785 print("a = x =", a)
2786 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002787
Guido van Rossum8c842552002-03-14 23:05:54 +00002788def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002789 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002790 import pickle, pickle as cPickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002791 # Pickling of classes with __slots__ but without __getstate__ should fail
2792 global B, C, D, E
2793 class B(object):
2794 pass
2795 for base in [object, B]:
2796 class C(base):
2797 __slots__ = ['a']
2798 class D(C):
2799 pass
2800 try:
2801 pickle.dumps(C())
2802 except TypeError:
2803 pass
2804 else:
2805 raise TestFailed, "should fail: pickle C instance - %s" % base
2806 try:
2807 cPickle.dumps(C())
2808 except TypeError:
2809 pass
2810 else:
2811 raise TestFailed, "should fail: cPickle C instance - %s" % base
2812 try:
2813 pickle.dumps(C())
2814 except TypeError:
2815 pass
2816 else:
2817 raise TestFailed, "should fail: pickle D instance - %s" % base
2818 try:
2819 cPickle.dumps(D())
2820 except TypeError:
2821 pass
2822 else:
2823 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002824 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002825 class C(base):
2826 __slots__ = ['a']
2827 def __getstate__(self):
2828 try:
2829 d = self.__dict__.copy()
2830 except AttributeError:
2831 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002832 for cls in self.__class__.__mro__:
2833 for sn in cls.__dict__.get('__slots__', ()):
2834 try:
2835 d[sn] = getattr(self, sn)
2836 except AttributeError:
2837 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002838 return d
2839 def __setstate__(self, d):
2840 for k, v in d.items():
2841 setattr(self, k, v)
2842 class D(C):
2843 pass
2844 # Now it should work
2845 x = C()
2846 y = pickle.loads(pickle.dumps(x))
2847 vereq(hasattr(y, 'a'), 0)
2848 y = cPickle.loads(cPickle.dumps(x))
2849 vereq(hasattr(y, 'a'), 0)
2850 x.a = 42
2851 y = pickle.loads(pickle.dumps(x))
2852 vereq(y.a, 42)
2853 y = cPickle.loads(cPickle.dumps(x))
2854 vereq(y.a, 42)
2855 x = D()
2856 x.a = 42
2857 x.b = 100
2858 y = pickle.loads(pickle.dumps(x))
2859 vereq(y.a + y.b, 142)
2860 y = cPickle.loads(cPickle.dumps(x))
2861 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002862 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002863 class E(C):
2864 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002865 x = E()
2866 x.a = 42
2867 x.b = "foo"
2868 y = pickle.loads(pickle.dumps(x))
2869 vereq(y.a, x.a)
2870 vereq(y.b, x.b)
2871 y = cPickle.loads(cPickle.dumps(x))
2872 vereq(y.a, x.a)
2873 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002874
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002875def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002876 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002877 import copy
2878 class C(object):
2879 pass
2880
2881 a = C()
2882 a.foo = 12
2883 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002884 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002885
2886 a.bar = [1,2,3]
2887 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002888 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002889 verify(c.bar is a.bar)
2890
2891 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002892 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002893 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002894 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002895
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002896def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002897 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002898 class I(int):
2899 def __repr__(self):
2900 return "I(%r)" % int(self)
2901 def __add__(self, other):
2902 return I(int(self) + int(other))
2903 __radd__ = __add__
2904 def __pow__(self, other, mod=None):
2905 if mod is None:
2906 return I(pow(int(self), int(other)))
2907 else:
2908 return I(pow(int(self), int(other), int(mod)))
2909 def __rpow__(self, other, mod=None):
2910 if mod is None:
2911 return I(pow(int(other), int(self), mod))
2912 else:
2913 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002914
Walter Dörwald70a6b492004-02-12 17:35:32 +00002915 vereq(repr(I(1) + I(2)), "I(3)")
2916 vereq(repr(I(1) + 2), "I(3)")
2917 vereq(repr(1 + I(2)), "I(3)")
2918 vereq(repr(I(2) ** I(3)), "I(8)")
2919 vereq(repr(2 ** I(3)), "I(8)")
2920 vereq(repr(I(2) ** 3), "I(8)")
2921 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002922 class S(str):
2923 def __eq__(self, other):
2924 return self.lower() == other.lower()
2925
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002926def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002927 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002928 class A(object):
2929 pass
2930 class B(A):
2931 pass
2932 class C(A):
2933 pass
2934 class D(B, C):
2935 pass
2936 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002937 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002938 A.__hash__ = lambda self: 42
2939 vereq(hash(d), 42)
2940 C.__hash__ = lambda self: 314
2941 vereq(hash(d), 314)
2942 B.__hash__ = lambda self: 144
2943 vereq(hash(d), 144)
2944 D.__hash__ = lambda self: 100
2945 vereq(hash(d), 100)
2946 del D.__hash__
2947 vereq(hash(d), 144)
2948 del B.__hash__
2949 vereq(hash(d), 314)
2950 del C.__hash__
2951 vereq(hash(d), 42)
2952 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002953 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002954 d.foo = 42
2955 d.bar = 42
2956 vereq(d.foo, 42)
2957 vereq(d.bar, 42)
2958 def __getattribute__(self, name):
2959 if name == "foo":
2960 return 24
2961 return object.__getattribute__(self, name)
2962 A.__getattribute__ = __getattribute__
2963 vereq(d.foo, 24)
2964 vereq(d.bar, 42)
2965 def __getattr__(self, name):
2966 if name in ("spam", "foo", "bar"):
2967 return "hello"
2968 raise AttributeError, name
2969 B.__getattr__ = __getattr__
2970 vereq(d.spam, "hello")
2971 vereq(d.foo, 24)
2972 vereq(d.bar, 42)
2973 del A.__getattribute__
2974 vereq(d.foo, 42)
2975 del d.foo
2976 vereq(d.foo, "hello")
2977 vereq(d.bar, 42)
2978 del B.__getattr__
2979 try:
2980 d.foo
2981 except AttributeError:
2982 pass
2983 else:
2984 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002985
Guido van Rossume7f3e242002-06-14 02:35:45 +00002986 # Test a nasty bug in recurse_down_subclasses()
2987 import gc
2988 class A(object):
2989 pass
2990 class B(A):
2991 pass
2992 del B
2993 gc.collect()
2994 A.__setitem__ = lambda *a: None # crash
2995
Tim Petersfc57ccb2001-10-12 02:38:24 +00002996def buffer_inherit():
2997 import binascii
2998 # SF bug [#470040] ParseTuple t# vs subclasses.
2999 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003000 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003001
3002 class MyStr(str):
3003 pass
3004 base = 'abc'
3005 m = MyStr(base)
3006 # b2a_hex uses the buffer interface to get its argument's value, via
3007 # PyArg_ParseTuple 't#' code.
3008 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3009
3010 # It's not clear that unicode will continue to support the character
3011 # buffer interface, and this test will fail if that's taken away.
3012 class MyUni(unicode):
3013 pass
3014 base = u'abc'
3015 m = MyUni(base)
3016 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3017
3018 class MyInt(int):
3019 pass
3020 m = MyInt(42)
3021 try:
3022 binascii.b2a_hex(m)
3023 raise TestFailed('subclass of int should not have a buffer interface')
3024 except TypeError:
3025 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003026
Tim Petersc9933152001-10-16 20:18:24 +00003027def str_of_str_subclass():
3028 import binascii
3029 import cStringIO
3030
3031 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003032 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003033
3034 class octetstring(str):
3035 def __str__(self):
3036 return binascii.b2a_hex(self)
3037 def __repr__(self):
3038 return self + " repr"
3039
3040 o = octetstring('A')
3041 vereq(type(o), octetstring)
3042 vereq(type(str(o)), str)
3043 vereq(type(repr(o)), str)
3044 vereq(ord(o), 0x41)
3045 vereq(str(o), '41')
3046 vereq(repr(o), 'A repr')
3047 vereq(o.__str__(), '41')
3048 vereq(o.__repr__(), 'A repr')
3049
3050 capture = cStringIO.StringIO()
3051 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003052 print(o, file=capture)
3053 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003054 vereq(capture.getvalue(), '41\n41\n')
3055 capture.close()
3056
Guido van Rossumc8e56452001-10-22 00:43:43 +00003057def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003058 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003059 def f(a): return a
3060 vereq(f.__call__(a=42), 42)
3061 a = []
3062 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003063 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003064
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003065def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003066 if verbose: print(("Testing recursive __call__() by setting to instance of "
3067 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003068 class A(object):
3069 pass
3070
3071 A.__call__ = A()
3072 try:
3073 A()()
3074 except RuntimeError:
3075 pass
3076 else:
3077 raise TestFailed("Recursion limit should have been reached for "
3078 "__call__()")
3079
Guido van Rossumed87ad82001-10-30 02:33:02 +00003080def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003081 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003082 log = []
3083 class C(object):
3084 def __del__(self):
3085 log.append(1)
3086 c = C()
3087 vereq(log, [])
3088 del c
3089 vereq(log, [1])
3090
Guido van Rossum29d26062001-12-11 04:37:34 +00003091 class D(object): pass
3092 d = D()
3093 try: del d[0]
3094 except TypeError: pass
3095 else: raise TestFailed, "invalid del() didn't raise TypeError"
3096
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003097def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003098 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003099
3100 class mydict(dict):
3101 pass
3102 d = mydict()
3103 try:
3104 hash(d)
3105 except TypeError:
3106 pass
3107 else:
3108 raise TestFailed, "hash() of dict subclass should fail"
3109
3110 class mylist(list):
3111 pass
3112 d = mylist()
3113 try:
3114 hash(d)
3115 except TypeError:
3116 pass
3117 else:
3118 raise TestFailed, "hash() of list subclass should fail"
3119
Guido van Rossum29d26062001-12-11 04:37:34 +00003120def strops():
3121 try: 'a' + 5
3122 except TypeError: pass
3123 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3124
3125 try: ''.split('')
3126 except ValueError: pass
3127 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3128
3129 try: ''.join([0])
3130 except TypeError: pass
3131 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3132
3133 try: ''.rindex('5')
3134 except ValueError: pass
3135 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3136
Guido van Rossum29d26062001-12-11 04:37:34 +00003137 try: '%(n)s' % None
3138 except TypeError: pass
3139 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3140
3141 try: '%(n' % {}
3142 except ValueError: pass
3143 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3144
3145 try: '%*s' % ('abc')
3146 except TypeError: pass
3147 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3148
3149 try: '%*.*s' % ('abc', 5)
3150 except TypeError: pass
3151 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3152
3153 try: '%s' % (1, 2)
3154 except TypeError: pass
3155 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3156
3157 try: '%' % None
3158 except ValueError: pass
3159 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3160
3161 vereq('534253'.isdigit(), 1)
3162 vereq('534253x'.isdigit(), 0)
3163 vereq('%c' % 5, '\x05')
3164 vereq('%c' % '5', '5')
3165
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003166def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003167 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003168 class Node:
3169 pass
3170 a = Node()
3171 b = Node()
3172 a.b = b
3173 b.a = a
3174 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003175
Guido van Rossumd7035672002-03-12 20:43:31 +00003176def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003177 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003178 from types import ModuleType as M
3179 m = M.__new__(M)
3180 str(m)
3181 vereq(hasattr(m, "__name__"), 0)
3182 vereq(hasattr(m, "__file__"), 0)
3183 vereq(hasattr(m, "foo"), 0)
3184 vereq(m.__dict__, None)
3185 m.foo = 1
3186 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003187
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003188def dictproxyiterkeys():
3189 class C(object):
3190 def meth(self):
3191 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003192 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003193 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003194 keys.sort()
3195 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3196
3197def dictproxyitervalues():
3198 class C(object):
3199 def meth(self):
3200 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003201 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003202 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003203 vereq(len(values), 5)
3204
3205def dictproxyiteritems():
3206 class C(object):
3207 def meth(self):
3208 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003209 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003210 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003211 keys.sort()
3212 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3213
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003214def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003215 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003216 class C(object):
3217 def __new__(cls, arg):
3218 if isinstance(arg, str): return [1, 2, 3]
3219 elif isinstance(arg, int): return object.__new__(D)
3220 else: return object.__new__(cls)
3221 class D(C):
3222 def __init__(self, arg):
3223 self.foo = arg
3224 vereq(C("1"), [1, 2, 3])
3225 vereq(D("1"), [1, 2, 3])
3226 d = D(None)
3227 veris(d.foo, None)
3228 d = C(1)
3229 vereq(isinstance(d, D), True)
3230 vereq(d.foo, 1)
3231 d = D(1)
3232 vereq(isinstance(d, D), True)
3233 vereq(d.foo, 1)
3234
Guido van Rossume8fc6402002-04-16 16:44:51 +00003235def imulbug():
3236 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003237 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003238 class C(object):
3239 def __imul__(self, other):
3240 return (self, other)
3241 x = C()
3242 y = x
3243 y *= 1.0
3244 vereq(y, (x, 1.0))
3245 y = x
3246 y *= 2
3247 vereq(y, (x, 2))
3248 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003249 y *= 3
3250 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003251 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003252 y *= 1<<100
3253 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003254 y = x
3255 y *= None
3256 vereq(y, (x, None))
3257 y = x
3258 y *= "foo"
3259 vereq(y, (x, "foo"))
3260
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003261def docdescriptor():
3262 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003263 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003264 class DocDescr(object):
3265 def __get__(self, object, otype):
3266 if object:
3267 object = object.__class__.__name__ + ' instance'
3268 if otype:
3269 otype = otype.__name__
3270 return 'object=%s; type=%s' % (object, otype)
3271 class OldClass:
3272 __doc__ = DocDescr()
3273 class NewClass(object):
3274 __doc__ = DocDescr()
3275 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3276 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3277 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3278 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3279
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003280def copy_setstate():
3281 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003282 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003283 import copy
3284 class C(object):
3285 def __init__(self, foo=None):
3286 self.foo = foo
3287 self.__foo = foo
3288 def setfoo(self, foo=None):
3289 self.foo = foo
3290 def getfoo(self):
3291 return self.__foo
3292 def __getstate__(self):
3293 return [self.foo]
3294 def __setstate__(self, lst):
3295 assert len(lst) == 1
3296 self.__foo = self.foo = lst[0]
3297 a = C(42)
3298 a.setfoo(24)
3299 vereq(a.foo, 24)
3300 vereq(a.getfoo(), 42)
3301 b = copy.copy(a)
3302 vereq(b.foo, 24)
3303 vereq(b.getfoo(), 24)
3304 b = copy.deepcopy(a)
3305 vereq(b.foo, 24)
3306 vereq(b.getfoo(), 24)
3307
Guido van Rossum09638c12002-06-13 19:17:46 +00003308def slices():
3309 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003310 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003311 # Strings
3312 vereq("hello"[:4], "hell")
3313 vereq("hello"[slice(4)], "hell")
3314 vereq(str.__getitem__("hello", slice(4)), "hell")
3315 class S(str):
3316 def __getitem__(self, x):
3317 return str.__getitem__(self, x)
3318 vereq(S("hello")[:4], "hell")
3319 vereq(S("hello")[slice(4)], "hell")
3320 vereq(S("hello").__getitem__(slice(4)), "hell")
3321 # Tuples
3322 vereq((1,2,3)[:2], (1,2))
3323 vereq((1,2,3)[slice(2)], (1,2))
3324 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3325 class T(tuple):
3326 def __getitem__(self, x):
3327 return tuple.__getitem__(self, x)
3328 vereq(T((1,2,3))[:2], (1,2))
3329 vereq(T((1,2,3))[slice(2)], (1,2))
3330 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3331 # Lists
3332 vereq([1,2,3][:2], [1,2])
3333 vereq([1,2,3][slice(2)], [1,2])
3334 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3335 class L(list):
3336 def __getitem__(self, x):
3337 return list.__getitem__(self, x)
3338 vereq(L([1,2,3])[:2], [1,2])
3339 vereq(L([1,2,3])[slice(2)], [1,2])
3340 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3341 # Now do lists and __setitem__
3342 a = L([1,2,3])
3343 a[slice(1, 3)] = [3,2]
3344 vereq(a, [1,3,2])
3345 a[slice(0, 2, 1)] = [3,1]
3346 vereq(a, [3,1,2])
3347 a.__setitem__(slice(1, 3), [2,1])
3348 vereq(a, [3,2,1])
3349 a.__setitem__(slice(0, 2, 1), [2,3])
3350 vereq(a, [2,3,1])
3351
Tim Peters2484aae2002-07-11 06:56:07 +00003352def subtype_resurrection():
3353 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003354 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003355
3356 class C(object):
3357 container = []
3358
3359 def __del__(self):
3360 # resurrect the instance
3361 C.container.append(self)
3362
3363 c = C()
3364 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003365 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003366 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003367 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003368
3369 # If that didn't blow up, it's also interesting to see whether clearing
3370 # the last container slot works: that will attempt to delete c again,
3371 # which will cause c to get appended back to the container again "during"
3372 # the del.
3373 del C.container[-1]
3374 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003375 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003376
Tim Peters14cb1e12002-07-11 18:26:21 +00003377 # Make c mortal again, so that the test framework with -l doesn't report
3378 # it as a leak.
3379 del C.__del__
3380
Guido van Rossum2d702462002-08-06 21:28:28 +00003381def slottrash():
3382 # Deallocating deeply nested slotted trash caused stack overflows
3383 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003384 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003385 class trash(object):
3386 __slots__ = ['x']
3387 def __init__(self, x):
3388 self.x = x
3389 o = None
3390 for i in xrange(50000):
3391 o = trash(o)
3392 del o
3393
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003394def slotmultipleinheritance():
3395 # SF bug 575229, multiple inheritance w/ slots dumps core
3396 class A(object):
3397 __slots__=()
3398 class B(object):
3399 pass
3400 class C(A,B) :
3401 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003402 vereq(C.__basicsize__, B.__basicsize__)
3403 verify(hasattr(C, '__dict__'))
3404 verify(hasattr(C, '__weakref__'))
3405 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003406
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003407def testrmul():
3408 # SF patch 592646
3409 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003410 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003411 class C(object):
3412 def __mul__(self, other):
3413 return "mul"
3414 def __rmul__(self, other):
3415 return "rmul"
3416 a = C()
3417 vereq(a*2, "mul")
3418 vereq(a*2.2, "mul")
3419 vereq(2*a, "rmul")
3420 vereq(2.2*a, "rmul")
3421
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003422def testipow():
3423 # [SF bug 620179]
3424 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003425 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003426 class C(object):
3427 def __ipow__(self, other):
3428 pass
3429 a = C()
3430 a **= 2
3431
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003432def do_this_first():
3433 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003434 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003435 # This dumps core when SF bug 551412 isn't fixed --
3436 # but only when test_descr.py is run separately.
3437 # (That can't be helped -- as soon as PyType_Ready()
3438 # is called for PyLong_Type, the bug is gone.)
3439 class UserLong(object):
3440 def __pow__(self, *args):
3441 pass
3442 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003443 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003444 except:
3445 pass
3446
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003447 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003448 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003449 # Another segfault only when run early
3450 # (before PyType_Ready(tuple) is called)
3451 type.mro(tuple)
3452
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003453def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003454 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003455 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003456 # stuff that should work:
3457 class C(object):
3458 pass
3459 class C2(object):
3460 def __getattribute__(self, attr):
3461 if attr == 'a':
3462 return 2
3463 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003464 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003465 def meth(self):
3466 return 1
3467 class D(C):
3468 pass
3469 class E(D):
3470 pass
3471 d = D()
3472 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003473 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003474 D.__bases__ = (C2,)
3475 vereq(d.meth(), 1)
3476 vereq(e.meth(), 1)
3477 vereq(d.a, 2)
3478 vereq(e.a, 2)
3479 vereq(C2.__subclasses__(), [D])
3480
3481 # stuff that shouldn't:
3482 class L(list):
3483 pass
3484
3485 try:
3486 L.__bases__ = (dict,)
3487 except TypeError:
3488 pass
3489 else:
3490 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3491
3492 try:
3493 list.__bases__ = (dict,)
3494 except TypeError:
3495 pass
3496 else:
3497 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3498
3499 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003500 D.__bases__ = (C2, list)
3501 except TypeError:
3502 pass
3503 else:
3504 assert 0, "best_base calculation found wanting"
3505
3506 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003507 del D.__bases__
3508 except TypeError:
3509 pass
3510 else:
3511 raise TestFailed, "shouldn't be able to delete .__bases__"
3512
3513 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003514 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003515 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003516 if str(msg) == "a new-style class can't have only classic bases":
3517 raise TestFailed, "wrong error message for .__bases__ = ()"
3518 else:
3519 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3520
3521 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003522 D.__bases__ = (D,)
3523 except TypeError:
3524 pass
3525 else:
3526 # actually, we'll have crashed by here...
3527 raise TestFailed, "shouldn't be able to create inheritance cycles"
3528
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003529 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003530 D.__bases__ = (C, C)
3531 except TypeError:
3532 pass
3533 else:
3534 raise TestFailed, "didn't detect repeated base classes"
3535
3536 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003537 D.__bases__ = (E,)
3538 except TypeError:
3539 pass
3540 else:
3541 raise TestFailed, "shouldn't be able to create inheritance cycles"
3542
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003543def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003544 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003545 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003546 class WorkOnce(type):
3547 def __new__(self, name, bases, ns):
3548 self.flag = 0
3549 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3550 def mro(self):
3551 if self.flag > 0:
3552 raise RuntimeError, "bozo"
3553 else:
3554 self.flag += 1
3555 return type.mro(self)
3556
3557 class WorkAlways(type):
3558 def mro(self):
3559 # this is here to make sure that .mro()s aren't called
3560 # with an exception set (which was possible at one point).
3561 # An error message will be printed in a debug build.
3562 # What's a good way to test for this?
3563 return type.mro(self)
3564
3565 class C(object):
3566 pass
3567
3568 class C2(object):
3569 pass
3570
3571 class D(C):
3572 pass
3573
3574 class E(D):
3575 pass
3576
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003577 class F(D, metaclass=WorkOnce):
3578 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003579
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003580 class G(D, metaclass=WorkAlways):
3581 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003582
3583 # Immediate subclasses have their mro's adjusted in alphabetical
3584 # order, so E's will get adjusted before adjusting F's fails. We
3585 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003586
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003587 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003588 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003589
3590 try:
3591 D.__bases__ = (C2,)
3592 except RuntimeError:
3593 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003594 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003595 else:
3596 raise TestFailed, "exception not propagated"
3597
3598def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003599 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003600 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003601 class A(object):
3602 pass
3603
3604 class B(object):
3605 pass
3606
3607 class C(A, B):
3608 pass
3609
3610 class D(A, B):
3611 pass
3612
3613 class E(C, D):
3614 pass
3615
3616 try:
3617 C.__bases__ = (B, A)
3618 except TypeError:
3619 pass
3620 else:
3621 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003622
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003623def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003624 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003625 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003626 class C(object):
3627 pass
3628
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003629 # C.__module__ could be 'test_descr' or '__main__'
3630 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003631
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003632 C.__name__ = 'D'
3633 vereq((C.__module__, C.__name__), (mod, 'D'))
3634
3635 C.__name__ = 'D.E'
3636 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003637
Guido van Rossum613f24f2003-01-06 23:00:59 +00003638def subclass_right_op():
3639 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003640 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003641
3642 # This code tests various cases where right-dispatch of a subclass
3643 # should be preferred over left-dispatch of a base class.
3644
3645 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3646
3647 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003648 def __floordiv__(self, other):
3649 return "B.__floordiv__"
3650 def __rfloordiv__(self, other):
3651 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003652
Guido van Rossumf389c772003-02-27 20:04:19 +00003653 vereq(B(1) // 1, "B.__floordiv__")
3654 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003655
3656 # Case 2: subclass of object; this is just the baseline for case 3
3657
3658 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003659 def __floordiv__(self, other):
3660 return "C.__floordiv__"
3661 def __rfloordiv__(self, other):
3662 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003663
Guido van Rossumf389c772003-02-27 20:04:19 +00003664 vereq(C() // 1, "C.__floordiv__")
3665 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003666
3667 # Case 3: subclass of new-style class; here it gets interesting
3668
3669 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003670 def __floordiv__(self, other):
3671 return "D.__floordiv__"
3672 def __rfloordiv__(self, other):
3673 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003674
Guido van Rossumf389c772003-02-27 20:04:19 +00003675 vereq(D() // C(), "D.__floordiv__")
3676 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003677
3678 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3679
3680 class E(C):
3681 pass
3682
Guido van Rossumf389c772003-02-27 20:04:19 +00003683 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003684
Guido van Rossumf389c772003-02-27 20:04:19 +00003685 vereq(E() // 1, "C.__floordiv__")
3686 vereq(1 // E(), "C.__rfloordiv__")
3687 vereq(E() // C(), "C.__floordiv__")
3688 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003689
Guido van Rossum373c7412003-01-07 13:41:37 +00003690def dict_type_with_metaclass():
3691 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003692 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003693
3694 class B(object):
3695 pass
3696 class M(type):
3697 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003698 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003699 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003700 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003701 veris(type(C.__dict__), type(B.__dict__))
3702
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003703def meth_class_get():
3704 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003705 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003706 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003707 # Baseline
3708 arg = [1, 2, 3]
3709 res = {1: None, 2: None, 3: None}
3710 vereq(dict.fromkeys(arg), res)
3711 vereq({}.fromkeys(arg), res)
3712 # Now get the descriptor
3713 descr = dict.__dict__["fromkeys"]
3714 # More baseline using the descriptor directly
3715 vereq(descr.__get__(None, dict)(arg), res)
3716 vereq(descr.__get__({})(arg), res)
3717 # Now check various error cases
3718 try:
3719 descr.__get__(None, None)
3720 except TypeError:
3721 pass
3722 else:
3723 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3724 try:
3725 descr.__get__(42)
3726 except TypeError:
3727 pass
3728 else:
3729 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3730 try:
3731 descr.__get__(None, 42)
3732 except TypeError:
3733 pass
3734 else:
3735 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3736 try:
3737 descr.__get__(None, int)
3738 except TypeError:
3739 pass
3740 else:
3741 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3742
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003743def isinst_isclass():
3744 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003745 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003746 class Proxy(object):
3747 def __init__(self, obj):
3748 self.__obj = obj
3749 def __getattribute__(self, name):
3750 if name.startswith("_Proxy__"):
3751 return object.__getattribute__(self, name)
3752 else:
3753 return getattr(self.__obj, name)
3754 # Test with a classic class
3755 class C:
3756 pass
3757 a = C()
3758 pa = Proxy(a)
3759 verify(isinstance(a, C)) # Baseline
3760 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003761 # Test with a classic subclass
3762 class D(C):
3763 pass
3764 a = D()
3765 pa = Proxy(a)
3766 verify(isinstance(a, C)) # Baseline
3767 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003768 # Test with a new-style class
3769 class C(object):
3770 pass
3771 a = C()
3772 pa = Proxy(a)
3773 verify(isinstance(a, C)) # Baseline
3774 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003775 # Test with a new-style subclass
3776 class D(C):
3777 pass
3778 a = D()
3779 pa = Proxy(a)
3780 verify(isinstance(a, C)) # Baseline
3781 verify(isinstance(pa, C)) # Test
3782
3783def proxysuper():
3784 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003785 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003786 class Proxy(object):
3787 def __init__(self, obj):
3788 self.__obj = obj
3789 def __getattribute__(self, name):
3790 if name.startswith("_Proxy__"):
3791 return object.__getattribute__(self, name)
3792 else:
3793 return getattr(self.__obj, name)
3794
3795 class B(object):
3796 def f(self):
3797 return "B.f"
3798
3799 class C(B):
3800 def f(self):
3801 return super(C, self).f() + "->C.f"
3802
3803 obj = C()
3804 p = Proxy(obj)
3805 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003806
Guido van Rossum52b27052003-04-15 20:05:10 +00003807def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003808 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003809 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003810 try:
3811 object.__setattr__(str, "foo", 42)
3812 except TypeError:
3813 pass
3814 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003815 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003816 try:
3817 object.__delattr__(str, "lower")
3818 except TypeError:
3819 pass
3820 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003821 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003822
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003823def weakref_segfault():
3824 # SF 742911
3825 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003826 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003827
3828 import weakref
3829
3830 class Provoker:
3831 def __init__(self, referrent):
3832 self.ref = weakref.ref(referrent)
3833
3834 def __del__(self):
3835 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003836
3837 class Oops(object):
3838 pass
3839
3840 o = Oops()
3841 o.whatever = Provoker(o)
3842 del o
3843
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003844def wrapper_segfault():
3845 # SF 927248: deeply nested wrappers could cause stack overflow
3846 f = lambda:None
3847 for i in xrange(1000000):
3848 f = f.__call__
3849 f = None
3850
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003851# Fix SF #762455, segfault when sys.stdout is changed in getattr
3852def filefault():
3853 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003854 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003855 import sys
3856 class StdoutGuard:
3857 def __getattr__(self, attr):
3858 sys.stdout = sys.__stdout__
3859 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3860 sys.stdout = StdoutGuard()
3861 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003862 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003863 except RuntimeError:
3864 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003865
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003866def vicious_descriptor_nonsense():
3867 # A potential segfault spotted by Thomas Wouters in mail to
3868 # python-dev 2003-04-17, turned into an example & fixed by Michael
3869 # Hudson just less than four months later...
3870 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003871 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003872
3873 class Evil(object):
3874 def __hash__(self):
3875 return hash('attr')
3876 def __eq__(self, other):
3877 del C.attr
3878 return 0
3879
3880 class Descr(object):
3881 def __get__(self, ob, type=None):
3882 return 1
3883
3884 class C(object):
3885 attr = Descr()
3886
3887 c = C()
3888 c.__dict__[Evil()] = 0
3889
3890 vereq(c.attr, 1)
3891 # this makes a crash more likely:
3892 import gc; gc.collect()
3893 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00003894
Raymond Hettingerb67cc802005-03-03 16:45:19 +00003895def test_init():
3896 # SF 1155938
3897 class Foo(object):
3898 def __init__(self):
3899 return 10
3900 try:
3901 Foo()
3902 except TypeError:
3903 pass
3904 else:
3905 raise TestFailed, "did not test __init__() for None return"
3906
Armin Rigoc6686b72005-11-07 08:38:00 +00003907def methodwrapper():
3908 # <type 'method-wrapper'> did not support any reflection before 2.5
3909 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003910 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00003911
Guido van Rossum47b9ff62006-08-24 00:41:19 +00003912 return # XXX should methods really support __eq__?
3913
Armin Rigoc6686b72005-11-07 08:38:00 +00003914 l = []
3915 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003916 vereq(l.__add__, [].__add__)
3917 verify(l.__add__ != [5].__add__)
3918 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00003919 verify(l.__add__.__name__ == '__add__')
3920 verify(l.__add__.__self__ is l)
3921 verify(l.__add__.__objclass__ is list)
3922 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003923 try:
3924 hash(l.__add__)
3925 except TypeError:
3926 pass
3927 else:
3928 raise TestFailed("no TypeError from hash([].__add__)")
3929
3930 t = ()
3931 t += (7,)
3932 vereq(t.__add__, (7,).__add__)
3933 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003934
Armin Rigofd163f92005-12-29 15:59:19 +00003935def notimplemented():
3936 # all binary methods should be able to return a NotImplemented
3937 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003938 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00003939
3940 import sys
3941 import types
3942 import operator
3943
3944 def specialmethod(self, other):
3945 return NotImplemented
3946
3947 def check(expr, x, y):
3948 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00003949 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00003950 except TypeError:
3951 pass
3952 else:
3953 raise TestFailed("no TypeError from %r" % (expr,))
3954
Guido van Rossume2a383d2007-01-15 16:59:06 +00003955 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00003956 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
3957 # ValueErrors instead of TypeErrors
3958 for metaclass in [type, types.ClassType]:
3959 for name, expr, iexpr in [
3960 ('__add__', 'x + y', 'x += y'),
3961 ('__sub__', 'x - y', 'x -= y'),
3962 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00003963 ('__truediv__', 'x / y', None),
3964 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00003965 ('__mod__', 'x % y', 'x %= y'),
3966 ('__divmod__', 'divmod(x, y)', None),
3967 ('__pow__', 'x ** y', 'x **= y'),
3968 ('__lshift__', 'x << y', 'x <<= y'),
3969 ('__rshift__', 'x >> y', 'x >>= y'),
3970 ('__and__', 'x & y', 'x &= y'),
3971 ('__or__', 'x | y', 'x |= y'),
3972 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00003973 ]:
3974 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00003975 A = metaclass('A', (), {name: specialmethod})
3976 B = metaclass('B', (), {rname: specialmethod})
3977 a = A()
3978 b = B()
3979 check(expr, a, a)
3980 check(expr, a, b)
3981 check(expr, b, a)
3982 check(expr, b, b)
3983 check(expr, a, N1)
3984 check(expr, a, N2)
3985 check(expr, N1, b)
3986 check(expr, N2, b)
3987 if iexpr:
3988 check(iexpr, a, a)
3989 check(iexpr, a, b)
3990 check(iexpr, b, a)
3991 check(iexpr, b, b)
3992 check(iexpr, a, N1)
3993 check(iexpr, a, N2)
3994 iname = '__i' + name[2:]
3995 C = metaclass('C', (), {iname: specialmethod})
3996 c = C()
3997 check(iexpr, c, a)
3998 check(iexpr, c, b)
3999 check(iexpr, c, N1)
4000 check(iexpr, c, N2)
4001
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004002def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004003 weakref_segfault() # Must be first, somehow
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004004 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004005 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004006 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004007 lists()
4008 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004009 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004010 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004011 ints()
4012 longs()
4013 floats()
4014 complexes()
4015 spamlists()
4016 spamdicts()
4017 pydicts()
4018 pylists()
4019 metaclass()
4020 pymods()
4021 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004022 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004023 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004024 ex5()
4025 monotonicity()
4026 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004027 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004028 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004029 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004030 dynamics()
4031 errors()
4032 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004033 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004034 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004035 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004036 classic()
4037 compattr()
4038 newslot()
4039 altmro()
4040 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004041 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004042 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004043 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004044 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004045 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004046 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004047 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004048 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004049 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004050 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004051 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004052 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004053 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004054 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004055 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004056 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004057 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004058 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004059 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004060 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004061 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004062 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004063 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004064 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004065 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004066 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004067 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004068 dictproxyiterkeys()
4069 dictproxyitervalues()
4070 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004071 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004072 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004073 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004074 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004075 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004076 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004077 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004078 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004079 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004080 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004081 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004082 test_mutable_bases()
4083 test_mutable_bases_with_failing_mro()
4084 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004085 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004086 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004087 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004088 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004089 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004090 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004091 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004092 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004093 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004094 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004095 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004096 notimplemented()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004097
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004098 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004099
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004100if __name__ == "__main__":
4101 test_main()