blob: f52edb629ac63e725b7c77663042ae8b4b02552e [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
Fred Drakef841aa62002-03-28 15:49:54 +00001217def classmethods_in_c():
1218 if verbose: print "Testing C-based class methods..."
1219 import xxsubtype as spam
1220 a = (1, 2, 3)
1221 d = {'abc': 123}
1222 x, a1, d1 = spam.spamlist.classmeth(*a, **d)
1223 veris(x, None)
1224 vereq((spam.spamlist,) + a, a1)
1225 vereq(d, d1)
1226 x, a1, d1 = spam.spamlist().classmeth(*a, **d)
1227 veris(x, None)
1228 vereq((spam.spamlist,) + a, a1)
1229 vereq(d, d1)
1230
Tim Peters6d6c1a32001-08-02 04:15:00 +00001231def staticmethods():
1232 if verbose: print "Testing static methods..."
1233 class C(object):
1234 def foo(*a): return a
1235 goo = staticmethod(foo)
1236 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001237 vereq(C.goo(1), (1,))
1238 vereq(c.goo(1), (1,))
1239 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001240 class D(C):
1241 pass
1242 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001243 vereq(D.goo(1), (1,))
1244 vereq(d.goo(1), (1,))
1245 vereq(d.foo(1), (d, 1))
1246 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001247
Fred Drakef841aa62002-03-28 15:49:54 +00001248def staticmethods_in_c():
1249 if verbose: print "Testing C-based static methods..."
1250 import xxsubtype as spam
1251 a = (1, 2, 3)
1252 d = {"abc": 123}
1253 x, a1, d1 = spam.spamlist.staticmeth(*a, **d)
1254 veris(x, None)
1255 vereq(a, a1)
1256 vereq(d, d1)
1257 x, a1, d2 = spam.spamlist().staticmeth(*a, **d)
1258 veris(x, None)
1259 vereq(a, a1)
1260 vereq(d, d1)
1261
Tim Peters6d6c1a32001-08-02 04:15:00 +00001262def classic():
1263 if verbose: print "Testing classic classes..."
1264 class C:
1265 def foo(*a): return a
1266 goo = classmethod(foo)
1267 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001268 vereq(C.goo(1), (C, 1))
1269 vereq(c.goo(1), (C, 1))
1270 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001271 class D(C):
1272 pass
1273 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001274 vereq(D.goo(1), (D, 1))
1275 vereq(d.goo(1), (D, 1))
1276 vereq(d.foo(1), (d, 1))
1277 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001278 class E: # *not* subclassing from C
1279 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001280 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001281 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001282
1283def compattr():
1284 if verbose: print "Testing computed attributes..."
1285 class C(object):
1286 class computed_attribute(object):
1287 def __init__(self, get, set=None):
1288 self.__get = get
1289 self.__set = set
1290 def __get__(self, obj, type=None):
1291 return self.__get(obj)
1292 def __set__(self, obj, value):
1293 return self.__set(obj, value)
1294 def __init__(self):
1295 self.__x = 0
1296 def __get_x(self):
1297 x = self.__x
1298 self.__x = x+1
1299 return x
1300 def __set_x(self, x):
1301 self.__x = x
1302 x = computed_attribute(__get_x, __set_x)
1303 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001304 vereq(a.x, 0)
1305 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001306 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001307 vereq(a.x, 10)
1308 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001309
1310def newslot():
1311 if verbose: print "Testing __new__ slot override..."
1312 class C(list):
1313 def __new__(cls):
1314 self = list.__new__(cls)
1315 self.foo = 1
1316 return self
1317 def __init__(self):
1318 self.foo = self.foo + 2
1319 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001320 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001321 verify(a.__class__ is C)
1322 class D(C):
1323 pass
1324 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001325 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001326 verify(b.__class__ is D)
1327
Tim Peters6d6c1a32001-08-02 04:15:00 +00001328def altmro():
1329 if verbose: print "Testing mro() and overriding it..."
1330 class A(object):
1331 def f(self): return "A"
1332 class B(A):
1333 pass
1334 class C(A):
1335 def f(self): return "C"
1336 class D(B, C):
1337 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001338 vereq(D.mro(), [D, B, C, A, object])
1339 vereq(D.__mro__, (D, B, C, A, object))
1340 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001341 class PerverseMetaType(type):
1342 def mro(cls):
1343 L = type.mro(cls)
1344 L.reverse()
1345 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001346 class X(A,B,C,D):
1347 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001348 vereq(X.__mro__, (object, A, C, B, D, X))
1349 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001350
1351def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001352 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001353
1354 class B(object):
1355 "Intermediate class because object doesn't have a __setattr__"
1356
1357 class C(B):
1358
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001359 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001360 if name == "foo":
1361 return ("getattr", name)
1362 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001363 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364 def __setattr__(self, name, value):
1365 if name == "foo":
1366 self.setattr = (name, value)
1367 else:
1368 return B.__setattr__(self, name, value)
1369 def __delattr__(self, name):
1370 if name == "foo":
1371 self.delattr = name
1372 else:
1373 return B.__delattr__(self, name)
1374
1375 def __getitem__(self, key):
1376 return ("getitem", key)
1377 def __setitem__(self, key, value):
1378 self.setitem = (key, value)
1379 def __delitem__(self, key):
1380 self.delitem = key
1381
1382 def __getslice__(self, i, j):
1383 return ("getslice", i, j)
1384 def __setslice__(self, i, j, value):
1385 self.setslice = (i, j, value)
1386 def __delslice__(self, i, j):
1387 self.delslice = (i, j)
1388
1389 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001390 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001391 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001392 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001393 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001394 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001395
Guido van Rossum45704552001-10-08 16:35:45 +00001396 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001397 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001398 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001399 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001400 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001401
Guido van Rossum45704552001-10-08 16:35:45 +00001402 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001403 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001404 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001405 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001406 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001407
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001408def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001409 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001410 class C(object):
1411 def __init__(self, x):
1412 self.x = x
1413 def foo(self):
1414 return self.x
1415 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001416 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001417 class D(C):
1418 boo = C.foo
1419 goo = c1.foo
1420 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001421 vereq(d2.foo(), 2)
1422 vereq(d2.boo(), 2)
1423 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001424 class E(object):
1425 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001426 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001427 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001428
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001429def specials():
1430 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001431 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001432 # Test the default behavior for static classes
1433 class C(object):
1434 def __getitem__(self, i):
1435 if 0 <= i < 10: return i
1436 raise IndexError
1437 c1 = C()
1438 c2 = C()
1439 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001440 vereq(hash(c1), id(c1))
1441 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1442 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001443 verify(c1 != c2)
1444 verify(not c1 != c1)
1445 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001446 # Note that the module name appears in str/repr, and that varies
1447 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001448 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001449 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001450 verify(-1 not in c1)
1451 for i in range(10):
1452 verify(i in c1)
1453 verify(10 not in c1)
1454 # Test the default behavior for dynamic classes
1455 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001456 def __getitem__(self, i):
1457 if 0 <= i < 10: return i
1458 raise IndexError
1459 d1 = D()
1460 d2 = D()
1461 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001462 vereq(hash(d1), id(d1))
1463 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1464 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001465 verify(d1 != d2)
1466 verify(not d1 != d1)
1467 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001468 # Note that the module name appears in str/repr, and that varies
1469 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001470 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001471 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001472 verify(-1 not in d1)
1473 for i in range(10):
1474 verify(i in d1)
1475 verify(10 not in d1)
1476 # Test overridden behavior for static classes
1477 class Proxy(object):
1478 def __init__(self, x):
1479 self.x = x
1480 def __nonzero__(self):
1481 return not not self.x
1482 def __hash__(self):
1483 return hash(self.x)
1484 def __eq__(self, other):
1485 return self.x == other
1486 def __ne__(self, other):
1487 return self.x != other
1488 def __cmp__(self, other):
1489 return cmp(self.x, other.x)
1490 def __str__(self):
1491 return "Proxy:%s" % self.x
1492 def __repr__(self):
1493 return "Proxy(%r)" % self.x
1494 def __contains__(self, value):
1495 return value in self.x
1496 p0 = Proxy(0)
1497 p1 = Proxy(1)
1498 p_1 = Proxy(-1)
1499 verify(not p0)
1500 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001501 vereq(hash(p0), hash(0))
1502 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001503 verify(p0 != p1)
1504 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001505 vereq(not p0, p1)
1506 vereq(cmp(p0, p1), -1)
1507 vereq(cmp(p0, p0), 0)
1508 vereq(cmp(p0, p_1), 1)
1509 vereq(str(p0), "Proxy:0")
1510 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001511 p10 = Proxy(range(10))
1512 verify(-1 not in p10)
1513 for i in range(10):
1514 verify(i in p10)
1515 verify(10 not in p10)
1516 # Test overridden behavior for dynamic classes
1517 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001518 def __init__(self, x):
1519 self.x = x
1520 def __nonzero__(self):
1521 return not not self.x
1522 def __hash__(self):
1523 return hash(self.x)
1524 def __eq__(self, other):
1525 return self.x == other
1526 def __ne__(self, other):
1527 return self.x != other
1528 def __cmp__(self, other):
1529 return cmp(self.x, other.x)
1530 def __str__(self):
1531 return "DProxy:%s" % self.x
1532 def __repr__(self):
1533 return "DProxy(%r)" % self.x
1534 def __contains__(self, value):
1535 return value in self.x
1536 p0 = DProxy(0)
1537 p1 = DProxy(1)
1538 p_1 = DProxy(-1)
1539 verify(not p0)
1540 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001541 vereq(hash(p0), hash(0))
1542 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001543 verify(p0 != p1)
1544 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001545 vereq(not p0, p1)
1546 vereq(cmp(p0, p1), -1)
1547 vereq(cmp(p0, p0), 0)
1548 vereq(cmp(p0, p_1), 1)
1549 vereq(str(p0), "DProxy:0")
1550 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001551 p10 = DProxy(range(10))
1552 verify(-1 not in p10)
1553 for i in range(10):
1554 verify(i in p10)
1555 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001556 # Safety test for __cmp__
1557 def unsafecmp(a, b):
1558 try:
1559 a.__class__.__cmp__(a, b)
1560 except TypeError:
1561 pass
1562 else:
1563 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1564 a.__class__, a, b)
1565 unsafecmp(u"123", "123")
1566 unsafecmp("123", u"123")
1567 unsafecmp(1, 1.0)
1568 unsafecmp(1.0, 1)
1569 unsafecmp(1, 1L)
1570 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001571
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001572def weakrefs():
1573 if verbose: print "Testing weak references..."
1574 import weakref
1575 class C(object):
1576 pass
1577 c = C()
1578 r = weakref.ref(c)
1579 verify(r() is c)
1580 del c
1581 verify(r() is None)
1582 del r
1583 class NoWeak(object):
1584 __slots__ = ['foo']
1585 no = NoWeak()
1586 try:
1587 weakref.ref(no)
1588 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001589 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001590 else:
1591 verify(0, "weakref.ref(no) should be illegal")
1592 class Weak(object):
1593 __slots__ = ['foo', '__weakref__']
1594 yes = Weak()
1595 r = weakref.ref(yes)
1596 verify(r() is yes)
1597 del yes
1598 verify(r() is None)
1599 del r
1600
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001601def properties():
1602 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001603 class C(object):
1604 def getx(self):
1605 return self.__x
1606 def setx(self, value):
1607 self.__x = value
1608 def delx(self):
1609 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001610 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001611 a = C()
1612 verify(not hasattr(a, "x"))
1613 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001614 vereq(a._C__x, 42)
1615 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001616 del a.x
1617 verify(not hasattr(a, "x"))
1618 verify(not hasattr(a, "_C__x"))
1619 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001620 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001621## C.x.__set__(a)
1622## verify(not hasattr(a, "x"))
1623
Tim Peters66c1a522001-09-24 21:17:50 +00001624 raw = C.__dict__['x']
1625 verify(isinstance(raw, property))
1626
1627 attrs = dir(raw)
1628 verify("__doc__" in attrs)
1629 verify("fget" in attrs)
1630 verify("fset" in attrs)
1631 verify("fdel" in attrs)
1632
Guido van Rossum45704552001-10-08 16:35:45 +00001633 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001634 verify(raw.fget is C.__dict__['getx'])
1635 verify(raw.fset is C.__dict__['setx'])
1636 verify(raw.fdel is C.__dict__['delx'])
1637
1638 for attr in "__doc__", "fget", "fset", "fdel":
1639 try:
1640 setattr(raw, attr, 42)
1641 except TypeError, msg:
1642 if str(msg).find('readonly') < 0:
1643 raise TestFailed("when setting readonly attr %r on a "
1644 "property, got unexpected TypeError "
1645 "msg %r" % (attr, str(msg)))
1646 else:
1647 raise TestFailed("expected TypeError from trying to set "
1648 "readonly %r attr on a property" % attr)
1649
Guido van Rossumc4a18802001-08-24 16:55:27 +00001650def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001651 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001652
1653 class A(object):
1654 def meth(self, a):
1655 return "A(%r)" % a
1656
Guido van Rossum45704552001-10-08 16:35:45 +00001657 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001658
1659 class B(A):
1660 def __init__(self):
1661 self.__super = super(B, self)
1662 def meth(self, a):
1663 return "B(%r)" % a + self.__super.meth(a)
1664
Guido van Rossum45704552001-10-08 16:35:45 +00001665 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001666
1667 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001668 def meth(self, a):
1669 return "C(%r)" % a + self.__super.meth(a)
1670 C._C__super = super(C)
1671
Guido van Rossum45704552001-10-08 16:35:45 +00001672 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001673
1674 class D(C, B):
1675 def meth(self, a):
1676 return "D(%r)" % a + super(D, self).meth(a)
1677
Guido van Rossum5b443c62001-12-03 15:38:28 +00001678 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1679
1680 # Test for subclassing super
1681
1682 class mysuper(super):
1683 def __init__(self, *args):
1684 return super(mysuper, self).__init__(*args)
1685
1686 class E(D):
1687 def meth(self, a):
1688 return "E(%r)" % a + mysuper(E, self).meth(a)
1689
1690 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1691
1692 class F(E):
1693 def meth(self, a):
1694 s = self.__super
1695 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1696 F._F__super = mysuper(F)
1697
1698 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1699
1700 # Make sure certain errors are raised
1701
1702 try:
1703 super(D, 42)
1704 except TypeError:
1705 pass
1706 else:
1707 raise TestFailed, "shouldn't allow super(D, 42)"
1708
1709 try:
1710 super(D, C())
1711 except TypeError:
1712 pass
1713 else:
1714 raise TestFailed, "shouldn't allow super(D, C())"
1715
1716 try:
1717 super(D).__get__(12)
1718 except TypeError:
1719 pass
1720 else:
1721 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1722
1723 try:
1724 super(D).__get__(C())
1725 except TypeError:
1726 pass
1727 else:
1728 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001729
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001730def inherits():
1731 if verbose: print "Testing inheritance from basic types..."
1732
1733 class hexint(int):
1734 def __repr__(self):
1735 return hex(self)
1736 def __add__(self, other):
1737 return hexint(int.__add__(self, other))
1738 # (Note that overriding __radd__ doesn't work,
1739 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001740 vereq(repr(hexint(7) + 9), "0x10")
1741 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001742 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001743 vereq(a, 12345)
1744 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001745 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001746 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001747 verify((+a).__class__ is int)
1748 verify((a >> 0).__class__ is int)
1749 verify((a << 0).__class__ is int)
1750 verify((hexint(0) << 12).__class__ is int)
1751 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001752
1753 class octlong(long):
1754 __slots__ = []
1755 def __str__(self):
1756 s = oct(self)
1757 if s[-1] == 'L':
1758 s = s[:-1]
1759 return s
1760 def __add__(self, other):
1761 return self.__class__(super(octlong, self).__add__(other))
1762 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001763 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001764 # (Note that overriding __radd__ here only seems to work
1765 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001766 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001767 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001768 vereq(a, 12345L)
1769 vereq(long(a), 12345L)
1770 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001771 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001772 verify((+a).__class__ is long)
1773 verify((-a).__class__ is long)
1774 verify((-octlong(0)).__class__ is long)
1775 verify((a >> 0).__class__ is long)
1776 verify((a << 0).__class__ is long)
1777 verify((a - 0).__class__ is long)
1778 verify((a * 1).__class__ is long)
1779 verify((a ** 1).__class__ is long)
1780 verify((a // 1).__class__ is long)
1781 verify((1 * a).__class__ is long)
1782 verify((a | 0).__class__ is long)
1783 verify((a ^ 0).__class__ is long)
1784 verify((a & -1L).__class__ is long)
1785 verify((octlong(0) << 12).__class__ is long)
1786 verify((octlong(0) >> 12).__class__ is long)
1787 verify(abs(octlong(0)).__class__ is long)
1788
1789 # Because octlong overrides __add__, we can't check the absence of +0
1790 # optimizations using octlong.
1791 class longclone(long):
1792 pass
1793 a = longclone(1)
1794 verify((a + 0).__class__ is long)
1795 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001796
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001797 # Check that negative clones don't segfault
1798 a = longclone(-1)
1799 vereq(a.__dict__, {})
Tim Peters5329cdb2002-03-02 04:18:04 +00001800 vereq(long(a), -1) # verify PyNumber_Long() copies the sign bit
Guido van Rossum2eb0b872002-03-01 22:24:49 +00001801
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001802 class precfloat(float):
1803 __slots__ = ['prec']
1804 def __init__(self, value=0.0, prec=12):
1805 self.prec = int(prec)
1806 float.__init__(value)
1807 def __repr__(self):
1808 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001809 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001810 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001811 vereq(a, 12345.0)
1812 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001813 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001814 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001815 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001816
Tim Peters2400fa42001-09-12 19:12:49 +00001817 class madcomplex(complex):
1818 def __repr__(self):
1819 return "%.17gj%+.17g" % (self.imag, self.real)
1820 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001821 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001822 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001823 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001824 vereq(a, base)
1825 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001826 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001827 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001828 vereq(repr(a), "4j-3")
1829 vereq(a, base)
1830 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001831 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001832 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001833 veris((+a).__class__, complex)
1834 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001835 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001836 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001837 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001838 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001839 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001840 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001841 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001842
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001843 class madtuple(tuple):
1844 _rev = None
1845 def rev(self):
1846 if self._rev is not None:
1847 return self._rev
1848 L = list(self)
1849 L.reverse()
1850 self._rev = self.__class__(L)
1851 return self._rev
1852 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001853 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1854 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1855 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001856 for i in range(512):
1857 t = madtuple(range(i))
1858 u = t.rev()
1859 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001860 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001861 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001862 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001863 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001864 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001865 verify(a[:].__class__ is tuple)
1866 verify((a * 1).__class__ is tuple)
1867 verify((a * 0).__class__ is tuple)
1868 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001869 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001870 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001871 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001872 verify((a + a).__class__ is tuple)
1873 verify((a * 0).__class__ is tuple)
1874 verify((a * 1).__class__ is tuple)
1875 verify((a * 2).__class__ is tuple)
1876 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001877
1878 class madstring(str):
1879 _rev = None
1880 def rev(self):
1881 if self._rev is not None:
1882 return self._rev
1883 L = list(self)
1884 L.reverse()
1885 self._rev = self.__class__("".join(L))
1886 return self._rev
1887 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001888 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1889 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1890 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001891 for i in range(256):
1892 s = madstring("".join(map(chr, range(i))))
1893 t = s.rev()
1894 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001895 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001896 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001897 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001898 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001899
Tim Peters8fa5dd02001-09-12 02:18:30 +00001900 base = "\x00" * 5
1901 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001902 vereq(s, base)
1903 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001904 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001905 vereq(hash(s), hash(base))
1906 vereq({s: 1}[base], 1)
1907 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001908 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001909 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001910 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001911 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001912 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001913 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001914 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001915 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001916 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001917 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001918 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001919 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001920 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001921 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001922 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001923 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001924 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001925 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001926 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001927 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001928 identitytab = ''.join([chr(i) for i in range(256)])
1929 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001930 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001931 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001932 vereq(s.translate(identitytab, "x"), base)
1933 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001934 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001936 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001937 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001938 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001939 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001940 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001941 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001942 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001944
Tim Peters111f6092001-09-12 07:54:51 +00001945 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001946 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001947 verify(intern(s).__class__ is str)
1948 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001949 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001950
1951 i = intern("y x")
1952 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001953 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001954 verify(intern(s).__class__ is str)
1955 verify(intern(s) is i)
1956
1957 s = madstring(i)
1958 verify(intern(s).__class__ is str)
1959 verify(intern(s) is i)
1960
Guido van Rossum91ee7982001-08-30 20:52:40 +00001961 class madunicode(unicode):
1962 _rev = None
1963 def rev(self):
1964 if self._rev is not None:
1965 return self._rev
1966 L = list(self)
1967 L.reverse()
1968 self._rev = self.__class__(u"".join(L))
1969 return self._rev
1970 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001971 vereq(u, u"ABCDEF")
1972 vereq(u.rev(), madunicode(u"FEDCBA"))
1973 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001974 base = u"12345"
1975 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001976 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001977 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001978 vereq(hash(u), hash(base))
1979 vereq({u: 1}[base], 1)
1980 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001981 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001982 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001983 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001984 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001985 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001986 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001987 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001988 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001989 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001990 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001991 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001992 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001993 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001994 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001995 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001996 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001997 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001998 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001999 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002000 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002001 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002002 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002003 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002004 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002005 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002006 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002007 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002008 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002009 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002010 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00002011 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002012 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002013 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002014 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002015 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002016 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00002017 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00002018 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00002019
Guido van Rossum12b22ff2001-10-09 20:36:44 +00002020 class sublist(list):
2021 pass
2022 a = sublist(range(5))
2023 vereq(a, range(5))
2024 a.append("hello")
2025 vereq(a, range(5) + ["hello"])
2026 a[5] = 5
2027 vereq(a, range(6))
2028 a.extend(range(6, 20))
2029 vereq(a, range(20))
2030 a[-5:] = []
2031 vereq(a, range(15))
2032 del a[10:15]
2033 vereq(len(a), 10)
2034 vereq(a, range(10))
2035 vereq(list(a), range(10))
2036 vereq(a[0], 0)
2037 vereq(a[9], 9)
2038 vereq(a[-10], 0)
2039 vereq(a[-1], 9)
2040 vereq(a[:5], range(5))
2041
Tim Peters59c9a642001-09-13 05:38:56 +00002042 class CountedInput(file):
2043 """Counts lines read by self.readline().
2044
2045 self.lineno is the 0-based ordinal of the last line read, up to
2046 a maximum of one greater than the number of lines in the file.
2047
2048 self.ateof is true if and only if the final "" line has been read,
2049 at which point self.lineno stops incrementing, and further calls
2050 to readline() continue to return "".
2051 """
2052
2053 lineno = 0
2054 ateof = 0
2055 def readline(self):
2056 if self.ateof:
2057 return ""
2058 s = file.readline(self)
2059 # Next line works too.
2060 # s = super(CountedInput, self).readline()
2061 self.lineno += 1
2062 if s == "":
2063 self.ateof = 1
2064 return s
2065
Tim Peters561f8992001-09-13 19:36:36 +00002066 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002067 lines = ['a\n', 'b\n', 'c\n']
2068 try:
2069 f.writelines(lines)
2070 f.close()
2071 f = CountedInput(TESTFN)
2072 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2073 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002074 vereq(expected, got)
2075 vereq(f.lineno, i)
2076 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002077 f.close()
2078 finally:
2079 try:
2080 f.close()
2081 except:
2082 pass
2083 try:
2084 import os
2085 os.unlink(TESTFN)
2086 except:
2087 pass
2088
Tim Peters808b94e2001-09-13 19:33:07 +00002089def keywords():
2090 if verbose:
2091 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002092 vereq(int(x=1), 1)
2093 vereq(float(x=2), 2.0)
2094 vereq(long(x=3), 3L)
2095 vereq(complex(imag=42, real=666), complex(666, 42))
2096 vereq(str(object=500), '500')
2097 vereq(unicode(string='abc', errors='strict'), u'abc')
2098 vereq(tuple(sequence=range(3)), (0, 1, 2))
2099 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002100 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002101
2102 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002103 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002104 try:
2105 constructor(bogus_keyword_arg=1)
2106 except TypeError:
2107 pass
2108 else:
2109 raise TestFailed("expected TypeError from bogus keyword "
2110 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002111
Tim Peters8fa45672001-09-13 21:01:29 +00002112def restricted():
2113 import rexec
2114 if verbose:
2115 print "Testing interaction with restricted execution ..."
2116
2117 sandbox = rexec.RExec()
2118
2119 code1 = """f = open(%r, 'w')""" % TESTFN
2120 code2 = """f = file(%r, 'w')""" % TESTFN
2121 code3 = """\
2122f = open(%r)
2123t = type(f) # a sneaky way to get the file() constructor
2124f.close()
2125f = t(%r, 'w') # rexec can't catch this by itself
2126""" % (TESTFN, TESTFN)
2127
2128 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2129 f.close()
2130
2131 try:
2132 for code in code1, code2, code3:
2133 try:
2134 sandbox.r_exec(code)
2135 except IOError, msg:
2136 if str(msg).find("restricted") >= 0:
2137 outcome = "OK"
2138 else:
2139 outcome = "got an exception, but not an expected one"
2140 else:
2141 outcome = "expected a restricted-execution exception"
2142
2143 if outcome != "OK":
2144 raise TestFailed("%s, in %r" % (outcome, code))
2145
2146 finally:
2147 try:
2148 import os
2149 os.unlink(TESTFN)
2150 except:
2151 pass
2152
Tim Peters0ab085c2001-09-14 00:25:33 +00002153def str_subclass_as_dict_key():
2154 if verbose:
2155 print "Testing a str subclass used as dict key .."
2156
2157 class cistr(str):
2158 """Sublcass of str that computes __eq__ case-insensitively.
2159
2160 Also computes a hash code of the string in canonical form.
2161 """
2162
2163 def __init__(self, value):
2164 self.canonical = value.lower()
2165 self.hashcode = hash(self.canonical)
2166
2167 def __eq__(self, other):
2168 if not isinstance(other, cistr):
2169 other = cistr(other)
2170 return self.canonical == other.canonical
2171
2172 def __hash__(self):
2173 return self.hashcode
2174
Guido van Rossum45704552001-10-08 16:35:45 +00002175 vereq(cistr('ABC'), 'abc')
2176 vereq('aBc', cistr('ABC'))
2177 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002178
2179 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002180 vereq(d[cistr('one')], 1)
2181 vereq(d[cistr('tWo')], 2)
2182 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002183 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002184 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002185
Guido van Rossumab3b0342001-09-18 20:38:53 +00002186def classic_comparisons():
2187 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002188 class classic:
2189 pass
2190 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002191 if verbose: print " (base = %s)" % base
2192 class C(base):
2193 def __init__(self, value):
2194 self.value = int(value)
2195 def __cmp__(self, other):
2196 if isinstance(other, C):
2197 return cmp(self.value, other.value)
2198 if isinstance(other, int) or isinstance(other, long):
2199 return cmp(self.value, other)
2200 return NotImplemented
2201 c1 = C(1)
2202 c2 = C(2)
2203 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002204 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002205 c = {1: c1, 2: c2, 3: c3}
2206 for x in 1, 2, 3:
2207 for y in 1, 2, 3:
2208 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2209 for op in "<", "<=", "==", "!=", ">", ">=":
2210 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2211 "x=%d, y=%d" % (x, y))
2212 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2213 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2214
Guido van Rossum0639f592001-09-18 21:06:04 +00002215def rich_comparisons():
2216 if verbose:
2217 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002218 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002219 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002220 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002221 vereq(z, 1+0j)
2222 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002223 class ZZ(complex):
2224 def __eq__(self, other):
2225 try:
2226 return abs(self - other) <= 1e-6
2227 except:
2228 return NotImplemented
2229 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002230 vereq(zz, 1+0j)
2231 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002232
Guido van Rossum0639f592001-09-18 21:06:04 +00002233 class classic:
2234 pass
2235 for base in (classic, int, object, list):
2236 if verbose: print " (base = %s)" % base
2237 class C(base):
2238 def __init__(self, value):
2239 self.value = int(value)
2240 def __cmp__(self, other):
2241 raise TestFailed, "shouldn't call __cmp__"
2242 def __eq__(self, other):
2243 if isinstance(other, C):
2244 return self.value == other.value
2245 if isinstance(other, int) or isinstance(other, long):
2246 return self.value == other
2247 return NotImplemented
2248 def __ne__(self, other):
2249 if isinstance(other, C):
2250 return self.value != other.value
2251 if isinstance(other, int) or isinstance(other, long):
2252 return self.value != other
2253 return NotImplemented
2254 def __lt__(self, other):
2255 if isinstance(other, C):
2256 return self.value < other.value
2257 if isinstance(other, int) or isinstance(other, long):
2258 return self.value < other
2259 return NotImplemented
2260 def __le__(self, other):
2261 if isinstance(other, C):
2262 return self.value <= other.value
2263 if isinstance(other, int) or isinstance(other, long):
2264 return self.value <= other
2265 return NotImplemented
2266 def __gt__(self, other):
2267 if isinstance(other, C):
2268 return self.value > other.value
2269 if isinstance(other, int) or isinstance(other, long):
2270 return self.value > other
2271 return NotImplemented
2272 def __ge__(self, other):
2273 if isinstance(other, C):
2274 return self.value >= other.value
2275 if isinstance(other, int) or isinstance(other, long):
2276 return self.value >= other
2277 return NotImplemented
2278 c1 = C(1)
2279 c2 = C(2)
2280 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002281 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002282 c = {1: c1, 2: c2, 3: c3}
2283 for x in 1, 2, 3:
2284 for y in 1, 2, 3:
2285 for op in "<", "<=", "==", "!=", ">", ">=":
2286 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2287 "x=%d, y=%d" % (x, y))
2288 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2289 "x=%d, y=%d" % (x, y))
2290 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2291 "x=%d, y=%d" % (x, y))
2292
Guido van Rossum1952e382001-09-19 01:25:16 +00002293def coercions():
2294 if verbose: print "Testing coercions..."
2295 class I(int): pass
2296 coerce(I(0), 0)
2297 coerce(0, I(0))
2298 class L(long): pass
2299 coerce(L(0), 0)
2300 coerce(L(0), 0L)
2301 coerce(0, L(0))
2302 coerce(0L, L(0))
2303 class F(float): pass
2304 coerce(F(0), 0)
2305 coerce(F(0), 0L)
2306 coerce(F(0), 0.)
2307 coerce(0, F(0))
2308 coerce(0L, F(0))
2309 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002310 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002311 coerce(C(0), 0)
2312 coerce(C(0), 0L)
2313 coerce(C(0), 0.)
2314 coerce(C(0), 0j)
2315 coerce(0, C(0))
2316 coerce(0L, C(0))
2317 coerce(0., C(0))
2318 coerce(0j, C(0))
2319
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002320def descrdoc():
2321 if verbose: print "Testing descriptor doc strings..."
2322 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002323 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002324 check(file.closed, "flag set if the file is closed") # getset descriptor
2325 check(file.name, "file name") # member descriptor
2326
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002327def setclass():
2328 if verbose: print "Testing __class__ assignment..."
2329 class C(object): pass
2330 class D(object): pass
2331 class E(object): pass
2332 class F(D, E): pass
2333 for cls in C, D, E, F:
2334 for cls2 in C, D, E, F:
2335 x = cls()
2336 x.__class__ = cls2
2337 verify(x.__class__ is cls2)
2338 x.__class__ = cls
2339 verify(x.__class__ is cls)
2340 def cant(x, C):
2341 try:
2342 x.__class__ = C
2343 except TypeError:
2344 pass
2345 else:
2346 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2347 cant(C(), list)
2348 cant(list(), C)
2349 cant(C(), 1)
2350 cant(C(), object)
2351 cant(object(), list)
2352 cant(list(), object)
2353
Guido van Rossum6661be32001-10-26 04:26:12 +00002354def setdict():
2355 if verbose: print "Testing __dict__ assignment..."
2356 class C(object): pass
2357 a = C()
2358 a.__dict__ = {'b': 1}
2359 vereq(a.b, 1)
2360 def cant(x, dict):
2361 try:
2362 x.__dict__ = dict
2363 except TypeError:
2364 pass
2365 else:
2366 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2367 cant(a, None)
2368 cant(a, [])
2369 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002370 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002371 # Classes don't allow __dict__ assignment
2372 cant(C, {})
2373
Guido van Rossum3926a632001-09-25 16:25:58 +00002374def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002375 if verbose:
2376 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002377 import pickle, cPickle
2378
2379 def sorteditems(d):
2380 L = d.items()
2381 L.sort()
2382 return L
2383
2384 global C
2385 class C(object):
2386 def __init__(self, a, b):
2387 super(C, self).__init__()
2388 self.a = a
2389 self.b = b
2390 def __repr__(self):
2391 return "C(%r, %r)" % (self.a, self.b)
2392
2393 global C1
2394 class C1(list):
2395 def __new__(cls, a, b):
2396 return super(C1, cls).__new__(cls)
2397 def __init__(self, a, b):
2398 self.a = a
2399 self.b = b
2400 def __repr__(self):
2401 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2402
2403 global C2
2404 class C2(int):
2405 def __new__(cls, a, b, val=0):
2406 return super(C2, cls).__new__(cls, val)
2407 def __init__(self, a, b, val=0):
2408 self.a = a
2409 self.b = b
2410 def __repr__(self):
2411 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2412
Guido van Rossum90c45142001-11-24 21:07:01 +00002413 global C3
2414 class C3(object):
2415 def __init__(self, foo):
2416 self.foo = foo
2417 def __getstate__(self):
2418 return self.foo
2419 def __setstate__(self, foo):
2420 self.foo = foo
2421
2422 global C4classic, C4
2423 class C4classic: # classic
2424 pass
2425 class C4(C4classic, object): # mixed inheritance
2426 pass
2427
Guido van Rossum3926a632001-09-25 16:25:58 +00002428 for p in pickle, cPickle:
2429 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002430 if verbose:
2431 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002432
2433 for cls in C, C1, C2:
2434 s = p.dumps(cls, bin)
2435 cls2 = p.loads(s)
2436 verify(cls2 is cls)
2437
2438 a = C1(1, 2); a.append(42); a.append(24)
2439 b = C2("hello", "world", 42)
2440 s = p.dumps((a, b), bin)
2441 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002442 vereq(x.__class__, a.__class__)
2443 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2444 vereq(y.__class__, b.__class__)
2445 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2446 vereq(`x`, `a`)
2447 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002448 if verbose:
2449 print "a = x =", a
2450 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002451 # Test for __getstate__ and __setstate__ on new style class
2452 u = C3(42)
2453 s = p.dumps(u, bin)
2454 v = p.loads(s)
2455 veris(u.__class__, v.__class__)
2456 vereq(u.foo, v.foo)
2457 # Test for picklability of hybrid class
2458 u = C4()
2459 u.foo = 42
2460 s = p.dumps(u, bin)
2461 v = p.loads(s)
2462 veris(u.__class__, v.__class__)
2463 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002464
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002465 # Testing copy.deepcopy()
2466 if verbose:
2467 print "deepcopy"
2468 import copy
2469 for cls in C, C1, C2:
2470 cls2 = copy.deepcopy(cls)
2471 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002472
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002473 a = C1(1, 2); a.append(42); a.append(24)
2474 b = C2("hello", "world", 42)
2475 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002476 vereq(x.__class__, a.__class__)
2477 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2478 vereq(y.__class__, b.__class__)
2479 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2480 vereq(`x`, `a`)
2481 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002482 if verbose:
2483 print "a = x =", a
2484 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002485
Guido van Rossum8c842552002-03-14 23:05:54 +00002486def pickleslots():
2487 if verbose: print "Testing pickling of classes with __slots__ ..."
2488 import pickle, cPickle
2489 # Pickling of classes with __slots__ but without __getstate__ should fail
2490 global B, C, D, E
2491 class B(object):
2492 pass
2493 for base in [object, B]:
2494 class C(base):
2495 __slots__ = ['a']
2496 class D(C):
2497 pass
2498 try:
2499 pickle.dumps(C())
2500 except TypeError:
2501 pass
2502 else:
2503 raise TestFailed, "should fail: pickle C instance - %s" % base
2504 try:
2505 cPickle.dumps(C())
2506 except TypeError:
2507 pass
2508 else:
2509 raise TestFailed, "should fail: cPickle C instance - %s" % base
2510 try:
2511 pickle.dumps(C())
2512 except TypeError:
2513 pass
2514 else:
2515 raise TestFailed, "should fail: pickle D instance - %s" % base
2516 try:
2517 cPickle.dumps(D())
2518 except TypeError:
2519 pass
2520 else:
2521 raise TestFailed, "should fail: cPickle D instance - %s" % base
2522 # Give C a __getstate__ and __setstate__
2523 class C(base):
2524 __slots__ = ['a']
2525 def __getstate__(self):
2526 try:
2527 d = self.__dict__.copy()
2528 except AttributeError:
2529 d = {}
2530 try:
2531 d['a'] = self.a
2532 except AttributeError:
2533 pass
2534 return d
2535 def __setstate__(self, d):
2536 for k, v in d.items():
2537 setattr(self, k, v)
2538 class D(C):
2539 pass
2540 # Now it should work
2541 x = C()
2542 y = pickle.loads(pickle.dumps(x))
2543 vereq(hasattr(y, 'a'), 0)
2544 y = cPickle.loads(cPickle.dumps(x))
2545 vereq(hasattr(y, 'a'), 0)
2546 x.a = 42
2547 y = pickle.loads(pickle.dumps(x))
2548 vereq(y.a, 42)
2549 y = cPickle.loads(cPickle.dumps(x))
2550 vereq(y.a, 42)
2551 x = D()
2552 x.a = 42
2553 x.b = 100
2554 y = pickle.loads(pickle.dumps(x))
2555 vereq(y.a + y.b, 142)
2556 y = cPickle.loads(cPickle.dumps(x))
2557 vereq(y.a + y.b, 142)
2558 # But a subclass that adds a slot should not work
2559 class E(C):
2560 __slots__ = ['b']
2561 try:
2562 pickle.dumps(E())
2563 except TypeError:
2564 pass
2565 else:
2566 raise TestFailed, "should fail: pickle E instance - %s" % base
2567 try:
2568 cPickle.dumps(E())
2569 except TypeError:
2570 pass
2571 else:
2572 raise TestFailed, "should fail: cPickle E instance - %s" % base
2573
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002574def copies():
2575 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2576 import copy
2577 class C(object):
2578 pass
2579
2580 a = C()
2581 a.foo = 12
2582 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002583 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002584
2585 a.bar = [1,2,3]
2586 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002587 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002588 verify(c.bar is a.bar)
2589
2590 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002591 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002592 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002593 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002594
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002595def binopoverride():
2596 if verbose: print "Testing overrides of binary operations..."
2597 class I(int):
2598 def __repr__(self):
2599 return "I(%r)" % int(self)
2600 def __add__(self, other):
2601 return I(int(self) + int(other))
2602 __radd__ = __add__
2603 def __pow__(self, other, mod=None):
2604 if mod is None:
2605 return I(pow(int(self), int(other)))
2606 else:
2607 return I(pow(int(self), int(other), int(mod)))
2608 def __rpow__(self, other, mod=None):
2609 if mod is None:
2610 return I(pow(int(other), int(self), mod))
2611 else:
2612 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002613
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002614 vereq(`I(1) + I(2)`, "I(3)")
2615 vereq(`I(1) + 2`, "I(3)")
2616 vereq(`1 + I(2)`, "I(3)")
2617 vereq(`I(2) ** I(3)`, "I(8)")
2618 vereq(`2 ** I(3)`, "I(8)")
2619 vereq(`I(2) ** 3`, "I(8)")
2620 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2621 class S(str):
2622 def __eq__(self, other):
2623 return self.lower() == other.lower()
2624
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002625def subclasspropagation():
2626 if verbose: print "Testing propagation of slot functions to subclasses..."
2627 class A(object):
2628 pass
2629 class B(A):
2630 pass
2631 class C(A):
2632 pass
2633 class D(B, C):
2634 pass
2635 d = D()
2636 vereq(hash(d), id(d))
2637 A.__hash__ = lambda self: 42
2638 vereq(hash(d), 42)
2639 C.__hash__ = lambda self: 314
2640 vereq(hash(d), 314)
2641 B.__hash__ = lambda self: 144
2642 vereq(hash(d), 144)
2643 D.__hash__ = lambda self: 100
2644 vereq(hash(d), 100)
2645 del D.__hash__
2646 vereq(hash(d), 144)
2647 del B.__hash__
2648 vereq(hash(d), 314)
2649 del C.__hash__
2650 vereq(hash(d), 42)
2651 del A.__hash__
2652 vereq(hash(d), id(d))
2653 d.foo = 42
2654 d.bar = 42
2655 vereq(d.foo, 42)
2656 vereq(d.bar, 42)
2657 def __getattribute__(self, name):
2658 if name == "foo":
2659 return 24
2660 return object.__getattribute__(self, name)
2661 A.__getattribute__ = __getattribute__
2662 vereq(d.foo, 24)
2663 vereq(d.bar, 42)
2664 def __getattr__(self, name):
2665 if name in ("spam", "foo", "bar"):
2666 return "hello"
2667 raise AttributeError, name
2668 B.__getattr__ = __getattr__
2669 vereq(d.spam, "hello")
2670 vereq(d.foo, 24)
2671 vereq(d.bar, 42)
2672 del A.__getattribute__
2673 vereq(d.foo, 42)
2674 del d.foo
2675 vereq(d.foo, "hello")
2676 vereq(d.bar, 42)
2677 del B.__getattr__
2678 try:
2679 d.foo
2680 except AttributeError:
2681 pass
2682 else:
2683 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002684
2685def buffer_inherit():
2686 import binascii
2687 # SF bug [#470040] ParseTuple t# vs subclasses.
2688 if verbose:
2689 print "Testing that buffer interface is inherited ..."
2690
2691 class MyStr(str):
2692 pass
2693 base = 'abc'
2694 m = MyStr(base)
2695 # b2a_hex uses the buffer interface to get its argument's value, via
2696 # PyArg_ParseTuple 't#' code.
2697 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2698
2699 # It's not clear that unicode will continue to support the character
2700 # buffer interface, and this test will fail if that's taken away.
2701 class MyUni(unicode):
2702 pass
2703 base = u'abc'
2704 m = MyUni(base)
2705 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2706
2707 class MyInt(int):
2708 pass
2709 m = MyInt(42)
2710 try:
2711 binascii.b2a_hex(m)
2712 raise TestFailed('subclass of int should not have a buffer interface')
2713 except TypeError:
2714 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002715
Tim Petersc9933152001-10-16 20:18:24 +00002716def str_of_str_subclass():
2717 import binascii
2718 import cStringIO
2719
2720 if verbose:
2721 print "Testing __str__ defined in subclass of str ..."
2722
2723 class octetstring(str):
2724 def __str__(self):
2725 return binascii.b2a_hex(self)
2726 def __repr__(self):
2727 return self + " repr"
2728
2729 o = octetstring('A')
2730 vereq(type(o), octetstring)
2731 vereq(type(str(o)), str)
2732 vereq(type(repr(o)), str)
2733 vereq(ord(o), 0x41)
2734 vereq(str(o), '41')
2735 vereq(repr(o), 'A repr')
2736 vereq(o.__str__(), '41')
2737 vereq(o.__repr__(), 'A repr')
2738
2739 capture = cStringIO.StringIO()
2740 # Calling str() or not exercises different internal paths.
2741 print >> capture, o
2742 print >> capture, str(o)
2743 vereq(capture.getvalue(), '41\n41\n')
2744 capture.close()
2745
Guido van Rossumc8e56452001-10-22 00:43:43 +00002746def kwdargs():
2747 if verbose: print "Testing keyword arguments to __init__, __call__..."
2748 def f(a): return a
2749 vereq(f.__call__(a=42), 42)
2750 a = []
2751 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002752 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002753
Guido van Rossumed87ad82001-10-30 02:33:02 +00002754def delhook():
2755 if verbose: print "Testing __del__ hook..."
2756 log = []
2757 class C(object):
2758 def __del__(self):
2759 log.append(1)
2760 c = C()
2761 vereq(log, [])
2762 del c
2763 vereq(log, [1])
2764
Guido van Rossum29d26062001-12-11 04:37:34 +00002765 class D(object): pass
2766 d = D()
2767 try: del d[0]
2768 except TypeError: pass
2769 else: raise TestFailed, "invalid del() didn't raise TypeError"
2770
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002771def hashinherit():
2772 if verbose: print "Testing hash of mutable subclasses..."
2773
2774 class mydict(dict):
2775 pass
2776 d = mydict()
2777 try:
2778 hash(d)
2779 except TypeError:
2780 pass
2781 else:
2782 raise TestFailed, "hash() of dict subclass should fail"
2783
2784 class mylist(list):
2785 pass
2786 d = mylist()
2787 try:
2788 hash(d)
2789 except TypeError:
2790 pass
2791 else:
2792 raise TestFailed, "hash() of list subclass should fail"
2793
Guido van Rossum29d26062001-12-11 04:37:34 +00002794def strops():
2795 try: 'a' + 5
2796 except TypeError: pass
2797 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2798
2799 try: ''.split('')
2800 except ValueError: pass
2801 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2802
2803 try: ''.join([0])
2804 except TypeError: pass
2805 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2806
2807 try: ''.rindex('5')
2808 except ValueError: pass
2809 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2810
2811 try: ''.replace('', '')
2812 except ValueError: pass
2813 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2814
2815 try: '%(n)s' % None
2816 except TypeError: pass
2817 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2818
2819 try: '%(n' % {}
2820 except ValueError: pass
2821 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2822
2823 try: '%*s' % ('abc')
2824 except TypeError: pass
2825 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2826
2827 try: '%*.*s' % ('abc', 5)
2828 except TypeError: pass
2829 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2830
2831 try: '%s' % (1, 2)
2832 except TypeError: pass
2833 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2834
2835 try: '%' % None
2836 except ValueError: pass
2837 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2838
2839 vereq('534253'.isdigit(), 1)
2840 vereq('534253x'.isdigit(), 0)
2841 vereq('%c' % 5, '\x05')
2842 vereq('%c' % '5', '5')
2843
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002844def deepcopyrecursive():
2845 if verbose: print "Testing deepcopy of recursive objects..."
2846 class Node:
2847 pass
2848 a = Node()
2849 b = Node()
2850 a.b = b
2851 b.a = a
2852 z = deepcopy(a) # This blew up before
Guido van Rossum29d26062001-12-11 04:37:34 +00002853
Guido van Rossumd7035672002-03-12 20:43:31 +00002854def modules():
2855 if verbose: print "Testing uninitialized module objects..."
2856 from types import ModuleType as M
2857 m = M.__new__(M)
2858 str(m)
2859 vereq(hasattr(m, "__name__"), 0)
2860 vereq(hasattr(m, "__file__"), 0)
2861 vereq(hasattr(m, "foo"), 0)
2862 vereq(m.__dict__, None)
2863 m.foo = 1
2864 vereq(m.__dict__, {"foo": 1})
Guido van Rossum29d26062001-12-11 04:37:34 +00002865
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002866def dictproxyiterkeys():
2867 class C(object):
2868 def meth(self):
2869 pass
2870 if verbose: print "Testing dict-proxy iterkeys..."
2871 keys = [ key for key in C.__dict__.iterkeys() ]
2872 keys.sort()
2873 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
2874
2875def dictproxyitervalues():
2876 class C(object):
2877 def meth(self):
2878 pass
2879 if verbose: print "Testing dict-proxy itervalues..."
2880 values = [ values for values in C.__dict__.itervalues() ]
2881 vereq(len(values), 5)
2882
2883def dictproxyiteritems():
2884 class C(object):
2885 def meth(self):
2886 pass
2887 if verbose: print "Testing dict-proxy iteritems..."
2888 keys = [ key for (key, value) in C.__dict__.iteritems() ]
2889 keys.sort()
2890 vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth'])
2891
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002892def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002893 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002894 lists()
2895 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002896 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002897 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002898 ints()
2899 longs()
2900 floats()
2901 complexes()
2902 spamlists()
2903 spamdicts()
2904 pydicts()
2905 pylists()
2906 metaclass()
2907 pymods()
2908 multi()
2909 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002910 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002911 slots()
2912 dynamics()
2913 errors()
2914 classmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00002915 classmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002916 staticmethods()
Fred Drakef841aa62002-03-28 15:49:54 +00002917 staticmethods_in_c()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002918 classic()
2919 compattr()
2920 newslot()
2921 altmro()
2922 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002923 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002924 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002925 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002926 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002927 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002928 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002929 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002930 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002931 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002932 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002933 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002934 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002935 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002936 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002937 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002938 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002939 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002940 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002941 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002942 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002943 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002944 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002945 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002946 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00002947 strops()
Guido van Rossum2764a3a2001-12-28 21:39:03 +00002948 deepcopyrecursive()
Guido van Rossumd7035672002-03-12 20:43:31 +00002949 modules()
Walter Dörwalddbd2d252002-03-25 18:36:32 +00002950 dictproxyiterkeys()
2951 dictproxyitervalues()
2952 dictproxyiteritems()
Guido van Rossum8c842552002-03-14 23:05:54 +00002953 pickleslots()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002954 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002955
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002956if __name__ == "__main__":
2957 test_main()