blob: 4b6d734b81c1397247d1277526383da8643ae160 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Neal Norwitz1a997502003-01-13 20:13:12 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000016 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000017 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000029 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000030 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
Guido van Rossum45704552001-10-08 16:35:45 +000032 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000033 t = type(a)
34 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000035 while meth not in t.__dict__:
36 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000037 vereq(m, t.__dict__[meth])
38 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000040 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000041
42def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000043 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000045 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046 t = type(a)
47 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000048 while meth not in t.__dict__:
49 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000050 vereq(m, t.__dict__[meth])
51 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000053 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054
55def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000056 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000057 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000058 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000059 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000060 t = type(a)
61 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000062 while meth not in t.__dict__:
63 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000064 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000065 dict['a'] = deepcopy(a)
66 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000067 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000068 dict['a'] = deepcopy(a)
69 bm = getattr(dict['a'], meth)
70 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072
73def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000074 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000075 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000076 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000077 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000078 t = type(a)
79 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000080 while meth not in t.__dict__:
81 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000082 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000083 dict['a'] = deepcopy(a)
84 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000085 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000086 dict['a'] = deepcopy(a)
87 bm = getattr(dict['a'], meth)
88 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090
91def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000092 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000093 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000094 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000095 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000096 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000097 while meth not in t.__dict__:
98 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000099 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000100 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101 dict['a'] = deepcopy(a)
102 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000103 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000104 dict['a'] = deepcopy(a)
105 bm = getattr(dict['a'], meth)
106 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108
Tim Peters2f93e282001-10-04 05:27:00 +0000109def class_docstrings():
110 class Classic:
111 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000112 vereq(Classic.__doc__, "A classic docstring.")
113 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000114
115 class Classic2:
116 pass
117 verify(Classic2.__doc__ is None)
118
Tim Peters4fb1fe82001-10-04 05:48:13 +0000119 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000120 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000121 vereq(NewStatic.__doc__, "Another docstring.")
122 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000123
Tim Peters4fb1fe82001-10-04 05:48:13 +0000124 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000125 pass
126 verify(NewStatic2.__doc__ is None)
127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000130 vereq(NewDynamic.__doc__, "Another docstring.")
131 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000132
Tim Peters4fb1fe82001-10-04 05:48:13 +0000133 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000134 pass
135 verify(NewDynamic2.__doc__ is None)
136
Tim Peters6d6c1a32001-08-02 04:15:00 +0000137def lists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000138 if verbose: print("Testing list operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000139 testbinop([1], [2], [1,2], "a+b", "__add__")
140 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
141 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
142 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
143 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
144 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
145 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
146 testunop([1,2,3], 3, "len(a)", "__len__")
147 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
148 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
149 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
150 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
151
152def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000153 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000154 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000155 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
156 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
157 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
158 d = {1:2,3:4}
159 l1 = []
160 for i in d.keys(): l1.append(i)
161 l = []
162 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000163 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 l = []
165 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000166 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000167 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000168 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000169 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 d = {1:2, 3:4}
171 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000172 vereq(eval(repr(d), {}), d)
173 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
175
Tim Peters25786c02001-09-02 08:22:48 +0000176def dict_constructor():
177 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000178 print("Testing dict constructor ...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000179 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000180 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000181 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000186 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000187 d = dict({'one':1, 'two':2})
188 vereq(d, dict(one=1, two=2))
189 vereq(d, dict(**d))
190 vereq(d, dict({"one": 1}, two=2))
191 vereq(d, dict([("two", 2)], one=1))
192 vereq(d, dict([("one", 100), ("two", 200)], **d))
193 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000194 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000195 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000196 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000197 except TypeError:
198 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000199 except ValueError:
200 if badarg == "0":
201 # It's a sequence, and its elements are also sequences (gotta
202 # love strings <wink>), but they aren't of length 2, so this
203 # one seemed better as a ValueError than a TypeError.
204 pass
205 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000206 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000207 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000208 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000209
210 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000211 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000212 except TypeError:
213 pass
214 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000216
217 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000218 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000219 dict = {1:2, 3:4, 'a':1j}
220
Tim Peters25786c02001-09-02 08:22:48 +0000221 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000222 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000223 except TypeError:
224 pass
225 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000226 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000227
228 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000229 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000230 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000231 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000232
Tim Peters1fc240e2001-10-26 05:06:50 +0000233 # Init from sequence of iterable objects, each producing a 2-sequence.
234 class AddressBookEntry:
235 def __init__(self, first, last):
236 self.first = first
237 self.last = last
238 def __iter__(self):
239 return iter([self.first, self.last])
240
Tim Petersa427a2b2001-10-29 22:25:45 +0000241 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000242 AddressBookEntry('Barry', 'Peters'),
243 AddressBookEntry('Tim', 'Peters'),
244 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000245 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
246
Tim Petersa427a2b2001-10-29 22:25:45 +0000247 d = dict(zip(range(4), range(1, 5)))
248 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000249
250 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000251 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000252 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000253 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000254 except ValueError:
255 pass
256 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000257 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000258
Tim Peters5d2b77c2001-09-03 05:47:38 +0000259def test_dir():
260 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000261 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000262 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000263 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264 del junk
265
266 # Just make sure these don't blow up!
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000267 for arg in 2, 2, 2j, 2e0, [2], "2", "2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000268 dir(arg)
269
Thomas Wouters0725cf22006-04-15 09:04:57 +0000270 # Test dir on custom classes. Since these have object as a
271 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000272 def interesting(strings):
273 return [s for s in strings if not s.startswith('_')]
274
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275 class C(object):
276 Cdata = 1
277 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000278
279 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000281
282 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000284 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000285
286 c.cdata = 2
287 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000288 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000289 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000290
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291 class A(C):
292 Adata = 1
293 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000294
295 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000296 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000297 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000298 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000300 a.adata = 42
301 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000302 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000303 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000304
Tim Peterscaaff8d2001-09-10 23:12:14 +0000305 # Try a module subclass.
306 import sys
307 class M(type(sys)):
308 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000309 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000310 minstance.b = 2
311 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000312 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
313 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000314
315 class M2(M):
316 def getdict(self):
317 return "Not a dict!"
318 __dict__ = property(getdict)
319
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000320 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000321 m2instance.b = 2
322 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000323 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000324 try:
325 dir(m2instance)
326 except TypeError:
327 pass
328
Tim Peters9e6a3992001-10-30 05:45:26 +0000329 # Two essentially featureless objects, just inheriting stuff from
330 # object.
331 vereq(dir(None), dir(Ellipsis))
332
Guido van Rossum44022412002-05-13 18:29:46 +0000333 # Nasty test case for proxied objects
334 class Wrapper(object):
335 def __init__(self, obj):
336 self.__obj = obj
337 def __repr__(self):
338 return "Wrapper(%s)" % repr(self.__obj)
339 def __getitem__(self, key):
340 return Wrapper(self.__obj[key])
341 def __len__(self):
342 return len(self.__obj)
343 def __getattr__(self, name):
344 return Wrapper(getattr(self.__obj, name))
345
346 class C(object):
347 def __getclass(self):
348 return Wrapper(type(self))
349 __class__ = property(__getclass)
350
351 dir(C()) # This used to segfault
352
Tim Peters6d6c1a32001-08-02 04:15:00 +0000353binops = {
354 'add': '+',
355 'sub': '-',
356 'mul': '*',
357 'div': '/',
358 'mod': '%',
359 'divmod': 'divmod',
360 'pow': '**',
361 'lshift': '<<',
362 'rshift': '>>',
363 'and': '&',
364 'xor': '^',
365 'or': '|',
366 'cmp': 'cmp',
367 'lt': '<',
368 'le': '<=',
369 'eq': '==',
370 'ne': '!=',
371 'gt': '>',
372 'ge': '>=',
373 }
374
375for name, expr in binops.items():
376 if expr.islower():
377 expr = expr + "(a, b)"
378 else:
379 expr = 'a %s b' % expr
380 binops[name] = expr
381
382unops = {
383 'pos': '+',
384 'neg': '-',
385 'abs': 'abs',
386 'invert': '~',
387 'int': 'int',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000388 'float': 'float',
389 'oct': 'oct',
390 'hex': 'hex',
391 }
392
393for name, expr in unops.items():
394 if expr.islower():
395 expr = expr + "(a)"
396 else:
397 expr = '%s a' % expr
398 unops[name] = expr
399
400def numops(a, b, skip=[]):
401 dict = {'a': a, 'b': b}
402 for name, expr in binops.items():
403 if name not in skip:
404 name = "__%s__" % name
405 if hasattr(a, name):
406 res = eval(expr, dict)
407 testbinop(a, b, res, expr, name)
408 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000409 if name not in skip:
410 name = "__%s__" % name
411 if hasattr(a, name):
412 res = eval(expr, dict)
413 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000414
415def ints():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000416 if verbose: print("Testing int operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000417 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000418 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000419 vereq((1).__bool__(), True)
420 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000421 # This returns 'NotImplemented' in Python 2.2
422 class C(int):
423 def __add__(self, other):
424 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000425 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000426 try:
427 C() + ""
428 except TypeError:
429 pass
430 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000431 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000432
433def longs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000434 if verbose: print("Testing long operations...")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000435 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000436
437def floats():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000438 if verbose: print("Testing float operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000439 numops(100.0, 3.0)
440
441def complexes():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000442 if verbose: print("Testing complex operations...")
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000443 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000444 class Number(complex):
445 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000446 def __new__(cls, *args, **kwds):
447 result = complex.__new__(cls, *args)
448 result.prec = kwds.get('prec', 12)
449 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 def __repr__(self):
451 prec = self.prec
452 if self.imag == 0.0:
453 return "%.*g" % (prec, self.real)
454 if self.real == 0.0:
455 return "%.*gj" % (prec, self.imag)
456 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
457 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000458
Tim Peters6d6c1a32001-08-02 04:15:00 +0000459 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000460 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000461 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000462
Tim Peters3f996e72001-09-13 19:18:27 +0000463 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000464 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000465 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000466
467 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000468 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000469 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000470
Tim Peters6d6c1a32001-08-02 04:15:00 +0000471def spamlists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000472 if verbose: print("Testing spamlist operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473 import copy, xxsubtype as spam
474 def spamlist(l, memo=None):
475 import xxsubtype as spam
476 return spam.spamlist(l)
477 # This is an ugly hack:
478 copy._deepcopy_dispatch[spam.spamlist] = spamlist
479
480 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
481 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
482 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
483 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
484 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
485 "a[b:c]", "__getslice__")
486 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
487 "a+=b", "__iadd__")
488 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
489 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
490 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
491 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
492 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
493 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
494 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
495 # Test subclassing
496 class C(spam.spamlist):
497 def foo(self): return 1
498 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(a, [])
500 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000502 vereq(a, [100])
503 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000504 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000505 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506
507def spamdicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000508 if verbose: print("Testing spamdict operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000509 import copy, xxsubtype as spam
510 def spamdict(d, memo=None):
511 import xxsubtype as spam
512 sd = spam.spamdict()
513 for k, v in d.items(): sd[k] = v
514 return sd
515 # This is an ugly hack:
516 copy._deepcopy_dispatch[spam.spamdict] = spamdict
517
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000518 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000519 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
520 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
521 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
522 d = spamdict({1:2,3:4})
523 l1 = []
524 for i in d.keys(): l1.append(i)
525 l = []
526 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000527 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000528 l = []
529 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 l = []
532 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000533 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000534 straightd = {1:2, 3:4}
535 spamd = spamdict(straightd)
536 testunop(spamd, 2, "len(a)", "__len__")
537 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
538 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
539 "a[b]=c", "__setitem__")
540 # Test subclassing
541 class C(spam.spamdict):
542 def foo(self): return 1
543 a = C()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000544 vereq(list(a.items()), [])
Guido van Rossum45704552001-10-08 16:35:45 +0000545 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 a['foo'] = 'bar'
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000547 vereq(list(a.items()), [('foo', 'bar')])
Guido van Rossum45704552001-10-08 16:35:45 +0000548 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551
552def pydicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000553 if verbose: print("Testing Python subclass of dict...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000554 verify(issubclass(dict, dict))
555 verify(isinstance({}, dict))
556 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000557 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000558 verify(d.__class__ is dict)
559 verify(isinstance(d, dict))
560 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561 state = -1
562 def __init__(self, *a, **kw):
563 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000564 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565 self.state = a[0]
566 if kw:
567 for k, v in kw.items(): self[v] = k
568 def __getitem__(self, key):
569 return self.get(key, 0)
570 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000571 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000572 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000573 def setstate(self, state):
574 self.state = state
575 def getstate(self):
576 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000577 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000581 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.state, -1)
584 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.state, 0)
587 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000588 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a.state, 10)
590 vereq(a.getstate(), 10)
591 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a[42], 24)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000594 if verbose: print("pydict stress test ...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 N = 50
596 for i in range(N):
597 a[i] = C()
598 for j in range(N):
599 a[i][j] = i*j
600 for i in range(N):
601 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000602 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603
604def pylists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000605 if verbose: print("Testing Python subclass of list...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000606 class C(list):
607 def __getitem__(self, i):
608 return list.__getitem__(self, i) + 100
609 def __getslice__(self, i, j):
610 return (i, j)
611 a = C()
612 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000613 vereq(a[0], 100)
614 vereq(a[1], 101)
615 vereq(a[2], 102)
616 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617
618def metaclass():
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000619 if verbose: print("Testing metaclass...")
620 class C(metaclass=type):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000621 def __init__(self):
622 self.__state = 0
623 def getstate(self):
624 return self.__state
625 def setstate(self, state):
626 self.__state = state
627 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000628 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000630 vereq(a.getstate(), 10)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000631 class _metaclass(type):
632 def myself(cls): return cls
633 class D(metaclass=_metaclass):
634 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000635 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000636 d = D()
637 verify(d.__class__ is D)
638 class M1(type):
639 def __new__(cls, name, bases, dict):
640 dict['__spam__'] = 1
641 return type.__new__(cls, name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000642 class C(metaclass=M1):
643 pass
Guido van Rossum45704552001-10-08 16:35:45 +0000644 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000645 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000646 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000647
Guido van Rossum309b5662001-08-17 11:43:17 +0000648 class _instance(object):
649 pass
650 class M2(object):
Guido van Rossum5a8a0372005-01-16 00:25:31 +0000651 @staticmethod
Guido van Rossum309b5662001-08-17 11:43:17 +0000652 def __new__(cls, name, bases, dict):
653 self = object.__new__(cls)
654 self.name = name
655 self.bases = bases
656 self.dict = dict
657 return self
Guido van Rossum309b5662001-08-17 11:43:17 +0000658 def __call__(self):
659 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000660 # Early binding of methods
661 for key in self.dict:
662 if key.startswith("__"):
663 continue
664 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000665 return it
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000666 class C(metaclass=M2):
Guido van Rossum309b5662001-08-17 11:43:17 +0000667 def spam(self):
668 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000669 vereq(C.name, 'C')
670 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000671 verify('spam' in C.dict)
672 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000673 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000674
Guido van Rossum91ee7982001-08-30 20:52:40 +0000675 # More metaclass examples
676
677 class autosuper(type):
678 # Automatically add __super to the class
679 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000680 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 cls = super(autosuper, metaclass).__new__(metaclass,
682 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000683 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000684 while name[:1] == "_":
685 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000686 if name:
687 name = "_%s__super" % name
688 else:
689 name = "__super"
690 setattr(cls, name, super(cls))
691 return cls
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000692 class A(metaclass=autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000693 def meth(self):
694 return "A"
695 class B(A):
696 def meth(self):
697 return "B" + self.__super.meth()
698 class C(A):
699 def meth(self):
700 return "C" + self.__super.meth()
701 class D(C, B):
702 def meth(self):
703 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000704 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000705 class E(B, C):
706 def meth(self):
707 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000708 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000709
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000710 class autoproperty(type):
711 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000712 # named _get_x and/or _set_x are found
713 def __new__(metaclass, name, bases, dict):
714 hits = {}
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000715 for key, val in dict.items():
Guido van Rossum91ee7982001-08-30 20:52:40 +0000716 if key.startswith("_get_"):
717 key = key[5:]
718 get, set = hits.get(key, (None, None))
719 get = val
720 hits[key] = get, set
721 elif key.startswith("_set_"):
722 key = key[5:]
723 get, set = hits.get(key, (None, None))
724 set = val
725 hits[key] = get, set
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000726 for key, (get, set) in hits.items():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000727 dict[key] = property(get, set)
728 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000729 name, bases, dict)
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000730 class A(metaclass=autoproperty):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 def _get_x(self):
732 return -self.__x
733 def _set_x(self, x):
734 self.__x = -x
735 a = A()
736 verify(not hasattr(a, "x"))
737 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000738 vereq(a.x, 12)
739 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000740
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000741 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000742 # Merge of multiple cooperating metaclasses
743 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000744 class A(metaclass=multimetaclass):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000745 def _get_x(self):
746 return "A"
747 class B(A):
748 def _get_x(self):
749 return "B" + self.__super._get_x()
750 class C(A):
751 def _get_x(self):
752 return "C" + self.__super._get_x()
753 class D(C, B):
754 def _get_x(self):
755 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000756 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000757
Guido van Rossumf76de622001-10-18 15:49:21 +0000758 # Make sure type(x) doesn't call x.__class__.__init__
759 class T(type):
760 counter = 0
761 def __init__(self, *args):
762 T.counter += 1
Guido van Rossum52cc1d82007-03-18 15:41:51 +0000763 class C(metaclass=T):
764 pass
Guido van Rossumf76de622001-10-18 15:49:21 +0000765 vereq(T.counter, 1)
766 a = C()
767 vereq(type(a), C)
768 vereq(T.counter, 1)
769
Guido van Rossum29d26062001-12-11 04:37:34 +0000770 class C(object): pass
771 c = C()
772 try: c()
773 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000774 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000775
Guido van Rossumd8faa362007-04-27 19:54:29 +0000776 # Testing code to find most derived baseclass
777 class A(type):
778 def __new__(*args, **kwargs):
779 return type.__new__(*args, **kwargs)
780
781 class B(object):
782 pass
783
784 class C(object, metaclass=A):
785 pass
786
787 # The most derived metaclass of D is A rather than type.
788 class D(B, C):
789 pass
790
791
Tim Peters6d6c1a32001-08-02 04:15:00 +0000792def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000793 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000794 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000795 import sys
796 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000797 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000798 def __init__(self, name):
799 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000800 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000802 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000803 def __setattr__(self, name, value):
804 log.append(("setattr", name, value))
805 MT.__setattr__(self, name, value)
806 def __delattr__(self, name):
807 log.append(("delattr", name))
808 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000809 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000810 a.foo = 12
811 x = a.foo
812 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000813 vereq(log, [("setattr", "foo", 12),
814 ("getattr", "foo"),
815 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816
817def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000818 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819 class C(object):
820 def __init__(self):
821 self.__state = 0
822 def getstate(self):
823 return self.__state
824 def setstate(self, state):
825 self.__state = state
826 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000827 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000829 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000830 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831 def __init__(self):
832 type({}).__init__(self)
833 C.__init__(self)
834 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000835 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000836 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000837 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000838 vereq(d["hello"], "world")
839 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000840 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000841 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000842 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000843
Guido van Rossume45763a2001-08-10 21:28:46 +0000844 # SF bug #442833
845 class Node(object):
846 def __int__(self):
847 return int(self.foo())
848 def foo(self):
849 return "23"
850 class Frag(Node, list):
851 def foo(self):
852 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000853 vereq(Node().__int__(), 23)
854 vereq(int(Node()), 23)
855 vereq(Frag().__int__(), 42)
856 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000857
Tim Peters6d6c1a32001-08-02 04:15:00 +0000858def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000859 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 class A(object):
861 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000862 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000863 class B(A):
864 def boo(self): return "B"
865 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000866 vereq(B().spam(), "B")
867 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000868 class C(A):
869 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000870 vereq(C().spam(), "A")
871 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000872 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000873 vereq(D().spam(), "B")
874 vereq(D().boo(), "B")
875 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000876 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000877 vereq(E().spam(), "B")
878 vereq(E().boo(), "C")
879 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000880 # MRO order disagreement
881 try:
882 class F(D, E): pass
883 except TypeError:
884 pass
885 else:
886 raise TestFailed, "expected MRO order disagreement (F)"
887 try:
888 class G(E, D): pass
889 except TypeError:
890 pass
891 else:
892 raise TestFailed, "expected MRO order disagreement (G)"
893
894
895# see thread python-dev/2002-October/029035.html
896def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000897 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000898 class A(object): pass
899 class B(object): pass
900 class C(object): pass
901 class X(A): pass
902 class Y(A): pass
903 class Z(X,B,Y,C): pass
904 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
905
906# see "A Monotonic Superclass Linearization for Dylan",
907# by Kim Barrett et al. (OOPSLA 1996)
908def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000909 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000910 class Boat(object): pass
911 class DayBoat(Boat): pass
912 class WheelBoat(Boat): pass
913 class EngineLess(DayBoat): pass
914 class SmallMultihull(DayBoat): pass
915 class PedalWheelBoat(EngineLess,WheelBoat): pass
916 class SmallCatamaran(SmallMultihull): pass
917 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
918
919 vereq(PedalWheelBoat.__mro__,
920 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
921 object))
922 vereq(SmallCatamaran.__mro__,
923 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
924
925 vereq(Pedalo.__mro__,
926 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
927 SmallMultihull, DayBoat, WheelBoat, Boat, object))
928
929# see "A Monotonic Superclass Linearization for Dylan",
930# by Kim Barrett et al. (OOPSLA 1996)
931def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000932 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000933 class Pane(object): pass
934 class ScrollingMixin(object): pass
935 class EditingMixin(object): pass
936 class ScrollablePane(Pane,ScrollingMixin): pass
937 class EditablePane(Pane,EditingMixin): pass
938 class EditableScrollablePane(ScrollablePane,EditablePane): pass
939
940 vereq(EditableScrollablePane.__mro__,
941 (EditableScrollablePane, ScrollablePane, EditablePane,
942 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000943
Raymond Hettingerf394df42003-04-06 19:13:41 +0000944mro_err_msg = """Cannot create a consistent method resolution
945order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000946
Guido van Rossumd32047f2002-11-25 21:38:52 +0000947def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000948 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000949 def raises(exc, expected, callable, *args):
950 try:
951 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000952 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000953 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +0000954 raise TestFailed, "Message %r, expected %r" % (str(msg),
955 expected)
956 else:
957 raise TestFailed, "Expected %s" % exc
958 class A(object): pass
959 class B(A): pass
960 class C(object): pass
961 # Test some very simple errors
962 raises(TypeError, "duplicate base class A",
963 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000964 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000965 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000966 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000967 type, "X", (A, C, B), {})
968 # Test a slightly more complex error
969 class GridLayout(object): pass
970 class HorizontalGrid(GridLayout): pass
971 class VerticalGrid(GridLayout): pass
972 class HVGrid(HorizontalGrid, VerticalGrid): pass
973 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000974 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000975 type, "ConfusedGrid", (HVGrid, VHGrid), {})
976
Guido van Rossum37202612001-08-09 19:45:21 +0000977def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000978 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000979 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000980 vereq(a.__class__, object)
981 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000982 b = object()
983 verify(a is not b)
984 verify(not hasattr(a, "foo"))
985 try:
986 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000987 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000988 pass
989 else:
990 verify(0, "object() should not allow setting a foo attribute")
991 verify(not hasattr(object(), "__dict__"))
992
993 class Cdict(object):
994 pass
995 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000996 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000997 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000998 vereq(x.foo, 1)
999 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001000
Tim Peters6d6c1a32001-08-02 04:15:00 +00001001def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001002 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003 class C0(object):
1004 __slots__ = []
1005 x = C0()
1006 verify(not hasattr(x, "__dict__"))
1007 verify(not hasattr(x, "foo"))
1008
1009 class C1(object):
1010 __slots__ = ['a']
1011 x = C1()
1012 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001013 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001014 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001015 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001016 x.a = None
1017 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001018 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001019 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020
1021 class C3(object):
1022 __slots__ = ['a', 'b', 'c']
1023 x = C3()
1024 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001025 verify(not hasattr(x, 'a'))
1026 verify(not hasattr(x, 'b'))
1027 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001028 x.a = 1
1029 x.b = 2
1030 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001031 vereq(x.a, 1)
1032 vereq(x.b, 2)
1033 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001034
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001035 class C4(object):
1036 """Validate name mangling"""
1037 __slots__ = ['__a']
1038 def __init__(self, value):
1039 self.__a = value
1040 def get(self):
1041 return self.__a
1042 x = C4(5)
1043 verify(not hasattr(x, '__dict__'))
1044 verify(not hasattr(x, '__a'))
1045 vereq(x.get(), 5)
1046 try:
1047 x.__a = 6
1048 except AttributeError:
1049 pass
1050 else:
1051 raise TestFailed, "Double underscored names not mangled"
1052
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001053 # Make sure slot names are proper identifiers
1054 try:
1055 class C(object):
1056 __slots__ = [None]
1057 except TypeError:
1058 pass
1059 else:
1060 raise TestFailed, "[None] slots not caught"
1061 try:
1062 class C(object):
1063 __slots__ = ["foo bar"]
1064 except TypeError:
1065 pass
1066 else:
1067 raise TestFailed, "['foo bar'] slots not caught"
1068 try:
1069 class C(object):
1070 __slots__ = ["foo\0bar"]
1071 except TypeError:
1072 pass
1073 else:
1074 raise TestFailed, "['foo\\0bar'] slots not caught"
1075 try:
1076 class C(object):
1077 __slots__ = ["1"]
1078 except TypeError:
1079 pass
1080 else:
1081 raise TestFailed, "['1'] slots not caught"
1082 try:
1083 class C(object):
1084 __slots__ = [""]
1085 except TypeError:
1086 pass
1087 else:
1088 raise TestFailed, "[''] slots not caught"
1089 class C(object):
1090 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001091 # XXX(nnorwitz): was there supposed to be something tested
1092 # from the class above?
1093
1094 # Test a single string is not expanded as a sequence.
1095 class C(object):
1096 __slots__ = "abc"
1097 c = C()
1098 c.abc = 5
1099 vereq(c.abc, 5)
1100
1101 # Test unicode slot names
1102 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001103 str
Guido van Rossumd8faa362007-04-27 19:54:29 +00001104 except NameError:
1105 pass
1106 else:
1107 # Test a single unicode string is not expanded as a sequence.
1108 class C(object):
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001109 __slots__ = str("abc")
Guido van Rossumd8faa362007-04-27 19:54:29 +00001110 c = C()
1111 c.abc = 5
1112 vereq(c.abc, 5)
1113
1114 # _unicode_to_string used to modify slots in certain circumstances
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001115 slots = (str("foo"), str("bar"))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001116 class C(object):
1117 __slots__ = slots
1118 x = C()
1119 x.foo = 5
1120 vereq(x.foo, 5)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001121 veris(type(slots[0]), str)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001122 # this used to leak references
1123 try:
1124 class C(object):
Guido van Rossum84fc66d2007-05-03 17:18:26 +00001125 __slots__ = [chr(128)]
Guido van Rossumd8faa362007-04-27 19:54:29 +00001126 except (TypeError, UnicodeEncodeError):
1127 pass
1128 else:
1129 raise TestFailed, "[unichr(128)] slots not caught"
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001130
Guido van Rossum33bab012001-12-05 22:45:48 +00001131 # Test leaks
1132 class Counted(object):
1133 counter = 0 # counts the number of instances alive
1134 def __init__(self):
1135 Counted.counter += 1
1136 def __del__(self):
1137 Counted.counter -= 1
1138 class C(object):
1139 __slots__ = ['a', 'b', 'c']
1140 x = C()
1141 x.a = Counted()
1142 x.b = Counted()
1143 x.c = Counted()
1144 vereq(Counted.counter, 3)
1145 del x
1146 vereq(Counted.counter, 0)
1147 class D(C):
1148 pass
1149 x = D()
1150 x.a = Counted()
1151 x.z = Counted()
1152 vereq(Counted.counter, 2)
1153 del x
1154 vereq(Counted.counter, 0)
1155 class E(D):
1156 __slots__ = ['e']
1157 x = E()
1158 x.a = Counted()
1159 x.z = Counted()
1160 x.e = Counted()
1161 vereq(Counted.counter, 3)
1162 del x
1163 vereq(Counted.counter, 0)
1164
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001165 # Test cyclical leaks [SF bug 519621]
1166 class F(object):
1167 __slots__ = ['a', 'b']
1168 log = []
1169 s = F()
1170 s.a = [Counted(), s]
1171 vereq(Counted.counter, 1)
1172 s = None
1173 import gc
1174 gc.collect()
1175 vereq(Counted.counter, 0)
1176
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001177 # Test lookup leaks [SF bug 572567]
1178 import sys,gc
1179 class G(object):
1180 def __cmp__(self, other):
1181 return 0
1182 g = G()
1183 orig_objects = len(gc.get_objects())
Guido van Rossum805365e2007-05-07 22:24:25 +00001184 for i in range(10):
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001185 g==g
1186 new_objects = len(gc.get_objects())
1187 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001188 class H(object):
1189 __slots__ = ['a', 'b']
1190 def __init__(self):
1191 self.a = 1
1192 self.b = 2
1193 def __del__(self):
1194 assert self.a == 1
1195 assert self.b == 2
1196
1197 save_stderr = sys.stderr
1198 sys.stderr = sys.stdout
1199 h = H()
1200 try:
1201 del h
1202 finally:
1203 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001204
Guido van Rossum8b056da2002-08-13 18:26:26 +00001205def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001206 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001207
1208 class D(object):
1209 __slots__ = ["__dict__"]
1210 a = D()
1211 verify(hasattr(a, "__dict__"))
1212 verify(not hasattr(a, "__weakref__"))
1213 a.foo = 42
1214 vereq(a.__dict__, {"foo": 42})
1215
1216 class W(object):
1217 __slots__ = ["__weakref__"]
1218 a = W()
1219 verify(hasattr(a, "__weakref__"))
1220 verify(not hasattr(a, "__dict__"))
1221 try:
1222 a.foo = 42
1223 except AttributeError:
1224 pass
1225 else:
1226 raise TestFailed, "shouldn't be allowed to set a.foo"
1227
1228 class C1(W, D):
1229 __slots__ = []
1230 a = C1()
1231 verify(hasattr(a, "__dict__"))
1232 verify(hasattr(a, "__weakref__"))
1233 a.foo = 42
1234 vereq(a.__dict__, {"foo": 42})
1235
1236 class C2(D, W):
1237 __slots__ = []
1238 a = C2()
1239 verify(hasattr(a, "__dict__"))
1240 verify(hasattr(a, "__weakref__"))
1241 a.foo = 42
1242 vereq(a.__dict__, {"foo": 42})
1243
Guido van Rossum9a818922002-11-14 19:50:14 +00001244# MRO order disagreement
1245#
1246# class C3(C1, C2):
1247# __slots__ = []
1248#
1249# class C4(C2, C1):
1250# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001251
Tim Peters6d6c1a32001-08-02 04:15:00 +00001252def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001253 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001254 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001255 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001256 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001258 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001259 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001260 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001261 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001262 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001263 vereq(E.foo, 1)
1264 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001265 # Test dynamic instances
1266 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001267 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001268 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001269 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001270 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001271 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001272 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001273 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001274 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001275 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001276 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001277 vereq(int(a), 100)
1278 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001279 verify(not hasattr(a, "spam"))
1280 def mygetattr(self, name):
1281 if name == "spam":
1282 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001283 raise AttributeError
1284 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001285 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001286 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001287 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001288 def mysetattr(self, name, value):
1289 if name == "spam":
1290 raise AttributeError
1291 return object.__setattr__(self, name, value)
1292 C.__setattr__ = mysetattr
1293 try:
1294 a.spam = "not spam"
1295 except AttributeError:
1296 pass
1297 else:
1298 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001299 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001300 class D(C):
1301 pass
1302 d = D()
1303 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001304 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001305
Guido van Rossum7e35d572001-09-15 03:14:32 +00001306 # Test handling of int*seq and seq*int
1307 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001308 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001309 vereq("a"*I(2), "aa")
1310 vereq(I(2)*"a", "aa")
1311 vereq(2*I(3), 6)
1312 vereq(I(3)*2, 6)
1313 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001314
1315 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001316 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001317 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001318 vereq("a"*L(2), "aa")
1319 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001320 vereq(2*L(3), 6)
1321 vereq(L(3)*2, 6)
1322 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001323
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001324 # Test comparison of classes with dynamic metaclasses
1325 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001326 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001327 class someclass(metaclass=dynamicmetaclass):
1328 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001329 verify(someclass != object)
1330
Tim Peters6d6c1a32001-08-02 04:15:00 +00001331def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001332 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001333
1334 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001335 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336 pass
1337 except TypeError:
1338 pass
1339 else:
1340 verify(0, "inheritance from both list and dict should be illegal")
1341
1342 try:
1343 class C(object, None):
1344 pass
1345 except TypeError:
1346 pass
1347 else:
1348 verify(0, "inheritance from non-type should be illegal")
1349 class Classic:
1350 pass
1351
1352 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001353 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001354 pass
1355 except TypeError:
1356 pass
1357 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001358 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001359
1360 try:
1361 class C(object):
1362 __slots__ = 1
1363 except TypeError:
1364 pass
1365 else:
1366 verify(0, "__slots__ = 1 should be illegal")
1367
1368 try:
1369 class C(object):
1370 __slots__ = [1]
1371 except TypeError:
1372 pass
1373 else:
1374 verify(0, "__slots__ = [1] should be illegal")
1375
Guido van Rossumd8faa362007-04-27 19:54:29 +00001376 class M1(type):
1377 pass
1378 class M2(type):
1379 pass
1380 class A1(object, metaclass=M1):
1381 pass
1382 class A2(object, metaclass=M2):
1383 pass
1384 try:
1385 class B(A1, A2):
1386 pass
1387 except TypeError:
1388 pass
1389 else:
1390 verify(0, "finding the most derived metaclass should have failed")
1391
Tim Peters6d6c1a32001-08-02 04:15:00 +00001392def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001393 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001394 class C(object):
1395 def foo(*a): return a
1396 goo = classmethod(foo)
1397 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001398 vereq(C.goo(1), (C, 1))
1399 vereq(c.goo(1), (C, 1))
1400 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001401 class D(C):
1402 pass
1403 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001404 vereq(D.goo(1), (D, 1))
1405 vereq(d.goo(1), (D, 1))
1406 vereq(d.foo(1), (d, 1))
1407 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001408 # Test for a specific crash (SF bug 528132)
1409 def f(cls, arg): return (cls, arg)
1410 ff = classmethod(f)
1411 vereq(ff.__get__(0, int)(42), (int, 42))
1412 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001413
Guido van Rossum155db9a2002-04-02 17:53:47 +00001414 # Test super() with classmethods (SF bug 535444)
1415 veris(C.goo.im_self, C)
1416 veris(D.goo.im_self, D)
1417 veris(super(D,D).goo.im_self, D)
1418 veris(super(D,d).goo.im_self, D)
1419 vereq(super(D,D).goo(), (D,))
1420 vereq(super(D,d).goo(), (D,))
1421
Raymond Hettingerbe971532003-06-18 01:13:41 +00001422 # Verify that argument is checked for callability (SF bug 753451)
1423 try:
1424 classmethod(1).__get__(1)
1425 except TypeError:
1426 pass
1427 else:
1428 raise TestFailed, "classmethod should check for callability"
1429
Georg Brandl6a29c322006-02-21 22:17:46 +00001430 # Verify that classmethod() doesn't allow keyword args
1431 try:
1432 classmethod(f, kw=1)
1433 except TypeError:
1434 pass
1435 else:
1436 raise TestFailed, "classmethod shouldn't accept keyword args"
1437
Fred Drakef841aa62002-03-28 15:49:54 +00001438def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001439 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001440 import xxsubtype as spam
1441 a = (1, 2, 3)
1442 d = {'abc': 123}
1443 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001444 veris(x, spam.spamlist)
1445 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001446 vereq(d, d1)
1447 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001448 veris(x, spam.spamlist)
1449 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001450 vereq(d, d1)
1451
Tim Peters6d6c1a32001-08-02 04:15:00 +00001452def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001453 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001454 class C(object):
1455 def foo(*a): return a
1456 goo = staticmethod(foo)
1457 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001458 vereq(C.goo(1), (1,))
1459 vereq(c.goo(1), (1,))
1460 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001461 class D(C):
1462 pass
1463 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001464 vereq(D.goo(1), (1,))
1465 vereq(d.goo(1), (1,))
1466 vereq(d.foo(1), (d, 1))
1467 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001468
Fred Drakef841aa62002-03-28 15:49:54 +00001469def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001470 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001471 import xxsubtype as spam
1472 a = (1, 2, 3)
1473 d = {"abc": 123}
1474 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1475 veris(x, None)
1476 vereq(a, a1)
1477 vereq(d, d1)
1478 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1479 veris(x, None)
1480 vereq(a, a1)
1481 vereq(d, d1)
1482
Tim Peters6d6c1a32001-08-02 04:15:00 +00001483def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001484 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001485 class C:
1486 def foo(*a): return a
1487 goo = classmethod(foo)
1488 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001489 vereq(C.goo(1), (C, 1))
1490 vereq(c.goo(1), (C, 1))
1491 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001492 class D(C):
1493 pass
1494 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001495 vereq(D.goo(1), (D, 1))
1496 vereq(d.goo(1), (D, 1))
1497 vereq(d.foo(1), (d, 1))
1498 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001499 class E: # *not* subclassing from C
1500 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001501 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001502 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001503
1504def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001505 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001506 class C(object):
1507 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001508 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509 self.__get = get
1510 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001511 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512 def __get__(self, obj, type=None):
1513 return self.__get(obj)
1514 def __set__(self, obj, value):
1515 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001516 def __delete__(self, obj):
1517 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001518 def __init__(self):
1519 self.__x = 0
1520 def __get_x(self):
1521 x = self.__x
1522 self.__x = x+1
1523 return x
1524 def __set_x(self, x):
1525 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001526 def __delete_x(self):
1527 del self.__x
1528 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001529 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001530 vereq(a.x, 0)
1531 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001532 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001533 vereq(a.x, 10)
1534 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001535 del a.x
1536 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001537
1538def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001539 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001540 class C(list):
1541 def __new__(cls):
1542 self = list.__new__(cls)
1543 self.foo = 1
1544 return self
1545 def __init__(self):
1546 self.foo = self.foo + 2
1547 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001548 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001549 verify(a.__class__ is C)
1550 class D(C):
1551 pass
1552 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001553 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001554 verify(b.__class__ is D)
1555
Tim Peters6d6c1a32001-08-02 04:15:00 +00001556def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001557 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001558 class A(object):
1559 def f(self): return "A"
1560 class B(A):
1561 pass
1562 class C(A):
1563 def f(self): return "C"
1564 class D(B, C):
1565 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001566 vereq(D.mro(), [D, B, C, A, object])
1567 vereq(D.__mro__, (D, B, C, A, object))
1568 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001569
Guido van Rossumd3077402001-08-12 05:24:18 +00001570 class PerverseMetaType(type):
1571 def mro(cls):
1572 L = type.mro(cls)
1573 L.reverse()
1574 return L
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001575 class X(D,B,C,A, metaclass=PerverseMetaType):
1576 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001577 vereq(X.__mro__, (object, A, C, B, D, X))
1578 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001579
Armin Rigo037d1e02005-12-29 17:07:39 +00001580 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001581 class _metaclass(type):
1582 def mro(self):
1583 return [self, dict, object]
1584 class X(object, metaclass=_metaclass):
1585 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001586 except TypeError:
1587 pass
1588 else:
1589 raise TestFailed, "devious mro() return not caught"
1590
1591 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001592 class _metaclass(type):
1593 def mro(self):
1594 return [1]
1595 class X(object, metaclass=_metaclass):
1596 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001597 except TypeError:
1598 pass
1599 else:
1600 raise TestFailed, "non-class mro() return not caught"
1601
1602 try:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00001603 class _metaclass(type):
1604 def mro(self):
1605 return 1
1606 class X(object, metaclass=_metaclass):
1607 pass
Armin Rigo037d1e02005-12-29 17:07:39 +00001608 except TypeError:
1609 pass
1610 else:
1611 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001612
Armin Rigo037d1e02005-12-29 17:07:39 +00001613
Tim Peters6d6c1a32001-08-02 04:15:00 +00001614def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001615 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001616
1617 class B(object):
1618 "Intermediate class because object doesn't have a __setattr__"
1619
1620 class C(B):
1621
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001622 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623 if name == "foo":
1624 return ("getattr", name)
1625 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001626 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001627 def __setattr__(self, name, value):
1628 if name == "foo":
1629 self.setattr = (name, value)
1630 else:
1631 return B.__setattr__(self, name, value)
1632 def __delattr__(self, name):
1633 if name == "foo":
1634 self.delattr = name
1635 else:
1636 return B.__delattr__(self, name)
1637
1638 def __getitem__(self, key):
1639 return ("getitem", key)
1640 def __setitem__(self, key, value):
1641 self.setitem = (key, value)
1642 def __delitem__(self, key):
1643 self.delitem = key
1644
1645 def __getslice__(self, i, j):
1646 return ("getslice", i, j)
1647 def __setslice__(self, i, j, value):
1648 self.setslice = (i, j, value)
1649 def __delslice__(self, i, j):
1650 self.delslice = (i, j)
1651
1652 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001653 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001654 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001655 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001656 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001657 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001658
Guido van Rossum45704552001-10-08 16:35:45 +00001659 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001660 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001661 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001662 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001663 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001664
Guido van Rossum45704552001-10-08 16:35:45 +00001665 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001666 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001667 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001668 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001669 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001670
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001671def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001672 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001673 class C(object):
1674 def __init__(self, x):
1675 self.x = x
1676 def foo(self):
1677 return self.x
1678 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001679 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001680 class D(C):
1681 boo = C.foo
1682 goo = c1.foo
1683 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001684 vereq(d2.foo(), 2)
1685 vereq(d2.boo(), 2)
1686 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001687 class E(object):
1688 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001689 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001690 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001691
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001692def specials():
1693 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001694 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001695 # Test the default behavior for static classes
1696 class C(object):
1697 def __getitem__(self, i):
1698 if 0 <= i < 10: return i
1699 raise IndexError
1700 c1 = C()
1701 c2 = C()
1702 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001703 verify(id(c1) != id(c2))
1704 hash(c1)
1705 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001706 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001707 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001708 verify(c1 != c2)
1709 verify(not c1 != c1)
1710 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001711 # Note that the module name appears in str/repr, and that varies
1712 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001713 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001714 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001715 verify(-1 not in c1)
1716 for i in range(10):
1717 verify(i in c1)
1718 verify(10 not in c1)
1719 # Test the default behavior for dynamic classes
1720 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001721 def __getitem__(self, i):
1722 if 0 <= i < 10: return i
1723 raise IndexError
1724 d1 = D()
1725 d2 = D()
1726 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001727 verify(id(d1) != id(d2))
1728 hash(d1)
1729 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001730 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001731 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001732 verify(d1 != d2)
1733 verify(not d1 != d1)
1734 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001735 # Note that the module name appears in str/repr, and that varies
1736 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001737 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001738 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001739 verify(-1 not in d1)
1740 for i in range(10):
1741 verify(i in d1)
1742 verify(10 not in d1)
1743 # Test overridden behavior for static classes
1744 class Proxy(object):
1745 def __init__(self, x):
1746 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001747 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001748 return not not self.x
1749 def __hash__(self):
1750 return hash(self.x)
1751 def __eq__(self, other):
1752 return self.x == other
1753 def __ne__(self, other):
1754 return self.x != other
1755 def __cmp__(self, other):
1756 return cmp(self.x, other.x)
1757 def __str__(self):
1758 return "Proxy:%s" % self.x
1759 def __repr__(self):
1760 return "Proxy(%r)" % self.x
1761 def __contains__(self, value):
1762 return value in self.x
1763 p0 = Proxy(0)
1764 p1 = Proxy(1)
1765 p_1 = Proxy(-1)
1766 verify(not p0)
1767 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(hash(p0), hash(0))
1769 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001770 verify(p0 != p1)
1771 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001772 vereq(not p0, p1)
1773 vereq(cmp(p0, p1), -1)
1774 vereq(cmp(p0, p0), 0)
1775 vereq(cmp(p0, p_1), 1)
1776 vereq(str(p0), "Proxy:0")
1777 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001778 p10 = Proxy(range(10))
1779 verify(-1 not in p10)
1780 for i in range(10):
1781 verify(i in p10)
1782 verify(10 not in p10)
1783 # Test overridden behavior for dynamic classes
1784 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001785 def __init__(self, x):
1786 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001787 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001788 return not not self.x
1789 def __hash__(self):
1790 return hash(self.x)
1791 def __eq__(self, other):
1792 return self.x == other
1793 def __ne__(self, other):
1794 return self.x != other
1795 def __cmp__(self, other):
1796 return cmp(self.x, other.x)
1797 def __str__(self):
1798 return "DProxy:%s" % self.x
1799 def __repr__(self):
1800 return "DProxy(%r)" % self.x
1801 def __contains__(self, value):
1802 return value in self.x
1803 p0 = DProxy(0)
1804 p1 = DProxy(1)
1805 p_1 = DProxy(-1)
1806 verify(not p0)
1807 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001808 vereq(hash(p0), hash(0))
1809 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001810 verify(p0 != p1)
1811 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001812 vereq(not p0, p1)
1813 vereq(cmp(p0, p1), -1)
1814 vereq(cmp(p0, p0), 0)
1815 vereq(cmp(p0, p_1), 1)
1816 vereq(str(p0), "DProxy:0")
1817 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001818 p10 = DProxy(range(10))
1819 verify(-1 not in p10)
1820 for i in range(10):
1821 verify(i in p10)
1822 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001823## # Safety test for __cmp__
1824## def unsafecmp(a, b):
1825## try:
1826## a.__class__.__cmp__(a, b)
1827## except TypeError:
1828## pass
1829## else:
1830## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1831## a.__class__, a, b)
1832## unsafecmp(u"123", "123")
1833## unsafecmp("123", u"123")
1834## unsafecmp(1, 1.0)
1835## unsafecmp(1.0, 1)
1836## unsafecmp(1, 1L)
1837## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001838
Neal Norwitz1a997502003-01-13 20:13:12 +00001839 class Letter(str):
1840 def __new__(cls, letter):
1841 if letter == 'EPS':
1842 return str.__new__(cls)
1843 return str.__new__(cls, letter)
1844 def __str__(self):
1845 if not self:
1846 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001847 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001848
1849 # sys.stdout needs to be the original to trigger the recursion bug
1850 import sys
1851 test_stdout = sys.stdout
1852 sys.stdout = get_original_stdout()
1853 try:
1854 # nothing should actually be printed, this should raise an exception
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001855 print(Letter('w'))
Neal Norwitz1a997502003-01-13 20:13:12 +00001856 except RuntimeError:
1857 pass
1858 else:
1859 raise TestFailed, "expected a RuntimeError for print recursion"
1860 sys.stdout = test_stdout
1861
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001862def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001863 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001864 import weakref
1865 class C(object):
1866 pass
1867 c = C()
1868 r = weakref.ref(c)
1869 verify(r() is c)
1870 del c
1871 verify(r() is None)
1872 del r
1873 class NoWeak(object):
1874 __slots__ = ['foo']
1875 no = NoWeak()
1876 try:
1877 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001878 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001879 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001880 else:
1881 verify(0, "weakref.ref(no) should be illegal")
1882 class Weak(object):
1883 __slots__ = ['foo', '__weakref__']
1884 yes = Weak()
1885 r = weakref.ref(yes)
1886 verify(r() is yes)
1887 del yes
1888 verify(r() is None)
1889 del r
1890
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001891def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001892 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001893 class C(object):
1894 def getx(self):
1895 return self.__x
1896 def setx(self, value):
1897 self.__x = value
1898 def delx(self):
1899 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001900 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001901 a = C()
1902 verify(not hasattr(a, "x"))
1903 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001904 vereq(a._C__x, 42)
1905 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001906 del a.x
1907 verify(not hasattr(a, "x"))
1908 verify(not hasattr(a, "_C__x"))
1909 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001911 C.x.__delete__(a)
1912 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001913
Tim Peters66c1a522001-09-24 21:17:50 +00001914 raw = C.__dict__['x']
1915 verify(isinstance(raw, property))
1916
1917 attrs = dir(raw)
1918 verify("__doc__" in attrs)
1919 verify("fget" in attrs)
1920 verify("fset" in attrs)
1921 verify("fdel" in attrs)
1922
Guido van Rossum45704552001-10-08 16:35:45 +00001923 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001924 verify(raw.fget is C.__dict__['getx'])
1925 verify(raw.fset is C.__dict__['setx'])
1926 verify(raw.fdel is C.__dict__['delx'])
1927
1928 for attr in "__doc__", "fget", "fset", "fdel":
1929 try:
1930 setattr(raw, attr, 42)
Collin Winter42dae6a2007-03-28 21:44:53 +00001931 except AttributeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001932 if str(msg).find('readonly') < 0:
1933 raise TestFailed("when setting readonly attr %r on a "
Collin Winter42dae6a2007-03-28 21:44:53 +00001934 "property, got unexpected AttributeError "
Tim Peters66c1a522001-09-24 21:17:50 +00001935 "msg %r" % (attr, str(msg)))
1936 else:
Collin Winter42dae6a2007-03-28 21:44:53 +00001937 raise TestFailed("expected AttributeError from trying to set "
Tim Peters66c1a522001-09-24 21:17:50 +00001938 "readonly %r attr on a property" % attr)
1939
Neal Norwitz673cd822002-10-18 16:33:13 +00001940 class D(object):
1941 __getitem__ = property(lambda s: 1/0)
1942
1943 d = D()
1944 try:
1945 for i in d:
1946 str(i)
1947 except ZeroDivisionError:
1948 pass
1949 else:
1950 raise TestFailed, "expected ZeroDivisionError from bad property"
1951
Georg Brandl533ff6f2006-03-08 18:09:27 +00001952 class E(object):
1953 def getter(self):
1954 "getter method"
1955 return 0
1956 def setter(self, value):
1957 "setter method"
1958 pass
1959 prop = property(getter)
1960 vereq(prop.__doc__, "getter method")
1961 prop2 = property(fset=setter)
1962 vereq(prop2.__doc__, None)
1963
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001964 # this segfaulted in 2.5b2
1965 try:
1966 import _testcapi
1967 except ImportError:
1968 pass
1969 else:
1970 class X(object):
1971 p = property(_testcapi.test_with_docstring)
1972
1973
Guido van Rossumc4a18802001-08-24 16:55:27 +00001974def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001975 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001976
1977 class A(object):
1978 def meth(self, a):
1979 return "A(%r)" % a
1980
Guido van Rossum45704552001-10-08 16:35:45 +00001981 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001982
1983 class B(A):
1984 def __init__(self):
1985 self.__super = super(B, self)
1986 def meth(self, a):
1987 return "B(%r)" % a + self.__super.meth(a)
1988
Guido van Rossum45704552001-10-08 16:35:45 +00001989 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001990
1991 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001992 def meth(self, a):
1993 return "C(%r)" % a + self.__super.meth(a)
1994 C._C__super = super(C)
1995
Guido van Rossum45704552001-10-08 16:35:45 +00001996 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001997
1998 class D(C, B):
1999 def meth(self, a):
2000 return "D(%r)" % a + super(D, self).meth(a)
2001
Guido van Rossum5b443c62001-12-03 15:38:28 +00002002 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
2003
2004 # Test for subclassing super
2005
2006 class mysuper(super):
2007 def __init__(self, *args):
2008 return super(mysuper, self).__init__(*args)
2009
2010 class E(D):
2011 def meth(self, a):
2012 return "E(%r)" % a + mysuper(E, self).meth(a)
2013
2014 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
2015
2016 class F(E):
2017 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00002018 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00002019 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
2020 F._F__super = mysuper(F)
2021
2022 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
2023
2024 # Make sure certain errors are raised
2025
2026 try:
2027 super(D, 42)
2028 except TypeError:
2029 pass
2030 else:
2031 raise TestFailed, "shouldn't allow super(D, 42)"
2032
2033 try:
2034 super(D, C())
2035 except TypeError:
2036 pass
2037 else:
2038 raise TestFailed, "shouldn't allow super(D, C())"
2039
2040 try:
2041 super(D).__get__(12)
2042 except TypeError:
2043 pass
2044 else:
2045 raise TestFailed, "shouldn't allow super(D).__get__(12)"
2046
2047 try:
2048 super(D).__get__(C())
2049 except TypeError:
2050 pass
2051 else:
2052 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00002053
Guido van Rossuma4541a32003-04-16 20:02:22 +00002054 # Make sure data descriptors can be overridden and accessed via super
2055 # (new feature in Python 2.3)
2056
2057 class DDbase(object):
2058 def getx(self): return 42
2059 x = property(getx)
2060
2061 class DDsub(DDbase):
2062 def getx(self): return "hello"
2063 x = property(getx)
2064
2065 dd = DDsub()
2066 vereq(dd.x, "hello")
2067 vereq(super(DDsub, dd).x, 42)
2068
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002069 # Ensure that super() lookup of descriptor from classmethod
2070 # works (SF ID# 743627)
2071
2072 class Base(object):
2073 aProp = property(lambda self: "foo")
2074
2075 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002076 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002077 def test(klass):
2078 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002079
2080 veris(Sub.test(), Base.aProp)
2081
Thomas Wouters89f507f2006-12-13 04:49:30 +00002082 # Verify that super() doesn't allow keyword args
2083 try:
2084 super(Base, kw=1)
2085 except TypeError:
2086 pass
2087 else:
2088 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002089
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002090def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002091 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002092
2093 class hexint(int):
2094 def __repr__(self):
2095 return hex(self)
2096 def __add__(self, other):
2097 return hexint(int.__add__(self, other))
2098 # (Note that overriding __radd__ doesn't work,
2099 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002100 vereq(repr(hexint(7) + 9), "0x10")
2101 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002102 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002103 vereq(a, 12345)
2104 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002105 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002106 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002107 verify((+a).__class__ is int)
2108 verify((a >> 0).__class__ is int)
2109 verify((a << 0).__class__ is int)
2110 verify((hexint(0) << 12).__class__ is int)
2111 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002112
Guido van Rossume2a383d2007-01-15 16:59:06 +00002113 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002114 __slots__ = []
2115 def __str__(self):
2116 s = oct(self)
2117 if s[-1] == 'L':
2118 s = s[:-1]
2119 return s
2120 def __add__(self, other):
2121 return self.__class__(super(octlong, self).__add__(other))
2122 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002123 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002124 # (Note that overriding __radd__ here only seems to work
2125 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002126 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002127 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002128 vereq(a, 12345)
2129 vereq(int(a), 12345)
2130 vereq(hash(a), hash(12345))
2131 verify(int(a).__class__ is int)
2132 verify((+a).__class__ is int)
2133 verify((-a).__class__ is int)
2134 verify((-octlong(0)).__class__ is int)
2135 verify((a >> 0).__class__ is int)
2136 verify((a << 0).__class__ is int)
2137 verify((a - 0).__class__ is int)
2138 verify((a * 1).__class__ is int)
2139 verify((a ** 1).__class__ is int)
2140 verify((a // 1).__class__ is int)
2141 verify((1 * a).__class__ is int)
2142 verify((a | 0).__class__ is int)
2143 verify((a ^ 0).__class__ is int)
2144 verify((a & -1).__class__ is int)
2145 verify((octlong(0) << 12).__class__ is int)
2146 verify((octlong(0) >> 12).__class__ is int)
2147 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002148
2149 # Because octlong overrides __add__, we can't check the absence of +0
2150 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002151 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002152 pass
2153 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002154 verify((a + 0).__class__ is int)
2155 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002156
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002157 # Check that negative clones don't segfault
2158 a = longclone(-1)
2159 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002160 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002161
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002162 class precfloat(float):
2163 __slots__ = ['prec']
2164 def __init__(self, value=0.0, prec=12):
2165 self.prec = int(prec)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002166 def __repr__(self):
2167 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002168 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002169 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002170 vereq(a, 12345.0)
2171 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002172 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002173 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002174 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002175
Tim Peters2400fa42001-09-12 19:12:49 +00002176 class madcomplex(complex):
2177 def __repr__(self):
2178 return "%.17gj%+.17g" % (self.imag, self.real)
2179 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002180 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002181 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002182 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002183 vereq(a, base)
2184 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002185 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002186 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(repr(a), "4j-3")
2188 vereq(a, base)
2189 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002190 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002191 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002192 veris((+a).__class__, complex)
2193 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002194 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002195 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002196 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002197 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002198 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002199 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002200 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002201
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002202 class madtuple(tuple):
2203 _rev = None
2204 def rev(self):
2205 if self._rev is not None:
2206 return self._rev
2207 L = list(self)
2208 L.reverse()
2209 self._rev = self.__class__(L)
2210 return self._rev
2211 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002212 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2213 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2214 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002215 for i in range(512):
2216 t = madtuple(range(i))
2217 u = t.rev()
2218 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002219 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002220 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002222 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002223 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002224 verify(a[:].__class__ is tuple)
2225 verify((a * 1).__class__ is tuple)
2226 verify((a * 0).__class__ is tuple)
2227 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002228 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002229 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002230 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002231 verify((a + a).__class__ is tuple)
2232 verify((a * 0).__class__ is tuple)
2233 verify((a * 1).__class__ is tuple)
2234 verify((a * 2).__class__ is tuple)
2235 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002236
2237 class madstring(str):
2238 _rev = None
2239 def rev(self):
2240 if self._rev is not None:
2241 return self._rev
2242 L = list(self)
2243 L.reverse()
2244 self._rev = self.__class__("".join(L))
2245 return self._rev
2246 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002247 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2248 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2249 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002250 for i in range(256):
2251 s = madstring("".join(map(chr, range(i))))
2252 t = s.rev()
2253 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002254 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002255 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002257 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002258
Tim Peters8fa5dd02001-09-12 02:18:30 +00002259 base = "\x00" * 5
2260 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002261 vereq(s, base)
2262 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002263 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(hash(s), hash(base))
2265 vereq({s: 1}[base], 1)
2266 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002267 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002269 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002271 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002273 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002275 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002277 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002279 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002281 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002283 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002285 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002287 identitytab = ''.join([chr(i) for i in range(256)])
2288 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002289 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002290 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002291 vereq(s.translate(identitytab, "x"), base)
2292 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002293 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002294 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002295 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002296 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002297 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002298 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002299 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002300 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002301 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002302 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002303
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002304 class madunicode(str):
Guido van Rossum91ee7982001-08-30 20:52:40 +00002305 _rev = None
2306 def rev(self):
2307 if self._rev is not None:
2308 return self._rev
2309 L = list(self)
2310 L.reverse()
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002311 self._rev = self.__class__("".join(L))
Guido van Rossum91ee7982001-08-30 20:52:40 +00002312 return self._rev
2313 u = madunicode("ABCDEF")
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002314 vereq(u, "ABCDEF")
2315 vereq(u.rev(), madunicode("FEDCBA"))
2316 vereq(u.rev().rev(), madunicode("ABCDEF"))
2317 base = "12345"
Tim Peters7a29bd52001-09-12 03:03:31 +00002318 u = madunicode(base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002319 vereq(str(u), base)
2320 verify(str(u).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002321 vereq(hash(u), hash(base))
2322 vereq({u: 1}[base], 1)
2323 vereq({base: 1}[u], 1)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002324 verify(u.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002325 vereq(u.strip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002326 verify(u.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002327 vereq(u.lstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002328 verify(u.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002329 vereq(u.rstrip(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002330 verify(u.replace("x", "x").__class__ is str)
2331 vereq(u.replace("x", "x"), base)
2332 verify(u.replace("xy", "xy").__class__ is str)
2333 vereq(u.replace("xy", "xy"), base)
2334 verify(u.center(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002335 vereq(u.center(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002336 verify(u.ljust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002337 vereq(u.ljust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002338 verify(u.rjust(len(u)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002339 vereq(u.rjust(len(u)), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002340 verify(u.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002341 vereq(u.lower(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002342 verify(u.upper().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002343 vereq(u.upper(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002344 verify(u.capitalize().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002345 vereq(u.capitalize(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002346 verify(u.title().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002347 vereq(u.title(), base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002348 verify((u + "").__class__ is str)
2349 vereq(u + "", base)
2350 verify(("" + u).__class__ is str)
2351 vereq("" + u, base)
2352 verify((u * 0).__class__ is str)
2353 vereq(u * 0, "")
2354 verify((u * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002355 vereq(u * 1, base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002356 verify((u * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002357 vereq(u * 2, base + base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002358 verify(u[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002359 vereq(u[:], base)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002360 verify(u[0:0].__class__ is str)
2361 vereq(u[0:0], "")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002362
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002363 class sublist(list):
2364 pass
2365 a = sublist(range(5))
Guido van Rossum805365e2007-05-07 22:24:25 +00002366 vereq(a, list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002367 a.append("hello")
Guido van Rossum805365e2007-05-07 22:24:25 +00002368 vereq(a, list(range(5)) + ["hello"])
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002369 a[5] = 5
Guido van Rossum805365e2007-05-07 22:24:25 +00002370 vereq(a, list(range(6)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002371 a.extend(range(6, 20))
Guido van Rossum805365e2007-05-07 22:24:25 +00002372 vereq(a, list(range(20)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002373 a[-5:] = []
Guido van Rossum805365e2007-05-07 22:24:25 +00002374 vereq(a, list(range(15)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002375 del a[10:15]
2376 vereq(len(a), 10)
Guido van Rossum805365e2007-05-07 22:24:25 +00002377 vereq(a, list(range(10)))
2378 vereq(list(a), list(range(10)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002379 vereq(a[0], 0)
2380 vereq(a[9], 9)
2381 vereq(a[-10], 0)
2382 vereq(a[-1], 9)
Guido van Rossum805365e2007-05-07 22:24:25 +00002383 vereq(a[:5], list(range(5)))
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002384
Tim Peters59c9a642001-09-13 05:38:56 +00002385 class CountedInput(file):
2386 """Counts lines read by self.readline().
2387
2388 self.lineno is the 0-based ordinal of the last line read, up to
2389 a maximum of one greater than the number of lines in the file.
2390
2391 self.ateof is true if and only if the final "" line has been read,
2392 at which point self.lineno stops incrementing, and further calls
2393 to readline() continue to return "".
2394 """
2395
2396 lineno = 0
2397 ateof = 0
2398 def readline(self):
2399 if self.ateof:
2400 return ""
2401 s = file.readline(self)
2402 # Next line works too.
2403 # s = super(CountedInput, self).readline()
2404 self.lineno += 1
2405 if s == "":
2406 self.ateof = 1
2407 return s
2408
Alex Martelli01c77c62006-08-24 02:58:11 +00002409 f = open(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002410 lines = ['a\n', 'b\n', 'c\n']
2411 try:
2412 f.writelines(lines)
2413 f.close()
2414 f = CountedInput(TESTFN)
Guido van Rossum805365e2007-05-07 22:24:25 +00002415 for (i, expected) in zip(list(range(1, 5)) + [4], lines + 2 * [""]):
Tim Peters59c9a642001-09-13 05:38:56 +00002416 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002417 vereq(expected, got)
2418 vereq(f.lineno, i)
2419 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002420 f.close()
2421 finally:
2422 try:
2423 f.close()
2424 except:
2425 pass
2426 try:
2427 import os
2428 os.unlink(TESTFN)
2429 except:
2430 pass
2431
Tim Peters808b94e2001-09-13 19:33:07 +00002432def keywords():
2433 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002434 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002435 vereq(int(x=1), 1)
2436 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002437 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(complex(imag=42, real=666), complex(666, 42))
2439 vereq(str(object=500), '500')
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002440 vereq(str(string='abc', errors='strict'), 'abc')
Guido van Rossum45704552001-10-08 16:35:45 +00002441 vereq(tuple(sequence=range(3)), (0, 1, 2))
Guido van Rossum805365e2007-05-07 22:24:25 +00002442 vereq(list(sequence=(0, 1, 2)), list(range(3)))
Just van Rossuma797d812002-11-23 09:45:04 +00002443 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002444
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002445 for constructor in (int, float, int, complex, str, str,
Just van Rossuma797d812002-11-23 09:45:04 +00002446 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002447 try:
2448 constructor(bogus_keyword_arg=1)
2449 except TypeError:
2450 pass
2451 else:
2452 raise TestFailed("expected TypeError from bogus keyword "
2453 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002454
Tim Peters0ab085c2001-09-14 00:25:33 +00002455def str_subclass_as_dict_key():
2456 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002457 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002458
2459 class cistr(str):
2460 """Sublcass of str that computes __eq__ case-insensitively.
2461
2462 Also computes a hash code of the string in canonical form.
2463 """
2464
2465 def __init__(self, value):
2466 self.canonical = value.lower()
2467 self.hashcode = hash(self.canonical)
2468
2469 def __eq__(self, other):
2470 if not isinstance(other, cistr):
2471 other = cistr(other)
2472 return self.canonical == other.canonical
2473
2474 def __hash__(self):
2475 return self.hashcode
2476
Guido van Rossum45704552001-10-08 16:35:45 +00002477 vereq(cistr('ABC'), 'abc')
2478 vereq('aBc', cistr('ABC'))
2479 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002480
2481 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002482 vereq(d[cistr('one')], 1)
2483 vereq(d[cistr('tWo')], 2)
2484 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002485 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002486 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002487
Guido van Rossumab3b0342001-09-18 20:38:53 +00002488def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002489 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002490 class classic:
2491 pass
2492 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002493 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002494 class C(base):
2495 def __init__(self, value):
2496 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002497 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002498 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002499 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002500 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002501 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002502 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002503 def __ne__(self, other):
2504 if isinstance(other, C):
2505 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002506 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002507 return self.value != other
2508 return NotImplemented
2509 def __lt__(self, other):
2510 if isinstance(other, C):
2511 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002512 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002513 return self.value < other
2514 return NotImplemented
2515 def __le__(self, other):
2516 if isinstance(other, C):
2517 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002518 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002519 return self.value <= other
2520 return NotImplemented
2521 def __gt__(self, other):
2522 if isinstance(other, C):
2523 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002524 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002525 return self.value > other
2526 return NotImplemented
2527 def __ge__(self, other):
2528 if isinstance(other, C):
2529 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002530 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002531 return self.value >= other
2532 return NotImplemented
2533
Guido van Rossumab3b0342001-09-18 20:38:53 +00002534 c1 = C(1)
2535 c2 = C(2)
2536 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002537 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002538 c = {1: c1, 2: c2, 3: c3}
2539 for x in 1, 2, 3:
2540 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002541 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002542 for op in "<", "<=", "==", "!=", ">", ">=":
2543 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2544 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002545 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2546 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002547
Guido van Rossum0639f592001-09-18 21:06:04 +00002548def rich_comparisons():
2549 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002550 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002551 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002552 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002553 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002554 vereq(z, 1+0j)
2555 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002556 class ZZ(complex):
2557 def __eq__(self, other):
2558 try:
2559 return abs(self - other) <= 1e-6
2560 except:
2561 return NotImplemented
2562 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002563 vereq(zz, 1+0j)
2564 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002565
Guido van Rossum0639f592001-09-18 21:06:04 +00002566 class classic:
2567 pass
2568 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002569 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002570 class C(base):
2571 def __init__(self, value):
2572 self.value = int(value)
2573 def __cmp__(self, other):
2574 raise TestFailed, "shouldn't call __cmp__"
2575 def __eq__(self, other):
2576 if isinstance(other, C):
2577 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002578 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002579 return self.value == other
2580 return NotImplemented
2581 def __ne__(self, other):
2582 if isinstance(other, C):
2583 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002584 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002585 return self.value != other
2586 return NotImplemented
2587 def __lt__(self, other):
2588 if isinstance(other, C):
2589 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002590 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002591 return self.value < other
2592 return NotImplemented
2593 def __le__(self, other):
2594 if isinstance(other, C):
2595 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002596 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002597 return self.value <= other
2598 return NotImplemented
2599 def __gt__(self, other):
2600 if isinstance(other, C):
2601 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002602 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002603 return self.value > other
2604 return NotImplemented
2605 def __ge__(self, other):
2606 if isinstance(other, C):
2607 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002608 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002609 return self.value >= other
2610 return NotImplemented
2611 c1 = C(1)
2612 c2 = C(2)
2613 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002614 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002615 c = {1: c1, 2: c2, 3: c3}
2616 for x in 1, 2, 3:
2617 for y in 1, 2, 3:
2618 for op in "<", "<=", "==", "!=", ">", ">=":
2619 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2620 "x=%d, y=%d" % (x, y))
2621 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2622 "x=%d, y=%d" % (x, y))
2623 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2624 "x=%d, y=%d" % (x, y))
2625
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002626def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002627 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002628 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002629 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002630 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002631 check(file.name, "file name") # member descriptor
2632
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002633def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002634 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002635 class C(object): pass
2636 class D(object): pass
2637 class E(object): pass
2638 class F(D, E): pass
2639 for cls in C, D, E, F:
2640 for cls2 in C, D, E, F:
2641 x = cls()
2642 x.__class__ = cls2
2643 verify(x.__class__ is cls2)
2644 x.__class__ = cls
2645 verify(x.__class__ is cls)
2646 def cant(x, C):
2647 try:
2648 x.__class__ = C
2649 except TypeError:
2650 pass
2651 else:
2652 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002653 try:
2654 delattr(x, "__class__")
2655 except TypeError:
2656 pass
2657 else:
2658 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002659 cant(C(), list)
2660 cant(list(), C)
2661 cant(C(), 1)
2662 cant(C(), object)
2663 cant(object(), list)
2664 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002665 class Int(int): __slots__ = []
2666 cant(2, Int)
2667 cant(Int(), int)
2668 cant(True, int)
2669 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002670 o = object()
2671 cant(o, type(1))
2672 cant(o, type(None))
2673 del o
Guido van Rossumd8faa362007-04-27 19:54:29 +00002674 class G(object):
2675 __slots__ = ["a", "b"]
2676 class H(object):
2677 __slots__ = ["b", "a"]
2678 try:
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002679 str
Guido van Rossumd8faa362007-04-27 19:54:29 +00002680 except NameError:
2681 class I(object):
2682 __slots__ = ["a", "b"]
2683 else:
2684 class I(object):
Guido van Rossumef87d6e2007-05-02 19:09:54 +00002685 __slots__ = [str("a"), str("b")]
Guido van Rossumd8faa362007-04-27 19:54:29 +00002686 class J(object):
2687 __slots__ = ["c", "b"]
2688 class K(object):
2689 __slots__ = ["a", "b", "d"]
2690 class L(H):
2691 __slots__ = ["e"]
2692 class M(I):
2693 __slots__ = ["e"]
2694 class N(J):
2695 __slots__ = ["__weakref__"]
2696 class P(J):
2697 __slots__ = ["__dict__"]
2698 class Q(J):
2699 pass
2700 class R(J):
2701 __slots__ = ["__dict__", "__weakref__"]
2702
2703 for cls, cls2 in ((G, H), (G, I), (I, H), (Q, R), (R, Q)):
2704 x = cls()
2705 x.a = 1
2706 x.__class__ = cls2
2707 verify(x.__class__ is cls2,
2708 "assigning %r as __class__ for %r silently failed" % (cls2, x))
2709 vereq(x.a, 1)
2710 x.__class__ = cls
2711 verify(x.__class__ is cls,
2712 "assigning %r as __class__ for %r silently failed" % (cls, x))
2713 vereq(x.a, 1)
2714 for cls in G, J, K, L, M, N, P, R, list, Int:
2715 for cls2 in G, J, K, L, M, N, P, R, list, Int:
2716 if cls is cls2:
2717 continue
2718 cant(cls(), cls2)
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002719
Guido van Rossum6661be32001-10-26 04:26:12 +00002720def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002721 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002722 class C(object): pass
2723 a = C()
2724 a.__dict__ = {'b': 1}
2725 vereq(a.b, 1)
2726 def cant(x, dict):
2727 try:
2728 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002729 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002730 pass
2731 else:
2732 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2733 cant(a, None)
2734 cant(a, [])
2735 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002736 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002737 # Classes don't allow __dict__ assignment
2738 cant(C, {})
2739
Guido van Rossum3926a632001-09-25 16:25:58 +00002740def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002741 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002742 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002743 import pickle
2744 try:
2745 import cPickle
2746 except ImportError:
2747 cPickle = None
Guido van Rossum3926a632001-09-25 16:25:58 +00002748
2749 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002750 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002751
2752 global C
2753 class C(object):
2754 def __init__(self, a, b):
2755 super(C, self).__init__()
2756 self.a = a
2757 self.b = b
2758 def __repr__(self):
2759 return "C(%r, %r)" % (self.a, self.b)
2760
2761 global C1
2762 class C1(list):
2763 def __new__(cls, a, b):
2764 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002765 def __getnewargs__(self):
2766 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002767 def __init__(self, a, b):
2768 self.a = a
2769 self.b = b
2770 def __repr__(self):
2771 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2772
2773 global C2
2774 class C2(int):
2775 def __new__(cls, a, b, val=0):
2776 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002777 def __getnewargs__(self):
2778 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002779 def __init__(self, a, b, val=0):
2780 self.a = a
2781 self.b = b
2782 def __repr__(self):
2783 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2784
Guido van Rossum90c45142001-11-24 21:07:01 +00002785 global C3
2786 class C3(object):
2787 def __init__(self, foo):
2788 self.foo = foo
2789 def __getstate__(self):
2790 return self.foo
2791 def __setstate__(self, foo):
2792 self.foo = foo
2793
2794 global C4classic, C4
2795 class C4classic: # classic
2796 pass
2797 class C4(C4classic, object): # mixed inheritance
2798 pass
2799
Guido van Rossum3926a632001-09-25 16:25:58 +00002800 for p in pickle, cPickle:
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002801 if p is None:
2802 continue # cPickle not found -- skip it
Guido van Rossum3926a632001-09-25 16:25:58 +00002803 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002804 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002805 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002806
2807 for cls in C, C1, C2:
2808 s = p.dumps(cls, bin)
2809 cls2 = p.loads(s)
2810 verify(cls2 is cls)
2811
2812 a = C1(1, 2); a.append(42); a.append(24)
2813 b = C2("hello", "world", 42)
2814 s = p.dumps((a, b), bin)
2815 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002816 vereq(x.__class__, a.__class__)
2817 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2818 vereq(y.__class__, b.__class__)
2819 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002820 vereq(repr(x), repr(a))
2821 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002822 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002823 print("a = x =", a)
2824 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002825 # Test for __getstate__ and __setstate__ on new style class
2826 u = C3(42)
2827 s = p.dumps(u, bin)
2828 v = p.loads(s)
2829 veris(u.__class__, v.__class__)
2830 vereq(u.foo, v.foo)
2831 # Test for picklability of hybrid class
2832 u = C4()
2833 u.foo = 42
2834 s = p.dumps(u, bin)
2835 v = p.loads(s)
2836 veris(u.__class__, v.__class__)
2837 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002838
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002839 # Testing copy.deepcopy()
2840 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002841 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002842 import copy
2843 for cls in C, C1, C2:
2844 cls2 = copy.deepcopy(cls)
2845 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002846
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002847 a = C1(1, 2); a.append(42); a.append(24)
2848 b = C2("hello", "world", 42)
2849 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002850 vereq(x.__class__, a.__class__)
2851 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2852 vereq(y.__class__, b.__class__)
2853 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002854 vereq(repr(x), repr(a))
2855 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002856 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002857 print("a = x =", a)
2858 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002859
Guido van Rossum8c842552002-03-14 23:05:54 +00002860def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002861 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002862 import pickle, pickle as cPickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002863 # Pickling of classes with __slots__ but without __getstate__ should fail
2864 global B, C, D, E
2865 class B(object):
2866 pass
2867 for base in [object, B]:
2868 class C(base):
2869 __slots__ = ['a']
2870 class D(C):
2871 pass
2872 try:
2873 pickle.dumps(C())
2874 except TypeError:
2875 pass
2876 else:
2877 raise TestFailed, "should fail: pickle C instance - %s" % base
2878 try:
2879 cPickle.dumps(C())
2880 except TypeError:
2881 pass
2882 else:
2883 raise TestFailed, "should fail: cPickle C instance - %s" % base
2884 try:
2885 pickle.dumps(C())
2886 except TypeError:
2887 pass
2888 else:
2889 raise TestFailed, "should fail: pickle D instance - %s" % base
2890 try:
2891 cPickle.dumps(D())
2892 except TypeError:
2893 pass
2894 else:
2895 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002896 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002897 class C(base):
2898 __slots__ = ['a']
2899 def __getstate__(self):
2900 try:
2901 d = self.__dict__.copy()
2902 except AttributeError:
2903 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002904 for cls in self.__class__.__mro__:
2905 for sn in cls.__dict__.get('__slots__', ()):
2906 try:
2907 d[sn] = getattr(self, sn)
2908 except AttributeError:
2909 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002910 return d
2911 def __setstate__(self, d):
2912 for k, v in d.items():
2913 setattr(self, k, v)
2914 class D(C):
2915 pass
2916 # Now it should work
2917 x = C()
2918 y = pickle.loads(pickle.dumps(x))
2919 vereq(hasattr(y, 'a'), 0)
2920 y = cPickle.loads(cPickle.dumps(x))
2921 vereq(hasattr(y, 'a'), 0)
2922 x.a = 42
2923 y = pickle.loads(pickle.dumps(x))
2924 vereq(y.a, 42)
2925 y = cPickle.loads(cPickle.dumps(x))
2926 vereq(y.a, 42)
2927 x = D()
2928 x.a = 42
2929 x.b = 100
2930 y = pickle.loads(pickle.dumps(x))
2931 vereq(y.a + y.b, 142)
2932 y = cPickle.loads(cPickle.dumps(x))
2933 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002934 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002935 class E(C):
2936 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002937 x = E()
2938 x.a = 42
2939 x.b = "foo"
2940 y = pickle.loads(pickle.dumps(x))
2941 vereq(y.a, x.a)
2942 vereq(y.b, x.b)
2943 y = cPickle.loads(cPickle.dumps(x))
2944 vereq(y.a, x.a)
2945 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002946
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002947def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002948 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002949 import copy
2950 class C(object):
2951 pass
2952
2953 a = C()
2954 a.foo = 12
2955 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002956 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002957
2958 a.bar = [1,2,3]
2959 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002960 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002961 verify(c.bar is a.bar)
2962
2963 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002964 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002965 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002966 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002967
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002968def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002969 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002970 class I(int):
2971 def __repr__(self):
2972 return "I(%r)" % int(self)
2973 def __add__(self, other):
2974 return I(int(self) + int(other))
2975 __radd__ = __add__
2976 def __pow__(self, other, mod=None):
2977 if mod is None:
2978 return I(pow(int(self), int(other)))
2979 else:
2980 return I(pow(int(self), int(other), int(mod)))
2981 def __rpow__(self, other, mod=None):
2982 if mod is None:
2983 return I(pow(int(other), int(self), mod))
2984 else:
2985 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002986
Walter Dörwald70a6b492004-02-12 17:35:32 +00002987 vereq(repr(I(1) + I(2)), "I(3)")
2988 vereq(repr(I(1) + 2), "I(3)")
2989 vereq(repr(1 + I(2)), "I(3)")
2990 vereq(repr(I(2) ** I(3)), "I(8)")
2991 vereq(repr(2 ** I(3)), "I(8)")
2992 vereq(repr(I(2) ** 3), "I(8)")
2993 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002994 class S(str):
2995 def __eq__(self, other):
2996 return self.lower() == other.lower()
2997
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002998def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002999 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003000 class A(object):
3001 pass
3002 class B(A):
3003 pass
3004 class C(A):
3005 pass
3006 class D(B, C):
3007 pass
3008 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003009 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003010 A.__hash__ = lambda self: 42
3011 vereq(hash(d), 42)
3012 C.__hash__ = lambda self: 314
3013 vereq(hash(d), 314)
3014 B.__hash__ = lambda self: 144
3015 vereq(hash(d), 144)
3016 D.__hash__ = lambda self: 100
3017 vereq(hash(d), 100)
3018 del D.__hash__
3019 vereq(hash(d), 144)
3020 del B.__hash__
3021 vereq(hash(d), 314)
3022 del C.__hash__
3023 vereq(hash(d), 42)
3024 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003025 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003026 d.foo = 42
3027 d.bar = 42
3028 vereq(d.foo, 42)
3029 vereq(d.bar, 42)
3030 def __getattribute__(self, name):
3031 if name == "foo":
3032 return 24
3033 return object.__getattribute__(self, name)
3034 A.__getattribute__ = __getattribute__
3035 vereq(d.foo, 24)
3036 vereq(d.bar, 42)
3037 def __getattr__(self, name):
3038 if name in ("spam", "foo", "bar"):
3039 return "hello"
3040 raise AttributeError, name
3041 B.__getattr__ = __getattr__
3042 vereq(d.spam, "hello")
3043 vereq(d.foo, 24)
3044 vereq(d.bar, 42)
3045 del A.__getattribute__
3046 vereq(d.foo, 42)
3047 del d.foo
3048 vereq(d.foo, "hello")
3049 vereq(d.bar, 42)
3050 del B.__getattr__
3051 try:
3052 d.foo
3053 except AttributeError:
3054 pass
3055 else:
3056 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00003057
Guido van Rossume7f3e242002-06-14 02:35:45 +00003058 # Test a nasty bug in recurse_down_subclasses()
3059 import gc
3060 class A(object):
3061 pass
3062 class B(A):
3063 pass
3064 del B
3065 gc.collect()
3066 A.__setitem__ = lambda *a: None # crash
3067
Tim Petersfc57ccb2001-10-12 02:38:24 +00003068def buffer_inherit():
3069 import binascii
3070 # SF bug [#470040] ParseTuple t# vs subclasses.
3071 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003072 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003073
3074 class MyStr(str):
3075 pass
3076 base = 'abc'
3077 m = MyStr(base)
3078 # b2a_hex uses the buffer interface to get its argument's value, via
3079 # PyArg_ParseTuple 't#' code.
3080 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3081
3082 # It's not clear that unicode will continue to support the character
3083 # buffer interface, and this test will fail if that's taken away.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003084 class MyUni(str):
Tim Petersfc57ccb2001-10-12 02:38:24 +00003085 pass
Guido van Rossumef87d6e2007-05-02 19:09:54 +00003086 base = 'abc'
Tim Petersfc57ccb2001-10-12 02:38:24 +00003087 m = MyUni(base)
3088 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3089
3090 class MyInt(int):
3091 pass
3092 m = MyInt(42)
3093 try:
3094 binascii.b2a_hex(m)
3095 raise TestFailed('subclass of int should not have a buffer interface')
3096 except TypeError:
3097 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003098
Tim Petersc9933152001-10-16 20:18:24 +00003099def str_of_str_subclass():
3100 import binascii
3101 import cStringIO
3102
3103 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003104 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003105
3106 class octetstring(str):
3107 def __str__(self):
3108 return binascii.b2a_hex(self)
3109 def __repr__(self):
3110 return self + " repr"
3111
3112 o = octetstring('A')
3113 vereq(type(o), octetstring)
3114 vereq(type(str(o)), str)
3115 vereq(type(repr(o)), str)
3116 vereq(ord(o), 0x41)
3117 vereq(str(o), '41')
3118 vereq(repr(o), 'A repr')
3119 vereq(o.__str__(), '41')
3120 vereq(o.__repr__(), 'A repr')
3121
3122 capture = cStringIO.StringIO()
3123 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003124 print(o, file=capture)
3125 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003126 vereq(capture.getvalue(), '41\n41\n')
3127 capture.close()
3128
Guido van Rossumc8e56452001-10-22 00:43:43 +00003129def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003130 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003131 def f(a): return a
3132 vereq(f.__call__(a=42), 42)
3133 a = []
3134 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003135 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003136
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003137def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003138 if verbose: print(("Testing recursive __call__() by setting to instance of "
3139 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003140 class A(object):
3141 pass
3142
3143 A.__call__ = A()
3144 try:
3145 A()()
3146 except RuntimeError:
3147 pass
3148 else:
3149 raise TestFailed("Recursion limit should have been reached for "
3150 "__call__()")
3151
Guido van Rossumed87ad82001-10-30 02:33:02 +00003152def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003153 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003154 log = []
3155 class C(object):
3156 def __del__(self):
3157 log.append(1)
3158 c = C()
3159 vereq(log, [])
3160 del c
3161 vereq(log, [1])
3162
Guido van Rossum29d26062001-12-11 04:37:34 +00003163 class D(object): pass
3164 d = D()
3165 try: del d[0]
3166 except TypeError: pass
3167 else: raise TestFailed, "invalid del() didn't raise TypeError"
3168
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003169def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003170 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003171
3172 class mydict(dict):
3173 pass
3174 d = mydict()
3175 try:
3176 hash(d)
3177 except TypeError:
3178 pass
3179 else:
3180 raise TestFailed, "hash() of dict subclass should fail"
3181
3182 class mylist(list):
3183 pass
3184 d = mylist()
3185 try:
3186 hash(d)
3187 except TypeError:
3188 pass
3189 else:
3190 raise TestFailed, "hash() of list subclass should fail"
3191
Guido van Rossum29d26062001-12-11 04:37:34 +00003192def strops():
3193 try: 'a' + 5
3194 except TypeError: pass
3195 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3196
3197 try: ''.split('')
3198 except ValueError: pass
3199 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3200
3201 try: ''.join([0])
3202 except TypeError: pass
3203 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3204
3205 try: ''.rindex('5')
3206 except ValueError: pass
3207 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3208
Guido van Rossum29d26062001-12-11 04:37:34 +00003209 try: '%(n)s' % None
3210 except TypeError: pass
3211 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3212
3213 try: '%(n' % {}
3214 except ValueError: pass
3215 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3216
3217 try: '%*s' % ('abc')
3218 except TypeError: pass
3219 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3220
3221 try: '%*.*s' % ('abc', 5)
3222 except TypeError: pass
3223 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3224
3225 try: '%s' % (1, 2)
3226 except TypeError: pass
3227 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3228
3229 try: '%' % None
3230 except ValueError: pass
3231 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3232
3233 vereq('534253'.isdigit(), 1)
3234 vereq('534253x'.isdigit(), 0)
3235 vereq('%c' % 5, '\x05')
3236 vereq('%c' % '5', '5')
3237
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003238def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003239 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003240 class Node:
3241 pass
3242 a = Node()
3243 b = Node()
3244 a.b = b
3245 b.a = a
3246 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003247
Guido van Rossumd7035672002-03-12 20:43:31 +00003248def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003249 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003250 from types import ModuleType as M
3251 m = M.__new__(M)
3252 str(m)
3253 vereq(hasattr(m, "__name__"), 0)
3254 vereq(hasattr(m, "__file__"), 0)
3255 vereq(hasattr(m, "foo"), 0)
3256 vereq(m.__dict__, None)
3257 m.foo = 1
3258 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003259
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003260def dictproxyiterkeys():
3261 class C(object):
3262 def meth(self):
3263 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003264 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003265 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003266 keys.sort()
3267 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3268
3269def dictproxyitervalues():
3270 class C(object):
3271 def meth(self):
3272 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003273 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003274 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003275 vereq(len(values), 5)
3276
3277def dictproxyiteritems():
3278 class C(object):
3279 def meth(self):
3280 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003281 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003282 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003283 keys.sort()
3284 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3285
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003286def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003287 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003288 class C(object):
3289 def __new__(cls, arg):
3290 if isinstance(arg, str): return [1, 2, 3]
3291 elif isinstance(arg, int): return object.__new__(D)
3292 else: return object.__new__(cls)
3293 class D(C):
3294 def __init__(self, arg):
3295 self.foo = arg
3296 vereq(C("1"), [1, 2, 3])
3297 vereq(D("1"), [1, 2, 3])
3298 d = D(None)
3299 veris(d.foo, None)
3300 d = C(1)
3301 vereq(isinstance(d, D), True)
3302 vereq(d.foo, 1)
3303 d = D(1)
3304 vereq(isinstance(d, D), True)
3305 vereq(d.foo, 1)
3306
Guido van Rossume8fc6402002-04-16 16:44:51 +00003307def imulbug():
3308 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003309 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003310 class C(object):
3311 def __imul__(self, other):
3312 return (self, other)
3313 x = C()
3314 y = x
3315 y *= 1.0
3316 vereq(y, (x, 1.0))
3317 y = x
3318 y *= 2
3319 vereq(y, (x, 2))
3320 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003321 y *= 3
3322 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003323 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003324 y *= 1<<100
3325 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003326 y = x
3327 y *= None
3328 vereq(y, (x, None))
3329 y = x
3330 y *= "foo"
3331 vereq(y, (x, "foo"))
3332
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003333def docdescriptor():
3334 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003335 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003336 class DocDescr(object):
3337 def __get__(self, object, otype):
3338 if object:
3339 object = object.__class__.__name__ + ' instance'
3340 if otype:
3341 otype = otype.__name__
3342 return 'object=%s; type=%s' % (object, otype)
3343 class OldClass:
3344 __doc__ = DocDescr()
3345 class NewClass(object):
3346 __doc__ = DocDescr()
3347 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3348 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3349 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3350 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3351
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003352def copy_setstate():
3353 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003354 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003355 import copy
3356 class C(object):
3357 def __init__(self, foo=None):
3358 self.foo = foo
3359 self.__foo = foo
3360 def setfoo(self, foo=None):
3361 self.foo = foo
3362 def getfoo(self):
3363 return self.__foo
3364 def __getstate__(self):
3365 return [self.foo]
3366 def __setstate__(self, lst):
3367 assert len(lst) == 1
3368 self.__foo = self.foo = lst[0]
3369 a = C(42)
3370 a.setfoo(24)
3371 vereq(a.foo, 24)
3372 vereq(a.getfoo(), 42)
3373 b = copy.copy(a)
3374 vereq(b.foo, 24)
3375 vereq(b.getfoo(), 24)
3376 b = copy.deepcopy(a)
3377 vereq(b.foo, 24)
3378 vereq(b.getfoo(), 24)
3379
Guido van Rossum09638c12002-06-13 19:17:46 +00003380def slices():
3381 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003382 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003383 # Strings
3384 vereq("hello"[:4], "hell")
3385 vereq("hello"[slice(4)], "hell")
3386 vereq(str.__getitem__("hello", slice(4)), "hell")
3387 class S(str):
3388 def __getitem__(self, x):
3389 return str.__getitem__(self, x)
3390 vereq(S("hello")[:4], "hell")
3391 vereq(S("hello")[slice(4)], "hell")
3392 vereq(S("hello").__getitem__(slice(4)), "hell")
3393 # Tuples
3394 vereq((1,2,3)[:2], (1,2))
3395 vereq((1,2,3)[slice(2)], (1,2))
3396 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3397 class T(tuple):
3398 def __getitem__(self, x):
3399 return tuple.__getitem__(self, x)
3400 vereq(T((1,2,3))[:2], (1,2))
3401 vereq(T((1,2,3))[slice(2)], (1,2))
3402 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3403 # Lists
3404 vereq([1,2,3][:2], [1,2])
3405 vereq([1,2,3][slice(2)], [1,2])
3406 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3407 class L(list):
3408 def __getitem__(self, x):
3409 return list.__getitem__(self, x)
3410 vereq(L([1,2,3])[:2], [1,2])
3411 vereq(L([1,2,3])[slice(2)], [1,2])
3412 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3413 # Now do lists and __setitem__
3414 a = L([1,2,3])
3415 a[slice(1, 3)] = [3,2]
3416 vereq(a, [1,3,2])
3417 a[slice(0, 2, 1)] = [3,1]
3418 vereq(a, [3,1,2])
3419 a.__setitem__(slice(1, 3), [2,1])
3420 vereq(a, [3,2,1])
3421 a.__setitem__(slice(0, 2, 1), [2,3])
3422 vereq(a, [2,3,1])
3423
Tim Peters2484aae2002-07-11 06:56:07 +00003424def subtype_resurrection():
3425 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003426 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003427
3428 class C(object):
3429 container = []
3430
3431 def __del__(self):
3432 # resurrect the instance
3433 C.container.append(self)
3434
3435 c = C()
3436 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003437 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003438 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003439 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003440
3441 # If that didn't blow up, it's also interesting to see whether clearing
3442 # the last container slot works: that will attempt to delete c again,
3443 # which will cause c to get appended back to the container again "during"
3444 # the del.
3445 del C.container[-1]
3446 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003447 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003448
Tim Peters14cb1e12002-07-11 18:26:21 +00003449 # Make c mortal again, so that the test framework with -l doesn't report
3450 # it as a leak.
3451 del C.__del__
3452
Guido van Rossum2d702462002-08-06 21:28:28 +00003453def slottrash():
3454 # Deallocating deeply nested slotted trash caused stack overflows
3455 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003456 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003457 class trash(object):
3458 __slots__ = ['x']
3459 def __init__(self, x):
3460 self.x = x
3461 o = None
Guido van Rossum805365e2007-05-07 22:24:25 +00003462 for i in range(50000):
Guido van Rossum2d702462002-08-06 21:28:28 +00003463 o = trash(o)
3464 del o
3465
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003466def slotmultipleinheritance():
3467 # SF bug 575229, multiple inheritance w/ slots dumps core
3468 class A(object):
3469 __slots__=()
3470 class B(object):
3471 pass
3472 class C(A,B) :
3473 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003474 vereq(C.__basicsize__, B.__basicsize__)
3475 verify(hasattr(C, '__dict__'))
3476 verify(hasattr(C, '__weakref__'))
3477 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003478
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003479def testrmul():
3480 # SF patch 592646
3481 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003482 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003483 class C(object):
3484 def __mul__(self, other):
3485 return "mul"
3486 def __rmul__(self, other):
3487 return "rmul"
3488 a = C()
3489 vereq(a*2, "mul")
3490 vereq(a*2.2, "mul")
3491 vereq(2*a, "rmul")
3492 vereq(2.2*a, "rmul")
3493
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003494def testipow():
3495 # [SF bug 620179]
3496 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003497 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003498 class C(object):
3499 def __ipow__(self, other):
3500 pass
3501 a = C()
3502 a **= 2
3503
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003504def do_this_first():
3505 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003506 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003507 # This dumps core when SF bug 551412 isn't fixed --
3508 # but only when test_descr.py is run separately.
3509 # (That can't be helped -- as soon as PyType_Ready()
3510 # is called for PyLong_Type, the bug is gone.)
3511 class UserLong(object):
3512 def __pow__(self, *args):
3513 pass
3514 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003515 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003516 except:
3517 pass
3518
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003519 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003520 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003521 # Another segfault only when run early
3522 # (before PyType_Ready(tuple) is called)
3523 type.mro(tuple)
3524
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003525def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003526 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003527 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003528 # stuff that should work:
3529 class C(object):
3530 pass
3531 class C2(object):
3532 def __getattribute__(self, attr):
3533 if attr == 'a':
3534 return 2
3535 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003536 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003537 def meth(self):
3538 return 1
3539 class D(C):
3540 pass
3541 class E(D):
3542 pass
3543 d = D()
3544 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003545 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003546 D.__bases__ = (C2,)
3547 vereq(d.meth(), 1)
3548 vereq(e.meth(), 1)
3549 vereq(d.a, 2)
3550 vereq(e.a, 2)
3551 vereq(C2.__subclasses__(), [D])
3552
3553 # stuff that shouldn't:
3554 class L(list):
3555 pass
3556
3557 try:
3558 L.__bases__ = (dict,)
3559 except TypeError:
3560 pass
3561 else:
3562 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3563
3564 try:
3565 list.__bases__ = (dict,)
3566 except TypeError:
3567 pass
3568 else:
3569 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3570
3571 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003572 D.__bases__ = (C2, list)
3573 except TypeError:
3574 pass
3575 else:
3576 assert 0, "best_base calculation found wanting"
3577
3578 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003579 del D.__bases__
3580 except TypeError:
3581 pass
3582 else:
3583 raise TestFailed, "shouldn't be able to delete .__bases__"
3584
3585 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003586 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003587 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003588 if str(msg) == "a new-style class can't have only classic bases":
3589 raise TestFailed, "wrong error message for .__bases__ = ()"
3590 else:
3591 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3592
3593 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003594 D.__bases__ = (D,)
3595 except TypeError:
3596 pass
3597 else:
3598 # actually, we'll have crashed by here...
3599 raise TestFailed, "shouldn't be able to create inheritance cycles"
3600
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003601 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003602 D.__bases__ = (C, C)
3603 except TypeError:
3604 pass
3605 else:
3606 raise TestFailed, "didn't detect repeated base classes"
3607
3608 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003609 D.__bases__ = (E,)
3610 except TypeError:
3611 pass
3612 else:
3613 raise TestFailed, "shouldn't be able to create inheritance cycles"
3614
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003615def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003616 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003617 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003618 class WorkOnce(type):
3619 def __new__(self, name, bases, ns):
3620 self.flag = 0
3621 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3622 def mro(self):
3623 if self.flag > 0:
3624 raise RuntimeError, "bozo"
3625 else:
3626 self.flag += 1
3627 return type.mro(self)
3628
3629 class WorkAlways(type):
3630 def mro(self):
3631 # this is here to make sure that .mro()s aren't called
3632 # with an exception set (which was possible at one point).
3633 # An error message will be printed in a debug build.
3634 # What's a good way to test for this?
3635 return type.mro(self)
3636
3637 class C(object):
3638 pass
3639
3640 class C2(object):
3641 pass
3642
3643 class D(C):
3644 pass
3645
3646 class E(D):
3647 pass
3648
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003649 class F(D, metaclass=WorkOnce):
3650 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003651
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003652 class G(D, metaclass=WorkAlways):
3653 pass
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003654
3655 # Immediate subclasses have their mro's adjusted in alphabetical
3656 # order, so E's will get adjusted before adjusting F's fails. We
3657 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003658
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003659 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003660 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003661
3662 try:
3663 D.__bases__ = (C2,)
3664 except RuntimeError:
3665 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003666 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003667 else:
3668 raise TestFailed, "exception not propagated"
3669
3670def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003671 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003672 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003673 class A(object):
3674 pass
3675
3676 class B(object):
3677 pass
3678
3679 class C(A, B):
3680 pass
3681
3682 class D(A, B):
3683 pass
3684
3685 class E(C, D):
3686 pass
3687
3688 try:
3689 C.__bases__ = (B, A)
3690 except TypeError:
3691 pass
3692 else:
3693 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003694
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003695def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003696 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003697 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003698 class C(object):
3699 pass
3700
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003701 # C.__module__ could be 'test_descr' or '__main__'
3702 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003703
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +00003704 C.__name__ = 'D'
3705 vereq((C.__module__, C.__name__), (mod, 'D'))
3706
3707 C.__name__ = 'D.E'
3708 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003709
Guido van Rossum613f24f2003-01-06 23:00:59 +00003710def subclass_right_op():
3711 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003712 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003713
3714 # This code tests various cases where right-dispatch of a subclass
3715 # should be preferred over left-dispatch of a base class.
3716
3717 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3718
3719 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003720 def __floordiv__(self, other):
3721 return "B.__floordiv__"
3722 def __rfloordiv__(self, other):
3723 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003724
Guido van Rossumf389c772003-02-27 20:04:19 +00003725 vereq(B(1) // 1, "B.__floordiv__")
3726 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003727
3728 # Case 2: subclass of object; this is just the baseline for case 3
3729
3730 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003731 def __floordiv__(self, other):
3732 return "C.__floordiv__"
3733 def __rfloordiv__(self, other):
3734 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003735
Guido van Rossumf389c772003-02-27 20:04:19 +00003736 vereq(C() // 1, "C.__floordiv__")
3737 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003738
3739 # Case 3: subclass of new-style class; here it gets interesting
3740
3741 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003742 def __floordiv__(self, other):
3743 return "D.__floordiv__"
3744 def __rfloordiv__(self, other):
3745 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003746
Guido van Rossumf389c772003-02-27 20:04:19 +00003747 vereq(D() // C(), "D.__floordiv__")
3748 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003749
3750 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3751
3752 class E(C):
3753 pass
3754
Guido van Rossumf389c772003-02-27 20:04:19 +00003755 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003756
Guido van Rossumf389c772003-02-27 20:04:19 +00003757 vereq(E() // 1, "C.__floordiv__")
3758 vereq(1 // E(), "C.__rfloordiv__")
3759 vereq(E() // C(), "C.__floordiv__")
3760 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003761
Guido van Rossum373c7412003-01-07 13:41:37 +00003762def dict_type_with_metaclass():
3763 if verbose:
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003764 print("Testing type of __dict__ when metaclass set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003765
3766 class B(object):
3767 pass
3768 class M(type):
3769 pass
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003770 class C(metaclass=M):
Guido van Rossum373c7412003-01-07 13:41:37 +00003771 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
Guido van Rossum52cc1d82007-03-18 15:41:51 +00003772 pass
Guido van Rossum373c7412003-01-07 13:41:37 +00003773 veris(type(C.__dict__), type(B.__dict__))
3774
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003775def meth_class_get():
3776 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003777 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003778 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003779 # Baseline
3780 arg = [1, 2, 3]
3781 res = {1: None, 2: None, 3: None}
3782 vereq(dict.fromkeys(arg), res)
3783 vereq({}.fromkeys(arg), res)
3784 # Now get the descriptor
3785 descr = dict.__dict__["fromkeys"]
3786 # More baseline using the descriptor directly
3787 vereq(descr.__get__(None, dict)(arg), res)
3788 vereq(descr.__get__({})(arg), res)
3789 # Now check various error cases
3790 try:
3791 descr.__get__(None, None)
3792 except TypeError:
3793 pass
3794 else:
3795 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3796 try:
3797 descr.__get__(42)
3798 except TypeError:
3799 pass
3800 else:
3801 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3802 try:
3803 descr.__get__(None, 42)
3804 except TypeError:
3805 pass
3806 else:
3807 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3808 try:
3809 descr.__get__(None, int)
3810 except TypeError:
3811 pass
3812 else:
3813 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3814
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003815def isinst_isclass():
3816 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003817 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003818 class Proxy(object):
3819 def __init__(self, obj):
3820 self.__obj = obj
3821 def __getattribute__(self, name):
3822 if name.startswith("_Proxy__"):
3823 return object.__getattribute__(self, name)
3824 else:
3825 return getattr(self.__obj, name)
3826 # Test with a classic class
3827 class C:
3828 pass
3829 a = C()
3830 pa = Proxy(a)
3831 verify(isinstance(a, C)) # Baseline
3832 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003833 # Test with a classic subclass
3834 class D(C):
3835 pass
3836 a = D()
3837 pa = Proxy(a)
3838 verify(isinstance(a, C)) # Baseline
3839 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003840 # Test with a new-style class
3841 class C(object):
3842 pass
3843 a = C()
3844 pa = Proxy(a)
3845 verify(isinstance(a, C)) # Baseline
3846 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003847 # Test with a new-style subclass
3848 class D(C):
3849 pass
3850 a = D()
3851 pa = Proxy(a)
3852 verify(isinstance(a, C)) # Baseline
3853 verify(isinstance(pa, C)) # Test
3854
3855def proxysuper():
3856 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003857 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003858 class Proxy(object):
3859 def __init__(self, obj):
3860 self.__obj = obj
3861 def __getattribute__(self, name):
3862 if name.startswith("_Proxy__"):
3863 return object.__getattribute__(self, name)
3864 else:
3865 return getattr(self.__obj, name)
3866
3867 class B(object):
3868 def f(self):
3869 return "B.f"
3870
3871 class C(B):
3872 def f(self):
3873 return super(C, self).f() + "->C.f"
3874
3875 obj = C()
3876 p = Proxy(obj)
3877 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003878
Guido van Rossum52b27052003-04-15 20:05:10 +00003879def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003880 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003881 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003882 try:
3883 object.__setattr__(str, "foo", 42)
3884 except TypeError:
3885 pass
3886 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003887 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003888 try:
3889 object.__delattr__(str, "lower")
3890 except TypeError:
3891 pass
3892 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003893 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003894
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003895def weakref_segfault():
3896 # SF 742911
3897 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003898 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003899
3900 import weakref
3901
3902 class Provoker:
3903 def __init__(self, referrent):
3904 self.ref = weakref.ref(referrent)
3905
3906 def __del__(self):
3907 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003908
3909 class Oops(object):
3910 pass
3911
3912 o = Oops()
3913 o.whatever = Provoker(o)
3914 del o
3915
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003916def wrapper_segfault():
3917 # SF 927248: deeply nested wrappers could cause stack overflow
3918 f = lambda:None
Guido van Rossum805365e2007-05-07 22:24:25 +00003919 for i in range(1000000):
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003920 f = f.__call__
3921 f = None
3922
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003923# Fix SF #762455, segfault when sys.stdout is changed in getattr
3924def filefault():
3925 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003926 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003927 import sys
3928 class StdoutGuard:
3929 def __getattr__(self, attr):
3930 sys.stdout = sys.__stdout__
3931 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3932 sys.stdout = StdoutGuard()
3933 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003934 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003935 except RuntimeError:
3936 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003937
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003938def vicious_descriptor_nonsense():
3939 # A potential segfault spotted by Thomas Wouters in mail to
3940 # python-dev 2003-04-17, turned into an example & fixed by Michael
3941 # Hudson just less than four months later...
3942 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003943 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003944
3945 class Evil(object):
3946 def __hash__(self):
3947 return hash('attr')
3948 def __eq__(self, other):
3949 del C.attr
3950 return 0
3951
3952 class Descr(object):
3953 def __get__(self, ob, type=None):
3954 return 1
3955
3956 class C(object):
3957 attr = Descr()
3958
3959 c = C()
3960 c.__dict__[Evil()] = 0
3961
3962 vereq(c.attr, 1)
3963 # this makes a crash more likely:
3964 import gc; gc.collect()
3965 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00003966
Raymond Hettingerb67cc802005-03-03 16:45:19 +00003967def test_init():
3968 # SF 1155938
3969 class Foo(object):
3970 def __init__(self):
3971 return 10
3972 try:
3973 Foo()
3974 except TypeError:
3975 pass
3976 else:
3977 raise TestFailed, "did not test __init__() for None return"
3978
Armin Rigoc6686b72005-11-07 08:38:00 +00003979def methodwrapper():
3980 # <type 'method-wrapper'> did not support any reflection before 2.5
3981 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003982 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00003983
Guido van Rossum47b9ff62006-08-24 00:41:19 +00003984 return # XXX should methods really support __eq__?
3985
Armin Rigoc6686b72005-11-07 08:38:00 +00003986 l = []
3987 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003988 vereq(l.__add__, [].__add__)
3989 verify(l.__add__ != [5].__add__)
3990 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00003991 verify(l.__add__.__name__ == '__add__')
3992 verify(l.__add__.__self__ is l)
3993 verify(l.__add__.__objclass__ is list)
3994 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003995 try:
3996 hash(l.__add__)
3997 except TypeError:
3998 pass
3999 else:
4000 raise TestFailed("no TypeError from hash([].__add__)")
4001
4002 t = ()
4003 t += (7,)
4004 vereq(t.__add__, (7,).__add__)
4005 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004006
Armin Rigofd163f92005-12-29 15:59:19 +00004007def notimplemented():
4008 # all binary methods should be able to return a NotImplemented
4009 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004010 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00004011
4012 import sys
4013 import types
4014 import operator
4015
4016 def specialmethod(self, other):
4017 return NotImplemented
4018
4019 def check(expr, x, y):
4020 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00004021 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00004022 except TypeError:
4023 pass
4024 else:
4025 raise TestFailed("no TypeError from %r" % (expr,))
4026
Guido van Rossume2a383d2007-01-15 16:59:06 +00004027 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00004028 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
4029 # ValueErrors instead of TypeErrors
4030 for metaclass in [type, types.ClassType]:
4031 for name, expr, iexpr in [
4032 ('__add__', 'x + y', 'x += y'),
4033 ('__sub__', 'x - y', 'x -= y'),
4034 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00004035 ('__truediv__', 'x / y', None),
4036 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00004037 ('__mod__', 'x % y', 'x %= y'),
4038 ('__divmod__', 'divmod(x, y)', None),
4039 ('__pow__', 'x ** y', 'x **= y'),
4040 ('__lshift__', 'x << y', 'x <<= y'),
4041 ('__rshift__', 'x >> y', 'x >>= y'),
4042 ('__and__', 'x & y', 'x &= y'),
4043 ('__or__', 'x | y', 'x |= y'),
4044 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00004045 ]:
4046 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00004047 A = metaclass('A', (), {name: specialmethod})
4048 B = metaclass('B', (), {rname: specialmethod})
4049 a = A()
4050 b = B()
4051 check(expr, a, a)
4052 check(expr, a, b)
4053 check(expr, b, a)
4054 check(expr, b, b)
4055 check(expr, a, N1)
4056 check(expr, a, N2)
4057 check(expr, N1, b)
4058 check(expr, N2, b)
4059 if iexpr:
4060 check(iexpr, a, a)
4061 check(iexpr, a, b)
4062 check(iexpr, b, a)
4063 check(iexpr, b, b)
4064 check(iexpr, a, N1)
4065 check(iexpr, a, N2)
4066 iname = '__i' + name[2:]
4067 C = metaclass('C', (), {iname: specialmethod})
4068 c = C()
4069 check(iexpr, c, a)
4070 check(iexpr, c, b)
4071 check(iexpr, c, N1)
4072 check(iexpr, c, N2)
4073
Guido van Rossumd8faa362007-04-27 19:54:29 +00004074def test_assign_slice():
4075 # ceval.c's assign_slice used to check for
4076 # tp->tp_as_sequence->sq_slice instead of
4077 # tp->tp_as_sequence->sq_ass_slice
4078
4079 class C(object):
4080 def __setslice__(self, start, stop, value):
4081 self.value = value
4082
4083 c = C()
4084 c[1:2] = 3
4085 vereq(c.value, 3)
4086
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004087def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004088 weakref_segfault() # Must be first, somehow
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004089 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004090 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004091 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004092 lists()
4093 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004094 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004095 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004096 ints()
4097 longs()
4098 floats()
4099 complexes()
4100 spamlists()
4101 spamdicts()
4102 pydicts()
4103 pylists()
4104 metaclass()
4105 pymods()
4106 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004107 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004108 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004109 ex5()
4110 monotonicity()
4111 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004112 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004113 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004114 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004115 dynamics()
4116 errors()
4117 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004118 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004119 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004120 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004121 classic()
4122 compattr()
4123 newslot()
4124 altmro()
4125 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004126 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004127 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004128 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004129 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004130 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004131 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004132 keywords()
Tim Peters0ab085c2001-09-14 00:25:33 +00004133 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004134 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004135 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004136 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004137 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004138 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004139 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004140 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004141 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004142 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004143 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004144 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004145 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004146 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004147 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004148 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004149 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004150 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004151 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004152 dictproxyiterkeys()
4153 dictproxyitervalues()
4154 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004155 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004156 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004157 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004158 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004159 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004160 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004161 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004162 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004163 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004164 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004165 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004166 test_mutable_bases()
4167 test_mutable_bases_with_failing_mro()
4168 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004169 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004170 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004171 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004172 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004173 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004174 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004175 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004176 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004177 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004178 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004179 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004180 notimplemented()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004181 test_assign_slice()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004182
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004183 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004184
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004185if __name__ == "__main__":
4186 test_main()