blob: 830cd08b36c2c25e19f86da75cf1282d668fcc83 [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
Tim Petersc2fe6182001-10-30 23:20:46 +00003from test_support import verify, vereq, verbose, TestFailed, TESTFN
Tim Peters6d6c1a32001-08-02 04:15:00 +00004from copy import deepcopy
5
Guido van Rossum875eeaa2001-10-11 18:33:53 +00006def veris(a, b):
7 if a is not b:
8 raise TestFailed, "%r is %r" % (a, b)
9
Tim Peters6d6c1a32001-08-02 04:15:00 +000010def testunop(a, res, expr="len(a)", meth="__len__"):
11 if verbose: print "checking", expr
12 dict = {'a': a}
Guido van Rossum45704552001-10-08 16:35:45 +000013 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000014 t = type(a)
15 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000016 while meth not in t.__dict__:
17 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000018 vereq(m, t.__dict__[meth])
19 vereq(m(a), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000020 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000021 vereq(bm(), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000022
23def testbinop(a, b, res, expr="a+b", meth="__add__"):
24 if verbose: print "checking", expr
25 dict = {'a': a, 'b': b}
Tim Peters3caca232001-12-06 06:23:26 +000026
27 # XXX Hack so this passes before 2.3 when -Qnew is specified.
28 if meth == "__div__" and 1/2 == 0.5:
29 meth = "__truediv__"
30
Guido van Rossum45704552001-10-08 16:35:45 +000031 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000032 t = type(a)
33 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000034 while meth not in t.__dict__:
35 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000036 vereq(m, t.__dict__[meth])
37 vereq(m(a, b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000038 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000039 vereq(bm(b), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000040
41def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"):
42 if verbose: print "checking", expr
43 dict = {'a': a, 'b': b, 'c': c}
Guido van Rossum45704552001-10-08 16:35:45 +000044 vereq(eval(expr, dict), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000045 t = type(a)
46 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000047 while meth not in t.__dict__:
48 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000049 vereq(m, t.__dict__[meth])
50 vereq(m(a, b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000051 bm = getattr(a, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000052 vereq(bm(b, c), res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000053
54def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"):
55 if verbose: print "checking", stmt
56 dict = {'a': deepcopy(a), 'b': b}
57 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000058 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000059 t = type(a)
60 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000061 while meth not in t.__dict__:
62 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000063 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000064 dict['a'] = deepcopy(a)
65 m(dict['a'], b)
Guido van Rossum45704552001-10-08 16:35:45 +000066 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000067 dict['a'] = deepcopy(a)
68 bm = getattr(dict['a'], meth)
69 bm(b)
Guido van Rossum45704552001-10-08 16:35:45 +000070 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000071
72def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"):
73 if verbose: print "checking", stmt
74 dict = {'a': deepcopy(a), 'b': b, 'c': c}
75 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000076 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000077 t = type(a)
78 m = getattr(t, meth)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000079 while meth not in t.__dict__:
80 t = t.__bases__[0]
Guido van Rossum45704552001-10-08 16:35:45 +000081 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +000082 dict['a'] = deepcopy(a)
83 m(dict['a'], b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000084 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000085 dict['a'] = deepcopy(a)
86 bm = getattr(dict['a'], meth)
87 bm(b, c)
Guido van Rossum45704552001-10-08 16:35:45 +000088 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000089
90def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"):
91 if verbose: print "checking", stmt
92 dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d}
93 exec stmt in dict
Guido van Rossum45704552001-10-08 16:35:45 +000094 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +000095 t = type(a)
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000096 while meth not in t.__dict__:
97 t = t.__bases__[0]
Tim Peters6d6c1a32001-08-02 04:15:00 +000098 m = getattr(t, meth)
Guido van Rossum45704552001-10-08 16:35:45 +000099 vereq(m, t.__dict__[meth])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100 dict['a'] = deepcopy(a)
101 m(dict['a'], b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000102 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000103 dict['a'] = deepcopy(a)
104 bm = getattr(dict['a'], meth)
105 bm(b, c, d)
Guido van Rossum45704552001-10-08 16:35:45 +0000106 vereq(dict['a'], res)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000107
Tim Peters2f93e282001-10-04 05:27:00 +0000108def class_docstrings():
109 class Classic:
110 "A classic docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000111 vereq(Classic.__doc__, "A classic docstring.")
112 vereq(Classic.__dict__['__doc__'], "A classic docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000113
114 class Classic2:
115 pass
116 verify(Classic2.__doc__ is None)
117
Tim Peters4fb1fe82001-10-04 05:48:13 +0000118 class NewStatic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000119 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000120 vereq(NewStatic.__doc__, "Another docstring.")
121 vereq(NewStatic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000122
Tim Peters4fb1fe82001-10-04 05:48:13 +0000123 class NewStatic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000124 pass
125 verify(NewStatic2.__doc__ is None)
126
Tim Peters4fb1fe82001-10-04 05:48:13 +0000127 class NewDynamic(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000128 "Another docstring."
Guido van Rossum45704552001-10-08 16:35:45 +0000129 vereq(NewDynamic.__doc__, "Another docstring.")
130 vereq(NewDynamic.__dict__['__doc__'], "Another docstring.")
Tim Peters2f93e282001-10-04 05:27:00 +0000131
Tim Peters4fb1fe82001-10-04 05:48:13 +0000132 class NewDynamic2(object):
Tim Peters2f93e282001-10-04 05:27:00 +0000133 pass
134 verify(NewDynamic2.__doc__ is None)
135
Tim Peters6d6c1a32001-08-02 04:15:00 +0000136def lists():
137 if verbose: print "Testing list operations..."
138 testbinop([1], [2], [1,2], "a+b", "__add__")
139 testbinop([1,2,3], 2, 1, "b in a", "__contains__")
140 testbinop([1,2,3], 4, 0, "b in a", "__contains__")
141 testbinop([1,2,3], 1, 2, "a[b]", "__getitem__")
142 testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__")
143 testsetop([1], [2], [1,2], "a+=b", "__iadd__")
144 testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__")
145 testunop([1,2,3], 3, "len(a)", "__len__")
146 testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__")
147 testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__")
148 testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__")
149 testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__")
150
151def dicts():
152 if verbose: print "Testing dict operations..."
153 testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__")
154 testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__")
155 testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__")
156 testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__")
157 d = {1:2,3:4}
158 l1 = []
159 for i in d.keys(): l1.append(i)
160 l = []
161 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000162 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000163 l = []
164 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000165 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000166 l = []
Tim Petersa427a2b2001-10-29 22:25:45 +0000167 for i in dict.__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000168 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000169 d = {1:2, 3:4}
170 testunop(d, 2, "len(a)", "__len__")
Guido van Rossum45704552001-10-08 16:35:45 +0000171 vereq(eval(repr(d), {}), d)
172 vereq(eval(d.__repr__(), {}), d)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000173 testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__")
174
Tim Peters25786c02001-09-02 08:22:48 +0000175def dict_constructor():
176 if verbose:
Tim Petersa427a2b2001-10-29 22:25:45 +0000177 print "Testing dict constructor ..."
178 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000179 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000180 d = dict({})
Guido van Rossum45704552001-10-08 16:35:45 +0000181 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000182 d = dict(items={})
Guido van Rossum45704552001-10-08 16:35:45 +0000183 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000184 d = dict({1: 2, 'a': 'b'})
Guido van Rossum45704552001-10-08 16:35:45 +0000185 vereq(d, {1: 2, 'a': 'b'})
Tim Petersa427a2b2001-10-29 22:25:45 +0000186 vereq(d, dict(d.items()))
187 vereq(d, dict(items=d.iteritems()))
Tim Peters25786c02001-09-02 08:22:48 +0000188 for badarg in 0, 0L, 0j, "0", [0], (0,):
189 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000190 dict(badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000191 except TypeError:
192 pass
Tim Peters1fc240e2001-10-26 05:06:50 +0000193 except ValueError:
194 if badarg == "0":
195 # It's a sequence, and its elements are also sequences (gotta
196 # love strings <wink>), but they aren't of length 2, so this
197 # one seemed better as a ValueError than a TypeError.
198 pass
199 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000200 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000201 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000202 raise TestFailed("no TypeError from dict(%r)" % badarg)
Tim Peters25786c02001-09-02 08:22:48 +0000203 try:
Tim Petersa427a2b2001-10-29 22:25:45 +0000204 dict(senseless={})
Tim Peters25786c02001-09-02 08:22:48 +0000205 except TypeError:
206 pass
207 else:
Tim Petersa427a2b2001-10-29 22:25:45 +0000208 raise TestFailed("no TypeError from dict(senseless={})")
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]
Tim Petersa427a2b2001-10-29 22:25:45 +0000230 d = dict(items=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:
261 print "Testing dir() ..."
262 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!
267 for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
268 dir(arg)
269
Tim Peters37a309d2001-09-04 01:20:04 +0000270 # Try classic classes.
Tim Peters5d2b77c2001-09-03 05:47:38 +0000271 class C:
272 Cdata = 1
273 def Cmethod(self): pass
274
275 cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
Guido van Rossum45704552001-10-08 16:35:45 +0000276 vereq(dir(C), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000277 verify('im_self' in dir(C.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000278
279 c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
Guido van Rossum45704552001-10-08 16:35:45 +0000280 vereq(dir(c), cstuff)
Tim Peters5d2b77c2001-09-03 05:47:38 +0000281
282 c.cdata = 2
283 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000284 vereq(dir(c), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000285 verify('im_self' in dir(c.Cmethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000286
287 class A(C):
288 Adata = 1
289 def Amethod(self): pass
Tim Peters5d2b77c2001-09-03 05:47:38 +0000290
Tim Peters37a309d2001-09-04 01:20:04 +0000291 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000292 vereq(dir(A), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000293 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000294 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000295 vereq(dir(a), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000296 verify('im_self' in dir(a.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000297 a.adata = 42
298 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000299 vereq(dir(a), astuff + ['adata', 'amethod'])
Tim Peters37a309d2001-09-04 01:20:04 +0000300
301 # The same, but with new-style classes. Since these have object as a
302 # base class, a lot more gets sucked in.
303 def interesting(strings):
304 return [s for s in strings if not s.startswith('_')]
305
Tim Peters5d2b77c2001-09-03 05:47:38 +0000306 class C(object):
307 Cdata = 1
308 def Cmethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000309
310 cstuff = ['Cdata', 'Cmethod']
Guido van Rossum45704552001-10-08 16:35:45 +0000311 vereq(interesting(dir(C)), cstuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000312
313 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000314 vereq(interesting(dir(c)), cstuff)
Tim Peters305b5852001-09-17 02:38:46 +0000315 verify('im_self' in dir(C.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000316
317 c.cdata = 2
318 c.cmethod = lambda self: 0
Guido van Rossum45704552001-10-08 16:35:45 +0000319 vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000320 verify('im_self' in dir(c.Cmethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000321
Tim Peters5d2b77c2001-09-03 05:47:38 +0000322 class A(C):
323 Adata = 1
324 def Amethod(self): pass
Tim Peters37a309d2001-09-04 01:20:04 +0000325
326 astuff = ['Adata', 'Amethod'] + cstuff
Guido van Rossum45704552001-10-08 16:35:45 +0000327 vereq(interesting(dir(A)), astuff)
Tim Peters305b5852001-09-17 02:38:46 +0000328 verify('im_self' in dir(A.Amethod))
Tim Peters37a309d2001-09-04 01:20:04 +0000329 a = A()
Guido van Rossum45704552001-10-08 16:35:45 +0000330 vereq(interesting(dir(a)), astuff)
Tim Peters37a309d2001-09-04 01:20:04 +0000331 a.adata = 42
332 a.amethod = lambda self: 3
Guido van Rossum45704552001-10-08 16:35:45 +0000333 vereq(interesting(dir(a)), astuff + ['adata', 'amethod'])
Tim Peters305b5852001-09-17 02:38:46 +0000334 verify('im_self' in dir(a.Amethod))
Tim Peters5d2b77c2001-09-03 05:47:38 +0000335
Tim Peterscaaff8d2001-09-10 23:12:14 +0000336 # Try a module subclass.
337 import sys
338 class M(type(sys)):
339 pass
340 minstance = M()
341 minstance.b = 2
342 minstance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000343 vereq(dir(minstance), ['a', 'b'])
Tim Peterscaaff8d2001-09-10 23:12:14 +0000344
345 class M2(M):
346 def getdict(self):
347 return "Not a dict!"
348 __dict__ = property(getdict)
349
350 m2instance = M2()
351 m2instance.b = 2
352 m2instance.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000353 vereq(m2instance.__dict__, "Not a dict!")
Tim Peterscaaff8d2001-09-10 23:12:14 +0000354 try:
355 dir(m2instance)
356 except TypeError:
357 pass
358
Tim Peters9e6a3992001-10-30 05:45:26 +0000359 # Two essentially featureless objects, just inheriting stuff from
360 # object.
361 vereq(dir(None), dir(Ellipsis))
362
Tim Peters6d6c1a32001-08-02 04:15:00 +0000363binops = {
364 'add': '+',
365 'sub': '-',
366 'mul': '*',
367 'div': '/',
368 'mod': '%',
369 'divmod': 'divmod',
370 'pow': '**',
371 'lshift': '<<',
372 'rshift': '>>',
373 'and': '&',
374 'xor': '^',
375 'or': '|',
376 'cmp': 'cmp',
377 'lt': '<',
378 'le': '<=',
379 'eq': '==',
380 'ne': '!=',
381 'gt': '>',
382 'ge': '>=',
383 }
384
385for name, expr in binops.items():
386 if expr.islower():
387 expr = expr + "(a, b)"
388 else:
389 expr = 'a %s b' % expr
390 binops[name] = expr
391
392unops = {
393 'pos': '+',
394 'neg': '-',
395 'abs': 'abs',
396 'invert': '~',
397 'int': 'int',
398 'long': 'long',
399 'float': 'float',
400 'oct': 'oct',
401 'hex': 'hex',
402 }
403
404for name, expr in unops.items():
405 if expr.islower():
406 expr = expr + "(a)"
407 else:
408 expr = '%s a' % expr
409 unops[name] = expr
410
411def numops(a, b, skip=[]):
412 dict = {'a': a, 'b': b}
413 for name, expr in binops.items():
414 if name not in skip:
415 name = "__%s__" % name
416 if hasattr(a, name):
417 res = eval(expr, dict)
418 testbinop(a, b, res, expr, name)
419 for name, expr in unops.items():
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000420 if name not in skip:
421 name = "__%s__" % name
422 if hasattr(a, name):
423 res = eval(expr, dict)
424 testunop(a, res, expr, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000425
426def ints():
427 if verbose: print "Testing int operations..."
428 numops(100, 3)
Guido van Rossum15d529a2002-03-11 00:07:13 +0000429 # The following crashes in Python 2.2
430 vereq((1).__nonzero__(), 1)
431 vereq((0).__nonzero__(), 0)
Guido van Rossumc9e9e402002-03-11 13:21:25 +0000432 # This returns 'NotImplemented' in Python 2.2
433 class C(int):
434 def __add__(self, other):
435 return NotImplemented
436 try:
437 C() + ""
438 except TypeError:
439 pass
440 else:
Neal Norwitz1af5e352002-03-11 14:44:12 +0000441 raise TestFailed, "NotImplemented should have caused TypeError"
Tim Peters6d6c1a32001-08-02 04:15:00 +0000442
443def longs():
444 if verbose: print "Testing long operations..."
445 numops(100L, 3L)
446
447def floats():
448 if verbose: print "Testing float operations..."
449 numops(100.0, 3.0)
450
451def complexes():
452 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000453 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000454 class Number(complex):
455 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000456 def __new__(cls, *args, **kwds):
457 result = complex.__new__(cls, *args)
458 result.prec = kwds.get('prec', 12)
459 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000460 def __repr__(self):
461 prec = self.prec
462 if self.imag == 0.0:
463 return "%.*g" % (prec, self.real)
464 if self.real == 0.0:
465 return "%.*gj" % (prec, self.imag)
466 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
467 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000468
Tim Peters6d6c1a32001-08-02 04:15:00 +0000469 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000470 vereq(`a`, "3.14")
471 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000472
Tim Peters3f996e72001-09-13 19:18:27 +0000473 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000474 vereq(`a`, "3.1")
475 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000476
477 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000478 vereq(`a`, "234.5")
479 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000480
Tim Peters6d6c1a32001-08-02 04:15:00 +0000481def spamlists():
482 if verbose: print "Testing spamlist operations..."
483 import copy, xxsubtype as spam
484 def spamlist(l, memo=None):
485 import xxsubtype as spam
486 return spam.spamlist(l)
487 # This is an ugly hack:
488 copy._deepcopy_dispatch[spam.spamlist] = spamlist
489
490 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
491 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
492 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
493 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
494 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
495 "a[b:c]", "__getslice__")
496 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
497 "a+=b", "__iadd__")
498 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
499 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
500 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
501 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
502 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
503 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
504 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
505 # Test subclassing
506 class C(spam.spamlist):
507 def foo(self): return 1
508 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000509 vereq(a, [])
510 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000511 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000512 vereq(a, [100])
513 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000514 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000515 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000516
517def spamdicts():
518 if verbose: print "Testing spamdict operations..."
519 import copy, xxsubtype as spam
520 def spamdict(d, memo=None):
521 import xxsubtype as spam
522 sd = spam.spamdict()
523 for k, v in d.items(): sd[k] = v
524 return sd
525 # This is an ugly hack:
526 copy._deepcopy_dispatch[spam.spamdict] = spamdict
527
528 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
529 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
530 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
531 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
532 d = spamdict({1:2,3:4})
533 l1 = []
534 for i in d.keys(): l1.append(i)
535 l = []
536 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000537 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000538 l = []
539 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000540 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000541 l = []
542 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000543 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000544 straightd = {1:2, 3:4}
545 spamd = spamdict(straightd)
546 testunop(spamd, 2, "len(a)", "__len__")
547 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
548 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
549 "a[b]=c", "__setitem__")
550 # Test subclassing
551 class C(spam.spamdict):
552 def foo(self): return 1
553 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000554 vereq(a.items(), [])
555 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000556 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000557 vereq(a.items(), [('foo', 'bar')])
558 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000559 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000560 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000561
562def pydicts():
563 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000564 verify(issubclass(dict, dict))
565 verify(isinstance({}, dict))
566 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000567 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000568 verify(d.__class__ is dict)
569 verify(isinstance(d, dict))
570 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000571 state = -1
572 def __init__(self, *a, **kw):
573 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000574 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575 self.state = a[0]
576 if kw:
577 for k, v in kw.items(): self[v] = k
578 def __getitem__(self, key):
579 return self.get(key, 0)
580 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000581 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000582 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000583 def setstate(self, state):
584 self.state = state
585 def getstate(self):
586 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000587 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000588 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000589 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000590 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000591 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000592 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000593 vereq(a.state, -1)
594 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000595 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000596 vereq(a.state, 0)
597 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000598 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000599 vereq(a.state, 10)
600 vereq(a.getstate(), 10)
601 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000602 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000603 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000604 if verbose: print "pydict stress test ..."
605 N = 50
606 for i in range(N):
607 a[i] = C()
608 for j in range(N):
609 a[i][j] = i*j
610 for i in range(N):
611 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000612 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000613
614def pylists():
615 if verbose: print "Testing Python subclass of list..."
616 class C(list):
617 def __getitem__(self, i):
618 return list.__getitem__(self, i) + 100
619 def __getslice__(self, i, j):
620 return (i, j)
621 a = C()
622 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000623 vereq(a[0], 100)
624 vereq(a[1], 101)
625 vereq(a[2], 102)
626 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627
628def metaclass():
629 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630 class C:
631 __metaclass__ = type
632 def __init__(self):
633 self.__state = 0
634 def getstate(self):
635 return self.__state
636 def setstate(self, state):
637 self.__state = state
638 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000639 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000640 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000641 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000642 class D:
643 class __metaclass__(type):
644 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000645 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000646 d = D()
647 verify(d.__class__ is D)
648 class M1(type):
649 def __new__(cls, name, bases, dict):
650 dict['__spam__'] = 1
651 return type.__new__(cls, name, bases, dict)
652 class C:
653 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000654 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000655 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000656 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000657
Guido van Rossum309b5662001-08-17 11:43:17 +0000658 class _instance(object):
659 pass
660 class M2(object):
661 def __new__(cls, name, bases, dict):
662 self = object.__new__(cls)
663 self.name = name
664 self.bases = bases
665 self.dict = dict
666 return self
667 __new__ = staticmethod(__new__)
668 def __call__(self):
669 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000670 # Early binding of methods
671 for key in self.dict:
672 if key.startswith("__"):
673 continue
674 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000675 return it
676 class C:
677 __metaclass__ = M2
678 def spam(self):
679 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000680 vereq(C.name, 'C')
681 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000682 verify('spam' in C.dict)
683 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000684 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685
Guido van Rossum91ee7982001-08-30 20:52:40 +0000686 # More metaclass examples
687
688 class autosuper(type):
689 # Automatically add __super to the class
690 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000691 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000692 cls = super(autosuper, metaclass).__new__(metaclass,
693 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000694 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000695 while name[:1] == "_":
696 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000697 if name:
698 name = "_%s__super" % name
699 else:
700 name = "__super"
701 setattr(cls, name, super(cls))
702 return cls
703 class A:
704 __metaclass__ = autosuper
705 def meth(self):
706 return "A"
707 class B(A):
708 def meth(self):
709 return "B" + self.__super.meth()
710 class C(A):
711 def meth(self):
712 return "C" + self.__super.meth()
713 class D(C, B):
714 def meth(self):
715 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000716 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000717 class E(B, C):
718 def meth(self):
719 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000720 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000721
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000722 class autoproperty(type):
723 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000724 # named _get_x and/or _set_x are found
725 def __new__(metaclass, name, bases, dict):
726 hits = {}
727 for key, val in dict.iteritems():
728 if key.startswith("_get_"):
729 key = key[5:]
730 get, set = hits.get(key, (None, None))
731 get = val
732 hits[key] = get, set
733 elif key.startswith("_set_"):
734 key = key[5:]
735 get, set = hits.get(key, (None, None))
736 set = val
737 hits[key] = get, set
738 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000739 dict[key] = property(get, set)
740 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000741 name, bases, dict)
742 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000743 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000744 def _get_x(self):
745 return -self.__x
746 def _set_x(self, x):
747 self.__x = -x
748 a = A()
749 verify(not hasattr(a, "x"))
750 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000751 vereq(a.x, 12)
752 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000753
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000754 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000755 # Merge of multiple cooperating metaclasses
756 pass
757 class A:
758 __metaclass__ = multimetaclass
759 def _get_x(self):
760 return "A"
761 class B(A):
762 def _get_x(self):
763 return "B" + self.__super._get_x()
764 class C(A):
765 def _get_x(self):
766 return "C" + self.__super._get_x()
767 class D(C, B):
768 def _get_x(self):
769 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000770 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000771
Guido van Rossumf76de622001-10-18 15:49:21 +0000772 # Make sure type(x) doesn't call x.__class__.__init__
773 class T(type):
774 counter = 0
775 def __init__(self, *args):
776 T.counter += 1
777 class C:
778 __metaclass__ = T
779 vereq(T.counter, 1)
780 a = C()
781 vereq(type(a), C)
782 vereq(T.counter, 1)
783
Guido van Rossum29d26062001-12-11 04:37:34 +0000784 class C(object): pass
785 c = C()
786 try: c()
787 except TypeError: pass
788 else: raise TestError, "calling object w/o call method should raise TypeError"
789
Tim Peters6d6c1a32001-08-02 04:15:00 +0000790def pymods():
791 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000792 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000793 import sys
794 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000795 class MM(MT):
796 def __init__(self):
797 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000798 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000800 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801 def __setattr__(self, name, value):
802 log.append(("setattr", name, value))
803 MT.__setattr__(self, name, value)
804 def __delattr__(self, name):
805 log.append(("delattr", name))
806 MT.__delattr__(self, name)
807 a = MM()
808 a.foo = 12
809 x = a.foo
810 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000811 vereq(log, [("setattr", "foo", 12),
812 ("getattr", "foo"),
813 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814
815def multi():
816 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000817 class C(object):
818 def __init__(self):
819 self.__state = 0
820 def getstate(self):
821 return self.__state
822 def setstate(self, state):
823 self.__state = state
824 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000825 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000826 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000827 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000828 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000829 def __init__(self):
830 type({}).__init__(self)
831 C.__init__(self)
832 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000833 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000835 vereq(d.items(), [("hello", "world")])
836 vereq(d["hello"], "world")
837 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000838 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000839 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000840 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841
Guido van Rossume45763a2001-08-10 21:28:46 +0000842 # SF bug #442833
843 class Node(object):
844 def __int__(self):
845 return int(self.foo())
846 def foo(self):
847 return "23"
848 class Frag(Node, list):
849 def foo(self):
850 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000851 vereq(Node().__int__(), 23)
852 vereq(int(Node()), 23)
853 vereq(Frag().__int__(), 42)
854 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000855
Tim Petersa91e9642001-11-14 23:32:33 +0000856 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000857
858 class A:
859 x = 1
860
861 class B(A):
862 pass
863
864 class C(A):
865 x = 2
866
867 class D(B, C):
868 pass
869 vereq(D.x, 1)
870
871 # Classic MRO is preserved for a classic base class.
872 class E(D, object):
873 pass
874 vereq(E.__mro__, (E, D, B, A, C, object))
875 vereq(E.x, 1)
876
877 # But with a mix of classic bases, their MROs are combined using
878 # new-style MRO.
879 class F(B, C, object):
880 pass
881 vereq(F.__mro__, (F, B, C, A, object))
882 vereq(F.x, 2)
883
884 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000885 class C:
886 def cmethod(self):
887 return "C a"
888 def all_method(self):
889 return "C b"
890
891 class M1(C, object):
892 def m1method(self):
893 return "M1 a"
894 def all_method(self):
895 return "M1 b"
896
897 vereq(M1.__mro__, (M1, C, object))
898 m = M1()
899 vereq(m.cmethod(), "C a")
900 vereq(m.m1method(), "M1 a")
901 vereq(m.all_method(), "M1 b")
902
903 class D(C):
904 def dmethod(self):
905 return "D a"
906 def all_method(self):
907 return "D b"
908
909 class M2(object, D):
910 def m2method(self):
911 return "M2 a"
912 def all_method(self):
913 return "M2 b"
914
915 vereq(M2.__mro__, (M2, object, D, C))
916 m = M2()
917 vereq(m.cmethod(), "C a")
918 vereq(m.dmethod(), "D a")
919 vereq(m.m2method(), "M2 a")
920 vereq(m.all_method(), "M2 b")
921
922 class M3(M1, object, M2):
923 def m3method(self):
924 return "M3 a"
925 def all_method(self):
926 return "M3 b"
927 # XXX Expected this (the commented-out result):
928 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
929 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000930 m = M3()
931 vereq(m.cmethod(), "C a")
932 vereq(m.dmethod(), "D a")
933 vereq(m.m1method(), "M1 a")
934 vereq(m.m2method(), "M2 a")
935 vereq(m.m3method(), "M3 a")
936 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000937
Guido van Rossume54616c2001-12-14 04:19:56 +0000938 class Classic:
939 pass
940 try:
941 class New(Classic):
942 __metaclass__ = type
943 except TypeError:
944 pass
945 else:
946 raise TestFailed, "new class with only classic bases - shouldn't be"
947
Tim Peters6d6c1a32001-08-02 04:15:00 +0000948def diamond():
949 if verbose: print "Testing multiple inheritance special cases..."
950 class A(object):
951 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000952 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000953 class B(A):
954 def boo(self): return "B"
955 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000956 vereq(B().spam(), "B")
957 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000958 class C(A):
959 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000960 vereq(C().spam(), "A")
961 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000962 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000963 vereq(D().spam(), "B")
964 vereq(D().boo(), "B")
965 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000966 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000967 vereq(E().spam(), "B")
968 vereq(E().boo(), "C")
969 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000970 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000971 vereq(F().spam(), "B")
972 vereq(F().boo(), "B")
973 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000974 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000975 vereq(G().spam(), "B")
976 vereq(G().boo(), "C")
977 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000978
Guido van Rossum37202612001-08-09 19:45:21 +0000979def objects():
980 if verbose: print "Testing object class..."
981 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000982 vereq(a.__class__, object)
983 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000984 b = object()
985 verify(a is not b)
986 verify(not hasattr(a, "foo"))
987 try:
988 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000989 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000990 pass
991 else:
992 verify(0, "object() should not allow setting a foo attribute")
993 verify(not hasattr(object(), "__dict__"))
994
995 class Cdict(object):
996 pass
997 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000998 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000999 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001000 vereq(x.foo, 1)
1001 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +00001002
Tim Peters6d6c1a32001-08-02 04:15:00 +00001003def slots():
1004 if verbose: print "Testing __slots__..."
1005 class C0(object):
1006 __slots__ = []
1007 x = C0()
1008 verify(not hasattr(x, "__dict__"))
1009 verify(not hasattr(x, "foo"))
1010
1011 class C1(object):
1012 __slots__ = ['a']
1013 x = C1()
1014 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001015 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001016 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001017 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +00001018 x.a = None
1019 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001020 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +00001021 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001022
1023 class C3(object):
1024 __slots__ = ['a', 'b', 'c']
1025 x = C3()
1026 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001027 verify(not hasattr(x, 'a'))
1028 verify(not hasattr(x, 'b'))
1029 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001030 x.a = 1
1031 x.b = 2
1032 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001033 vereq(x.a, 1)
1034 vereq(x.b, 2)
1035 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001036
Guido van Rossum33bab012001-12-05 22:45:48 +00001037 # Test leaks
1038 class Counted(object):
1039 counter = 0 # counts the number of instances alive
1040 def __init__(self):
1041 Counted.counter += 1
1042 def __del__(self):
1043 Counted.counter -= 1
1044 class C(object):
1045 __slots__ = ['a', 'b', 'c']
1046 x = C()
1047 x.a = Counted()
1048 x.b = Counted()
1049 x.c = Counted()
1050 vereq(Counted.counter, 3)
1051 del x
1052 vereq(Counted.counter, 0)
1053 class D(C):
1054 pass
1055 x = D()
1056 x.a = Counted()
1057 x.z = Counted()
1058 vereq(Counted.counter, 2)
1059 del x
1060 vereq(Counted.counter, 0)
1061 class E(D):
1062 __slots__ = ['e']
1063 x = E()
1064 x.a = Counted()
1065 x.z = Counted()
1066 x.e = Counted()
1067 vereq(Counted.counter, 3)
1068 del x
1069 vereq(Counted.counter, 0)
1070
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001072 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001073 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001074 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001075 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001076 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001077 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001079 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001080 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001081 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001082 vereq(E.foo, 1)
1083 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001084 # Test dynamic instances
1085 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001086 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001087 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001088 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001089 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001090 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001091 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001092 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001093 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001094 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001095 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001096 vereq(int(a), 100)
1097 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001098 verify(not hasattr(a, "spam"))
1099 def mygetattr(self, name):
1100 if name == "spam":
1101 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001102 raise AttributeError
1103 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001104 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001105 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001106 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001107 def mysetattr(self, name, value):
1108 if name == "spam":
1109 raise AttributeError
1110 return object.__setattr__(self, name, value)
1111 C.__setattr__ = mysetattr
1112 try:
1113 a.spam = "not spam"
1114 except AttributeError:
1115 pass
1116 else:
1117 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001118 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001119 class D(C):
1120 pass
1121 d = D()
1122 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001123 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001124
Guido van Rossum7e35d572001-09-15 03:14:32 +00001125 # Test handling of int*seq and seq*int
1126 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001127 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001128 vereq("a"*I(2), "aa")
1129 vereq(I(2)*"a", "aa")
1130 vereq(2*I(3), 6)
1131 vereq(I(3)*2, 6)
1132 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001133
1134 # Test handling of long*seq and seq*long
1135 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001136 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001137 vereq("a"*L(2L), "aa")
1138 vereq(L(2L)*"a", "aa")
1139 vereq(2*L(3), 6)
1140 vereq(L(3)*2, 6)
1141 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001142
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001143 # Test comparison of classes with dynamic metaclasses
1144 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001145 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001146 class someclass:
1147 __metaclass__ = dynamicmetaclass
1148 verify(someclass != object)
1149
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150def errors():
1151 if verbose: print "Testing errors..."
1152
1153 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001154 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155 pass
1156 except TypeError:
1157 pass
1158 else:
1159 verify(0, "inheritance from both list and dict should be illegal")
1160
1161 try:
1162 class C(object, None):
1163 pass
1164 except TypeError:
1165 pass
1166 else:
1167 verify(0, "inheritance from non-type should be illegal")
1168 class Classic:
1169 pass
1170
1171 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001172 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001173 pass
1174 except TypeError:
1175 pass
1176 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001177 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001178
1179 try:
1180 class C(object):
1181 __slots__ = 1
1182 except TypeError:
1183 pass
1184 else:
1185 verify(0, "__slots__ = 1 should be illegal")
1186
1187 try:
1188 class C(object):
1189 __slots__ = [1]
1190 except TypeError:
1191 pass
1192 else:
1193 verify(0, "__slots__ = [1] should be illegal")
1194
1195def classmethods():
1196 if verbose: print "Testing class methods..."
1197 class C(object):
1198 def foo(*a): return a
1199 goo = classmethod(foo)
1200 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001201 vereq(C.goo(1), (C, 1))
1202 vereq(c.goo(1), (C, 1))
1203 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001204 class D(C):
1205 pass
1206 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001207 vereq(D.goo(1), (D, 1))
1208 vereq(d.goo(1), (D, 1))
1209 vereq(d.foo(1), (d, 1))
1210 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum7e305482002-03-18 03:09:06 +00001211 # Test for a specific crash (SF bug 528132)
1212 def f(cls, arg): return (cls, arg)
1213 ff = classmethod(f)
1214 vereq(ff.__get__(0, int)(42), (int, 42))
1215 vereq(ff.__get__(0)(42), (int, 42))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001216
1217def staticmethods():
1218 if verbose: print "Testing static methods..."
1219 class C(object):
1220 def foo(*a): return a
1221 goo = staticmethod(foo)
1222 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001223 vereq(C.goo(1), (1,))
1224 vereq(c.goo(1), (1,))
1225 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001226 class D(C):
1227 pass
1228 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001229 vereq(D.goo(1), (1,))
1230 vereq(d.goo(1), (1,))
1231 vereq(d.foo(1), (d, 1))
1232 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001233
1234def classic():
1235 if verbose: print "Testing classic classes..."
1236 class C:
1237 def foo(*a): return a
1238 goo = classmethod(foo)
1239 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001240 vereq(C.goo(1), (C, 1))
1241 vereq(c.goo(1), (C, 1))
1242 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001243 class D(C):
1244 pass
1245 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001246 vereq(D.goo(1), (D, 1))
1247 vereq(d.goo(1), (D, 1))
1248 vereq(d.foo(1), (d, 1))
1249 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001250 class E: # *not* subclassing from C
1251 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001252 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001253 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001254
1255def compattr():
1256 if verbose: print "Testing computed attributes..."
1257 class C(object):
1258 class computed_attribute(object):
1259 def __init__(self, get, set=None):
1260 self.__get = get
1261 self.__set = set
1262 def __get__(self, obj, type=None):
1263 return self.__get(obj)
1264 def __set__(self, obj, value):
1265 return self.__set(obj, value)
1266 def __init__(self):
1267 self.__x = 0
1268 def __get_x(self):
1269 x = self.__x
1270 self.__x = x+1
1271 return x
1272 def __set_x(self, x):
1273 self.__x = x
1274 x = computed_attribute(__get_x, __set_x)
1275 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001276 vereq(a.x, 0)
1277 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001278 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001279 vereq(a.x, 10)
1280 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001281
1282def newslot():
1283 if verbose: print "Testing __new__ slot override..."
1284 class C(list):
1285 def __new__(cls):
1286 self = list.__new__(cls)
1287 self.foo = 1
1288 return self
1289 def __init__(self):
1290 self.foo = self.foo + 2
1291 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001292 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001293 verify(a.__class__ is C)
1294 class D(C):
1295 pass
1296 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001297 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001298 verify(b.__class__ is D)
1299
Tim Peters6d6c1a32001-08-02 04:15:00 +00001300def altmro():
1301 if verbose: print "Testing mro() and overriding it..."
1302 class A(object):
1303 def f(self): return "A"
1304 class B(A):
1305 pass
1306 class C(A):
1307 def f(self): return "C"
1308 class D(B, C):
1309 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001310 vereq(D.mro(), [D, B, C, A, object])
1311 vereq(D.__mro__, (D, B, C, A, object))
1312 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001313 class PerverseMetaType(type):
1314 def mro(cls):
1315 L = type.mro(cls)
1316 L.reverse()
1317 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001318 class X(A,B,C,D):
1319 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001320 vereq(X.__mro__, (object, A, C, B, D, X))
1321 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001322
1323def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001324 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001325
1326 class B(object):
1327 "Intermediate class because object doesn't have a __setattr__"
1328
1329 class C(B):
1330
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001331 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001332 if name == "foo":
1333 return ("getattr", name)
1334 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001335 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336 def __setattr__(self, name, value):
1337 if name == "foo":
1338 self.setattr = (name, value)
1339 else:
1340 return B.__setattr__(self, name, value)
1341 def __delattr__(self, name):
1342 if name == "foo":
1343 self.delattr = name
1344 else:
1345 return B.__delattr__(self, name)
1346
1347 def __getitem__(self, key):
1348 return ("getitem", key)
1349 def __setitem__(self, key, value):
1350 self.setitem = (key, value)
1351 def __delitem__(self, key):
1352 self.delitem = key
1353
1354 def __getslice__(self, i, j):
1355 return ("getslice", i, j)
1356 def __setslice__(self, i, j, value):
1357 self.setslice = (i, j, value)
1358 def __delslice__(self, i, j):
1359 self.delslice = (i, j)
1360
1361 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001362 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001363 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001364 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001365 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001366 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001367
Guido van Rossum45704552001-10-08 16:35:45 +00001368 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001369 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001370 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001371 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001372 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001373
Guido van Rossum45704552001-10-08 16:35:45 +00001374 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001375 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001376 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001377 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001378 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001379
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001380def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001381 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001382 class C(object):
1383 def __init__(self, x):
1384 self.x = x
1385 def foo(self):
1386 return self.x
1387 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001388 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001389 class D(C):
1390 boo = C.foo
1391 goo = c1.foo
1392 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001393 vereq(d2.foo(), 2)
1394 vereq(d2.boo(), 2)
1395 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001396 class E(object):
1397 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001398 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001399 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001400
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001401def specials():
1402 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001403 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001404 # Test the default behavior for static classes
1405 class C(object):
1406 def __getitem__(self, i):
1407 if 0 <= i < 10: return i
1408 raise IndexError
1409 c1 = C()
1410 c2 = C()
1411 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001412 vereq(hash(c1), id(c1))
1413 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1414 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001415 verify(c1 != c2)
1416 verify(not c1 != c1)
1417 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001418 # Note that the module name appears in str/repr, and that varies
1419 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001420 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001421 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001422 verify(-1 not in c1)
1423 for i in range(10):
1424 verify(i in c1)
1425 verify(10 not in c1)
1426 # Test the default behavior for dynamic classes
1427 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001428 def __getitem__(self, i):
1429 if 0 <= i < 10: return i
1430 raise IndexError
1431 d1 = D()
1432 d2 = D()
1433 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001434 vereq(hash(d1), id(d1))
1435 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1436 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001437 verify(d1 != d2)
1438 verify(not d1 != d1)
1439 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001440 # Note that the module name appears in str/repr, and that varies
1441 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001442 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001443 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001444 verify(-1 not in d1)
1445 for i in range(10):
1446 verify(i in d1)
1447 verify(10 not in d1)
1448 # Test overridden behavior for static classes
1449 class Proxy(object):
1450 def __init__(self, x):
1451 self.x = x
1452 def __nonzero__(self):
1453 return not not self.x
1454 def __hash__(self):
1455 return hash(self.x)
1456 def __eq__(self, other):
1457 return self.x == other
1458 def __ne__(self, other):
1459 return self.x != other
1460 def __cmp__(self, other):
1461 return cmp(self.x, other.x)
1462 def __str__(self):
1463 return "Proxy:%s" % self.x
1464 def __repr__(self):
1465 return "Proxy(%r)" % self.x
1466 def __contains__(self, value):
1467 return value in self.x
1468 p0 = Proxy(0)
1469 p1 = Proxy(1)
1470 p_1 = Proxy(-1)
1471 verify(not p0)
1472 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001473 vereq(hash(p0), hash(0))
1474 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001475 verify(p0 != p1)
1476 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001477 vereq(not p0, p1)
1478 vereq(cmp(p0, p1), -1)
1479 vereq(cmp(p0, p0), 0)
1480 vereq(cmp(p0, p_1), 1)
1481 vereq(str(p0), "Proxy:0")
1482 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001483 p10 = Proxy(range(10))
1484 verify(-1 not in p10)
1485 for i in range(10):
1486 verify(i in p10)
1487 verify(10 not in p10)
1488 # Test overridden behavior for dynamic classes
1489 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001490 def __init__(self, x):
1491 self.x = x
1492 def __nonzero__(self):
1493 return not not self.x
1494 def __hash__(self):
1495 return hash(self.x)
1496 def __eq__(self, other):
1497 return self.x == other
1498 def __ne__(self, other):
1499 return self.x != other
1500 def __cmp__(self, other):
1501 return cmp(self.x, other.x)
1502 def __str__(self):
1503 return "DProxy:%s" % self.x
1504 def __repr__(self):
1505 return "DProxy(%r)" % self.x
1506 def __contains__(self, value):
1507 return value in self.x
1508 p0 = DProxy(0)
1509 p1 = DProxy(1)
1510 p_1 = DProxy(-1)
1511 verify(not p0)
1512 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001513 vereq(hash(p0), hash(0))
1514 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001515 verify(p0 != p1)
1516 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001517 vereq(not p0, p1)
1518 vereq(cmp(p0, p1), -1)
1519 vereq(cmp(p0, p0), 0)
1520 vereq(cmp(p0, p_1), 1)
1521 vereq(str(p0), "DProxy:0")
1522 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001523 p10 = DProxy(range(10))
1524 verify(-1 not in p10)
1525 for i in range(10):
1526 verify(i in p10)
1527 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001528 # Safety test for __cmp__
1529 def unsafecmp(a, b):
1530 try:
1531 a.__class__.__cmp__(a, b)
1532 except TypeError:
1533 pass
1534 else:
1535 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1536 a.__class__, a, b)
1537 unsafecmp(u"123", "123")
1538 unsafecmp("123", u"123")
1539 unsafecmp(1, 1.0)
1540 unsafecmp(1.0, 1)
1541 unsafecmp(1, 1L)
1542 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001543
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001544def weakrefs():
1545 if verbose: print "Testing weak references..."
1546 import weakref
1547 class C(object):
1548 pass
1549 c = C()
1550 r = weakref.ref(c)
1551 verify(r() is c)
1552 del c
1553 verify(r() is None)
1554 del r
1555 class NoWeak(object):
1556 __slots__ = ['foo']
1557 no = NoWeak()
1558 try:
1559 weakref.ref(no)
1560 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001561 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001562 else:
1563 verify(0, "weakref.ref(no) should be illegal")
1564 class Weak(object):
1565 __slots__ = ['foo', '__weakref__']
1566 yes = Weak()
1567 r = weakref.ref(yes)
1568 verify(r() is yes)
1569 del yes
1570 verify(r() is None)
1571 del r
1572
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001573def properties():
1574 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001575 class C(object):
1576 def getx(self):
1577 return self.__x
1578 def setx(self, value):
1579 self.__x = value
1580 def delx(self):
1581 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001582 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001583 a = C()
1584 verify(not hasattr(a, "x"))
1585 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001586 vereq(a._C__x, 42)
1587 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001588 del a.x
1589 verify(not hasattr(a, "x"))
1590 verify(not hasattr(a, "_C__x"))
1591 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001592 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001593## C.x.__set__(a)
1594## verify(not hasattr(a, "x"))
1595
Tim Peters66c1a522001-09-24 21:17:50 +00001596 raw = C.__dict__['x']
1597 verify(isinstance(raw, property))
1598
1599 attrs = dir(raw)
1600 verify("__doc__" in attrs)
1601 verify("fget" in attrs)
1602 verify("fset" in attrs)
1603 verify("fdel" in attrs)
1604
Guido van Rossum45704552001-10-08 16:35:45 +00001605 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001606 verify(raw.fget is C.__dict__['getx'])
1607 verify(raw.fset is C.__dict__['setx'])
1608 verify(raw.fdel is C.__dict__['delx'])
1609
1610 for attr in "__doc__", "fget", "fset", "fdel":
1611 try:
1612 setattr(raw, attr, 42)
1613 except TypeError, msg:
1614 if str(msg).find('readonly') < 0:
1615 raise TestFailed("when setting readonly attr %r on a "
1616 "property, got unexpected TypeError "
1617 "msg %r" % (attr, str(msg)))
1618 else:
1619 raise TestFailed("expected TypeError from trying to set "
1620 "readonly %r attr on a property" % attr)
1621
Guido van Rossumc4a18802001-08-24 16:55:27 +00001622def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001623 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001624
1625 class A(object):
1626 def meth(self, a):
1627 return "A(%r)" % a
1628
Guido van Rossum45704552001-10-08 16:35:45 +00001629 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001630
1631 class B(A):
1632 def __init__(self):
1633 self.__super = super(B, self)
1634 def meth(self, a):
1635 return "B(%r)" % a + self.__super.meth(a)
1636
Guido van Rossum45704552001-10-08 16:35:45 +00001637 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001638
1639 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001640 def meth(self, a):
1641 return "C(%r)" % a + self.__super.meth(a)
1642 C._C__super = super(C)
1643
Guido van Rossum45704552001-10-08 16:35:45 +00001644 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001645
1646 class D(C, B):
1647 def meth(self, a):
1648 return "D(%r)" % a + super(D, self).meth(a)
1649
Guido van Rossum5b443c62001-12-03 15:38:28 +00001650 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1651
1652 # Test for subclassing super
1653
1654 class mysuper(super):
1655 def __init__(self, *args):
1656 return super(mysuper, self).__init__(*args)
1657
1658 class E(D):
1659 def meth(self, a):
1660 return "E(%r)" % a + mysuper(E, self).meth(a)
1661
1662 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1663
1664 class F(E):
1665 def meth(self, a):
1666 s = self.__super
1667 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1668 F._F__super = mysuper(F)
1669
1670 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1671
1672 # Make sure certain errors are raised
1673
1674 try:
1675 super(D, 42)
1676 except TypeError:
1677 pass
1678 else:
1679 raise TestFailed, "shouldn't allow super(D, 42)"
1680
1681 try:
1682 super(D, C())
1683 except TypeError:
1684 pass
1685 else:
1686 raise TestFailed, "shouldn't allow super(D, C())"
1687
1688 try:
1689 super(D).__get__(12)
1690 except TypeError:
1691 pass
1692 else:
1693 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1694
1695 try:
1696 super(D).__get__(C())
1697 except TypeError:
1698 pass
1699 else:
1700 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001701
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001702def inherits():
1703 if verbose: print "Testing inheritance from basic types..."
1704
1705 class hexint(int):
1706 def __repr__(self):
1707 return hex(self)
1708 def __add__(self, other):
1709 return hexint(int.__add__(self, other))
1710 # (Note that overriding __radd__ doesn't work,
1711 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001712 vereq(repr(hexint(7) + 9), "0x10")
1713 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001714 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001715 vereq(a, 12345)
1716 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001717 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001718 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001719 verify((+a).__class__ is int)
1720 verify((a >> 0).__class__ is int)
1721 verify((a << 0).__class__ is int)
1722 verify((hexint(0) << 12).__class__ is int)
1723 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001724
1725 class octlong(long):
1726 __slots__ = []
1727 def __str__(self):
1728 s = oct(self)
1729 if s[-1] == 'L':
1730 s = s[:-1]
1731 return s
1732 def __add__(self, other):
1733 return self.__class__(super(octlong, self).__add__(other))
1734 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001735 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001736 # (Note that overriding __radd__ here only seems to work
1737 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001738 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001739 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001740 vereq(a, 12345L)
1741 vereq(long(a), 12345L)
1742 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001743 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001744 verify((+a).__class__ is long)
1745 verify((-a).__class__ is long)
1746 verify((-octlong(0)).__class__ is long)
1747 verify((a >> 0).__class__ is long)
1748 verify((a << 0).__class__ is long)
1749 verify((a - 0).__class__ is long)
1750 verify((a * 1).__class__ is long)
1751 verify((a ** 1).__class__ is long)
1752 verify((a // 1).__class__ is long)
1753 verify((1 * a).__class__ is long)
1754 verify((a | 0).__class__ is long)
1755 verify((a ^ 0).__class__ is long)
1756 verify((a & -1L).__class__ is long)
1757 verify((octlong(0) << 12).__class__ is long)
1758 verify((octlong(0) >> 12).__class__ is long)
1759 verify(abs(octlong(0)).__class__ is long)
1760
1761 # Because octlong overrides __add__, we can't check the absence of +0
1762 # optimizations using octlong.
1763 class longclone(long):
1764 pass
1765 a = longclone(1)
1766 verify((a + 0).__class__ is long)
1767 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001768
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001769 # Check that negative clones don't segfault
1770 a = longclone(-1)
1771 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001772 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001773
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001774 class precfloat(float):
1775 __slots__ = ['prec']
1776 def __init__(self, value=0.0, prec=12):
1777 self.prec = int(prec)
1778 float.__init__(value)
1779 def __repr__(self):
1780 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001781 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001782 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001783 vereq(a, 12345.0)
1784 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001785 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001786 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001787 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001788
Tim Peters2400fa42001-09-12 19:12:49 +00001789 class madcomplex(complex):
1790 def __repr__(self):
1791 return "%.17gj%+.17g" % (self.imag, self.real)
1792 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001793 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001794 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001795 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001796 vereq(a, base)
1797 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001798 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001799 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001800 vereq(repr(a), "4j-3")
1801 vereq(a, base)
1802 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001803 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001804 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001805 veris((+a).__class__, complex)
1806 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001807 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001808 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001809 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001810 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001812 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001813 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001814
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001815 class madtuple(tuple):
1816 _rev = None
1817 def rev(self):
1818 if self._rev is not None:
1819 return self._rev
1820 L = list(self)
1821 L.reverse()
1822 self._rev = self.__class__(L)
1823 return self._rev
1824 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001825 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1826 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1827 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001828 for i in range(512):
1829 t = madtuple(range(i))
1830 u = t.rev()
1831 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001832 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001833 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001834 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001835 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001836 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001837 verify(a[:].__class__ is tuple)
1838 verify((a * 1).__class__ is tuple)
1839 verify((a * 0).__class__ is tuple)
1840 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001841 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001842 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001843 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001844 verify((a + a).__class__ is tuple)
1845 verify((a * 0).__class__ is tuple)
1846 verify((a * 1).__class__ is tuple)
1847 verify((a * 2).__class__ is tuple)
1848 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001849
1850 class madstring(str):
1851 _rev = None
1852 def rev(self):
1853 if self._rev is not None:
1854 return self._rev
1855 L = list(self)
1856 L.reverse()
1857 self._rev = self.__class__("".join(L))
1858 return self._rev
1859 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001860 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1861 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1862 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001863 for i in range(256):
1864 s = madstring("".join(map(chr, range(i))))
1865 t = s.rev()
1866 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001867 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001868 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001869 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001870 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001871
Tim Peters8fa5dd02001-09-12 02:18:30 +00001872 base = "\x00" * 5
1873 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001874 vereq(s, base)
1875 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001876 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001877 vereq(hash(s), hash(base))
1878 vereq({s: 1}[base], 1)
1879 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001880 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001881 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001882 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001883 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001884 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001885 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001886 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001887 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001888 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001889 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001890 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001891 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001892 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001893 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001894 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001895 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001896 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001897 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001898 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001899 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001900 identitytab = ''.join([chr(i) for i in range(256)])
1901 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001902 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001903 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001904 vereq(s.translate(identitytab, "x"), base)
1905 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001906 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001907 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001908 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001909 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001910 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001911 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001912 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001913 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001914 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001915 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001916
Tim Peters111f6092001-09-12 07:54:51 +00001917 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001918 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001919 verify(intern(s).__class__ is str)
1920 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001921 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001922
1923 i = intern("y x")
1924 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001925 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001926 verify(intern(s).__class__ is str)
1927 verify(intern(s) is i)
1928
1929 s = madstring(i)
1930 verify(intern(s).__class__ is str)
1931 verify(intern(s) is i)
1932
Guido van Rossum91ee7982001-08-30 20:52:40 +00001933 class madunicode(unicode):
1934 _rev = None
1935 def rev(self):
1936 if self._rev is not None:
1937 return self._rev
1938 L = list(self)
1939 L.reverse()
1940 self._rev = self.__class__(u"".join(L))
1941 return self._rev
1942 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(u, u"ABCDEF")
1944 vereq(u.rev(), madunicode(u"FEDCBA"))
1945 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001946 base = u"12345"
1947 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001948 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001949 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001950 vereq(hash(u), hash(base))
1951 vereq({u: 1}[base], 1)
1952 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001953 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001954 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001955 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001956 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001957 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001958 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001959 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001960 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001961 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001962 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001963 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001964 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001965 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001966 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001967 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001968 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001969 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001970 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001971 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001972 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001973 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001974 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001975 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001976 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001977 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001978 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001979 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001980 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001981 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001982 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001983 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001984 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001985 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001986 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001987 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001988 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001989 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001990 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001991
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001992 class sublist(list):
1993 pass
1994 a = sublist(range(5))
1995 vereq(a, range(5))
1996 a.append("hello")
1997 vereq(a, range(5) + ["hello"])
1998 a[5] = 5
1999 vereq(a, range(6))
2000 a.extend(range(6, 20))
2001 vereq(a, range(20))
2002 a[-5:] = []
2003 vereq(a, range(15))
2004 del a[10:15]
2005 vereq(len(a), 10)
2006 vereq(a, range(10))
2007 vereq(list(a), range(10))
2008 vereq(a[0], 0)
2009 vereq(a[9], 9)
2010 vereq(a[-10], 0)
2011 vereq(a[-1], 9)
2012 vereq(a[:5], range(5))
2013
Tim Peters59c9a642001-09-13 05:38:56 +00002014 class CountedInput(file):
2015 """Counts lines read by self.readline().
2016
2017 self.lineno is the 0-based ordinal of the last line read, up to
2018 a maximum of one greater than the number of lines in the file.
2019
2020 self.ateof is true if and only if the final "" line has been read,
2021 at which point self.lineno stops incrementing, and further calls
2022 to readline() continue to return "".
2023 """
2024
2025 lineno = 0
2026 ateof = 0
2027 def readline(self):
2028 if self.ateof:
2029 return ""
2030 s = file.readline(self)
2031 # Next line works too.
2032 # s = super(CountedInput, self).readline()
2033 self.lineno += 1
2034 if s == "":
2035 self.ateof = 1
2036 return s
2037
Tim Peters561f8992001-09-13 19:36:36 +00002038 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002039 lines = ['a\n', 'b\n', 'c\n']
2040 try:
2041 f.writelines(lines)
2042 f.close()
2043 f = CountedInput(TESTFN)
2044 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2045 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002046 vereq(expected, got)
2047 vereq(f.lineno, i)
2048 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002049 f.close()
2050 finally:
2051 try:
2052 f.close()
2053 except:
2054 pass
2055 try:
2056 import os
2057 os.unlink(TESTFN)
2058 except:
2059 pass
2060
Tim Peters808b94e2001-09-13 19:33:07 +00002061def keywords():
2062 if verbose:
2063 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002064 vereq(int(x=1), 1)
2065 vereq(float(x=2), 2.0)
2066 vereq(long(x=3), 3L)
2067 vereq(complex(imag=42, real=666), complex(666, 42))
2068 vereq(str(object=500), '500')
2069 vereq(unicode(string='abc', errors='strict'), u'abc')
2070 vereq(tuple(sequence=range(3)), (0, 1, 2))
2071 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002072 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002073
2074 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002075 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002076 try:
2077 constructor(bogus_keyword_arg=1)
2078 except TypeError:
2079 pass
2080 else:
2081 raise TestFailed("expected TypeError from bogus keyword "
2082 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002083
Tim Peters8fa45672001-09-13 21:01:29 +00002084def restricted():
2085 import rexec
2086 if verbose:
2087 print "Testing interaction with restricted execution ..."
2088
2089 sandbox = rexec.RExec()
2090
2091 code1 = """f = open(%r, 'w')""" % TESTFN
2092 code2 = """f = file(%r, 'w')""" % TESTFN
2093 code3 = """\
2094f = open(%r)
2095t = type(f) # a sneaky way to get the file() constructor
2096f.close()
2097f = t(%r, 'w') # rexec can't catch this by itself
2098""" % (TESTFN, TESTFN)
2099
2100 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2101 f.close()
2102
2103 try:
2104 for code in code1, code2, code3:
2105 try:
2106 sandbox.r_exec(code)
2107 except IOError, msg:
2108 if str(msg).find("restricted") >= 0:
2109 outcome = "OK"
2110 else:
2111 outcome = "got an exception, but not an expected one"
2112 else:
2113 outcome = "expected a restricted-execution exception"
2114
2115 if outcome != "OK":
2116 raise TestFailed("%s, in %r" % (outcome, code))
2117
2118 finally:
2119 try:
2120 import os
2121 os.unlink(TESTFN)
2122 except:
2123 pass
2124
Tim Peters0ab085c2001-09-14 00:25:33 +00002125def str_subclass_as_dict_key():
2126 if verbose:
2127 print "Testing a str subclass used as dict key .."
2128
2129 class cistr(str):
2130 """Sublcass of str that computes __eq__ case-insensitively.
2131
2132 Also computes a hash code of the string in canonical form.
2133 """
2134
2135 def __init__(self, value):
2136 self.canonical = value.lower()
2137 self.hashcode = hash(self.canonical)
2138
2139 def __eq__(self, other):
2140 if not isinstance(other, cistr):
2141 other = cistr(other)
2142 return self.canonical == other.canonical
2143
2144 def __hash__(self):
2145 return self.hashcode
2146
Guido van Rossum45704552001-10-08 16:35:45 +00002147 vereq(cistr('ABC'), 'abc')
2148 vereq('aBc', cistr('ABC'))
2149 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002150
2151 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002152 vereq(d[cistr('one')], 1)
2153 vereq(d[cistr('tWo')], 2)
2154 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002155 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002156 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002157
Guido van Rossumab3b0342001-09-18 20:38:53 +00002158def classic_comparisons():
2159 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002160 class classic:
2161 pass
2162 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002163 if verbose: print " (base = %s)" % base
2164 class C(base):
2165 def __init__(self, value):
2166 self.value = int(value)
2167 def __cmp__(self, other):
2168 if isinstance(other, C):
2169 return cmp(self.value, other.value)
2170 if isinstance(other, int) or isinstance(other, long):
2171 return cmp(self.value, other)
2172 return NotImplemented
2173 c1 = C(1)
2174 c2 = C(2)
2175 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002176 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002177 c = {1: c1, 2: c2, 3: c3}
2178 for x in 1, 2, 3:
2179 for y in 1, 2, 3:
2180 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2181 for op in "<", "<=", "==", "!=", ">", ">=":
2182 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2183 "x=%d, y=%d" % (x, y))
2184 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2185 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2186
Guido van Rossum0639f592001-09-18 21:06:04 +00002187def rich_comparisons():
2188 if verbose:
2189 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002190 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002191 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002192 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002193 vereq(z, 1+0j)
2194 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002195 class ZZ(complex):
2196 def __eq__(self, other):
2197 try:
2198 return abs(self - other) <= 1e-6
2199 except:
2200 return NotImplemented
2201 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002202 vereq(zz, 1+0j)
2203 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002204
Guido van Rossum0639f592001-09-18 21:06:04 +00002205 class classic:
2206 pass
2207 for base in (classic, int, object, list):
2208 if verbose: print " (base = %s)" % base
2209 class C(base):
2210 def __init__(self, value):
2211 self.value = int(value)
2212 def __cmp__(self, other):
2213 raise TestFailed, "shouldn't call __cmp__"
2214 def __eq__(self, other):
2215 if isinstance(other, C):
2216 return self.value == other.value
2217 if isinstance(other, int) or isinstance(other, long):
2218 return self.value == other
2219 return NotImplemented
2220 def __ne__(self, other):
2221 if isinstance(other, C):
2222 return self.value != other.value
2223 if isinstance(other, int) or isinstance(other, long):
2224 return self.value != other
2225 return NotImplemented
2226 def __lt__(self, other):
2227 if isinstance(other, C):
2228 return self.value < other.value
2229 if isinstance(other, int) or isinstance(other, long):
2230 return self.value < other
2231 return NotImplemented
2232 def __le__(self, other):
2233 if isinstance(other, C):
2234 return self.value <= other.value
2235 if isinstance(other, int) or isinstance(other, long):
2236 return self.value <= other
2237 return NotImplemented
2238 def __gt__(self, other):
2239 if isinstance(other, C):
2240 return self.value > other.value
2241 if isinstance(other, int) or isinstance(other, long):
2242 return self.value > other
2243 return NotImplemented
2244 def __ge__(self, other):
2245 if isinstance(other, C):
2246 return self.value >= other.value
2247 if isinstance(other, int) or isinstance(other, long):
2248 return self.value >= other
2249 return NotImplemented
2250 c1 = C(1)
2251 c2 = C(2)
2252 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002253 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002254 c = {1: c1, 2: c2, 3: c3}
2255 for x in 1, 2, 3:
2256 for y in 1, 2, 3:
2257 for op in "<", "<=", "==", "!=", ">", ">=":
2258 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2259 "x=%d, y=%d" % (x, y))
2260 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2261 "x=%d, y=%d" % (x, y))
2262 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2263 "x=%d, y=%d" % (x, y))
2264
Guido van Rossum1952e382001-09-19 01:25:16 +00002265def coercions():
2266 if verbose: print "Testing coercions..."
2267 class I(int): pass
2268 coerce(I(0), 0)
2269 coerce(0, I(0))
2270 class L(long): pass
2271 coerce(L(0), 0)
2272 coerce(L(0), 0L)
2273 coerce(0, L(0))
2274 coerce(0L, L(0))
2275 class F(float): pass
2276 coerce(F(0), 0)
2277 coerce(F(0), 0L)
2278 coerce(F(0), 0.)
2279 coerce(0, F(0))
2280 coerce(0L, F(0))
2281 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002282 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002283 coerce(C(0), 0)
2284 coerce(C(0), 0L)
2285 coerce(C(0), 0.)
2286 coerce(C(0), 0j)
2287 coerce(0, C(0))
2288 coerce(0L, C(0))
2289 coerce(0., C(0))
2290 coerce(0j, C(0))
2291
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002292def descrdoc():
2293 if verbose: print "Testing descriptor doc strings..."
2294 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002295 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002296 check(file.closed, "flag set if the file is closed") # getset descriptor
2297 check(file.name, "file name") # member descriptor
2298
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002299def setclass():
2300 if verbose: print "Testing __class__ assignment..."
2301 class C(object): pass
2302 class D(object): pass
2303 class E(object): pass
2304 class F(D, E): pass
2305 for cls in C, D, E, F:
2306 for cls2 in C, D, E, F:
2307 x = cls()
2308 x.__class__ = cls2
2309 verify(x.__class__ is cls2)
2310 x.__class__ = cls
2311 verify(x.__class__ is cls)
2312 def cant(x, C):
2313 try:
2314 x.__class__ = C
2315 except TypeError:
2316 pass
2317 else:
2318 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2319 cant(C(), list)
2320 cant(list(), C)
2321 cant(C(), 1)
2322 cant(C(), object)
2323 cant(object(), list)
2324 cant(list(), object)
2325
Guido van Rossum6661be32001-10-26 04:26:12 +00002326def setdict():
2327 if verbose: print "Testing __dict__ assignment..."
2328 class C(object): pass
2329 a = C()
2330 a.__dict__ = {'b': 1}
2331 vereq(a.b, 1)
2332 def cant(x, dict):
2333 try:
2334 x.__dict__ = dict
2335 except TypeError:
2336 pass
2337 else:
2338 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2339 cant(a, None)
2340 cant(a, [])
2341 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002342 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002343 # Classes don't allow __dict__ assignment
2344 cant(C, {})
2345
Guido van Rossum3926a632001-09-25 16:25:58 +00002346def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002347 if verbose:
2348 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002349 import pickle, cPickle
2350
2351 def sorteditems(d):
2352 L = d.items()
2353 L.sort()
2354 return L
2355
2356 global C
2357 class C(object):
2358 def __init__(self, a, b):
2359 super(C, self).__init__()
2360 self.a = a
2361 self.b = b
2362 def __repr__(self):
2363 return "C(%r, %r)" % (self.a, self.b)
2364
2365 global C1
2366 class C1(list):
2367 def __new__(cls, a, b):
2368 return super(C1, cls).__new__(cls)
2369 def __init__(self, a, b):
2370 self.a = a
2371 self.b = b
2372 def __repr__(self):
2373 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2374
2375 global C2
2376 class C2(int):
2377 def __new__(cls, a, b, val=0):
2378 return super(C2, cls).__new__(cls, val)
2379 def __init__(self, a, b, val=0):
2380 self.a = a
2381 self.b = b
2382 def __repr__(self):
2383 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2384
Guido van Rossum90c45142001-11-24 21:07:01 +00002385 global C3
2386 class C3(object):
2387 def __init__(self, foo):
2388 self.foo = foo
2389 def __getstate__(self):
2390 return self.foo
2391 def __setstate__(self, foo):
2392 self.foo = foo
2393
2394 global C4classic, C4
2395 class C4classic: # classic
2396 pass
2397 class C4(C4classic, object): # mixed inheritance
2398 pass
2399
Guido van Rossum3926a632001-09-25 16:25:58 +00002400 for p in pickle, cPickle:
2401 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002402 if verbose:
2403 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002404
2405 for cls in C, C1, C2:
2406 s = p.dumps(cls, bin)
2407 cls2 = p.loads(s)
2408 verify(cls2 is cls)
2409
2410 a = C1(1, 2); a.append(42); a.append(24)
2411 b = C2("hello", "world", 42)
2412 s = p.dumps((a, b), bin)
2413 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002414 vereq(x.__class__, a.__class__)
2415 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2416 vereq(y.__class__, b.__class__)
2417 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2418 vereq(`x`, `a`)
2419 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002420 if verbose:
2421 print "a = x =", a
2422 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002423 # Test for __getstate__ and __setstate__ on new style class
2424 u = C3(42)
2425 s = p.dumps(u, bin)
2426 v = p.loads(s)
2427 veris(u.__class__, v.__class__)
2428 vereq(u.foo, v.foo)
2429 # Test for picklability of hybrid class
2430 u = C4()
2431 u.foo = 42
2432 s = p.dumps(u, bin)
2433 v = p.loads(s)
2434 veris(u.__class__, v.__class__)
2435 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002436
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002437 # Testing copy.deepcopy()
2438 if verbose:
2439 print "deepcopy"
2440 import copy
2441 for cls in C, C1, C2:
2442 cls2 = copy.deepcopy(cls)
2443 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002444
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002445 a = C1(1, 2); a.append(42); a.append(24)
2446 b = C2("hello", "world", 42)
2447 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002448 vereq(x.__class__, a.__class__)
2449 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2450 vereq(y.__class__, b.__class__)
2451 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2452 vereq(`x`, `a`)
2453 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002454 if verbose:
2455 print "a = x =", a
2456 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002457
Guido van Rossum8c842552002-03-14 23:05:54 +00002458def pickleslots():
2459 if verbose: print "Testing pickling of classes with __slots__ ..."
2460 import pickle, cPickle
2461 # Pickling of classes with __slots__ but without __getstate__ should fail
2462 global B, C, D, E
2463 class B(object):
2464 pass
2465 for base in [object, B]:
2466 class C(base):
2467 __slots__ = ['a']
2468 class D(C):
2469 pass
2470 try:
2471 pickle.dumps(C())
2472 except TypeError:
2473 pass
2474 else:
2475 raise TestFailed, "should fail: pickle C instance - %s" % base
2476 try:
2477 cPickle.dumps(C())
2478 except TypeError:
2479 pass
2480 else:
2481 raise TestFailed, "should fail: cPickle C instance - %s" % base
2482 try:
2483 pickle.dumps(C())
2484 except TypeError:
2485 pass
2486 else:
2487 raise TestFailed, "should fail: pickle D instance - %s" % base
2488 try:
2489 cPickle.dumps(D())
2490 except TypeError:
2491 pass
2492 else:
2493 raise TestFailed, "should fail: cPickle D instance - %s" % base
2494 # Give C a __getstate__ and __setstate__
2495 class C(base):
2496 __slots__ = ['a']
2497 def __getstate__(self):
2498 try:
2499 d = self.__dict__.copy()
2500 except AttributeError:
2501 d = {}
2502 try:
2503 d['a'] = self.a
2504 except AttributeError:
2505 pass
2506 return d
2507 def __setstate__(self, d):
2508 for k, v in d.items():
2509 setattr(self, k, v)
2510 class D(C):
2511 pass
2512 # Now it should work
2513 x = C()
2514 y = pickle.loads(pickle.dumps(x))
2515 vereq(hasattr(y, 'a'), 0)
2516 y = cPickle.loads(cPickle.dumps(x))
2517 vereq(hasattr(y, 'a'), 0)
2518 x.a = 42
2519 y = pickle.loads(pickle.dumps(x))
2520 vereq(y.a, 42)
2521 y = cPickle.loads(cPickle.dumps(x))
2522 vereq(y.a, 42)
2523 x = D()
2524 x.a = 42
2525 x.b = 100
2526 y = pickle.loads(pickle.dumps(x))
2527 vereq(y.a + y.b, 142)
2528 y = cPickle.loads(cPickle.dumps(x))
2529 vereq(y.a + y.b, 142)
2530 # But a subclass that adds a slot should not work
2531 class E(C):
2532 __slots__ = ['b']
2533 try:
2534 pickle.dumps(E())
2535 except TypeError:
2536 pass
2537 else:
2538 raise TestFailed, "should fail: pickle E instance - %s" % base
2539 try:
2540 cPickle.dumps(E())
2541 except TypeError:
2542 pass
2543 else:
2544 raise TestFailed, "should fail: cPickle E instance - %s" % base
2545
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002546def copies():
2547 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2548 import copy
2549 class C(object):
2550 pass
2551
2552 a = C()
2553 a.foo = 12
2554 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002555 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002556
2557 a.bar = [1,2,3]
2558 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002559 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002560 verify(c.bar is a.bar)
2561
2562 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002563 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002564 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002565 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002566
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002567def binopoverride():
2568 if verbose: print "Testing overrides of binary operations..."
2569 class I(int):
2570 def __repr__(self):
2571 return "I(%r)" % int(self)
2572 def __add__(self, other):
2573 return I(int(self) + int(other))
2574 __radd__ = __add__
2575 def __pow__(self, other, mod=None):
2576 if mod is None:
2577 return I(pow(int(self), int(other)))
2578 else:
2579 return I(pow(int(self), int(other), int(mod)))
2580 def __rpow__(self, other, mod=None):
2581 if mod is None:
2582 return I(pow(int(other), int(self), mod))
2583 else:
2584 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002585
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002586 vereq(`I(1) + I(2)`, "I(3)")
2587 vereq(`I(1) + 2`, "I(3)")
2588 vereq(`1 + I(2)`, "I(3)")
2589 vereq(`I(2) ** I(3)`, "I(8)")
2590 vereq(`2 ** I(3)`, "I(8)")
2591 vereq(`I(2) ** 3`, "I(8)")
2592 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2593 class S(str):
2594 def __eq__(self, other):
2595 return self.lower() == other.lower()
2596
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002597def subclasspropagation():
2598 if verbose: print "Testing propagation of slot functions to subclasses..."
2599 class A(object):
2600 pass
2601 class B(A):
2602 pass
2603 class C(A):
2604 pass
2605 class D(B, C):
2606 pass
2607 d = D()
2608 vereq(hash(d), id(d))
2609 A.__hash__ = lambda self: 42
2610 vereq(hash(d), 42)
2611 C.__hash__ = lambda self: 314
2612 vereq(hash(d), 314)
2613 B.__hash__ = lambda self: 144
2614 vereq(hash(d), 144)
2615 D.__hash__ = lambda self: 100
2616 vereq(hash(d), 100)
2617 del D.__hash__
2618 vereq(hash(d), 144)
2619 del B.__hash__
2620 vereq(hash(d), 314)
2621 del C.__hash__
2622 vereq(hash(d), 42)
2623 del A.__hash__
2624 vereq(hash(d), id(d))
2625 d.foo = 42
2626 d.bar = 42
2627 vereq(d.foo, 42)
2628 vereq(d.bar, 42)
2629 def __getattribute__(self, name):
2630 if name == "foo":
2631 return 24
2632 return object.__getattribute__(self, name)
2633 A.__getattribute__ = __getattribute__
2634 vereq(d.foo, 24)
2635 vereq(d.bar, 42)
2636 def __getattr__(self, name):
2637 if name in ("spam", "foo", "bar"):
2638 return "hello"
2639 raise AttributeError, name
2640 B.__getattr__ = __getattr__
2641 vereq(d.spam, "hello")
2642 vereq(d.foo, 24)
2643 vereq(d.bar, 42)
2644 del A.__getattribute__
2645 vereq(d.foo, 42)
2646 del d.foo
2647 vereq(d.foo, "hello")
2648 vereq(d.bar, 42)
2649 del B.__getattr__
2650 try:
2651 d.foo
2652 except AttributeError:
2653 pass
2654 else:
2655 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002656
2657def buffer_inherit():
2658 import binascii
2659 # SF bug [#470040] ParseTuple t# vs subclasses.
2660 if verbose:
2661 print "Testing that buffer interface is inherited ..."
2662
2663 class MyStr(str):
2664 pass
2665 base = 'abc'
2666 m = MyStr(base)
2667 # b2a_hex uses the buffer interface to get its argument's value, via
2668 # PyArg_ParseTuple 't#' code.
2669 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2670
2671 # It's not clear that unicode will continue to support the character
2672 # buffer interface, and this test will fail if that's taken away.
2673 class MyUni(unicode):
2674 pass
2675 base = u'abc'
2676 m = MyUni(base)
2677 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2678
2679 class MyInt(int):
2680 pass
2681 m = MyInt(42)
2682 try:
2683 binascii.b2a_hex(m)
2684 raise TestFailed('subclass of int should not have a buffer interface')
2685 except TypeError:
2686 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002687
Tim Petersc9933152001-10-16 20:18:24 +00002688def str_of_str_subclass():
2689 import binascii
2690 import cStringIO
2691
2692 if verbose:
2693 print "Testing __str__ defined in subclass of str ..."
2694
2695 class octetstring(str):
2696 def __str__(self):
2697 return binascii.b2a_hex(self)
2698 def __repr__(self):
2699 return self + " repr"
2700
2701 o = octetstring('A')
2702 vereq(type(o), octetstring)
2703 vereq(type(str(o)), str)
2704 vereq(type(repr(o)), str)
2705 vereq(ord(o), 0x41)
2706 vereq(str(o), '41')
2707 vereq(repr(o), 'A repr')
2708 vereq(o.__str__(), '41')
2709 vereq(o.__repr__(), 'A repr')
2710
2711 capture = cStringIO.StringIO()
2712 # Calling str() or not exercises different internal paths.
2713 print >> capture, o
2714 print >> capture, str(o)
2715 vereq(capture.getvalue(), '41\n41\n')
2716 capture.close()
2717
Guido van Rossumc8e56452001-10-22 00:43:43 +00002718def kwdargs():
2719 if verbose: print "Testing keyword arguments to __init__, __call__..."
2720 def f(a): return a
2721 vereq(f.__call__(a=42), 42)
2722 a = []
2723 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002724 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002725
Guido van Rossumed87ad82001-10-30 02:33:02 +00002726def delhook():
2727 if verbose: print "Testing __del__ hook..."
2728 log = []
2729 class C(object):
2730 def __del__(self):
2731 log.append(1)
2732 c = C()
2733 vereq(log, [])
2734 del c
2735 vereq(log, [1])
2736
Guido van Rossum29d26062001-12-11 04:37:34 +00002737 class D(object): pass
2738 d = D()
2739 try: del d[0]
2740 except TypeError: pass
2741 else: raise TestFailed, "invalid del() didn't raise TypeError"
2742
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002743def hashinherit():
2744 if verbose: print "Testing hash of mutable subclasses..."
2745
2746 class mydict(dict):
2747 pass
2748 d = mydict()
2749 try:
2750 hash(d)
2751 except TypeError:
2752 pass
2753 else:
2754 raise TestFailed, "hash() of dict subclass should fail"
2755
2756 class mylist(list):
2757 pass
2758 d = mylist()
2759 try:
2760 hash(d)
2761 except TypeError:
2762 pass
2763 else:
2764 raise TestFailed, "hash() of list subclass should fail"
2765
Guido van Rossum29d26062001-12-11 04:37:34 +00002766def strops():
2767 try: 'a' + 5
2768 except TypeError: pass
2769 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2770
2771 try: ''.split('')
2772 except ValueError: pass
2773 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2774
2775 try: ''.join([0])
2776 except TypeError: pass
2777 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2778
2779 try: ''.rindex('5')
2780 except ValueError: pass
2781 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2782
2783 try: ''.replace('', '')
2784 except ValueError: pass
2785 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2786
2787 try: '%(n)s' % None
2788 except TypeError: pass
2789 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2790
2791 try: '%(n' % {}
2792 except ValueError: pass
2793 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2794
2795 try: '%*s' % ('abc')
2796 except TypeError: pass
2797 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2798
2799 try: '%*.*s' % ('abc', 5)
2800 except TypeError: pass
2801 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2802
2803 try: '%s' % (1, 2)
2804 except TypeError: pass
2805 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2806
2807 try: '%' % None
2808 except ValueError: pass
2809 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2810
2811 vereq('534253'.isdigit(), 1)
2812 vereq('534253x'.isdigit(), 0)
2813 vereq('%c' % 5, '\x05')
2814 vereq('%c' % '5', '5')
2815
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002816def deepcopyrecursive():
2817 if verbose: print "Testing deepcopy of recursive objects..."
2818 class Node:
2819 pass
2820 a = Node()
2821 b = Node()
2822 a.b = b
2823 b.a = a
2824 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002825
Guido van Rossumd7035672002-03-12 20:43:31 +00002826def modules():
2827 if verbose: print "Testing uninitialized module objects..."
2828 from types import ModuleType as M
2829 m = M.__new__(M)
2830 str(m)
2831 vereq(hasattr(m, "__name__"), 0)
2832 vereq(hasattr(m, "__file__"), 0)
2833 vereq(hasattr(m, "foo"), 0)
2834 vereq(m.__dict__, None)
2835 m.foo = 1
2836 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00002837
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002838def dictproxyiterkeys():
2839 class C(object):
2840 def meth(self):
2841 pass
2842 if verbose: print "Testing dict-proxy iterkeys..."
2843 keys = [ key for key in C.__dict__.iterkeys() ]
2844 keys.sort()
2845 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
2846
2847def dictproxyitervalues():
2848 class C(object):
2849 def meth(self):
2850 pass
2851 if verbose: print "Testing dict-proxy itervalues..."
2852 values = [ values for values in C.__dict__.itervalues() ]
2853 vereq(len(values), 5)
2854
2855def dictproxyiteritems():
2856 class C(object):
2857 def meth(self):
2858 pass
2859 if verbose: print "Testing dict-proxy iteritems..."
2860 keys = [ key for (key, value) in C.__dict__.iteritems() ]
2861 keys.sort()
2862 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
2863
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002864def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002865 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002866 lists()
2867 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002868 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002869 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002870 ints()
2871 longs()
2872 floats()
2873 complexes()
2874 spamlists()
2875 spamdicts()
2876 pydicts()
2877 pylists()
2878 metaclass()
2879 pymods()
2880 multi()
2881 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002882 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002883 slots()
2884 dynamics()
2885 errors()
2886 classmethods()
2887 staticmethods()
2888 classic()
2889 compattr()
2890 newslot()
2891 altmro()
2892 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002893 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002894 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002895 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002896 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002897 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002898 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002899 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002900 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002901 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002902 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002903 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002904 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002905 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002906 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002907 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002908 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002909 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002910 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002911 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002912 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002913 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002914 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002915 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002916 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00002917 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002918 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00002919 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002920 dictproxyiterkeys()
2921 dictproxyitervalues()
2922 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00002923 pickleslots()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002924 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002925
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002926if __name__ == "__main__":
2927 test_main()