blob: d369cf630579dc1a1b0dec21dcc6d40e073e2ae6 [file] [log] [blame]
Guido van Rossum4bb1e362001-09-28 23:49:48 +00001# Test enhancements related to descriptors and new-style classes
Tim Peters6d6c1a32001-08-02 04:15:00 +00002
Neal Norwitz1a997502003-01-13 20:13:12 +00003from test.test_support import verify, vereq, verbose, TestFailed, TESTFN, get_original_stdout
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
Tim Peters4d9b4662002-04-16 01:59:17 +00005import warnings
6
7warnings.filterwarnings("ignore",
8 r'complex divmod\(\), // and % are deprecated$',
Guido van Rossum155a34d2002-06-03 19:45:32 +00009 DeprecationWarning, r'(<string>|%s)$' % __name__)
Tim Peters6d6c1a32001-08-02 04:15:00 +000010
Guido van Rossum875eeaa2001-10-11 18:33:53 +000011def veris(a, b):
12 if a is not b:
13 raise TestFailed, "%r is %r" % (a, b)
14
Tim Peters6d6c1a32001-08-02 04:15:00 +000015def testunop(a, res, expr="len(a)", meth="__len__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000016 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000017 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000019 t = type(a)
20 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000021 while meth not in t.__dict__:
22 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000023 vereq(m, t.__dict__[meth])
24 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000025 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000026 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000027
28def testbinop(a, b, res, expr="a+b", meth="__add__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000029 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000030 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000031
Guido van Rossum45704552001-10-08 16:35:45 +000032 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000033 t = type(a)
34 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000035 while meth not in t.__dict__:
36 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000037 vereq(m, t.__dict__[meth])
38 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000039 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000040 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000041
42def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000043 if verbose: print("checking", expr)
Tim Peters6d6c1a32001-08-02 04:15:00 +000044 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000045 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000046 t = type(a)
47 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000048 while meth not in t.__dict__:
49 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000050 vereq(m, t.__dict__[meth])
51 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000052 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000053 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000054
55def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000056 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000057 dict = {'a': deepcopy(a), 'b': b}
Georg Brandl7cae87c2006-09-06 06:51:57 +000058 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000059 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000060 t = type(a)
61 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000062 while meth not in t.__dict__:
63 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000064 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000065 dict['a'] = deepcopy(a)
66 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000067 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000068 dict['a'] = deepcopy(a)
69 bm = getattr(dict['a'], meth)
70 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000071 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000072
73def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000074 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000075 dict = {'a': deepcopy(a), 'b': b, 'c': c}
Georg Brandl7cae87c2006-09-06 06:51:57 +000076 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000077 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000078 t = type(a)
79 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000080 while meth not in t.__dict__:
81 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000082 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000083 dict['a'] = deepcopy(a)
84 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000085 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000086 dict['a'] = deepcopy(a)
87 bm = getattr(dict['a'], meth)
88 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000089 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000090
91def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000092 if verbose: print("checking", stmt)
Tim Peters6d6c1a32001-08-02 04:15:00 +000093 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
Georg Brandl7cae87c2006-09-06 06:51:57 +000094 exec(stmt, dict)
Guido van Rossum45704552001-10-08 16:35:45 +000095 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000096 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000097 while meth not in t.__dict__:
98 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000099 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +0000100 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101 dict['a'] = deepcopy(a)
102 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000103 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000104 dict['a'] = deepcopy(a)
105 bm = getattr(dict['a'], meth)
106 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000107 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000108
Tim Peters2f93e282001-10-04 05:27:00 +0000109def class_docstrings():
110 class Classic:
111 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000112 vereq(Classic.__doc__, "A classic docstring.")
113 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000114
115 class Classic2:
116 pass
117 verify(Classic2.__doc__ is None)
118
Tim Peters4fb1fe82001-10-04 05:48:13 +0000119 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000120 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000121 vereq(NewStatic.__doc__, "Another docstring.")
122 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000123
Tim Peters4fb1fe82001-10-04 05:48:13 +0000124 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000125 pass
126 verify(NewStatic2.__doc__ is None)
127
Tim Peters4fb1fe82001-10-04 05:48:13 +0000128 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000129 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000130 vereq(NewDynamic.__doc__, "Another docstring.")
131 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000132
Tim Peters4fb1fe82001-10-04 05:48:13 +0000133 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000134 pass
135 verify(NewDynamic2.__doc__ is None)
136
Tim Peters6d6c1a32001-08-02 04:15:00 +0000137def lists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000138 if verbose: print("Testing list operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000139 testbinop([1], [2], [1,2], "a+b", "__add__")
140 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
141 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
142 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
143 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
144 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
145 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
146 testunop([1,2,3], 3, "len(a)", "__len__")
147 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
148 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
149 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
150 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
151
152def dicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000153 if verbose: print("Testing dict operations...")
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000154 ##testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000155 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
156 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
157 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
158 d = {1:2,3:4}
159 l1 = []
160 for i in d.keys(): l1.append(i)
161 l = []
162 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000163 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000164 l = []
165 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000166 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000167 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000168 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000169 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 d = {1:2, 3:4}
171 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000172 vereq(eval(repr(d), {}), d)
173 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000174 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
175
Tim Peters25786c02001-09-02 08:22:48 +0000176def dict_constructor():
177 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000178 print("Testing dict constructor ...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000179 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000180 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000181 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000182 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000183 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000184 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000185 vereq(d, dict(d.items()))
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000186 vereq(d, dict(d.items()))
Just van Rossuma797d812002-11-23 09:45:04 +0000187 d = dict({'one':1, 'two':2})
188 vereq(d, dict(one=1, two=2))
189 vereq(d, dict(**d))
190 vereq(d, dict({"one": 1}, two=2))
191 vereq(d, dict([("two", 2)], one=1))
192 vereq(d, dict([("one", 100), ("two", 200)], **d))
193 verify(d is not dict(**d))
Guido van Rossume2a383d2007-01-15 16:59:06 +0000194 for badarg in 0, 0, 0j, "0", [0], (0,):
Tim Peters25786c02001-09-02 08:22:48 +0000195 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000196 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000197 except TypeError:
198 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000199 except ValueError:
200 if badarg == "0":
201 # It's a sequence, and its elements are also sequences (gotta
202 # love strings <wink>), but they aren't of length 2, so this
203 # one seemed better as a ValueError than a TypeError.
204 pass
205 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000206 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000207 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000208 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000209
210 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000211 dict({}, {})
Tim Peters25786c02001-09-02 08:22:48 +0000212 except TypeError:
213 pass
214 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000215 raise TestFailed("no TypeError from dict({}, {})")
Tim Peters25786c02001-09-02 08:22:48 +0000216
217 class Mapping:
Tim Peters1fc240e2001-10-26 05:06:50 +0000218 # Lacks a .keys() method; will be added later.
Tim Peters25786c02001-09-02 08:22:48 +0000219 dict = {1:2, 3:4, 'a':1j}
220
Tim Peters25786c02001-09-02 08:22:48 +0000221 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000222 dict(Mapping())
Tim Peters25786c02001-09-02 08:22:48 +0000223 except TypeError:
224 pass
225 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000226 raise TestFailed("no TypeError from dict(incomplete mapping)")
Tim Peters25786c02001-09-02 08:22:48 +0000227
228 Mapping.keys = lambda self: self.dict.keys()
Tim Peters1fc240e2001-10-26 05:06:50 +0000229 Mapping.__getitem__ = lambda self, i: self.dict[i]
Just van Rossuma797d812002-11-23 09:45:04 +0000230 d = dict(Mapping())
Guido van Rossum45704552001-10-08 16:35:45 +0000231 vereq(d, Mapping.dict)
Tim Peters25786c02001-09-02 08:22:48 +0000232
Tim Peters1fc240e2001-10-26 05:06:50 +0000233 # Init from sequence of iterable objects, each producing a 2-sequence.
234 class AddressBookEntry:
235 def __init__(self, first, last):
236 self.first = first
237 self.last = last
238 def __iter__(self):
239 return iter([self.first, self.last])
240
Tim Petersa427a2b2001-10-29 22:25:45 +0000241 d = dict([AddressBookEntry('Tim', 'Warsaw'),
Tim Petersfe677e22001-10-30 05:41:07 +0000242 AddressBookEntry('Barry', 'Peters'),
243 AddressBookEntry('Tim', 'Peters'),
244 AddressBookEntry('Barry', 'Warsaw')])
Tim Peters1fc240e2001-10-26 05:06:50 +0000245 vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'})
246
Tim Petersa427a2b2001-10-29 22:25:45 +0000247 d = dict(zip(range(4), range(1, 5)))
248 vereq(d, dict([(i, i+1) for i in range(4)]))
Tim Peters1fc240e2001-10-26 05:06:50 +0000249
250 # Bad sequence lengths.
Tim Peters9fda73c2001-10-26 20:57:38 +0000251 for bad in [('tooshort',)], [('too', 'long', 'by 1')]:
Tim Peters1fc240e2001-10-26 05:06:50 +0000252 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000253 dict(bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000254 except ValueError:
255 pass
256 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000257 raise TestFailed("no ValueError from dict(%r)" % bad)
Tim Peters1fc240e2001-10-26 05:06:50 +0000258
Tim Peters5d2b77c2001-09-03 05:47:38 +0000259def test_dir():
260 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000261 print("Testing dir() ...")
Tim Peters5d2b77c2001-09-03 05:47:38 +0000262 junk = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000263 vereq(dir(), ['junk'])
Tim Peters5d2b77c2001-09-03 05:47:38 +0000264 del junk
265
266 # Just make sure these don't blow up!
Guido van Rossume2a383d2007-01-15 16:59:06 +0000267 for arg in 2, 2, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
Tim Peters5d2b77c2001-09-03 05:47:38 +0000268 dir(arg)
269
Thomas Wouters0725cf22006-04-15 09:04:57 +0000270 # Test dir on custom classes. Since these have object as a
271 # base class, a lot of stuff gets sucked in.
Tim Peters37a309d2001-09-04 01:20:04 +0000272 def interesting(strings):
273 return [s for s in strings if not s.startswith('_')]
274
Tim Peters5d2b77c2001-09-03 05:47:38 +0000275 class C(object):
276 Cdata = 1
277 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000278
279 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000281
282 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000283 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000284 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000285
286 c.cdata = 2
287 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000288 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000289 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000290
Tim Peters5d2b77c2001-09-03 05:47:38 +0000291 class A(C):
292 Adata = 1
293 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000294
295 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000296 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000297 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000298 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000300 a.adata = 42
301 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000302 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000303 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000304
Tim Peterscaaff8d2001-09-10 23:12:14 +0000305 # Try a module subclass.
306 import sys
307 class M(type(sys)):
308 pass
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000309 minstance = M("m")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000310 minstance.b = 2
311 minstance.a = 1
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000312 names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]]
313 vereq(names, ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000314
315 class M2(M):
316 def getdict(self):
317 return "Not a dict!"
318 __dict__ = property(getdict)
319
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000320 m2instance = M2("m2")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000321 m2instance.b = 2
322 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000323 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000324 try:
325 dir(m2instance)
326 except TypeError:
327 pass
328
Tim Peters9e6a3992001-10-30 05:45:26 +0000329 # Two essentially featureless objects, just inheriting stuff from
330 # object.
331 vereq(dir(None), dir(Ellipsis))
332
Guido van Rossum44022412002-05-13 18:29:46 +0000333 # Nasty test case for proxied objects
334 class Wrapper(object):
335 def __init__(self, obj):
336 self.__obj = obj
337 def __repr__(self):
338 return "Wrapper(%s)" % repr(self.__obj)
339 def __getitem__(self, key):
340 return Wrapper(self.__obj[key])
341 def __len__(self):
342 return len(self.__obj)
343 def __getattr__(self, name):
344 return Wrapper(getattr(self.__obj, name))
345
346 class C(object):
347 def __getclass(self):
348 return Wrapper(type(self))
349 __class__ = property(__getclass)
350
351 dir(C()) # This used to segfault
352
Tim Peters6d6c1a32001-08-02 04:15:00 +0000353binops = {
354 'add': '+',
355 'sub': '-',
356 'mul': '*',
357 'div': '/',
358 'mod': '%',
359 'divmod': 'divmod',
360 'pow': '**',
361 'lshift': '<<',
362 'rshift': '>>',
363 'and': '&',
364 'xor': '^',
365 'or': '|',
366 'cmp': 'cmp',
367 'lt': '<',
368 'le': '<=',
369 'eq': '==',
370 'ne': '!=',
371 'gt': '>',
372 'ge': '>=',
373 }
374
375for name, expr in binops.items():
376 if expr.islower():
377 expr = expr + "(a, b)"
378 else:
379 expr = 'a %s b' % expr
380 binops[name] = expr
381
382unops = {
383 'pos': '+',
384 'neg': '-',
385 'abs': 'abs',
386 'invert': '~',
387 'int': 'int',
Tim Peters6d6c1a32001-08-02 04:15:00 +0000388 'float': 'float',
389 'oct': 'oct',
390 'hex': 'hex',
391 }
392
393for name, expr in unops.items():
394 if expr.islower():
395 expr = expr + "(a)"
396 else:
397 expr = '%s a' % expr
398 unops[name] = expr
399
400def numops(a, b, skip=[]):
401 dict = {'a': a, 'b': b}
402 for name, expr in binops.items():
403 if name not in skip:
404 name = "__%s__" % name
405 if hasattr(a, name):
406 res = eval(expr, dict)
407 testbinop(a, b, res, expr, name)
408 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000409 if name not in skip:
410 name = "__%s__" % name
411 if hasattr(a, name):
412 res = eval(expr, dict)
413 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000414
415def ints():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000416 if verbose: print("Testing int operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000417 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000418 # The following crashes in Python 2.2
Jack Diederich4dafcc42006-11-28 19:15:13 +0000419 vereq((1).__bool__(), True)
420 vereq((0).__bool__(), False)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000421 # This returns 'NotImplemented' in Python 2.2
422 class C(int):
423 def __add__(self, other):
424 return NotImplemented
Guido van Rossume2a383d2007-01-15 16:59:06 +0000425 vereq(C(5), 5)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000426 try:
427 C() + ""
428 except TypeError:
429 pass
430 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000431 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000432
433def longs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000434 if verbose: print("Testing long operations...")
Guido van Rossume2a383d2007-01-15 16:59:06 +0000435 numops(100, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000436
437def floats():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000438 if verbose: print("Testing float operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000439 numops(100.0, 3.0)
440
441def complexes():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000442 if verbose: print("Testing complex operations...")
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000443 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000444 class Number(complex):
445 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000446 def __new__(cls, *args, **kwds):
447 result = complex.__new__(cls, *args)
448 result.prec = kwds.get('prec', 12)
449 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 def __repr__(self):
451 prec = self.prec
452 if self.imag == 0.0:
453 return "%.*g" % (prec, self.real)
454 if self.real == 0.0:
455 return "%.*gj" % (prec, self.imag)
456 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
457 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000458
Tim Peters6d6c1a32001-08-02 04:15:00 +0000459 a = Number(3.14, prec=6)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000460 vereq(repr(a), "3.14")
Guido van Rossum45704552001-10-08 16:35:45 +0000461 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000462
Tim Peters3f996e72001-09-13 19:18:27 +0000463 a = Number(a, prec=2)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000464 vereq(repr(a), "3.1")
Guido van Rossum45704552001-10-08 16:35:45 +0000465 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000466
467 a = Number(234.5)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000468 vereq(repr(a), "234.5")
Guido van Rossum45704552001-10-08 16:35:45 +0000469 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000470
Tim Peters6d6c1a32001-08-02 04:15:00 +0000471def spamlists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000472 if verbose: print("Testing spamlist operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473 import copy, xxsubtype as spam
474 def spamlist(l, memo=None):
475 import xxsubtype as spam
476 return spam.spamlist(l)
477 # This is an ugly hack:
478 copy._deepcopy_dispatch[spam.spamlist] = spamlist
479
480 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
481 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
482 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
483 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
484 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
485 "a[b:c]", "__getslice__")
486 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
487 "a+=b", "__iadd__")
488 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
489 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
490 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
491 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
492 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
493 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
494 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
495 # Test subclassing
496 class C(spam.spamlist):
497 def foo(self): return 1
498 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(a, [])
500 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000502 vereq(a, [100])
503 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000504 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000505 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000506
507def spamdicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000508 if verbose: print("Testing spamdict operations...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000509 import copy, xxsubtype as spam
510 def spamdict(d, memo=None):
511 import xxsubtype as spam
512 sd = spam.spamdict()
513 for k, v in d.items(): sd[k] = v
514 return sd
515 # This is an ugly hack:
516 copy._deepcopy_dispatch[spam.spamdict] = spamdict
517
Guido van Rossum47b9ff62006-08-24 00:41:19 +0000518 ##testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000519 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
520 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
521 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
522 d = spamdict({1:2,3:4})
523 l1 = []
524 for i in d.keys(): l1.append(i)
525 l = []
526 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000527 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000528 l = []
529 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 l = []
532 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000533 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000534 straightd = {1:2, 3:4}
535 spamd = spamdict(straightd)
536 testunop(spamd, 2, "len(a)", "__len__")
537 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
538 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
539 "a[b]=c", "__setitem__")
540 # Test subclassing
541 class C(spam.spamdict):
542 def foo(self): return 1
543 a = C()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000544 vereq(list(a.items()), [])
Guido van Rossum45704552001-10-08 16:35:45 +0000545 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 a['foo'] = 'bar'
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000547 vereq(list(a.items()), [('foo', 'bar')])
Guido van Rossum45704552001-10-08 16:35:45 +0000548 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000549 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000550 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000551
552def pydicts():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000553 if verbose: print("Testing Python subclass of dict...")
Tim Petersa427a2b2001-10-29 22:25:45 +0000554 verify(issubclass(dict, dict))
555 verify(isinstance({}, dict))
556 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000557 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000558 verify(d.__class__ is dict)
559 verify(isinstance(d, dict))
560 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561 state = -1
562 def __init__(self, *a, **kw):
563 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000564 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000565 self.state = a[0]
566 if kw:
567 for k, v in kw.items(): self[v] = k
568 def __getitem__(self, key):
569 return self.get(key, 0)
570 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000571 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000572 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000573 def setstate(self, state):
574 self.state = state
575 def getstate(self):
576 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000577 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000578 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000579 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000580 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000581 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.state, -1)
584 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.state, 0)
587 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000588 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a.state, 10)
590 vereq(a.getstate(), 10)
591 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a[42], 24)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000594 if verbose: print("pydict stress test ...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 N = 50
596 for i in range(N):
597 a[i] = C()
598 for j in range(N):
599 a[i][j] = i*j
600 for i in range(N):
601 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000602 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603
604def pylists():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000605 if verbose: print("Testing Python subclass of list...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000606 class C(list):
607 def __getitem__(self, i):
608 return list.__getitem__(self, i) + 100
609 def __getslice__(self, i, j):
610 return (i, j)
611 a = C()
612 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000613 vereq(a[0], 100)
614 vereq(a[1], 101)
615 vereq(a[2], 102)
616 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617
618def metaclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000619 if verbose: print("Testing __metaclass__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000620 class C:
621 __metaclass__ = type
622 def __init__(self):
623 self.__state = 0
624 def getstate(self):
625 return self.__state
626 def setstate(self, state):
627 self.__state = state
628 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000629 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000631 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000632 class D:
633 class __metaclass__(type):
634 def myself(cls): return cls
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)
642 class C:
643 __metaclass__ = M1
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
666 class C:
667 __metaclass__ = M2
668 def spam(self):
669 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000670 vereq(C.name, 'C')
671 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000672 verify('spam' in C.dict)
673 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000674 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000675
Guido van Rossum91ee7982001-08-30 20:52:40 +0000676 # More metaclass examples
677
678 class autosuper(type):
679 # Automatically add __super to the class
680 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000681 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 cls = super(autosuper, metaclass).__new__(metaclass,
683 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000684 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000685 while name[:1] == "_":
686 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000687 if name:
688 name = "_%s__super" % name
689 else:
690 name = "__super"
691 setattr(cls, name, super(cls))
692 return cls
693 class A:
694 __metaclass__ = autosuper
695 def meth(self):
696 return "A"
697 class B(A):
698 def meth(self):
699 return "B" + self.__super.meth()
700 class C(A):
701 def meth(self):
702 return "C" + self.__super.meth()
703 class D(C, B):
704 def meth(self):
705 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000706 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000707 class E(B, C):
708 def meth(self):
709 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000710 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000711
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000712 class autoproperty(type):
713 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000714 # named _get_x and/or _set_x are found
715 def __new__(metaclass, name, bases, dict):
716 hits = {}
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000717 for key, val in dict.items():
Guido van Rossum91ee7982001-08-30 20:52:40 +0000718 if key.startswith("_get_"):
719 key = key[5:]
720 get, set = hits.get(key, (None, None))
721 get = val
722 hits[key] = get, set
723 elif key.startswith("_set_"):
724 key = key[5:]
725 get, set = hits.get(key, (None, None))
726 set = val
727 hits[key] = get, set
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000728 for key, (get, set) in hits.items():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000729 dict[key] = property(get, set)
730 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 name, bases, dict)
732 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000733 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000734 def _get_x(self):
735 return -self.__x
736 def _set_x(self, x):
737 self.__x = -x
738 a = A()
739 verify(not hasattr(a, "x"))
740 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000741 vereq(a.x, 12)
742 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000743
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000744 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000745 # Merge of multiple cooperating metaclasses
746 pass
747 class A:
748 __metaclass__ = multimetaclass
749 def _get_x(self):
750 return "A"
751 class B(A):
752 def _get_x(self):
753 return "B" + self.__super._get_x()
754 class C(A):
755 def _get_x(self):
756 return "C" + self.__super._get_x()
757 class D(C, B):
758 def _get_x(self):
759 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000760 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000761
Guido van Rossumf76de622001-10-18 15:49:21 +0000762 # Make sure type(x) doesn't call x.__class__.__init__
763 class T(type):
764 counter = 0
765 def __init__(self, *args):
766 T.counter += 1
767 class C:
768 __metaclass__ = T
769 vereq(T.counter, 1)
770 a = C()
771 vereq(type(a), C)
772 vereq(T.counter, 1)
773
Guido van Rossum29d26062001-12-11 04:37:34 +0000774 class C(object): pass
775 c = C()
776 try: c()
777 except TypeError: pass
Neal Norwitzb1295da2002-04-01 18:59:20 +0000778 else: raise TestFailed, "calling object w/o call method should raise TypeError"
Guido van Rossum29d26062001-12-11 04:37:34 +0000779
Tim Peters6d6c1a32001-08-02 04:15:00 +0000780def pymods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000781 if verbose: print("Testing Python subclass of module...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000782 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000783 import sys
784 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000785 class MM(MT):
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000786 def __init__(self, name):
787 MT.__init__(self, name)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000788 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000789 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000790 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000791 def __setattr__(self, name, value):
792 log.append(("setattr", name, value))
793 MT.__setattr__(self, name, value)
794 def __delattr__(self, name):
795 log.append(("delattr", name))
796 MT.__delattr__(self, name)
Guido van Rossum1bdd9b02002-06-04 06:10:37 +0000797 a = MM("a")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000798 a.foo = 12
799 x = a.foo
800 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000801 vereq(log, [("setattr", "foo", 12),
802 ("getattr", "foo"),
803 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804
805def multi():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000806 if verbose: print("Testing multiple inheritance...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000807 class C(object):
808 def __init__(self):
809 self.__state = 0
810 def getstate(self):
811 return self.__state
812 def setstate(self, state):
813 self.__state = state
814 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000815 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000817 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000818 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000819 def __init__(self):
820 type({}).__init__(self)
821 C.__init__(self)
822 d = D()
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000823 vereq(list(d.keys()), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000824 d["hello"] = "world"
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000825 vereq(list(d.items()), [("hello", "world")])
Guido van Rossum45704552001-10-08 16:35:45 +0000826 vereq(d["hello"], "world")
827 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000829 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000830 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831
Guido van Rossume45763a2001-08-10 21:28:46 +0000832 # SF bug #442833
833 class Node(object):
834 def __int__(self):
835 return int(self.foo())
836 def foo(self):
837 return "23"
838 class Frag(Node, list):
839 def foo(self):
840 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000841 vereq(Node().__int__(), 23)
842 vereq(int(Node()), 23)
843 vereq(Frag().__int__(), 42)
844 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000845
Tim Peters6d6c1a32001-08-02 04:15:00 +0000846def diamond():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000847 if verbose: print("Testing multiple inheritance special cases...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000848 class A(object):
849 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000850 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000851 class B(A):
852 def boo(self): return "B"
853 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000854 vereq(B().spam(), "B")
855 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000856 class C(A):
857 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000858 vereq(C().spam(), "A")
859 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000860 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000861 vereq(D().spam(), "B")
862 vereq(D().boo(), "B")
863 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000864 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000865 vereq(E().spam(), "B")
866 vereq(E().boo(), "C")
867 vereq(E.__mro__, (E, C, B, A, object))
Guido van Rossum9a818922002-11-14 19:50:14 +0000868 # MRO order disagreement
869 try:
870 class F(D, E): pass
871 except TypeError:
872 pass
873 else:
874 raise TestFailed, "expected MRO order disagreement (F)"
875 try:
876 class G(E, D): pass
877 except TypeError:
878 pass
879 else:
880 raise TestFailed, "expected MRO order disagreement (G)"
881
882
883# see thread python-dev/2002-October/029035.html
884def ex5():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000885 if verbose: print("Testing ex5 from C3 switch discussion...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000886 class A(object): pass
887 class B(object): pass
888 class C(object): pass
889 class X(A): pass
890 class Y(A): pass
891 class Z(X,B,Y,C): pass
892 vereq(Z.__mro__, (Z, X, B, Y, A, C, object))
893
894# see "A Monotonic Superclass Linearization for Dylan",
895# by Kim Barrett et al. (OOPSLA 1996)
896def monotonicity():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000897 if verbose: print("Testing MRO monotonicity...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000898 class Boat(object): pass
899 class DayBoat(Boat): pass
900 class WheelBoat(Boat): pass
901 class EngineLess(DayBoat): pass
902 class SmallMultihull(DayBoat): pass
903 class PedalWheelBoat(EngineLess,WheelBoat): pass
904 class SmallCatamaran(SmallMultihull): pass
905 class Pedalo(PedalWheelBoat,SmallCatamaran): pass
906
907 vereq(PedalWheelBoat.__mro__,
908 (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat,
909 object))
910 vereq(SmallCatamaran.__mro__,
911 (SmallCatamaran, SmallMultihull, DayBoat, Boat, object))
912
913 vereq(Pedalo.__mro__,
914 (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran,
915 SmallMultihull, DayBoat, WheelBoat, Boat, object))
916
917# see "A Monotonic Superclass Linearization for Dylan",
918# by Kim Barrett et al. (OOPSLA 1996)
919def consistency_with_epg():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000920 if verbose: print("Testing consistentcy with EPG...")
Guido van Rossum9a818922002-11-14 19:50:14 +0000921 class Pane(object): pass
922 class ScrollingMixin(object): pass
923 class EditingMixin(object): pass
924 class ScrollablePane(Pane,ScrollingMixin): pass
925 class EditablePane(Pane,EditingMixin): pass
926 class EditableScrollablePane(ScrollablePane,EditablePane): pass
927
928 vereq(EditableScrollablePane.__mro__,
929 (EditableScrollablePane, ScrollablePane, EditablePane,
930 Pane, ScrollingMixin, EditingMixin, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000931
Raymond Hettingerf394df42003-04-06 19:13:41 +0000932mro_err_msg = """Cannot create a consistent method resolution
933order (MRO) for bases """
Raymond Hettinger83245b52003-03-12 04:25:42 +0000934
Guido van Rossumd32047f2002-11-25 21:38:52 +0000935def mro_disagreement():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000936 if verbose: print("Testing error messages for MRO disagreement...")
Guido van Rossumd32047f2002-11-25 21:38:52 +0000937 def raises(exc, expected, callable, *args):
938 try:
939 callable(*args)
Guido van Rossumb940e112007-01-10 16:19:56 +0000940 except exc as msg:
Guido van Rossuma01fa262002-11-27 04:00:59 +0000941 if not str(msg).startswith(expected):
Guido van Rossumd32047f2002-11-25 21:38:52 +0000942 raise TestFailed, "Message %r, expected %r" % (str(msg),
943 expected)
944 else:
945 raise TestFailed, "Expected %s" % exc
946 class A(object): pass
947 class B(A): pass
948 class C(object): pass
949 # Test some very simple errors
950 raises(TypeError, "duplicate base class A",
951 type, "X", (A, A), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000952 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000953 type, "X", (A, B), {})
Raymond Hettinger83245b52003-03-12 04:25:42 +0000954 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000955 type, "X", (A, C, B), {})
956 # Test a slightly more complex error
957 class GridLayout(object): pass
958 class HorizontalGrid(GridLayout): pass
959 class VerticalGrid(GridLayout): pass
960 class HVGrid(HorizontalGrid, VerticalGrid): pass
961 class VHGrid(VerticalGrid, HorizontalGrid): pass
Raymond Hettinger83245b52003-03-12 04:25:42 +0000962 raises(TypeError, mro_err_msg,
Guido van Rossumd32047f2002-11-25 21:38:52 +0000963 type, "ConfusedGrid", (HVGrid, VHGrid), {})
964
Guido van Rossum37202612001-08-09 19:45:21 +0000965def objects():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000966 if verbose: print("Testing object class...")
Guido van Rossum37202612001-08-09 19:45:21 +0000967 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000968 vereq(a.__class__, object)
969 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000970 b = object()
971 verify(a is not b)
972 verify(not hasattr(a, "foo"))
973 try:
974 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000975 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000976 pass
977 else:
978 verify(0, "object() should not allow setting a foo attribute")
979 verify(not hasattr(object(), "__dict__"))
980
981 class Cdict(object):
982 pass
983 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000984 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000985 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000986 vereq(x.foo, 1)
987 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000988
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989def slots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000990 if verbose: print("Testing __slots__...")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000991 class C0(object):
992 __slots__ = []
993 x = C0()
994 verify(not hasattr(x, "__dict__"))
995 verify(not hasattr(x, "foo"))
996
997 class C1(object):
998 __slots__ = ['a']
999 x = C1()
1000 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001001 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001002 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001003 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001004 x.a = None
1005 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001006 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001007 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001008
1009 class C3(object):
1010 __slots__ = ['a', 'b', 'c']
1011 x = C3()
1012 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001013 verify(not hasattr(x, 'a'))
1014 verify(not hasattr(x, 'b'))
1015 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 x.a = 1
1017 x.b = 2
1018 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001019 vereq(x.a, 1)
1020 vereq(x.b, 2)
1021 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001022
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001023 class C4(object):
1024 """Validate name mangling"""
1025 __slots__ = ['__a']
1026 def __init__(self, value):
1027 self.__a = value
1028 def get(self):
1029 return self.__a
1030 x = C4(5)
1031 verify(not hasattr(x, '__dict__'))
1032 verify(not hasattr(x, '__a'))
1033 vereq(x.get(), 5)
1034 try:
1035 x.__a = 6
1036 except AttributeError:
1037 pass
1038 else:
1039 raise TestFailed, "Double underscored names not mangled"
1040
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001041 # Make sure slot names are proper identifiers
1042 try:
1043 class C(object):
1044 __slots__ = [None]
1045 except TypeError:
1046 pass
1047 else:
1048 raise TestFailed, "[None] slots not caught"
1049 try:
1050 class C(object):
1051 __slots__ = ["foo bar"]
1052 except TypeError:
1053 pass
1054 else:
1055 raise TestFailed, "['foo bar'] slots not caught"
1056 try:
1057 class C(object):
1058 __slots__ = ["foo\0bar"]
1059 except TypeError:
1060 pass
1061 else:
1062 raise TestFailed, "['foo\\0bar'] slots not caught"
1063 try:
1064 class C(object):
1065 __slots__ = ["1"]
1066 except TypeError:
1067 pass
1068 else:
1069 raise TestFailed, "['1'] slots not caught"
1070 try:
1071 class C(object):
1072 __slots__ = [""]
1073 except TypeError:
1074 pass
1075 else:
1076 raise TestFailed, "[''] slots not caught"
1077 class C(object):
1078 __slots__ = ["a", "a_b", "_a", "A0123456789Z"]
1079
Guido van Rossum33bab012001-12-05 22:45:48 +00001080 # Test leaks
1081 class Counted(object):
1082 counter = 0 # counts the number of instances alive
1083 def __init__(self):
1084 Counted.counter += 1
1085 def __del__(self):
1086 Counted.counter -= 1
1087 class C(object):
1088 __slots__ = ['a', 'b', 'c']
1089 x = C()
1090 x.a = Counted()
1091 x.b = Counted()
1092 x.c = Counted()
1093 vereq(Counted.counter, 3)
1094 del x
1095 vereq(Counted.counter, 0)
1096 class D(C):
1097 pass
1098 x = D()
1099 x.a = Counted()
1100 x.z = Counted()
1101 vereq(Counted.counter, 2)
1102 del x
1103 vereq(Counted.counter, 0)
1104 class E(D):
1105 __slots__ = ['e']
1106 x = E()
1107 x.a = Counted()
1108 x.z = Counted()
1109 x.e = Counted()
1110 vereq(Counted.counter, 3)
1111 del x
1112 vereq(Counted.counter, 0)
1113
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001114 # Test cyclical leaks [SF bug 519621]
1115 class F(object):
1116 __slots__ = ['a', 'b']
1117 log = []
1118 s = F()
1119 s.a = [Counted(), s]
1120 vereq(Counted.counter, 1)
1121 s = None
1122 import gc
1123 gc.collect()
1124 vereq(Counted.counter, 0)
1125
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001126 # Test lookup leaks [SF bug 572567]
1127 import sys,gc
1128 class G(object):
1129 def __cmp__(self, other):
1130 return 0
1131 g = G()
1132 orig_objects = len(gc.get_objects())
1133 for i in xrange(10):
1134 g==g
1135 new_objects = len(gc.get_objects())
1136 vereq(orig_objects, new_objects)
Neal Norwitz98a379e2003-06-16 22:51:22 +00001137 class H(object):
1138 __slots__ = ['a', 'b']
1139 def __init__(self):
1140 self.a = 1
1141 self.b = 2
1142 def __del__(self):
1143 assert self.a == 1
1144 assert self.b == 2
1145
1146 save_stderr = sys.stderr
1147 sys.stderr = sys.stdout
1148 h = H()
1149 try:
1150 del h
1151 finally:
1152 sys.stderr = save_stderr
Raymond Hettingerab5dae32002-06-24 13:08:16 +00001153
Guido van Rossum8b056da2002-08-13 18:26:26 +00001154def slotspecials():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001155 if verbose: print("Testing __dict__ and __weakref__ in __slots__...")
Guido van Rossum8b056da2002-08-13 18:26:26 +00001156
1157 class D(object):
1158 __slots__ = ["__dict__"]
1159 a = D()
1160 verify(hasattr(a, "__dict__"))
1161 verify(not hasattr(a, "__weakref__"))
1162 a.foo = 42
1163 vereq(a.__dict__, {"foo": 42})
1164
1165 class W(object):
1166 __slots__ = ["__weakref__"]
1167 a = W()
1168 verify(hasattr(a, "__weakref__"))
1169 verify(not hasattr(a, "__dict__"))
1170 try:
1171 a.foo = 42
1172 except AttributeError:
1173 pass
1174 else:
1175 raise TestFailed, "shouldn't be allowed to set a.foo"
1176
1177 class C1(W, D):
1178 __slots__ = []
1179 a = C1()
1180 verify(hasattr(a, "__dict__"))
1181 verify(hasattr(a, "__weakref__"))
1182 a.foo = 42
1183 vereq(a.__dict__, {"foo": 42})
1184
1185 class C2(D, W):
1186 __slots__ = []
1187 a = C2()
1188 verify(hasattr(a, "__dict__"))
1189 verify(hasattr(a, "__weakref__"))
1190 a.foo = 42
1191 vereq(a.__dict__, {"foo": 42})
1192
Guido van Rossum9a818922002-11-14 19:50:14 +00001193# MRO order disagreement
1194#
1195# class C3(C1, C2):
1196# __slots__ = []
1197#
1198# class C4(C2, C1):
1199# __slots__ = []
Guido van Rossum8b056da2002-08-13 18:26:26 +00001200
Tim Peters6d6c1a32001-08-02 04:15:00 +00001201def dynamics():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001202 if verbose: print("Testing class attribute propagation...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001203 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001205 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001206 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001207 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001208 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001209 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001210 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001211 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001212 vereq(E.foo, 1)
1213 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001214 # Test dynamic instances
1215 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001216 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001217 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001218 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001219 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001220 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001221 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001222 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001223 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001224 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001225 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001226 vereq(int(a), 100)
1227 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001228 verify(not hasattr(a, "spam"))
1229 def mygetattr(self, name):
1230 if name == "spam":
1231 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001232 raise AttributeError
1233 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001234 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001235 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001236 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001237 def mysetattr(self, name, value):
1238 if name == "spam":
1239 raise AttributeError
1240 return object.__setattr__(self, name, value)
1241 C.__setattr__ = mysetattr
1242 try:
1243 a.spam = "not spam"
1244 except AttributeError:
1245 pass
1246 else:
1247 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001248 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001249 class D(C):
1250 pass
1251 d = D()
1252 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001253 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001254
Guido van Rossum7e35d572001-09-15 03:14:32 +00001255 # Test handling of int*seq and seq*int
1256 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001257 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001258 vereq("a"*I(2), "aa")
1259 vereq(I(2)*"a", "aa")
1260 vereq(2*I(3), 6)
1261 vereq(I(3)*2, 6)
1262 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001263
1264 # Test handling of long*seq and seq*long
Guido van Rossume2a383d2007-01-15 16:59:06 +00001265 class L(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001266 pass
Guido van Rossume2a383d2007-01-15 16:59:06 +00001267 vereq("a"*L(2), "aa")
1268 vereq(L(2)*"a", "aa")
Guido van Rossum45704552001-10-08 16:35:45 +00001269 vereq(2*L(3), 6)
1270 vereq(L(3)*2, 6)
1271 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001272
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001273 # Test comparison of classes with dynamic metaclasses
1274 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001275 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001276 class someclass:
1277 __metaclass__ = dynamicmetaclass
1278 verify(someclass != object)
1279
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280def errors():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001281 if verbose: print("Testing errors...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001282
1283 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001284 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001285 pass
1286 except TypeError:
1287 pass
1288 else:
1289 verify(0, "inheritance from both list and dict should be illegal")
1290
1291 try:
1292 class C(object, None):
1293 pass
1294 except TypeError:
1295 pass
1296 else:
1297 verify(0, "inheritance from non-type should be illegal")
1298 class Classic:
1299 pass
1300
1301 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001302 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001303 pass
1304 except TypeError:
1305 pass
1306 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001307 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001308
1309 try:
1310 class C(object):
1311 __slots__ = 1
1312 except TypeError:
1313 pass
1314 else:
1315 verify(0, "__slots__ = 1 should be illegal")
1316
1317 try:
1318 class C(object):
1319 __slots__ = [1]
1320 except TypeError:
1321 pass
1322 else:
1323 verify(0, "__slots__ = [1] should be illegal")
1324
1325def classmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001326 if verbose: print("Testing class methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001327 class C(object):
1328 def foo(*a): return a
1329 goo = classmethod(foo)
1330 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001331 vereq(C.goo(1), (C, 1))
1332 vereq(c.goo(1), (C, 1))
1333 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001334 class D(C):
1335 pass
1336 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001337 vereq(D.goo(1), (D, 1))
1338 vereq(d.goo(1), (D, 1))
1339 vereq(d.foo(1), (d, 1))
1340 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001341 # Test for a specific crash (SF bug 528132)
1342 def f(cls, arg): return (cls, arg)
1343 ff = classmethod(f)
1344 vereq(ff.__get__(0, int)(42), (int, 42))
1345 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001346
Guido van Rossum155db9a2002-04-02 17:53:47 +00001347 # Test super() with classmethods (SF bug 535444)
1348 veris(C.goo.im_self, C)
1349 veris(D.goo.im_self, D)
1350 veris(super(D,D).goo.im_self, D)
1351 veris(super(D,d).goo.im_self, D)
1352 vereq(super(D,D).goo(), (D,))
1353 vereq(super(D,d).goo(), (D,))
1354
Raymond Hettingerbe971532003-06-18 01:13:41 +00001355 # Verify that argument is checked for callability (SF bug 753451)
1356 try:
1357 classmethod(1).__get__(1)
1358 except TypeError:
1359 pass
1360 else:
1361 raise TestFailed, "classmethod should check for callability"
1362
Georg Brandl6a29c322006-02-21 22:17:46 +00001363 # Verify that classmethod() doesn't allow keyword args
1364 try:
1365 classmethod(f, kw=1)
1366 except TypeError:
1367 pass
1368 else:
1369 raise TestFailed, "classmethod shouldn't accept keyword args"
1370
Fred Drakef841aa62002-03-28 15:49:54 +00001371def classmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001372 if verbose: print("Testing C-based class methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001373 import xxsubtype as spam
1374 a = (1, 2, 3)
1375 d = {'abc': 123}
1376 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001377 veris(x, spam.spamlist)
1378 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001379 vereq(d, d1)
1380 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
Tim Petersbca1cbc2002-12-09 22:56:13 +00001381 veris(x, spam.spamlist)
1382 vereq(a, a1)
Fred Drakef841aa62002-03-28 15:49:54 +00001383 vereq(d, d1)
1384
Tim Peters6d6c1a32001-08-02 04:15:00 +00001385def staticmethods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001386 if verbose: print("Testing static methods...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001387 class C(object):
1388 def foo(*a): return a
1389 goo = staticmethod(foo)
1390 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001391 vereq(C.goo(1), (1,))
1392 vereq(c.goo(1), (1,))
1393 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001394 class D(C):
1395 pass
1396 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001397 vereq(D.goo(1), (1,))
1398 vereq(d.goo(1), (1,))
1399 vereq(d.foo(1), (d, 1))
1400 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001401
Fred Drakef841aa62002-03-28 15:49:54 +00001402def staticmethods_in_c():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001403 if verbose: print("Testing C-based static methods...")
Fred Drakef841aa62002-03-28 15:49:54 +00001404 import xxsubtype as spam
1405 a = (1, 2, 3)
1406 d = {"abc": 123}
1407 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1408 veris(x, None)
1409 vereq(a, a1)
1410 vereq(d, d1)
1411 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1412 veris(x, None)
1413 vereq(a, a1)
1414 vereq(d, d1)
1415
Tim Peters6d6c1a32001-08-02 04:15:00 +00001416def classic():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001417 if verbose: print("Testing classic classes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001418 class C:
1419 def foo(*a): return a
1420 goo = classmethod(foo)
1421 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001422 vereq(C.goo(1), (C, 1))
1423 vereq(c.goo(1), (C, 1))
1424 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001425 class D(C):
1426 pass
1427 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001428 vereq(D.goo(1), (D, 1))
1429 vereq(d.goo(1), (D, 1))
1430 vereq(d.foo(1), (d, 1))
1431 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001432 class E: # *not* subclassing from C
1433 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001435 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001436
1437def compattr():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001438 if verbose: print("Testing computed attributes...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001439 class C(object):
1440 class computed_attribute(object):
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001441 def __init__(self, get, set=None, delete=None):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001442 self.__get = get
1443 self.__set = set
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001444 self.__delete = delete
Tim Peters6d6c1a32001-08-02 04:15:00 +00001445 def __get__(self, obj, type=None):
1446 return self.__get(obj)
1447 def __set__(self, obj, value):
1448 return self.__set(obj, value)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001449 def __delete__(self, obj):
1450 return self.__delete(obj)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001451 def __init__(self):
1452 self.__x = 0
1453 def __get_x(self):
1454 x = self.__x
1455 self.__x = x+1
1456 return x
1457 def __set_x(self, x):
1458 self.__x = x
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001459 def __delete_x(self):
1460 del self.__x
1461 x = computed_attribute(__get_x, __set_x, __delete_x)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001462 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001463 vereq(a.x, 0)
1464 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001465 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001466 vereq(a.x, 10)
1467 vereq(a.x, 11)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001468 del a.x
1469 vereq(hasattr(a, 'x'), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001470
1471def newslot():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001472 if verbose: print("Testing __new__ slot override...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001473 class C(list):
1474 def __new__(cls):
1475 self = list.__new__(cls)
1476 self.foo = 1
1477 return self
1478 def __init__(self):
1479 self.foo = self.foo + 2
1480 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001481 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001482 verify(a.__class__ is C)
1483 class D(C):
1484 pass
1485 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001486 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001487 verify(b.__class__ is D)
1488
Tim Peters6d6c1a32001-08-02 04:15:00 +00001489def altmro():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001490 if verbose: print("Testing mro() and overriding it...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001491 class A(object):
1492 def f(self): return "A"
1493 class B(A):
1494 pass
1495 class C(A):
1496 def f(self): return "C"
1497 class D(B, C):
1498 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001499 vereq(D.mro(), [D, B, C, A, object])
1500 vereq(D.__mro__, (D, B, C, A, object))
1501 vereq(D().f(), "C")
Guido van Rossum9a818922002-11-14 19:50:14 +00001502
Guido van Rossumd3077402001-08-12 05:24:18 +00001503 class PerverseMetaType(type):
1504 def mro(cls):
1505 L = type.mro(cls)
1506 L.reverse()
1507 return L
Guido van Rossum9a818922002-11-14 19:50:14 +00001508 class X(D,B,C,A):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001510 vereq(X.__mro__, (object, A, C, B, D, X))
1511 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001512
Armin Rigo037d1e02005-12-29 17:07:39 +00001513 try:
1514 class X(object):
1515 class __metaclass__(type):
1516 def mro(self):
1517 return [self, dict, object]
1518 except TypeError:
1519 pass
1520 else:
1521 raise TestFailed, "devious mro() return not caught"
1522
1523 try:
1524 class X(object):
1525 class __metaclass__(type):
1526 def mro(self):
1527 return [1]
1528 except TypeError:
1529 pass
1530 else:
1531 raise TestFailed, "non-class mro() return not caught"
1532
1533 try:
1534 class X(object):
1535 class __metaclass__(type):
1536 def mro(self):
1537 return 1
1538 except TypeError:
1539 pass
1540 else:
1541 raise TestFailed, "non-sequence mro() return not caught"
Tim Peters1b27f862005-12-30 18:42:42 +00001542
Armin Rigo037d1e02005-12-29 17:07:39 +00001543
Tim Peters6d6c1a32001-08-02 04:15:00 +00001544def overloading():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001545 if verbose: print("Testing operator overloading...")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001546
1547 class B(object):
1548 "Intermediate class because object doesn't have a __setattr__"
1549
1550 class C(B):
1551
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001552 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001553 if name == "foo":
1554 return ("getattr", name)
1555 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001556 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001557 def __setattr__(self, name, value):
1558 if name == "foo":
1559 self.setattr = (name, value)
1560 else:
1561 return B.__setattr__(self, name, value)
1562 def __delattr__(self, name):
1563 if name == "foo":
1564 self.delattr = name
1565 else:
1566 return B.__delattr__(self, name)
1567
1568 def __getitem__(self, key):
1569 return ("getitem", key)
1570 def __setitem__(self, key, value):
1571 self.setitem = (key, value)
1572 def __delitem__(self, key):
1573 self.delitem = key
1574
1575 def __getslice__(self, i, j):
1576 return ("getslice", i, j)
1577 def __setslice__(self, i, j, value):
1578 self.setslice = (i, j, value)
1579 def __delslice__(self, i, j):
1580 self.delslice = (i, j)
1581
1582 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001583 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001584 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001585 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001586 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001587 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001588
Guido van Rossum45704552001-10-08 16:35:45 +00001589 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001590 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001591 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001592 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001593 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001594
Guido van Rossum45704552001-10-08 16:35:45 +00001595 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001596 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001597 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001598 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001599 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001600
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001601def methods():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001602 if verbose: print("Testing methods...")
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001603 class C(object):
1604 def __init__(self, x):
1605 self.x = x
1606 def foo(self):
1607 return self.x
1608 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001609 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001610 class D(C):
1611 boo = C.foo
1612 goo = c1.foo
1613 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001614 vereq(d2.foo(), 2)
1615 vereq(d2.boo(), 2)
1616 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001617 class E(object):
1618 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001619 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001620 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001621
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001622def specials():
1623 # Test operators like __hash__ for which a built-in default exists
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001624 if verbose: print("Testing special operators...")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001625 # Test the default behavior for static classes
1626 class C(object):
1627 def __getitem__(self, i):
1628 if 0 <= i < 10: return i
1629 raise IndexError
1630 c1 = C()
1631 c2 = C()
1632 verify(not not c1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001633 verify(id(c1) != id(c2))
1634 hash(c1)
1635 hash(c2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001636 ##vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001637 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001638 verify(c1 != c2)
1639 verify(not c1 != c1)
1640 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001641 # Note that the module name appears in str/repr, and that varies
1642 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001643 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001645 verify(-1 not in c1)
1646 for i in range(10):
1647 verify(i in c1)
1648 verify(10 not in c1)
1649 # Test the default behavior for dynamic classes
1650 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001651 def __getitem__(self, i):
1652 if 0 <= i < 10: return i
1653 raise IndexError
1654 d1 = D()
1655 d2 = D()
1656 verify(not not d1)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001657 verify(id(d1) != id(d2))
1658 hash(d1)
1659 hash(d2)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001660 ##vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
Guido van Rossum45704552001-10-08 16:35:45 +00001661 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001662 verify(d1 != d2)
1663 verify(not d1 != d1)
1664 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001665 # Note that the module name appears in str/repr, and that varies
1666 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001667 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001668 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001669 verify(-1 not in d1)
1670 for i in range(10):
1671 verify(i in d1)
1672 verify(10 not in d1)
1673 # Test overridden behavior for static classes
1674 class Proxy(object):
1675 def __init__(self, x):
1676 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001677 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001678 return not not self.x
1679 def __hash__(self):
1680 return hash(self.x)
1681 def __eq__(self, other):
1682 return self.x == other
1683 def __ne__(self, other):
1684 return self.x != other
1685 def __cmp__(self, other):
1686 return cmp(self.x, other.x)
1687 def __str__(self):
1688 return "Proxy:%s" % self.x
1689 def __repr__(self):
1690 return "Proxy(%r)" % self.x
1691 def __contains__(self, value):
1692 return value in self.x
1693 p0 = Proxy(0)
1694 p1 = Proxy(1)
1695 p_1 = Proxy(-1)
1696 verify(not p0)
1697 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001698 vereq(hash(p0), hash(0))
1699 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001700 verify(p0 != p1)
1701 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001702 vereq(not p0, p1)
1703 vereq(cmp(p0, p1), -1)
1704 vereq(cmp(p0, p0), 0)
1705 vereq(cmp(p0, p_1), 1)
1706 vereq(str(p0), "Proxy:0")
1707 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001708 p10 = Proxy(range(10))
1709 verify(-1 not in p10)
1710 for i in range(10):
1711 verify(i in p10)
1712 verify(10 not in p10)
1713 # Test overridden behavior for dynamic classes
1714 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001715 def __init__(self, x):
1716 self.x = x
Jack Diederich4dafcc42006-11-28 19:15:13 +00001717 def __bool__(self):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001718 return not not self.x
1719 def __hash__(self):
1720 return hash(self.x)
1721 def __eq__(self, other):
1722 return self.x == other
1723 def __ne__(self, other):
1724 return self.x != other
1725 def __cmp__(self, other):
1726 return cmp(self.x, other.x)
1727 def __str__(self):
1728 return "DProxy:%s" % self.x
1729 def __repr__(self):
1730 return "DProxy(%r)" % self.x
1731 def __contains__(self, value):
1732 return value in self.x
1733 p0 = DProxy(0)
1734 p1 = DProxy(1)
1735 p_1 = DProxy(-1)
1736 verify(not p0)
1737 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001738 vereq(hash(p0), hash(0))
1739 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001740 verify(p0 != p1)
1741 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001742 vereq(not p0, p1)
1743 vereq(cmp(p0, p1), -1)
1744 vereq(cmp(p0, p0), 0)
1745 vereq(cmp(p0, p_1), 1)
1746 vereq(str(p0), "DProxy:0")
1747 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001748 p10 = DProxy(range(10))
1749 verify(-1 not in p10)
1750 for i in range(10):
1751 verify(i in p10)
1752 verify(10 not in p10)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00001753## # Safety test for __cmp__
1754## def unsafecmp(a, b):
1755## try:
1756## a.__class__.__cmp__(a, b)
1757## except TypeError:
1758## pass
1759## else:
1760## raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1761## a.__class__, a, b)
1762## unsafecmp(u"123", "123")
1763## unsafecmp("123", u"123")
1764## unsafecmp(1, 1.0)
1765## unsafecmp(1.0, 1)
1766## unsafecmp(1, 1L)
1767## unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001768
Neal Norwitz1a997502003-01-13 20:13:12 +00001769 class Letter(str):
1770 def __new__(cls, letter):
1771 if letter == 'EPS':
1772 return str.__new__(cls)
1773 return str.__new__(cls, letter)
1774 def __str__(self):
1775 if not self:
1776 return 'EPS'
Tim Petersf2715e02003-02-19 02:35:07 +00001777 return self
Neal Norwitz1a997502003-01-13 20:13:12 +00001778
1779 # sys.stdout needs to be the original to trigger the recursion bug
1780 import sys
1781 test_stdout = sys.stdout
1782 sys.stdout = get_original_stdout()
1783 try:
1784 # nothing should actually be printed, this should raise an exception
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001785 print(Letter('w'))
Neal Norwitz1a997502003-01-13 20:13:12 +00001786 except RuntimeError:
1787 pass
1788 else:
1789 raise TestFailed, "expected a RuntimeError for print recursion"
1790 sys.stdout = test_stdout
1791
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001792def weakrefs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001793 if verbose: print("Testing weak references...")
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001794 import weakref
1795 class C(object):
1796 pass
1797 c = C()
1798 r = weakref.ref(c)
1799 verify(r() is c)
1800 del c
1801 verify(r() is None)
1802 del r
1803 class NoWeak(object):
1804 __slots__ = ['foo']
1805 no = NoWeak()
1806 try:
1807 weakref.ref(no)
Guido van Rossumb940e112007-01-10 16:19:56 +00001808 except TypeError as msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001809 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001810 else:
1811 verify(0, "weakref.ref(no) should be illegal")
1812 class Weak(object):
1813 __slots__ = ['foo', '__weakref__']
1814 yes = Weak()
1815 r = weakref.ref(yes)
1816 verify(r() is yes)
1817 del yes
1818 verify(r() is None)
1819 del r
1820
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001821def properties():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001822 if verbose: print("Testing property...")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001823 class C(object):
1824 def getx(self):
1825 return self.__x
1826 def setx(self, value):
1827 self.__x = value
1828 def delx(self):
1829 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001830 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001831 a = C()
1832 verify(not hasattr(a, "x"))
1833 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001834 vereq(a._C__x, 42)
1835 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001836 del a.x
1837 verify(not hasattr(a, "x"))
1838 verify(not hasattr(a, "_C__x"))
1839 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001840 vereq(C.x.__get__(a), 100)
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00001841 C.x.__delete__(a)
1842 verify(not hasattr(a, "x"))
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001843
Tim Peters66c1a522001-09-24 21:17:50 +00001844 raw = C.__dict__['x']
1845 verify(isinstance(raw, property))
1846
1847 attrs = dir(raw)
1848 verify("__doc__" in attrs)
1849 verify("fget" in attrs)
1850 verify("fset" in attrs)
1851 verify("fdel" in attrs)
1852
Guido van Rossum45704552001-10-08 16:35:45 +00001853 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001854 verify(raw.fget is C.__dict__['getx'])
1855 verify(raw.fset is C.__dict__['setx'])
1856 verify(raw.fdel is C.__dict__['delx'])
1857
1858 for attr in "__doc__", "fget", "fset", "fdel":
1859 try:
1860 setattr(raw, attr, 42)
Guido van Rossumb940e112007-01-10 16:19:56 +00001861 except TypeError as msg:
Tim Peters66c1a522001-09-24 21:17:50 +00001862 if str(msg).find('readonly') < 0:
1863 raise TestFailed("when setting readonly attr %r on a "
1864 "property, got unexpected TypeError "
1865 "msg %r" % (attr, str(msg)))
1866 else:
1867 raise TestFailed("expected TypeError from trying to set "
1868 "readonly %r attr on a property" % attr)
1869
Neal Norwitz673cd822002-10-18 16:33:13 +00001870 class D(object):
1871 __getitem__ = property(lambda s: 1/0)
1872
1873 d = D()
1874 try:
1875 for i in d:
1876 str(i)
1877 except ZeroDivisionError:
1878 pass
1879 else:
1880 raise TestFailed, "expected ZeroDivisionError from bad property"
1881
Georg Brandl533ff6f2006-03-08 18:09:27 +00001882 class E(object):
1883 def getter(self):
1884 "getter method"
1885 return 0
1886 def setter(self, value):
1887 "setter method"
1888 pass
1889 prop = property(getter)
1890 vereq(prop.__doc__, "getter method")
1891 prop2 = property(fset=setter)
1892 vereq(prop2.__doc__, None)
1893
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001894 # this segfaulted in 2.5b2
1895 try:
1896 import _testcapi
1897 except ImportError:
1898 pass
1899 else:
1900 class X(object):
1901 p = property(_testcapi.test_with_docstring)
1902
1903
Guido van Rossumc4a18802001-08-24 16:55:27 +00001904def supers():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00001905 if verbose: print("Testing super...")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001906
1907 class A(object):
1908 def meth(self, a):
1909 return "A(%r)" % a
1910
Guido van Rossum45704552001-10-08 16:35:45 +00001911 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001912
1913 class B(A):
1914 def __init__(self):
1915 self.__super = super(B, self)
1916 def meth(self, a):
1917 return "B(%r)" % a + self.__super.meth(a)
1918
Guido van Rossum45704552001-10-08 16:35:45 +00001919 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001920
1921 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001922 def meth(self, a):
1923 return "C(%r)" % a + self.__super.meth(a)
1924 C._C__super = super(C)
1925
Guido van Rossum45704552001-10-08 16:35:45 +00001926 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001927
1928 class D(C, B):
1929 def meth(self, a):
1930 return "D(%r)" % a + super(D, self).meth(a)
1931
Guido van Rossum5b443c62001-12-03 15:38:28 +00001932 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1933
1934 # Test for subclassing super
1935
1936 class mysuper(super):
1937 def __init__(self, *args):
1938 return super(mysuper, self).__init__(*args)
1939
1940 class E(D):
1941 def meth(self, a):
1942 return "E(%r)" % a + mysuper(E, self).meth(a)
1943
1944 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1945
1946 class F(E):
1947 def meth(self, a):
Guido van Rossuma4541a32003-04-16 20:02:22 +00001948 s = self.__super # == mysuper(F, self)
Guido van Rossum5b443c62001-12-03 15:38:28 +00001949 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1950 F._F__super = mysuper(F)
1951
1952 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1953
1954 # Make sure certain errors are raised
1955
1956 try:
1957 super(D, 42)
1958 except TypeError:
1959 pass
1960 else:
1961 raise TestFailed, "shouldn't allow super(D, 42)"
1962
1963 try:
1964 super(D, C())
1965 except TypeError:
1966 pass
1967 else:
1968 raise TestFailed, "shouldn't allow super(D, C())"
1969
1970 try:
1971 super(D).__get__(12)
1972 except TypeError:
1973 pass
1974 else:
1975 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1976
1977 try:
1978 super(D).__get__(C())
1979 except TypeError:
1980 pass
1981 else:
1982 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001983
Guido van Rossuma4541a32003-04-16 20:02:22 +00001984 # Make sure data descriptors can be overridden and accessed via super
1985 # (new feature in Python 2.3)
1986
1987 class DDbase(object):
1988 def getx(self): return 42
1989 x = property(getx)
1990
1991 class DDsub(DDbase):
1992 def getx(self): return "hello"
1993 x = property(getx)
1994
1995 dd = DDsub()
1996 vereq(dd.x, "hello")
1997 vereq(super(DDsub, dd).x, 42)
1998
Phillip J. Eby91a968a2004-03-25 02:19:34 +00001999 # Ensure that super() lookup of descriptor from classmethod
2000 # works (SF ID# 743627)
2001
2002 class Base(object):
2003 aProp = property(lambda self: "foo")
2004
2005 class Sub(Base):
Guido van Rossum5a8a0372005-01-16 00:25:31 +00002006 @classmethod
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002007 def test(klass):
2008 return super(Sub,klass).aProp
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002009
2010 veris(Sub.test(), Base.aProp)
2011
Thomas Wouters89f507f2006-12-13 04:49:30 +00002012 # Verify that super() doesn't allow keyword args
2013 try:
2014 super(Base, kw=1)
2015 except TypeError:
2016 pass
2017 else:
2018 raise TestFailed, "super shouldn't accept keyword args"
Phillip J. Eby91a968a2004-03-25 02:19:34 +00002019
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002020def inherits():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002021 if verbose: print("Testing inheritance from basic types...")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002022
2023 class hexint(int):
2024 def __repr__(self):
2025 return hex(self)
2026 def __add__(self, other):
2027 return hexint(int.__add__(self, other))
2028 # (Note that overriding __radd__ doesn't work,
2029 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00002030 vereq(repr(hexint(7) + 9), "0x10")
2031 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00002032 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002033 vereq(a, 12345)
2034 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00002035 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00002036 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00002037 verify((+a).__class__ is int)
2038 verify((a >> 0).__class__ is int)
2039 verify((a << 0).__class__ is int)
2040 verify((hexint(0) << 12).__class__ is int)
2041 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002042
Guido van Rossume2a383d2007-01-15 16:59:06 +00002043 class octlong(int):
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002044 __slots__ = []
2045 def __str__(self):
2046 s = oct(self)
2047 if s[-1] == 'L':
2048 s = s[:-1]
2049 return s
2050 def __add__(self, other):
2051 return self.__class__(super(octlong, self).__add__(other))
2052 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00002053 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002054 # (Note that overriding __radd__ here only seems to work
2055 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00002056 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00002057 a = octlong(12345)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002058 vereq(a, 12345)
2059 vereq(int(a), 12345)
2060 vereq(hash(a), hash(12345))
2061 verify(int(a).__class__ is int)
2062 verify((+a).__class__ is int)
2063 verify((-a).__class__ is int)
2064 verify((-octlong(0)).__class__ is int)
2065 verify((a >> 0).__class__ is int)
2066 verify((a << 0).__class__ is int)
2067 verify((a - 0).__class__ is int)
2068 verify((a * 1).__class__ is int)
2069 verify((a ** 1).__class__ is int)
2070 verify((a // 1).__class__ is int)
2071 verify((1 * a).__class__ is int)
2072 verify((a | 0).__class__ is int)
2073 verify((a ^ 0).__class__ is int)
2074 verify((a & -1).__class__ is int)
2075 verify((octlong(0) << 12).__class__ is int)
2076 verify((octlong(0) >> 12).__class__ is int)
2077 verify(abs(octlong(0)).__class__ is int)
Tim Peters69c2de32001-09-11 22:31:33 +00002078
2079 # Because octlong overrides __add__, we can't check the absence of +0
2080 # optimizations using octlong.
Guido van Rossume2a383d2007-01-15 16:59:06 +00002081 class longclone(int):
Tim Peters69c2de32001-09-11 22:31:33 +00002082 pass
2083 a = longclone(1)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002084 verify((a + 0).__class__ is int)
2085 verify((0 + a).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002086
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002087 # Check that negative clones don't segfault
2088 a = longclone(-1)
2089 vereq(a.__dict__, {})
Guido van Rossume2a383d2007-01-15 16:59:06 +00002090 vereq(int(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00002091
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002092 class precfloat(float):
2093 __slots__ = ['prec']
2094 def __init__(self, value=0.0, prec=12):
2095 self.prec = int(prec)
2096 float.__init__(value)
2097 def __repr__(self):
2098 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00002099 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00002100 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00002101 vereq(a, 12345.0)
2102 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00002103 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00002104 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00002105 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002106
Tim Peters2400fa42001-09-12 19:12:49 +00002107 class madcomplex(complex):
2108 def __repr__(self):
2109 return "%.17gj%+.17g" % (self.imag, self.real)
2110 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00002111 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00002112 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002113 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002114 vereq(a, base)
2115 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002116 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00002117 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00002118 vereq(repr(a), "4j-3")
2119 vereq(a, base)
2120 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002121 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002122 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002123 veris((+a).__class__, complex)
2124 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002125 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002126 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002127 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002128 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002129 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002130 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00002131 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00002132
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002133 class madtuple(tuple):
2134 _rev = None
2135 def rev(self):
2136 if self._rev is not None:
2137 return self._rev
2138 L = list(self)
2139 L.reverse()
2140 self._rev = self.__class__(L)
2141 return self._rev
2142 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00002143 vereq(a, (1,2,3,4,5,6,7,8,9,0))
2144 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
2145 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002146 for i in range(512):
2147 t = madtuple(range(i))
2148 u = t.rev()
2149 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002150 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00002151 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00002152 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00002153 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00002154 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00002155 verify(a[:].__class__ is tuple)
2156 verify((a * 1).__class__ is tuple)
2157 verify((a * 0).__class__ is tuple)
2158 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00002159 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00002160 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00002161 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00002162 verify((a + a).__class__ is tuple)
2163 verify((a * 0).__class__ is tuple)
2164 verify((a * 1).__class__ is tuple)
2165 verify((a * 2).__class__ is tuple)
2166 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002167
2168 class madstring(str):
2169 _rev = None
2170 def rev(self):
2171 if self._rev is not None:
2172 return self._rev
2173 L = list(self)
2174 L.reverse()
2175 self._rev = self.__class__("".join(L))
2176 return self._rev
2177 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00002178 vereq(s, "abcdefghijklmnopqrstuvwxyz")
2179 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
2180 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002181 for i in range(256):
2182 s = madstring("".join(map(chr, range(i))))
2183 t = s.rev()
2184 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00002185 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00002186 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00002187 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00002188 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002189
Tim Peters8fa5dd02001-09-12 02:18:30 +00002190 base = "\x00" * 5
2191 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002192 vereq(s, base)
2193 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00002194 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002195 vereq(hash(s), hash(base))
2196 vereq({s: 1}[base], 1)
2197 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002198 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002199 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002200 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002201 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002202 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002203 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002204 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002205 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002206 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002207 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002208 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002209 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002210 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002211 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002212 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002213 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002214 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002215 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002216 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002217 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002218 identitytab = ''.join([chr(i) for i in range(256)])
2219 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002220 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002221 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002222 vereq(s.translate(identitytab, "x"), base)
2223 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00002224 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002225 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002226 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002227 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002228 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002229 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00002230 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002231 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002232 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00002233 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00002234
Guido van Rossum91ee7982001-08-30 20:52:40 +00002235 class madunicode(unicode):
2236 _rev = None
2237 def rev(self):
2238 if self._rev is not None:
2239 return self._rev
2240 L = list(self)
2241 L.reverse()
2242 self._rev = self.__class__(u"".join(L))
2243 return self._rev
2244 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00002245 vereq(u, u"ABCDEF")
2246 vereq(u.rev(), madunicode(u"FEDCBA"))
2247 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00002248 base = u"12345"
2249 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00002250 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00002251 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002252 vereq(hash(u), hash(base))
2253 vereq({u: 1}[base], 1)
2254 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00002255 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002256 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002257 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002258 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002259 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002260 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002261 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002263 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002264 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002265 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002266 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002267 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002268 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002269 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002270 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002271 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002272 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002273 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002274 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002275 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002276 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002277 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002278 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002279 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002280 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002281 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002282 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002283 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002284 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002285 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002286 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002287 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002288 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002289 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002290 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002291 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002292 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002293
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002294 class sublist(list):
2295 pass
2296 a = sublist(range(5))
2297 vereq(a, range(5))
2298 a.append("hello")
2299 vereq(a, range(5) + ["hello"])
2300 a[5] = 5
2301 vereq(a, range(6))
2302 a.extend(range(6, 20))
2303 vereq(a, range(20))
2304 a[-5:] = []
2305 vereq(a, range(15))
2306 del a[10:15]
2307 vereq(len(a), 10)
2308 vereq(a, range(10))
2309 vereq(list(a), range(10))
2310 vereq(a[0], 0)
2311 vereq(a[9], 9)
2312 vereq(a[-10], 0)
2313 vereq(a[-1], 9)
2314 vereq(a[:5], range(5))
2315
Tim Peters59c9a642001-09-13 05:38:56 +00002316 class CountedInput(file):
2317 """Counts lines read by self.readline().
2318
2319 self.lineno is the 0-based ordinal of the last line read, up to
2320 a maximum of one greater than the number of lines in the file.
2321
2322 self.ateof is true if and only if the final "" line has been read,
2323 at which point self.lineno stops incrementing, and further calls
2324 to readline() continue to return "".
2325 """
2326
2327 lineno = 0
2328 ateof = 0
2329 def readline(self):
2330 if self.ateof:
2331 return ""
2332 s = file.readline(self)
2333 # Next line works too.
2334 # s = super(CountedInput, self).readline()
2335 self.lineno += 1
2336 if s == "":
2337 self.ateof = 1
2338 return s
2339
Alex Martelli01c77c62006-08-24 02:58:11 +00002340 f = open(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002341 lines = ['a\n', 'b\n', 'c\n']
2342 try:
2343 f.writelines(lines)
2344 f.close()
2345 f = CountedInput(TESTFN)
2346 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2347 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002348 vereq(expected, got)
2349 vereq(f.lineno, i)
2350 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002351 f.close()
2352 finally:
2353 try:
2354 f.close()
2355 except:
2356 pass
2357 try:
2358 import os
2359 os.unlink(TESTFN)
2360 except:
2361 pass
2362
Tim Peters808b94e2001-09-13 19:33:07 +00002363def keywords():
2364 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002365 print("Testing keyword args to basic type constructors ...")
Guido van Rossum45704552001-10-08 16:35:45 +00002366 vereq(int(x=1), 1)
2367 vereq(float(x=2), 2.0)
Guido van Rossume2a383d2007-01-15 16:59:06 +00002368 vereq(int(x=3), 3)
Guido van Rossum45704552001-10-08 16:35:45 +00002369 vereq(complex(imag=42, real=666), complex(666, 42))
2370 vereq(str(object=500), '500')
2371 vereq(unicode(string='abc', errors='strict'), u'abc')
2372 vereq(tuple(sequence=range(3)), (0, 1, 2))
2373 vereq(list(sequence=(0, 1, 2)), range(3))
Just van Rossuma797d812002-11-23 09:45:04 +00002374 # note: as of Python 2.3, dict() no longer has an "items" keyword arg
Tim Peters808b94e2001-09-13 19:33:07 +00002375
Guido van Rossume2a383d2007-01-15 16:59:06 +00002376 for constructor in (int, float, int, complex, str, unicode,
Just van Rossuma797d812002-11-23 09:45:04 +00002377 tuple, list, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002378 try:
2379 constructor(bogus_keyword_arg=1)
2380 except TypeError:
2381 pass
2382 else:
2383 raise TestFailed("expected TypeError from bogus keyword "
2384 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002385
Tim Peters8fa45672001-09-13 21:01:29 +00002386def restricted():
Guido van Rossum4f374182003-01-06 16:03:43 +00002387 # XXX This test is disabled because rexec is not deemed safe
2388 return
Tim Peters8fa45672001-09-13 21:01:29 +00002389 import rexec
2390 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002391 print("Testing interaction with restricted execution ...")
Tim Peters8fa45672001-09-13 21:01:29 +00002392
2393 sandbox = rexec.RExec()
2394
2395 code1 = """f = open(%r, 'w')""" % TESTFN
Alex Martelli01c77c62006-08-24 02:58:11 +00002396 code2 = """f = open(%r, 'w')""" % TESTFN
Tim Peters8fa45672001-09-13 21:01:29 +00002397 code3 = """\
2398f = open(%r)
2399t = type(f) # a sneaky way to get the file() constructor
2400f.close()
2401f = t(%r, 'w') # rexec can't catch this by itself
2402""" % (TESTFN, TESTFN)
2403
2404 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2405 f.close()
2406
2407 try:
2408 for code in code1, code2, code3:
2409 try:
2410 sandbox.r_exec(code)
Guido van Rossumb940e112007-01-10 16:19:56 +00002411 except IOError as msg:
Tim Peters8fa45672001-09-13 21:01:29 +00002412 if str(msg).find("restricted") >= 0:
2413 outcome = "OK"
2414 else:
2415 outcome = "got an exception, but not an expected one"
2416 else:
2417 outcome = "expected a restricted-execution exception"
2418
2419 if outcome != "OK":
2420 raise TestFailed("%s, in %r" % (outcome, code))
2421
2422 finally:
2423 try:
2424 import os
2425 os.unlink(TESTFN)
2426 except:
2427 pass
2428
Tim Peters0ab085c2001-09-14 00:25:33 +00002429def str_subclass_as_dict_key():
2430 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002431 print("Testing a str subclass used as dict key ..")
Tim Peters0ab085c2001-09-14 00:25:33 +00002432
2433 class cistr(str):
2434 """Sublcass of str that computes __eq__ case-insensitively.
2435
2436 Also computes a hash code of the string in canonical form.
2437 """
2438
2439 def __init__(self, value):
2440 self.canonical = value.lower()
2441 self.hashcode = hash(self.canonical)
2442
2443 def __eq__(self, other):
2444 if not isinstance(other, cistr):
2445 other = cistr(other)
2446 return self.canonical == other.canonical
2447
2448 def __hash__(self):
2449 return self.hashcode
2450
Guido van Rossum45704552001-10-08 16:35:45 +00002451 vereq(cistr('ABC'), 'abc')
2452 vereq('aBc', cistr('ABC'))
2453 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002454
2455 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002456 vereq(d[cistr('one')], 1)
2457 vereq(d[cistr('tWo')], 2)
2458 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002459 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002460 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002461
Guido van Rossumab3b0342001-09-18 20:38:53 +00002462def classic_comparisons():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002463 if verbose: print("Testing classic comparisons...")
Guido van Rossum0639f592001-09-18 21:06:04 +00002464 class classic:
2465 pass
2466 for base in (classic, int, object):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002467 if verbose: print(" (base = %s)" % base)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002468 class C(base):
2469 def __init__(self, value):
2470 self.value = int(value)
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002471 def __eq__(self, other):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002472 if isinstance(other, C):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002473 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002474 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002475 return self.value == other
Guido van Rossumab3b0342001-09-18 20:38:53 +00002476 return NotImplemented
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002477 def __ne__(self, other):
2478 if isinstance(other, C):
2479 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002480 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002481 return self.value != other
2482 return NotImplemented
2483 def __lt__(self, other):
2484 if isinstance(other, C):
2485 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002486 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002487 return self.value < other
2488 return NotImplemented
2489 def __le__(self, other):
2490 if isinstance(other, C):
2491 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002492 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002493 return self.value <= other
2494 return NotImplemented
2495 def __gt__(self, other):
2496 if isinstance(other, C):
2497 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002498 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002499 return self.value > other
2500 return NotImplemented
2501 def __ge__(self, other):
2502 if isinstance(other, C):
2503 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002504 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002505 return self.value >= other
2506 return NotImplemented
2507
Guido van Rossumab3b0342001-09-18 20:38:53 +00002508 c1 = C(1)
2509 c2 = C(2)
2510 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002511 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002512 c = {1: c1, 2: c2, 3: c3}
2513 for x in 1, 2, 3:
2514 for y in 1, 2, 3:
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002515 ##verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002516 for op in "<", "<=", "==", "!=", ">", ">=":
2517 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2518 "x=%d, y=%d" % (x, y))
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002519 ##verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2520 ##verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
Guido van Rossumab3b0342001-09-18 20:38:53 +00002521
Guido van Rossum0639f592001-09-18 21:06:04 +00002522def rich_comparisons():
2523 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002524 print("Testing rich comparisons...")
Guido van Rossum22056422001-09-24 17:52:04 +00002525 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002526 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002527 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002528 vereq(z, 1+0j)
2529 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002530 class ZZ(complex):
2531 def __eq__(self, other):
2532 try:
2533 return abs(self - other) <= 1e-6
2534 except:
2535 return NotImplemented
2536 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002537 vereq(zz, 1+0j)
2538 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002539
Guido van Rossum0639f592001-09-18 21:06:04 +00002540 class classic:
2541 pass
2542 for base in (classic, int, object, list):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002543 if verbose: print(" (base = %s)" % base)
Guido van Rossum0639f592001-09-18 21:06:04 +00002544 class C(base):
2545 def __init__(self, value):
2546 self.value = int(value)
2547 def __cmp__(self, other):
2548 raise TestFailed, "shouldn't call __cmp__"
2549 def __eq__(self, other):
2550 if isinstance(other, C):
2551 return self.value == other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002552 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002553 return self.value == other
2554 return NotImplemented
2555 def __ne__(self, other):
2556 if isinstance(other, C):
2557 return self.value != other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002558 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002559 return self.value != other
2560 return NotImplemented
2561 def __lt__(self, other):
2562 if isinstance(other, C):
2563 return self.value < other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002564 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002565 return self.value < other
2566 return NotImplemented
2567 def __le__(self, other):
2568 if isinstance(other, C):
2569 return self.value <= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002570 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002571 return self.value <= other
2572 return NotImplemented
2573 def __gt__(self, other):
2574 if isinstance(other, C):
2575 return self.value > other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002576 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002577 return self.value > other
2578 return NotImplemented
2579 def __ge__(self, other):
2580 if isinstance(other, C):
2581 return self.value >= other.value
Guido van Rossume2a383d2007-01-15 16:59:06 +00002582 if isinstance(other, int) or isinstance(other, int):
Guido van Rossum0639f592001-09-18 21:06:04 +00002583 return self.value >= other
2584 return NotImplemented
2585 c1 = C(1)
2586 c2 = C(2)
2587 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002588 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002589 c = {1: c1, 2: c2, 3: c3}
2590 for x in 1, 2, 3:
2591 for y in 1, 2, 3:
2592 for op in "<", "<=", "==", "!=", ">", ">=":
2593 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2594 "x=%d, y=%d" % (x, y))
2595 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2596 "x=%d, y=%d" % (x, y))
2597 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2598 "x=%d, y=%d" % (x, y))
2599
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002600def descrdoc():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002601 if verbose: print("Testing descriptor doc strings...")
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002602 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002603 vereq(descr.__doc__, what)
Guido van Rossum77f6a652002-04-03 22:41:51 +00002604 check(file.closed, "True if the file is closed") # getset descriptor
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002605 check(file.name, "file name") # member descriptor
2606
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002607def setclass():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002608 if verbose: print("Testing __class__ assignment...")
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002609 class C(object): pass
2610 class D(object): pass
2611 class E(object): pass
2612 class F(D, E): pass
2613 for cls in C, D, E, F:
2614 for cls2 in C, D, E, F:
2615 x = cls()
2616 x.__class__ = cls2
2617 verify(x.__class__ is cls2)
2618 x.__class__ = cls
2619 verify(x.__class__ is cls)
2620 def cant(x, C):
2621 try:
2622 x.__class__ = C
2623 except TypeError:
2624 pass
2625 else:
2626 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
Guido van Rossumb6b89422002-04-15 01:03:30 +00002627 try:
2628 delattr(x, "__class__")
2629 except TypeError:
2630 pass
2631 else:
2632 raise TestFailed, "shouldn't allow del %r.__class__" % x
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002633 cant(C(), list)
2634 cant(list(), C)
2635 cant(C(), 1)
2636 cant(C(), object)
2637 cant(object(), list)
2638 cant(list(), object)
Guido van Rossum40af8892002-08-10 05:42:07 +00002639 class Int(int): __slots__ = []
2640 cant(2, Int)
2641 cant(Int(), int)
2642 cant(True, int)
2643 cant(2, bool)
Neal Norwitz78ce6b12002-12-24 15:26:42 +00002644 o = object()
2645 cant(o, type(1))
2646 cant(o, type(None))
2647 del o
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002648
Guido van Rossum6661be32001-10-26 04:26:12 +00002649def setdict():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002650 if verbose: print("Testing __dict__ assignment...")
Guido van Rossum6661be32001-10-26 04:26:12 +00002651 class C(object): pass
2652 a = C()
2653 a.__dict__ = {'b': 1}
2654 vereq(a.b, 1)
2655 def cant(x, dict):
2656 try:
2657 x.__dict__ = dict
Barry Warsawb180c062005-04-20 19:41:36 +00002658 except (AttributeError, TypeError):
Guido van Rossum6661be32001-10-26 04:26:12 +00002659 pass
2660 else:
2661 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2662 cant(a, None)
2663 cant(a, [])
2664 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002665 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002666 # Classes don't allow __dict__ assignment
2667 cant(C, {})
2668
Guido van Rossum3926a632001-09-25 16:25:58 +00002669def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002670 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002671 print("Testing pickling and copying new-style classes and objects...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002672 import pickle
2673 try:
2674 import cPickle
2675 except ImportError:
2676 cPickle = None
Guido van Rossum3926a632001-09-25 16:25:58 +00002677
2678 def sorteditems(d):
Guido van Rossumcc2b0162007-02-11 06:12:03 +00002679 return sorted(d.items())
Guido van Rossum3926a632001-09-25 16:25:58 +00002680
2681 global C
2682 class C(object):
2683 def __init__(self, a, b):
2684 super(C, self).__init__()
2685 self.a = a
2686 self.b = b
2687 def __repr__(self):
2688 return "C(%r, %r)" % (self.a, self.b)
2689
2690 global C1
2691 class C1(list):
2692 def __new__(cls, a, b):
2693 return super(C1, cls).__new__(cls)
Guido van Rossumf6318592003-02-07 14:59:13 +00002694 def __getnewargs__(self):
2695 return (self.a, self.b)
Guido van Rossum3926a632001-09-25 16:25:58 +00002696 def __init__(self, a, b):
2697 self.a = a
2698 self.b = b
2699 def __repr__(self):
2700 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2701
2702 global C2
2703 class C2(int):
2704 def __new__(cls, a, b, val=0):
2705 return super(C2, cls).__new__(cls, val)
Guido van Rossumf6318592003-02-07 14:59:13 +00002706 def __getnewargs__(self):
2707 return (self.a, self.b, int(self))
Guido van Rossum3926a632001-09-25 16:25:58 +00002708 def __init__(self, a, b, val=0):
2709 self.a = a
2710 self.b = b
2711 def __repr__(self):
2712 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2713
Guido van Rossum90c45142001-11-24 21:07:01 +00002714 global C3
2715 class C3(object):
2716 def __init__(self, foo):
2717 self.foo = foo
2718 def __getstate__(self):
2719 return self.foo
2720 def __setstate__(self, foo):
2721 self.foo = foo
2722
2723 global C4classic, C4
2724 class C4classic: # classic
2725 pass
2726 class C4(C4classic, object): # mixed inheritance
2727 pass
2728
Guido van Rossum3926a632001-09-25 16:25:58 +00002729 for p in pickle, cPickle:
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002730 if p is None:
2731 continue # cPickle not found -- skip it
Guido van Rossum3926a632001-09-25 16:25:58 +00002732 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002733 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002734 print(p.__name__, ["text", "binary"][bin])
Guido van Rossum3926a632001-09-25 16:25:58 +00002735
2736 for cls in C, C1, C2:
2737 s = p.dumps(cls, bin)
2738 cls2 = p.loads(s)
2739 verify(cls2 is cls)
2740
2741 a = C1(1, 2); a.append(42); a.append(24)
2742 b = C2("hello", "world", 42)
2743 s = p.dumps((a, b), bin)
2744 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002745 vereq(x.__class__, a.__class__)
2746 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2747 vereq(y.__class__, b.__class__)
2748 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002749 vereq(repr(x), repr(a))
2750 vereq(repr(y), repr(b))
Guido van Rossum3926a632001-09-25 16:25:58 +00002751 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002752 print("a = x =", a)
2753 print("b = y =", b)
Guido van Rossum90c45142001-11-24 21:07:01 +00002754 # Test for __getstate__ and __setstate__ on new style class
2755 u = C3(42)
2756 s = p.dumps(u, bin)
2757 v = p.loads(s)
2758 veris(u.__class__, v.__class__)
2759 vereq(u.foo, v.foo)
2760 # Test for picklability of hybrid class
2761 u = C4()
2762 u.foo = 42
2763 s = p.dumps(u, bin)
2764 v = p.loads(s)
2765 veris(u.__class__, v.__class__)
2766 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002767
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002768 # Testing copy.deepcopy()
2769 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002770 print("deepcopy")
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002771 import copy
2772 for cls in C, C1, C2:
2773 cls2 = copy.deepcopy(cls)
2774 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002775
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002776 a = C1(1, 2); a.append(42); a.append(24)
2777 b = C2("hello", "world", 42)
2778 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002779 vereq(x.__class__, a.__class__)
2780 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2781 vereq(y.__class__, b.__class__)
2782 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
Walter Dörwald70a6b492004-02-12 17:35:32 +00002783 vereq(repr(x), repr(a))
2784 vereq(repr(y), repr(b))
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002785 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002786 print("a = x =", a)
2787 print("b = y =", b)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002788
Guido van Rossum8c842552002-03-14 23:05:54 +00002789def pickleslots():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002790 if verbose: print("Testing pickling of classes with __slots__ ...")
Guido van Rossumbf12cdb2006-08-17 20:24:18 +00002791 import pickle, pickle as cPickle
Guido van Rossum8c842552002-03-14 23:05:54 +00002792 # Pickling of classes with __slots__ but without __getstate__ should fail
2793 global B, C, D, E
2794 class B(object):
2795 pass
2796 for base in [object, B]:
2797 class C(base):
2798 __slots__ = ['a']
2799 class D(C):
2800 pass
2801 try:
2802 pickle.dumps(C())
2803 except TypeError:
2804 pass
2805 else:
2806 raise TestFailed, "should fail: pickle C instance - %s" % base
2807 try:
2808 cPickle.dumps(C())
2809 except TypeError:
2810 pass
2811 else:
2812 raise TestFailed, "should fail: cPickle C instance - %s" % base
2813 try:
2814 pickle.dumps(C())
2815 except TypeError:
2816 pass
2817 else:
2818 raise TestFailed, "should fail: pickle D instance - %s" % base
2819 try:
2820 cPickle.dumps(D())
2821 except TypeError:
2822 pass
2823 else:
2824 raise TestFailed, "should fail: cPickle D instance - %s" % base
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002825 # Give C a nice generic __getstate__ and __setstate__
Guido van Rossum8c842552002-03-14 23:05:54 +00002826 class C(base):
2827 __slots__ = ['a']
2828 def __getstate__(self):
2829 try:
2830 d = self.__dict__.copy()
2831 except AttributeError:
2832 d = {}
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002833 for cls in self.__class__.__mro__:
2834 for sn in cls.__dict__.get('__slots__', ()):
2835 try:
2836 d[sn] = getattr(self, sn)
2837 except AttributeError:
2838 pass
Guido van Rossum8c842552002-03-14 23:05:54 +00002839 return d
2840 def __setstate__(self, d):
2841 for k, v in d.items():
2842 setattr(self, k, v)
2843 class D(C):
2844 pass
2845 # Now it should work
2846 x = C()
2847 y = pickle.loads(pickle.dumps(x))
2848 vereq(hasattr(y, 'a'), 0)
2849 y = cPickle.loads(cPickle.dumps(x))
2850 vereq(hasattr(y, 'a'), 0)
2851 x.a = 42
2852 y = pickle.loads(pickle.dumps(x))
2853 vereq(y.a, 42)
2854 y = cPickle.loads(cPickle.dumps(x))
2855 vereq(y.a, 42)
2856 x = D()
2857 x.a = 42
2858 x.b = 100
2859 y = pickle.loads(pickle.dumps(x))
2860 vereq(y.a + y.b, 142)
2861 y = cPickle.loads(cPickle.dumps(x))
2862 vereq(y.a + y.b, 142)
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002863 # A subclass that adds a slot should also work
Guido van Rossum8c842552002-03-14 23:05:54 +00002864 class E(C):
2865 __slots__ = ['b']
Guido van Rossum3f50cdc2003-02-10 21:31:27 +00002866 x = E()
2867 x.a = 42
2868 x.b = "foo"
2869 y = pickle.loads(pickle.dumps(x))
2870 vereq(y.a, x.a)
2871 vereq(y.b, x.b)
2872 y = cPickle.loads(cPickle.dumps(x))
2873 vereq(y.a, x.a)
2874 vereq(y.b, x.b)
Guido van Rossum8c842552002-03-14 23:05:54 +00002875
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002876def copies():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002877 if verbose: print("Testing copy.copy() and copy.deepcopy()...")
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002878 import copy
2879 class C(object):
2880 pass
2881
2882 a = C()
2883 a.foo = 12
2884 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002885 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002886
2887 a.bar = [1,2,3]
2888 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002889 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002890 verify(c.bar is a.bar)
2891
2892 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002893 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002894 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002895 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002896
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002897def binopoverride():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002898 if verbose: print("Testing overrides of binary operations...")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002899 class I(int):
2900 def __repr__(self):
2901 return "I(%r)" % int(self)
2902 def __add__(self, other):
2903 return I(int(self) + int(other))
2904 __radd__ = __add__
2905 def __pow__(self, other, mod=None):
2906 if mod is None:
2907 return I(pow(int(self), int(other)))
2908 else:
2909 return I(pow(int(self), int(other), int(mod)))
2910 def __rpow__(self, other, mod=None):
2911 if mod is None:
2912 return I(pow(int(other), int(self), mod))
2913 else:
2914 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002915
Walter Dörwald70a6b492004-02-12 17:35:32 +00002916 vereq(repr(I(1) + I(2)), "I(3)")
2917 vereq(repr(I(1) + 2), "I(3)")
2918 vereq(repr(1 + I(2)), "I(3)")
2919 vereq(repr(I(2) ** I(3)), "I(8)")
2920 vereq(repr(2 ** I(3)), "I(8)")
2921 vereq(repr(I(2) ** 3), "I(8)")
2922 vereq(repr(pow(I(2), I(3), I(5))), "I(3)")
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002923 class S(str):
2924 def __eq__(self, other):
2925 return self.lower() == other.lower()
2926
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002927def subclasspropagation():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00002928 if verbose: print("Testing propagation of slot functions to subclasses...")
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002929 class A(object):
2930 pass
2931 class B(A):
2932 pass
2933 class C(A):
2934 pass
2935 class D(B, C):
2936 pass
2937 d = D()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002938 orig_hash = hash(d) # related to id(d) in platform-dependent ways
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002939 A.__hash__ = lambda self: 42
2940 vereq(hash(d), 42)
2941 C.__hash__ = lambda self: 314
2942 vereq(hash(d), 314)
2943 B.__hash__ = lambda self: 144
2944 vereq(hash(d), 144)
2945 D.__hash__ = lambda self: 100
2946 vereq(hash(d), 100)
2947 del D.__hash__
2948 vereq(hash(d), 144)
2949 del B.__hash__
2950 vereq(hash(d), 314)
2951 del C.__hash__
2952 vereq(hash(d), 42)
2953 del A.__hash__
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002954 vereq(hash(d), orig_hash)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002955 d.foo = 42
2956 d.bar = 42
2957 vereq(d.foo, 42)
2958 vereq(d.bar, 42)
2959 def __getattribute__(self, name):
2960 if name == "foo":
2961 return 24
2962 return object.__getattribute__(self, name)
2963 A.__getattribute__ = __getattribute__
2964 vereq(d.foo, 24)
2965 vereq(d.bar, 42)
2966 def __getattr__(self, name):
2967 if name in ("spam", "foo", "bar"):
2968 return "hello"
2969 raise AttributeError, name
2970 B.__getattr__ = __getattr__
2971 vereq(d.spam, "hello")
2972 vereq(d.foo, 24)
2973 vereq(d.bar, 42)
2974 del A.__getattribute__
2975 vereq(d.foo, 42)
2976 del d.foo
2977 vereq(d.foo, "hello")
2978 vereq(d.bar, 42)
2979 del B.__getattr__
2980 try:
2981 d.foo
2982 except AttributeError:
2983 pass
2984 else:
2985 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002986
Guido van Rossume7f3e242002-06-14 02:35:45 +00002987 # Test a nasty bug in recurse_down_subclasses()
2988 import gc
2989 class A(object):
2990 pass
2991 class B(A):
2992 pass
2993 del B
2994 gc.collect()
2995 A.__setitem__ = lambda *a: None # crash
2996
Tim Petersfc57ccb2001-10-12 02:38:24 +00002997def buffer_inherit():
2998 import binascii
2999 # SF bug [#470040] ParseTuple t# vs subclasses.
3000 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003001 print("Testing that buffer interface is inherited ...")
Tim Petersfc57ccb2001-10-12 02:38:24 +00003002
3003 class MyStr(str):
3004 pass
3005 base = 'abc'
3006 m = MyStr(base)
3007 # b2a_hex uses the buffer interface to get its argument's value, via
3008 # PyArg_ParseTuple 't#' code.
3009 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3010
3011 # It's not clear that unicode will continue to support the character
3012 # buffer interface, and this test will fail if that's taken away.
3013 class MyUni(unicode):
3014 pass
3015 base = u'abc'
3016 m = MyUni(base)
3017 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
3018
3019 class MyInt(int):
3020 pass
3021 m = MyInt(42)
3022 try:
3023 binascii.b2a_hex(m)
3024 raise TestFailed('subclass of int should not have a buffer interface')
3025 except TypeError:
3026 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00003027
Tim Petersc9933152001-10-16 20:18:24 +00003028def str_of_str_subclass():
3029 import binascii
3030 import cStringIO
3031
3032 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003033 print("Testing __str__ defined in subclass of str ...")
Tim Petersc9933152001-10-16 20:18:24 +00003034
3035 class octetstring(str):
3036 def __str__(self):
3037 return binascii.b2a_hex(self)
3038 def __repr__(self):
3039 return self + " repr"
3040
3041 o = octetstring('A')
3042 vereq(type(o), octetstring)
3043 vereq(type(str(o)), str)
3044 vereq(type(repr(o)), str)
3045 vereq(ord(o), 0x41)
3046 vereq(str(o), '41')
3047 vereq(repr(o), 'A repr')
3048 vereq(o.__str__(), '41')
3049 vereq(o.__repr__(), 'A repr')
3050
3051 capture = cStringIO.StringIO()
3052 # Calling str() or not exercises different internal paths.
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003053 print(o, file=capture)
3054 print(str(o), file=capture)
Tim Petersc9933152001-10-16 20:18:24 +00003055 vereq(capture.getvalue(), '41\n41\n')
3056 capture.close()
3057
Guido van Rossumc8e56452001-10-22 00:43:43 +00003058def kwdargs():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003059 if verbose: print("Testing keyword arguments to __init__, __call__...")
Guido van Rossumc8e56452001-10-22 00:43:43 +00003060 def f(a): return a
3061 vereq(f.__call__(a=42), 42)
3062 a = []
3063 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00003064 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00003065
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003066def recursive__call__():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003067 if verbose: print(("Testing recursive __call__() by setting to instance of "
3068 "class ..."))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003069 class A(object):
3070 pass
3071
3072 A.__call__ = A()
3073 try:
3074 A()()
3075 except RuntimeError:
3076 pass
3077 else:
3078 raise TestFailed("Recursion limit should have been reached for "
3079 "__call__()")
3080
Guido van Rossumed87ad82001-10-30 02:33:02 +00003081def delhook():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003082 if verbose: print("Testing __del__ hook...")
Guido van Rossumed87ad82001-10-30 02:33:02 +00003083 log = []
3084 class C(object):
3085 def __del__(self):
3086 log.append(1)
3087 c = C()
3088 vereq(log, [])
3089 del c
3090 vereq(log, [1])
3091
Guido van Rossum29d26062001-12-11 04:37:34 +00003092 class D(object): pass
3093 d = D()
3094 try: del d[0]
3095 except TypeError: pass
3096 else: raise TestFailed, "invalid del() didn't raise TypeError"
3097
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003098def hashinherit():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003099 if verbose: print("Testing hash of mutable subclasses...")
Guido van Rossumdbb53d92001-12-03 16:32:18 +00003100
3101 class mydict(dict):
3102 pass
3103 d = mydict()
3104 try:
3105 hash(d)
3106 except TypeError:
3107 pass
3108 else:
3109 raise TestFailed, "hash() of dict subclass should fail"
3110
3111 class mylist(list):
3112 pass
3113 d = mylist()
3114 try:
3115 hash(d)
3116 except TypeError:
3117 pass
3118 else:
3119 raise TestFailed, "hash() of list subclass should fail"
3120
Guido van Rossum29d26062001-12-11 04:37:34 +00003121def strops():
3122 try: 'a' + 5
3123 except TypeError: pass
3124 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
3125
3126 try: ''.split('')
3127 except ValueError: pass
3128 else: raise TestFailed, "''.split('') doesn't raise ValueError"
3129
3130 try: ''.join([0])
3131 except TypeError: pass
3132 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
3133
3134 try: ''.rindex('5')
3135 except ValueError: pass
3136 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
3137
Guido van Rossum29d26062001-12-11 04:37:34 +00003138 try: '%(n)s' % None
3139 except TypeError: pass
3140 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
3141
3142 try: '%(n' % {}
3143 except ValueError: pass
3144 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
3145
3146 try: '%*s' % ('abc')
3147 except TypeError: pass
3148 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
3149
3150 try: '%*.*s' % ('abc', 5)
3151 except TypeError: pass
3152 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
3153
3154 try: '%s' % (1, 2)
3155 except TypeError: pass
3156 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
3157
3158 try: '%' % None
3159 except ValueError: pass
3160 else: raise TestFailed, "'%' % None doesn't raise ValueError"
3161
3162 vereq('534253'.isdigit(), 1)
3163 vereq('534253x'.isdigit(), 0)
3164 vereq('%c' % 5, '\x05')
3165 vereq('%c' % '5', '5')
3166
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003167def deepcopyrecursive():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003168 if verbose: print("Testing deepcopy of recursive objects...")
Guido van Rossum2764a3a2001-12-28 21:39:03 +00003169 class Node:
3170 pass
3171 a = Node()
3172 b = Node()
3173 a.b = b
3174 b.a = a
3175 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00003176
Guido van Rossumd7035672002-03-12 20:43:31 +00003177def modules():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003178 if verbose: print("Testing uninitialized module objects...")
Guido van Rossumd7035672002-03-12 20:43:31 +00003179 from types import ModuleType as M
3180 m = M.__new__(M)
3181 str(m)
3182 vereq(hasattr(m, "__name__"), 0)
3183 vereq(hasattr(m, "__file__"), 0)
3184 vereq(hasattr(m, "foo"), 0)
3185 vereq(m.__dict__, None)
3186 m.foo = 1
3187 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00003188
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003189def dictproxyiterkeys():
3190 class C(object):
3191 def meth(self):
3192 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003193 if verbose: print("Testing dict-proxy iterkeys...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003194 keys = [ key for key in C.__dict__.keys() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003195 keys.sort()
3196 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3197
3198def dictproxyitervalues():
3199 class C(object):
3200 def meth(self):
3201 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003202 if verbose: print("Testing dict-proxy itervalues...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003203 values = [ values for values in C.__dict__.values() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003204 vereq(len(values), 5)
3205
3206def dictproxyiteritems():
3207 class C(object):
3208 def meth(self):
3209 pass
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003210 if verbose: print("Testing dict-proxy iteritems...")
Guido van Rossumcc2b0162007-02-11 06:12:03 +00003211 keys = [ key for (key, value) in C.__dict__.items() ]
Walter Dörwalddbd2d252002-03-25 18:36:32 +00003212 keys.sort()
3213 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
3214
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003215def funnynew():
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003216 if verbose: print("Testing __new__ returning something unexpected...")
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00003217 class C(object):
3218 def __new__(cls, arg):
3219 if isinstance(arg, str): return [1, 2, 3]
3220 elif isinstance(arg, int): return object.__new__(D)
3221 else: return object.__new__(cls)
3222 class D(C):
3223 def __init__(self, arg):
3224 self.foo = arg
3225 vereq(C("1"), [1, 2, 3])
3226 vereq(D("1"), [1, 2, 3])
3227 d = D(None)
3228 veris(d.foo, None)
3229 d = C(1)
3230 vereq(isinstance(d, D), True)
3231 vereq(d.foo, 1)
3232 d = D(1)
3233 vereq(isinstance(d, D), True)
3234 vereq(d.foo, 1)
3235
Guido van Rossume8fc6402002-04-16 16:44:51 +00003236def imulbug():
3237 # SF bug 544647
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003238 if verbose: print("Testing for __imul__ problems...")
Guido van Rossume8fc6402002-04-16 16:44:51 +00003239 class C(object):
3240 def __imul__(self, other):
3241 return (self, other)
3242 x = C()
3243 y = x
3244 y *= 1.0
3245 vereq(y, (x, 1.0))
3246 y = x
3247 y *= 2
3248 vereq(y, (x, 2))
3249 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003250 y *= 3
3251 vereq(y, (x, 3))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003252 y = x
Guido van Rossume2a383d2007-01-15 16:59:06 +00003253 y *= 1<<100
3254 vereq(y, (x, 1<<100))
Guido van Rossume8fc6402002-04-16 16:44:51 +00003255 y = x
3256 y *= None
3257 vereq(y, (x, None))
3258 y = x
3259 y *= "foo"
3260 vereq(y, (x, "foo"))
3261
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003262def docdescriptor():
3263 # SF bug 542984
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003264 if verbose: print("Testing __doc__ descriptor...")
Guido van Rossumd99b3e72002-04-18 00:27:33 +00003265 class DocDescr(object):
3266 def __get__(self, object, otype):
3267 if object:
3268 object = object.__class__.__name__ + ' instance'
3269 if otype:
3270 otype = otype.__name__
3271 return 'object=%s; type=%s' % (object, otype)
3272 class OldClass:
3273 __doc__ = DocDescr()
3274 class NewClass(object):
3275 __doc__ = DocDescr()
3276 vereq(OldClass.__doc__, 'object=None; type=OldClass')
3277 vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass')
3278 vereq(NewClass.__doc__, 'object=None; type=NewClass')
3279 vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass')
3280
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003281def copy_setstate():
3282 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003283 print("Testing that copy.*copy() correctly uses __setstate__...")
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00003284 import copy
3285 class C(object):
3286 def __init__(self, foo=None):
3287 self.foo = foo
3288 self.__foo = foo
3289 def setfoo(self, foo=None):
3290 self.foo = foo
3291 def getfoo(self):
3292 return self.__foo
3293 def __getstate__(self):
3294 return [self.foo]
3295 def __setstate__(self, lst):
3296 assert len(lst) == 1
3297 self.__foo = self.foo = lst[0]
3298 a = C(42)
3299 a.setfoo(24)
3300 vereq(a.foo, 24)
3301 vereq(a.getfoo(), 42)
3302 b = copy.copy(a)
3303 vereq(b.foo, 24)
3304 vereq(b.getfoo(), 24)
3305 b = copy.deepcopy(a)
3306 vereq(b.foo, 24)
3307 vereq(b.getfoo(), 24)
3308
Guido van Rossum09638c12002-06-13 19:17:46 +00003309def slices():
3310 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003311 print("Testing cases with slices and overridden __getitem__ ...")
Guido van Rossum09638c12002-06-13 19:17:46 +00003312 # Strings
3313 vereq("hello"[:4], "hell")
3314 vereq("hello"[slice(4)], "hell")
3315 vereq(str.__getitem__("hello", slice(4)), "hell")
3316 class S(str):
3317 def __getitem__(self, x):
3318 return str.__getitem__(self, x)
3319 vereq(S("hello")[:4], "hell")
3320 vereq(S("hello")[slice(4)], "hell")
3321 vereq(S("hello").__getitem__(slice(4)), "hell")
3322 # Tuples
3323 vereq((1,2,3)[:2], (1,2))
3324 vereq((1,2,3)[slice(2)], (1,2))
3325 vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2))
3326 class T(tuple):
3327 def __getitem__(self, x):
3328 return tuple.__getitem__(self, x)
3329 vereq(T((1,2,3))[:2], (1,2))
3330 vereq(T((1,2,3))[slice(2)], (1,2))
3331 vereq(T((1,2,3)).__getitem__(slice(2)), (1,2))
3332 # Lists
3333 vereq([1,2,3][:2], [1,2])
3334 vereq([1,2,3][slice(2)], [1,2])
3335 vereq(list.__getitem__([1,2,3], slice(2)), [1,2])
3336 class L(list):
3337 def __getitem__(self, x):
3338 return list.__getitem__(self, x)
3339 vereq(L([1,2,3])[:2], [1,2])
3340 vereq(L([1,2,3])[slice(2)], [1,2])
3341 vereq(L([1,2,3]).__getitem__(slice(2)), [1,2])
3342 # Now do lists and __setitem__
3343 a = L([1,2,3])
3344 a[slice(1, 3)] = [3,2]
3345 vereq(a, [1,3,2])
3346 a[slice(0, 2, 1)] = [3,1]
3347 vereq(a, [3,1,2])
3348 a.__setitem__(slice(1, 3), [2,1])
3349 vereq(a, [3,2,1])
3350 a.__setitem__(slice(0, 2, 1), [2,3])
3351 vereq(a, [2,3,1])
3352
Tim Peters2484aae2002-07-11 06:56:07 +00003353def subtype_resurrection():
3354 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003355 print("Testing resurrection of new-style instance...")
Tim Peters2484aae2002-07-11 06:56:07 +00003356
3357 class C(object):
3358 container = []
3359
3360 def __del__(self):
3361 # resurrect the instance
3362 C.container.append(self)
3363
3364 c = C()
3365 c.attr = 42
Tim Peters14cb1e12002-07-11 18:26:21 +00003366 # The most interesting thing here is whether this blows up, due to flawed
Tim Peters45228ca2002-07-11 07:09:42 +00003367 # GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug).
Tim Peters2484aae2002-07-11 06:56:07 +00003368 del c
Tim Peters14cb1e12002-07-11 18:26:21 +00003369
3370 # If that didn't blow up, it's also interesting to see whether clearing
3371 # the last container slot works: that will attempt to delete c again,
3372 # which will cause c to get appended back to the container again "during"
3373 # the del.
3374 del C.container[-1]
3375 vereq(len(C.container), 1)
Tim Peters2484aae2002-07-11 06:56:07 +00003376 vereq(C.container[-1].attr, 42)
Guido van Rossum09638c12002-06-13 19:17:46 +00003377
Tim Peters14cb1e12002-07-11 18:26:21 +00003378 # Make c mortal again, so that the test framework with -l doesn't report
3379 # it as a leak.
3380 del C.__del__
3381
Guido van Rossum2d702462002-08-06 21:28:28 +00003382def slottrash():
3383 # Deallocating deeply nested slotted trash caused stack overflows
3384 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003385 print("Testing slot trash...")
Guido van Rossum2d702462002-08-06 21:28:28 +00003386 class trash(object):
3387 __slots__ = ['x']
3388 def __init__(self, x):
3389 self.x = x
3390 o = None
3391 for i in xrange(50000):
3392 o = trash(o)
3393 del o
3394
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003395def slotmultipleinheritance():
3396 # SF bug 575229, multiple inheritance w/ slots dumps core
3397 class A(object):
3398 __slots__=()
3399 class B(object):
3400 pass
3401 class C(A,B) :
3402 __slots__=()
Guido van Rossum8b056da2002-08-13 18:26:26 +00003403 vereq(C.__basicsize__, B.__basicsize__)
3404 verify(hasattr(C, '__dict__'))
3405 verify(hasattr(C, '__weakref__'))
3406 C().x = 2
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00003407
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003408def testrmul():
3409 # SF patch 592646
3410 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003411 print("Testing correct invocation of __rmul__...")
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00003412 class C(object):
3413 def __mul__(self, other):
3414 return "mul"
3415 def __rmul__(self, other):
3416 return "rmul"
3417 a = C()
3418 vereq(a*2, "mul")
3419 vereq(a*2.2, "mul")
3420 vereq(2*a, "rmul")
3421 vereq(2.2*a, "rmul")
3422
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003423def testipow():
3424 # [SF bug 620179]
3425 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003426 print("Testing correct invocation of __ipow__...")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00003427 class C(object):
3428 def __ipow__(self, other):
3429 pass
3430 a = C()
3431 a **= 2
3432
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003433def do_this_first():
3434 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003435 print("Testing SF bug 551412 ...")
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003436 # This dumps core when SF bug 551412 isn't fixed --
3437 # but only when test_descr.py is run separately.
3438 # (That can't be helped -- as soon as PyType_Ready()
3439 # is called for PyLong_Type, the bug is gone.)
3440 class UserLong(object):
3441 def __pow__(self, *args):
3442 pass
3443 try:
Guido van Rossume2a383d2007-01-15 16:59:06 +00003444 pow(0, UserLong(), 0)
Guido van Rossum9fc8a292002-05-24 21:40:08 +00003445 except:
3446 pass
3447
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003448 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003449 print("Testing SF bug 570483...")
Guido van Rossuma96b0df2002-06-18 16:49:45 +00003450 # Another segfault only when run early
3451 # (before PyType_Ready(tuple) is called)
3452 type.mro(tuple)
3453
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003454def test_mutable_bases():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003455 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003456 print("Testing mutable bases...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003457 # stuff that should work:
3458 class C(object):
3459 pass
3460 class C2(object):
3461 def __getattribute__(self, attr):
3462 if attr == 'a':
3463 return 2
3464 else:
Tim Peters6578dc92002-12-24 18:31:27 +00003465 return super(C2, self).__getattribute__(attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003466 def meth(self):
3467 return 1
3468 class D(C):
3469 pass
3470 class E(D):
3471 pass
3472 d = D()
3473 e = E()
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003474 D.__bases__ = (C,)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003475 D.__bases__ = (C2,)
3476 vereq(d.meth(), 1)
3477 vereq(e.meth(), 1)
3478 vereq(d.a, 2)
3479 vereq(e.a, 2)
3480 vereq(C2.__subclasses__(), [D])
3481
3482 # stuff that shouldn't:
3483 class L(list):
3484 pass
3485
3486 try:
3487 L.__bases__ = (dict,)
3488 except TypeError:
3489 pass
3490 else:
3491 raise TestFailed, "shouldn't turn list subclass into dict subclass"
3492
3493 try:
3494 list.__bases__ = (dict,)
3495 except TypeError:
3496 pass
3497 else:
3498 raise TestFailed, "shouldn't be able to assign to list.__bases__"
3499
3500 try:
Thomas Wouters89f507f2006-12-13 04:49:30 +00003501 D.__bases__ = (C2, list)
3502 except TypeError:
3503 pass
3504 else:
3505 assert 0, "best_base calculation found wanting"
3506
3507 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003508 del D.__bases__
3509 except TypeError:
3510 pass
3511 else:
3512 raise TestFailed, "shouldn't be able to delete .__bases__"
3513
3514 try:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003515 D.__bases__ = ()
Guido van Rossumb940e112007-01-10 16:19:56 +00003516 except TypeError as msg:
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +00003517 if str(msg) == "a new-style class can't have only classic bases":
3518 raise TestFailed, "wrong error message for .__bases__ = ()"
3519 else:
3520 raise TestFailed, "shouldn't be able to set .__bases__ to ()"
3521
3522 try:
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003523 D.__bases__ = (D,)
3524 except TypeError:
3525 pass
3526 else:
3527 # actually, we'll have crashed by here...
3528 raise TestFailed, "shouldn't be able to create inheritance cycles"
3529
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003530 try:
Michael W. Hudsone723e452003-08-07 14:58:10 +00003531 D.__bases__ = (C, C)
3532 except TypeError:
3533 pass
3534 else:
3535 raise TestFailed, "didn't detect repeated base classes"
3536
3537 try:
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +00003538 D.__bases__ = (E,)
3539 except TypeError:
3540 pass
3541 else:
3542 raise TestFailed, "shouldn't be able to create inheritance cycles"
3543
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003544def test_mutable_bases_with_failing_mro():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003545 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003546 print("Testing mutable bases with failing mro...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003547 class WorkOnce(type):
3548 def __new__(self, name, bases, ns):
3549 self.flag = 0
3550 return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns)
3551 def mro(self):
3552 if self.flag > 0:
3553 raise RuntimeError, "bozo"
3554 else:
3555 self.flag += 1
3556 return type.mro(self)
3557
3558 class WorkAlways(type):
3559 def mro(self):
3560 # this is here to make sure that .mro()s aren't called
3561 # with an exception set (which was possible at one point).
3562 # An error message will be printed in a debug build.
3563 # What's a good way to test for this?
3564 return type.mro(self)
3565
3566 class C(object):
3567 pass
3568
3569 class C2(object):
3570 pass
3571
3572 class D(C):
3573 pass
3574
3575 class E(D):
3576 pass
3577
3578 class F(D):
3579 __metaclass__ = WorkOnce
3580
3581 class G(D):
3582 __metaclass__ = WorkAlways
3583
3584 # Immediate subclasses have their mro's adjusted in alphabetical
3585 # order, so E's will get adjusted before adjusting F's fails. We
3586 # check here that E's gets restored.
Tim Peters6578dc92002-12-24 18:31:27 +00003587
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003588 E_mro_before = E.__mro__
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003589 D_mro_before = D.__mro__
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003590
3591 try:
3592 D.__bases__ = (C2,)
3593 except RuntimeError:
3594 vereq(E.__mro__, E_mro_before)
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +00003595 vereq(D.__mro__, D_mro_before)
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003596 else:
3597 raise TestFailed, "exception not propagated"
3598
3599def test_mutable_bases_catch_mro_conflict():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003600 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003601 print("Testing mutable bases catch mro conflict...")
Michael W. Hudson586da8f2002-11-27 15:20:19 +00003602 class A(object):
3603 pass
3604
3605 class B(object):
3606 pass
3607
3608 class C(A, B):
3609 pass
3610
3611 class D(A, B):
3612 pass
3613
3614 class E(C, D):
3615 pass
3616
3617 try:
3618 C.__bases__ = (B, A)
3619 except TypeError:
3620 pass
3621 else:
3622 raise TestFailed, "didn't catch MRO conflict"
Tim Peters6578dc92002-12-24 18:31:27 +00003623
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003624def mutable_names():
Guido van Rossum2720b0d2003-01-06 21:26:44 +00003625 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003626 print("Testing mutable names...")
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003627 class C(object):
3628 pass
3629
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003630 # C.__module__ could be 'test_descr' or '__main__'
3631 mod = C.__module__
Tim Peters6578dc92002-12-24 18:31:27 +00003632
Michael W. Hudsonade8c8b22002-11-27 16:29:26 +00003633 C.__name__ = 'D'
3634 vereq((C.__module__, C.__name__), (mod, 'D'))
3635
3636 C.__name__ = 'D.E'
3637 vereq((C.__module__, C.__name__), (mod, 'D.E'))
Tim Peters6578dc92002-12-24 18:31:27 +00003638
Guido van Rossum613f24f2003-01-06 23:00:59 +00003639def subclass_right_op():
3640 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003641 print("Testing correct dispatch of subclass overloading __r<op>__...")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003642
3643 # This code tests various cases where right-dispatch of a subclass
3644 # should be preferred over left-dispatch of a base class.
3645
3646 # Case 1: subclass of int; this tests code in abstract.c::binary_op1()
3647
3648 class B(int):
Guido van Rossumf389c772003-02-27 20:04:19 +00003649 def __floordiv__(self, other):
3650 return "B.__floordiv__"
3651 def __rfloordiv__(self, other):
3652 return "B.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003653
Guido van Rossumf389c772003-02-27 20:04:19 +00003654 vereq(B(1) // 1, "B.__floordiv__")
3655 vereq(1 // B(1), "B.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003656
3657 # Case 2: subclass of object; this is just the baseline for case 3
3658
3659 class C(object):
Guido van Rossumf389c772003-02-27 20:04:19 +00003660 def __floordiv__(self, other):
3661 return "C.__floordiv__"
3662 def __rfloordiv__(self, other):
3663 return "C.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003664
Guido van Rossumf389c772003-02-27 20:04:19 +00003665 vereq(C() // 1, "C.__floordiv__")
3666 vereq(1 // C(), "C.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003667
3668 # Case 3: subclass of new-style class; here it gets interesting
3669
3670 class D(C):
Guido van Rossumf389c772003-02-27 20:04:19 +00003671 def __floordiv__(self, other):
3672 return "D.__floordiv__"
3673 def __rfloordiv__(self, other):
3674 return "D.__rfloordiv__"
Guido van Rossum613f24f2003-01-06 23:00:59 +00003675
Guido van Rossumf389c772003-02-27 20:04:19 +00003676 vereq(D() // C(), "D.__floordiv__")
3677 vereq(C() // D(), "D.__rfloordiv__")
Guido van Rossum613f24f2003-01-06 23:00:59 +00003678
3679 # Case 4: this didn't work right in 2.2.2 and 2.3a1
3680
3681 class E(C):
3682 pass
3683
Guido van Rossumf389c772003-02-27 20:04:19 +00003684 vereq(E.__rfloordiv__, C.__rfloordiv__)
Guido van Rossum613f24f2003-01-06 23:00:59 +00003685
Guido van Rossumf389c772003-02-27 20:04:19 +00003686 vereq(E() // 1, "C.__floordiv__")
3687 vereq(1 // E(), "C.__rfloordiv__")
3688 vereq(E() // C(), "C.__floordiv__")
3689 vereq(C() // E(), "C.__floordiv__") # This one would fail
Guido van Rossum613f24f2003-01-06 23:00:59 +00003690
Guido van Rossum373c7412003-01-07 13:41:37 +00003691def dict_type_with_metaclass():
3692 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003693 print("Testing type of __dict__ when __metaclass__ set...")
Guido van Rossum373c7412003-01-07 13:41:37 +00003694
3695 class B(object):
3696 pass
3697 class M(type):
3698 pass
3699 class C:
3700 # In 2.3a1, C.__dict__ was a real dict rather than a dict proxy
3701 __metaclass__ = M
3702 veris(type(C.__dict__), type(B.__dict__))
3703
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003704def meth_class_get():
3705 # Full coverage of descrobject.c::classmethod_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003706 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003707 print("Testing __get__ method of METH_CLASS C methods...")
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00003708 # Baseline
3709 arg = [1, 2, 3]
3710 res = {1: None, 2: None, 3: None}
3711 vereq(dict.fromkeys(arg), res)
3712 vereq({}.fromkeys(arg), res)
3713 # Now get the descriptor
3714 descr = dict.__dict__["fromkeys"]
3715 # More baseline using the descriptor directly
3716 vereq(descr.__get__(None, dict)(arg), res)
3717 vereq(descr.__get__({})(arg), res)
3718 # Now check various error cases
3719 try:
3720 descr.__get__(None, None)
3721 except TypeError:
3722 pass
3723 else:
3724 raise TestFailed, "shouldn't have allowed descr.__get__(None, None)"
3725 try:
3726 descr.__get__(42)
3727 except TypeError:
3728 pass
3729 else:
3730 raise TestFailed, "shouldn't have allowed descr.__get__(42)"
3731 try:
3732 descr.__get__(None, 42)
3733 except TypeError:
3734 pass
3735 else:
3736 raise TestFailed, "shouldn't have allowed descr.__get__(None, 42)"
3737 try:
3738 descr.__get__(None, int)
3739 except TypeError:
3740 pass
3741 else:
3742 raise TestFailed, "shouldn't have allowed descr.__get__(None, int)"
3743
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003744def isinst_isclass():
3745 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003746 print("Testing proxy isinstance() and isclass()...")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003747 class Proxy(object):
3748 def __init__(self, obj):
3749 self.__obj = obj
3750 def __getattribute__(self, name):
3751 if name.startswith("_Proxy__"):
3752 return object.__getattribute__(self, name)
3753 else:
3754 return getattr(self.__obj, name)
3755 # Test with a classic class
3756 class C:
3757 pass
3758 a = C()
3759 pa = Proxy(a)
3760 verify(isinstance(a, C)) # Baseline
3761 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003762 # Test with a classic subclass
3763 class D(C):
3764 pass
3765 a = D()
3766 pa = Proxy(a)
3767 verify(isinstance(a, C)) # Baseline
3768 verify(isinstance(pa, C)) # Test
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003769 # Test with a new-style class
3770 class C(object):
3771 pass
3772 a = C()
3773 pa = Proxy(a)
3774 verify(isinstance(a, C)) # Baseline
3775 verify(isinstance(pa, C)) # Test
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003776 # Test with a new-style subclass
3777 class D(C):
3778 pass
3779 a = D()
3780 pa = Proxy(a)
3781 verify(isinstance(a, C)) # Baseline
3782 verify(isinstance(pa, C)) # Test
3783
3784def proxysuper():
3785 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003786 print("Testing super() for a proxy object...")
Guido van Rossuma89d10e2003-02-12 03:58:38 +00003787 class Proxy(object):
3788 def __init__(self, obj):
3789 self.__obj = obj
3790 def __getattribute__(self, name):
3791 if name.startswith("_Proxy__"):
3792 return object.__getattribute__(self, name)
3793 else:
3794 return getattr(self.__obj, name)
3795
3796 class B(object):
3797 def f(self):
3798 return "B.f"
3799
3800 class C(B):
3801 def f(self):
3802 return super(C, self).f() + "->C.f"
3803
3804 obj = C()
3805 p = Proxy(obj)
3806 vereq(C.__dict__["f"](p), "B.f->C.f")
Guido van Rossum03bc7d32003-02-12 03:32:58 +00003807
Guido van Rossum52b27052003-04-15 20:05:10 +00003808def carloverre():
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003809 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003810 print("Testing prohibition of Carlo Verre's hack...")
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003811 try:
3812 object.__setattr__(str, "foo", 42)
3813 except TypeError:
3814 pass
3815 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003816 raise TestFailed, "Carlo Verre __setattr__ suceeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003817 try:
3818 object.__delattr__(str, "lower")
3819 except TypeError:
3820 pass
3821 else:
Guido van Rossum52b27052003-04-15 20:05:10 +00003822 raise TestFailed, "Carlo Verre __delattr__ succeeded!"
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003823
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003824def weakref_segfault():
3825 # SF 742911
3826 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003827 print("Testing weakref segfault...")
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003828
3829 import weakref
3830
3831 class Provoker:
3832 def __init__(self, referrent):
3833 self.ref = weakref.ref(referrent)
3834
3835 def __del__(self):
3836 x = self.ref()
Guido van Rossumaabe0b32003-05-29 14:26:57 +00003837
3838 class Oops(object):
3839 pass
3840
3841 o = Oops()
3842 o.whatever = Provoker(o)
3843 del o
3844
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003845def wrapper_segfault():
3846 # SF 927248: deeply nested wrappers could cause stack overflow
3847 f = lambda:None
3848 for i in xrange(1000000):
3849 f = f.__call__
3850 f = None
3851
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003852# Fix SF #762455, segfault when sys.stdout is changed in getattr
3853def filefault():
3854 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003855 print("Testing sys.stdout is changed in getattr...")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003856 import sys
3857 class StdoutGuard:
3858 def __getattr__(self, attr):
3859 sys.stdout = sys.__stdout__
3860 raise RuntimeError("Premature access to sys.stdout.%s" % attr)
3861 sys.stdout = StdoutGuard()
3862 try:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003863 print("Oops!")
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00003864 except RuntimeError:
3865 pass
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003866
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003867def vicious_descriptor_nonsense():
3868 # A potential segfault spotted by Thomas Wouters in mail to
3869 # python-dev 2003-04-17, turned into an example & fixed by Michael
3870 # Hudson just less than four months later...
3871 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003872 print("Testing vicious_descriptor_nonsense...")
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003873
3874 class Evil(object):
3875 def __hash__(self):
3876 return hash('attr')
3877 def __eq__(self, other):
3878 del C.attr
3879 return 0
3880
3881 class Descr(object):
3882 def __get__(self, ob, type=None):
3883 return 1
3884
3885 class C(object):
3886 attr = Descr()
3887
3888 c = C()
3889 c.__dict__[Evil()] = 0
3890
3891 vereq(c.attr, 1)
3892 # this makes a crash more likely:
3893 import gc; gc.collect()
3894 vereq(hasattr(c, 'attr'), False)
Tim Peters58eb11c2004-01-18 20:29:55 +00003895
Raymond Hettingerb67cc802005-03-03 16:45:19 +00003896def test_init():
3897 # SF 1155938
3898 class Foo(object):
3899 def __init__(self):
3900 return 10
3901 try:
3902 Foo()
3903 except TypeError:
3904 pass
3905 else:
3906 raise TestFailed, "did not test __init__() for None return"
3907
Armin Rigoc6686b72005-11-07 08:38:00 +00003908def methodwrapper():
3909 # <type 'method-wrapper'> did not support any reflection before 2.5
3910 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003911 print("Testing method-wrapper objects...")
Armin Rigoc6686b72005-11-07 08:38:00 +00003912
Guido van Rossum47b9ff62006-08-24 00:41:19 +00003913 return # XXX should methods really support __eq__?
3914
Armin Rigoc6686b72005-11-07 08:38:00 +00003915 l = []
3916 vereq(l.__add__, l.__add__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003917 vereq(l.__add__, [].__add__)
3918 verify(l.__add__ != [5].__add__)
3919 verify(l.__add__ != l.__mul__)
Armin Rigoc6686b72005-11-07 08:38:00 +00003920 verify(l.__add__.__name__ == '__add__')
3921 verify(l.__add__.__self__ is l)
3922 verify(l.__add__.__objclass__ is list)
3923 vereq(l.__add__.__doc__, list.__add__.__doc__)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003924 try:
3925 hash(l.__add__)
3926 except TypeError:
3927 pass
3928 else:
3929 raise TestFailed("no TypeError from hash([].__add__)")
3930
3931 t = ()
3932 t += (7,)
3933 vereq(t.__add__, (7,).__add__)
3934 vereq(hash(t.__add__), hash((7,).__add__))
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00003935
Armin Rigofd163f92005-12-29 15:59:19 +00003936def notimplemented():
3937 # all binary methods should be able to return a NotImplemented
3938 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +00003939 print("Testing NotImplemented...")
Armin Rigofd163f92005-12-29 15:59:19 +00003940
3941 import sys
3942 import types
3943 import operator
3944
3945 def specialmethod(self, other):
3946 return NotImplemented
3947
3948 def check(expr, x, y):
3949 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +00003950 exec(expr, {'x': x, 'y': y, 'operator': operator})
Armin Rigofd163f92005-12-29 15:59:19 +00003951 except TypeError:
3952 pass
3953 else:
3954 raise TestFailed("no TypeError from %r" % (expr,))
3955
Guido van Rossume2a383d2007-01-15 16:59:06 +00003956 N1 = sys.maxint + 1 # might trigger OverflowErrors instead of TypeErrors
Armin Rigofd163f92005-12-29 15:59:19 +00003957 N2 = sys.maxint # if sizeof(int) < sizeof(long), might trigger
3958 # ValueErrors instead of TypeErrors
3959 for metaclass in [type, types.ClassType]:
3960 for name, expr, iexpr in [
3961 ('__add__', 'x + y', 'x += y'),
3962 ('__sub__', 'x - y', 'x -= y'),
3963 ('__mul__', 'x * y', 'x *= y'),
Neal Norwitzbcc0db82006-03-24 08:14:36 +00003964 ('__truediv__', 'x / y', None),
3965 ('__floordiv__', 'x // y', None),
Armin Rigofd163f92005-12-29 15:59:19 +00003966 ('__mod__', 'x % y', 'x %= y'),
3967 ('__divmod__', 'divmod(x, y)', None),
3968 ('__pow__', 'x ** y', 'x **= y'),
3969 ('__lshift__', 'x << y', 'x <<= y'),
3970 ('__rshift__', 'x >> y', 'x >>= y'),
3971 ('__and__', 'x & y', 'x &= y'),
3972 ('__or__', 'x | y', 'x |= y'),
3973 ('__xor__', 'x ^ y', 'x ^= y'),
Neal Norwitz4886cc32006-08-21 17:06:07 +00003974 ]:
3975 rname = '__r' + name[2:]
Armin Rigofd163f92005-12-29 15:59:19 +00003976 A = metaclass('A', (), {name: specialmethod})
3977 B = metaclass('B', (), {rname: specialmethod})
3978 a = A()
3979 b = B()
3980 check(expr, a, a)
3981 check(expr, a, b)
3982 check(expr, b, a)
3983 check(expr, b, b)
3984 check(expr, a, N1)
3985 check(expr, a, N2)
3986 check(expr, N1, b)
3987 check(expr, N2, b)
3988 if iexpr:
3989 check(iexpr, a, a)
3990 check(iexpr, a, b)
3991 check(iexpr, b, a)
3992 check(iexpr, b, b)
3993 check(iexpr, a, N1)
3994 check(iexpr, a, N2)
3995 iname = '__i' + name[2:]
3996 C = metaclass('C', (), {iname: specialmethod})
3997 c = C()
3998 check(iexpr, c, a)
3999 check(iexpr, c, b)
4000 check(iexpr, c, N1)
4001 check(iexpr, c, N2)
4002
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004003def test_main():
Guido van Rossumaabe0b32003-05-29 14:26:57 +00004004 weakref_segfault() # Must be first, somehow
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004005 wrapper_segfault()
Guido van Rossum9fc8a292002-05-24 21:40:08 +00004006 do_this_first()
Tim Peters2f93e282001-10-04 05:27:00 +00004007 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004008 lists()
4009 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00004010 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00004011 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004012 ints()
4013 longs()
4014 floats()
4015 complexes()
4016 spamlists()
4017 spamdicts()
4018 pydicts()
4019 pylists()
4020 metaclass()
4021 pymods()
4022 multi()
Guido van Rossumd32047f2002-11-25 21:38:52 +00004023 mro_disagreement()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004024 diamond()
Guido van Rossum9a818922002-11-14 19:50:14 +00004025 ex5()
4026 monotonicity()
4027 consistency_with_epg()
Guido van Rossum37202612001-08-09 19:45:21 +00004028 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004029 slots()
Guido van Rossum8b056da2002-08-13 18:26:26 +00004030 slotspecials()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004031 dynamics()
4032 errors()
4033 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004034 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004035 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00004036 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00004037 classic()
4038 compattr()
4039 newslot()
4040 altmro()
4041 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00004042 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00004043 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00004044 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00004045 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00004046 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00004047 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00004048 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00004049 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00004050 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00004051 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00004052 rich_comparisons()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00004053 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00004054 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00004055 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00004056 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00004057 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00004058 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004059 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00004060 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00004061 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00004062 kwdargs()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004063 recursive__call__()
Guido van Rossumed87ad82001-10-30 02:33:02 +00004064 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00004065 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00004066 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00004067 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00004068 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00004069 dictproxyiterkeys()
4070 dictproxyitervalues()
4071 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00004072 pickleslots()
Guido van Rossum8ace1ab2002-04-06 01:05:01 +00004073 funnynew()
Guido van Rossume8fc6402002-04-16 16:44:51 +00004074 imulbug()
Guido van Rossumd99b3e72002-04-18 00:27:33 +00004075 docdescriptor()
Guido van Rossuma48cb8f2002-06-06 17:53:03 +00004076 copy_setstate()
Guido van Rossum09638c12002-06-13 19:17:46 +00004077 slices()
Tim Peters2484aae2002-07-11 06:56:07 +00004078 subtype_resurrection()
Guido van Rossum2d702462002-08-06 21:28:28 +00004079 slottrash()
Neal Norwitzf9dd0f12002-08-13 17:16:49 +00004080 slotmultipleinheritance()
Guido van Rossum0f5f0b82002-08-09 16:11:37 +00004081 testrmul()
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004082 testipow()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004083 test_mutable_bases()
4084 test_mutable_bases_with_failing_mro()
4085 test_mutable_bases_catch_mro_conflict()
Michael W. Hudson98bbc492002-11-26 14:47:27 +00004086 mutable_names()
Guido van Rossum613f24f2003-01-06 23:00:59 +00004087 subclass_right_op()
Guido van Rossum373c7412003-01-07 13:41:37 +00004088 dict_type_with_metaclass()
Guido van Rossumb6e5a0c2003-02-11 18:44:42 +00004089 meth_class_get()
Guido van Rossum03bc7d32003-02-12 03:32:58 +00004090 isinst_isclass()
Guido van Rossuma89d10e2003-02-12 03:58:38 +00004091 proxysuper()
Guido van Rossum52b27052003-04-15 20:05:10 +00004092 carloverre()
Raymond Hettinger2b6220d2003-06-29 15:44:07 +00004093 filefault()
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00004094 vicious_descriptor_nonsense()
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004095 test_init()
Armin Rigoc6686b72005-11-07 08:38:00 +00004096 methodwrapper()
Armin Rigofd163f92005-12-29 15:59:19 +00004097 notimplemented()
Michael W. Hudson586da8f2002-11-27 15:20:19 +00004098
Guido van Rossumbe19ed72007-02-09 05:37:30 +00004099 if verbose: print("All OK")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004100
Guido van Rossuma56b42b2001-09-20 21:39:07 +00004101if __name__ == "__main__":
4102 test_main()