blob: 1ec7c19c80098a19b3c0c9cbc0d4c5db628fa9bc [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)
429
430def longs():
431 if verbose: print "Testing long operations..."
432 numops(100L, 3L)
433
434def floats():
435 if verbose: print "Testing float operations..."
436 numops(100.0, 3.0)
437
438def complexes():
439 if verbose: print "Testing complex operations..."
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +0000440 numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float'])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000441 class Number(complex):
442 __slots__ = ['prec']
Tim Peters3f996e72001-09-13 19:18:27 +0000443 def __new__(cls, *args, **kwds):
444 result = complex.__new__(cls, *args)
445 result.prec = kwds.get('prec', 12)
446 return result
Tim Peters6d6c1a32001-08-02 04:15:00 +0000447 def __repr__(self):
448 prec = self.prec
449 if self.imag == 0.0:
450 return "%.*g" % (prec, self.real)
451 if self.real == 0.0:
452 return "%.*gj" % (prec, self.imag)
453 return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag)
454 __str__ = __repr__
Tim Peters3f996e72001-09-13 19:18:27 +0000455
Tim Peters6d6c1a32001-08-02 04:15:00 +0000456 a = Number(3.14, prec=6)
Guido van Rossum45704552001-10-08 16:35:45 +0000457 vereq(`a`, "3.14")
458 vereq(a.prec, 6)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000459
Tim Peters3f996e72001-09-13 19:18:27 +0000460 a = Number(a, prec=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000461 vereq(`a`, "3.1")
462 vereq(a.prec, 2)
Tim Peters3f996e72001-09-13 19:18:27 +0000463
464 a = Number(234.5)
Guido van Rossum45704552001-10-08 16:35:45 +0000465 vereq(`a`, "234.5")
466 vereq(a.prec, 12)
Tim Peters3f996e72001-09-13 19:18:27 +0000467
Tim Peters6d6c1a32001-08-02 04:15:00 +0000468def spamlists():
469 if verbose: print "Testing spamlist operations..."
470 import copy, xxsubtype as spam
471 def spamlist(l, memo=None):
472 import xxsubtype as spam
473 return spam.spamlist(l)
474 # This is an ugly hack:
475 copy._deepcopy_dispatch[spam.spamlist] = spamlist
476
477 testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__")
478 testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__")
479 testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__")
480 testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__")
481 testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]),
482 "a[b:c]", "__getslice__")
483 testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]),
484 "a+=b", "__iadd__")
485 testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__")
486 testunop(spamlist([1,2,3]), 3, "len(a)", "__len__")
487 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__")
488 testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__")
489 testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__")
490 testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]),
491 spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__")
492 # Test subclassing
493 class C(spam.spamlist):
494 def foo(self): return 1
495 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000496 vereq(a, [])
497 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000498 a.append(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000499 vereq(a, [100])
500 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000501 a.setstate(42)
Guido van Rossum45704552001-10-08 16:35:45 +0000502 vereq(a.getstate(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000503
504def spamdicts():
505 if verbose: print "Testing spamdict operations..."
506 import copy, xxsubtype as spam
507 def spamdict(d, memo=None):
508 import xxsubtype as spam
509 sd = spam.spamdict()
510 for k, v in d.items(): sd[k] = v
511 return sd
512 # This is an ugly hack:
513 copy._deepcopy_dispatch[spam.spamdict] = spamdict
514
515 testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__")
516 testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__")
517 testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__")
518 testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__")
519 d = spamdict({1:2,3:4})
520 l1 = []
521 for i in d.keys(): l1.append(i)
522 l = []
523 for i in iter(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000524 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000525 l = []
526 for i in d.__iter__(): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000527 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000528 l = []
529 for i in type(spamdict({})).__iter__(d): l.append(i)
Guido van Rossum45704552001-10-08 16:35:45 +0000530 vereq(l, l1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000531 straightd = {1:2, 3:4}
532 spamd = spamdict(straightd)
533 testunop(spamd, 2, "len(a)", "__len__")
534 testunop(spamd, repr(straightd), "repr(a)", "__repr__")
535 testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}),
536 "a[b]=c", "__setitem__")
537 # Test subclassing
538 class C(spam.spamdict):
539 def foo(self): return 1
540 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000541 vereq(a.items(), [])
542 vereq(a.foo(), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000543 a['foo'] = 'bar'
Guido van Rossum45704552001-10-08 16:35:45 +0000544 vereq(a.items(), [('foo', 'bar')])
545 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000546 a.setstate(100)
Guido van Rossum45704552001-10-08 16:35:45 +0000547 vereq(a.getstate(), 100)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000548
549def pydicts():
550 if verbose: print "Testing Python subclass of dict..."
Tim Petersa427a2b2001-10-29 22:25:45 +0000551 verify(issubclass(dict, dict))
552 verify(isinstance({}, dict))
553 d = dict()
Guido van Rossum45704552001-10-08 16:35:45 +0000554 vereq(d, {})
Tim Petersa427a2b2001-10-29 22:25:45 +0000555 verify(d.__class__ is dict)
556 verify(isinstance(d, dict))
557 class C(dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000558 state = -1
559 def __init__(self, *a, **kw):
560 if a:
Guido van Rossum90c45142001-11-24 21:07:01 +0000561 vereq(len(a), 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000562 self.state = a[0]
563 if kw:
564 for k, v in kw.items(): self[v] = k
565 def __getitem__(self, key):
566 return self.get(key, 0)
567 def __setitem__(self, key, value):
Guido van Rossum90c45142001-11-24 21:07:01 +0000568 verify(isinstance(key, type(0)))
Tim Petersa427a2b2001-10-29 22:25:45 +0000569 dict.__setitem__(self, key, value)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000570 def setstate(self, state):
571 self.state = state
572 def getstate(self):
573 return self.state
Tim Petersa427a2b2001-10-29 22:25:45 +0000574 verify(issubclass(C, dict))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000575 a1 = C(12)
Guido van Rossum45704552001-10-08 16:35:45 +0000576 vereq(a1.state, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000577 a2 = C(foo=1, bar=2)
Guido van Rossum45704552001-10-08 16:35:45 +0000578 vereq(a2[1] == 'foo' and a2[2], 'bar')
Tim Peters6d6c1a32001-08-02 04:15:00 +0000579 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000580 vereq(a.state, -1)
581 vereq(a.getstate(), -1)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000582 a.setstate(0)
Guido van Rossum45704552001-10-08 16:35:45 +0000583 vereq(a.state, 0)
584 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000585 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000586 vereq(a.state, 10)
587 vereq(a.getstate(), 10)
588 vereq(a[42], 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000589 a[42] = 24
Guido van Rossum45704552001-10-08 16:35:45 +0000590 vereq(a[42], 24)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000591 if verbose: print "pydict stress test ..."
592 N = 50
593 for i in range(N):
594 a[i] = C()
595 for j in range(N):
596 a[i][j] = i*j
597 for i in range(N):
598 for j in range(N):
Guido van Rossum45704552001-10-08 16:35:45 +0000599 vereq(a[i][j], i*j)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000600
601def pylists():
602 if verbose: print "Testing Python subclass of list..."
603 class C(list):
604 def __getitem__(self, i):
605 return list.__getitem__(self, i) + 100
606 def __getslice__(self, i, j):
607 return (i, j)
608 a = C()
609 a.extend([0,1,2])
Guido van Rossum45704552001-10-08 16:35:45 +0000610 vereq(a[0], 100)
611 vereq(a[1], 101)
612 vereq(a[2], 102)
613 vereq(a[100:200], (100,200))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614
615def metaclass():
616 if verbose: print "Testing __metaclass__..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000617 class C:
618 __metaclass__ = type
619 def __init__(self):
620 self.__state = 0
621 def getstate(self):
622 return self.__state
623 def setstate(self, state):
624 self.__state = state
625 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000626 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000628 vereq(a.getstate(), 10)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629 class D:
630 class __metaclass__(type):
631 def myself(cls): return cls
Guido van Rossum45704552001-10-08 16:35:45 +0000632 vereq(D.myself(), D)
Guido van Rossum309b5662001-08-17 11:43:17 +0000633 d = D()
634 verify(d.__class__ is D)
635 class M1(type):
636 def __new__(cls, name, bases, dict):
637 dict['__spam__'] = 1
638 return type.__new__(cls, name, bases, dict)
639 class C:
640 __metaclass__ = M1
Guido van Rossum45704552001-10-08 16:35:45 +0000641 vereq(C.__spam__, 1)
Guido van Rossum309b5662001-08-17 11:43:17 +0000642 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000643 vereq(c.__spam__, 1)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000644
Guido van Rossum309b5662001-08-17 11:43:17 +0000645 class _instance(object):
646 pass
647 class M2(object):
648 def __new__(cls, name, bases, dict):
649 self = object.__new__(cls)
650 self.name = name
651 self.bases = bases
652 self.dict = dict
653 return self
654 __new__ = staticmethod(__new__)
655 def __call__(self):
656 it = _instance()
Guido van Rossum7e1ff692001-08-17 11:55:58 +0000657 # Early binding of methods
658 for key in self.dict:
659 if key.startswith("__"):
660 continue
661 setattr(it, key, self.dict[key].__get__(it, self))
Guido van Rossum309b5662001-08-17 11:43:17 +0000662 return it
663 class C:
664 __metaclass__ = M2
665 def spam(self):
666 return 42
Guido van Rossum45704552001-10-08 16:35:45 +0000667 vereq(C.name, 'C')
668 vereq(C.bases, ())
Guido van Rossum309b5662001-08-17 11:43:17 +0000669 verify('spam' in C.dict)
670 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000671 vereq(c.spam(), 42)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000672
Guido van Rossum91ee7982001-08-30 20:52:40 +0000673 # More metaclass examples
674
675 class autosuper(type):
676 # Automatically add __super to the class
677 # This trick only works for dynamic classes
Guido van Rossum91ee7982001-08-30 20:52:40 +0000678 def __new__(metaclass, name, bases, dict):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000679 cls = super(autosuper, metaclass).__new__(metaclass,
680 name, bases, dict)
Guido van Rossumbfa47b02001-08-31 04:35:14 +0000681 # Name mangling for __super removes leading underscores
Guido van Rossum91ee7982001-08-30 20:52:40 +0000682 while name[:1] == "_":
683 name = name[1:]
Guido van Rossum91ee7982001-08-30 20:52:40 +0000684 if name:
685 name = "_%s__super" % name
686 else:
687 name = "__super"
688 setattr(cls, name, super(cls))
689 return cls
690 class A:
691 __metaclass__ = autosuper
692 def meth(self):
693 return "A"
694 class B(A):
695 def meth(self):
696 return "B" + self.__super.meth()
697 class C(A):
698 def meth(self):
699 return "C" + self.__super.meth()
700 class D(C, B):
701 def meth(self):
702 return "D" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000703 vereq(D().meth(), "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000704 class E(B, C):
705 def meth(self):
706 return "E" + self.__super.meth()
Guido van Rossum45704552001-10-08 16:35:45 +0000707 vereq(E().meth(), "EBCA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000708
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000709 class autoproperty(type):
710 # Automatically create property attributes when methods
Guido van Rossum91ee7982001-08-30 20:52:40 +0000711 # named _get_x and/or _set_x are found
712 def __new__(metaclass, name, bases, dict):
713 hits = {}
714 for key, val in dict.iteritems():
715 if key.startswith("_get_"):
716 key = key[5:]
717 get, set = hits.get(key, (None, None))
718 get = val
719 hits[key] = get, set
720 elif key.startswith("_set_"):
721 key = key[5:]
722 get, set = hits.get(key, (None, None))
723 set = val
724 hits[key] = get, set
725 for key, (get, set) in hits.iteritems():
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000726 dict[key] = property(get, set)
727 return super(autoproperty, metaclass).__new__(metaclass,
Guido van Rossum91ee7982001-08-30 20:52:40 +0000728 name, bases, dict)
729 class A:
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000730 __metaclass__ = autoproperty
Guido van Rossum91ee7982001-08-30 20:52:40 +0000731 def _get_x(self):
732 return -self.__x
733 def _set_x(self, x):
734 self.__x = -x
735 a = A()
736 verify(not hasattr(a, "x"))
737 a.x = 12
Guido van Rossum45704552001-10-08 16:35:45 +0000738 vereq(a.x, 12)
739 vereq(a._A__x, -12)
Guido van Rossum91ee7982001-08-30 20:52:40 +0000740
Guido van Rossum8bce4ac2001-09-06 21:56:42 +0000741 class multimetaclass(autoproperty, autosuper):
Guido van Rossum91ee7982001-08-30 20:52:40 +0000742 # Merge of multiple cooperating metaclasses
743 pass
744 class A:
745 __metaclass__ = multimetaclass
746 def _get_x(self):
747 return "A"
748 class B(A):
749 def _get_x(self):
750 return "B" + self.__super._get_x()
751 class C(A):
752 def _get_x(self):
753 return "C" + self.__super._get_x()
754 class D(C, B):
755 def _get_x(self):
756 return "D" + self.__super._get_x()
Guido van Rossum45704552001-10-08 16:35:45 +0000757 vereq(D().x, "DCBA")
Guido van Rossum91ee7982001-08-30 20:52:40 +0000758
Guido van Rossumf76de622001-10-18 15:49:21 +0000759 # Make sure type(x) doesn't call x.__class__.__init__
760 class T(type):
761 counter = 0
762 def __init__(self, *args):
763 T.counter += 1
764 class C:
765 __metaclass__ = T
766 vereq(T.counter, 1)
767 a = C()
768 vereq(type(a), C)
769 vereq(T.counter, 1)
770
Guido van Rossum29d26062001-12-11 04:37:34 +0000771 class C(object): pass
772 c = C()
773 try: c()
774 except TypeError: pass
775 else: raise TestError, "calling object w/o call method should raise TypeError"
776
Tim Peters6d6c1a32001-08-02 04:15:00 +0000777def pymods():
778 if verbose: print "Testing Python subclass of module..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000779 log = []
Guido van Rossumd3077402001-08-12 05:24:18 +0000780 import sys
781 MT = type(sys)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000782 class MM(MT):
783 def __init__(self):
784 MT.__init__(self)
Guido van Rossum867a8d22001-09-21 19:29:08 +0000785 def __getattribute__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000786 log.append(("getattr", name))
Guido van Rossum867a8d22001-09-21 19:29:08 +0000787 return MT.__getattribute__(self, name)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000788 def __setattr__(self, name, value):
789 log.append(("setattr", name, value))
790 MT.__setattr__(self, name, value)
791 def __delattr__(self, name):
792 log.append(("delattr", name))
793 MT.__delattr__(self, name)
794 a = MM()
795 a.foo = 12
796 x = a.foo
797 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +0000798 vereq(log, [("setattr", "foo", 12),
799 ("getattr", "foo"),
800 ("delattr", "foo")])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000801
802def multi():
803 if verbose: print "Testing multiple inheritance..."
Tim Peters6d6c1a32001-08-02 04:15:00 +0000804 class C(object):
805 def __init__(self):
806 self.__state = 0
807 def getstate(self):
808 return self.__state
809 def setstate(self, state):
810 self.__state = state
811 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +0000812 vereq(a.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000813 a.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000814 vereq(a.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000815 class D(dict, C):
Tim Peters6d6c1a32001-08-02 04:15:00 +0000816 def __init__(self):
817 type({}).__init__(self)
818 C.__init__(self)
819 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +0000820 vereq(d.keys(), [])
Tim Peters6d6c1a32001-08-02 04:15:00 +0000821 d["hello"] = "world"
Guido van Rossum45704552001-10-08 16:35:45 +0000822 vereq(d.items(), [("hello", "world")])
823 vereq(d["hello"], "world")
824 vereq(d.getstate(), 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 d.setstate(10)
Guido van Rossum45704552001-10-08 16:35:45 +0000826 vereq(d.getstate(), 10)
Tim Petersa427a2b2001-10-29 22:25:45 +0000827 vereq(D.__mro__, (D, dict, C, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828
Guido van Rossume45763a2001-08-10 21:28:46 +0000829 # SF bug #442833
830 class Node(object):
831 def __int__(self):
832 return int(self.foo())
833 def foo(self):
834 return "23"
835 class Frag(Node, list):
836 def foo(self):
837 return "42"
Guido van Rossum45704552001-10-08 16:35:45 +0000838 vereq(Node().__int__(), 23)
839 vereq(int(Node()), 23)
840 vereq(Frag().__int__(), 42)
841 vereq(int(Frag()), 42)
Guido van Rossume45763a2001-08-10 21:28:46 +0000842
Tim Petersa91e9642001-11-14 23:32:33 +0000843 # MI mixing classic and new-style classes.
Tim Peters144b98d2001-11-14 23:56:45 +0000844
845 class A:
846 x = 1
847
848 class B(A):
849 pass
850
851 class C(A):
852 x = 2
853
854 class D(B, C):
855 pass
856 vereq(D.x, 1)
857
858 # Classic MRO is preserved for a classic base class.
859 class E(D, object):
860 pass
861 vereq(E.__mro__, (E, D, B, A, C, object))
862 vereq(E.x, 1)
863
864 # But with a mix of classic bases, their MROs are combined using
865 # new-style MRO.
866 class F(B, C, object):
867 pass
868 vereq(F.__mro__, (F, B, C, A, object))
869 vereq(F.x, 2)
870
871 # Try something else.
Tim Petersa91e9642001-11-14 23:32:33 +0000872 class C:
873 def cmethod(self):
874 return "C a"
875 def all_method(self):
876 return "C b"
877
878 class M1(C, object):
879 def m1method(self):
880 return "M1 a"
881 def all_method(self):
882 return "M1 b"
883
884 vereq(M1.__mro__, (M1, C, object))
885 m = M1()
886 vereq(m.cmethod(), "C a")
887 vereq(m.m1method(), "M1 a")
888 vereq(m.all_method(), "M1 b")
889
890 class D(C):
891 def dmethod(self):
892 return "D a"
893 def all_method(self):
894 return "D b"
895
896 class M2(object, D):
897 def m2method(self):
898 return "M2 a"
899 def all_method(self):
900 return "M2 b"
901
902 vereq(M2.__mro__, (M2, object, D, C))
903 m = M2()
904 vereq(m.cmethod(), "C a")
905 vereq(m.dmethod(), "D a")
906 vereq(m.m2method(), "M2 a")
907 vereq(m.all_method(), "M2 b")
908
909 class M3(M1, object, M2):
910 def m3method(self):
911 return "M3 a"
912 def all_method(self):
913 return "M3 b"
914 # XXX Expected this (the commented-out result):
915 # vereq(M3.__mro__, (M3, M1, M2, object, D, C))
916 vereq(M3.__mro__, (M3, M1, M2, D, C, object)) # XXX ?
Tim Peters144b98d2001-11-14 23:56:45 +0000917 m = M3()
918 vereq(m.cmethod(), "C a")
919 vereq(m.dmethod(), "D a")
920 vereq(m.m1method(), "M1 a")
921 vereq(m.m2method(), "M2 a")
922 vereq(m.m3method(), "M3 a")
923 vereq(m.all_method(), "M3 b")
Tim Petersa91e9642001-11-14 23:32:33 +0000924
Tim Peters6d6c1a32001-08-02 04:15:00 +0000925def diamond():
926 if verbose: print "Testing multiple inheritance special cases..."
927 class A(object):
928 def spam(self): return "A"
Guido van Rossum45704552001-10-08 16:35:45 +0000929 vereq(A().spam(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000930 class B(A):
931 def boo(self): return "B"
932 def spam(self): return "B"
Guido van Rossum45704552001-10-08 16:35:45 +0000933 vereq(B().spam(), "B")
934 vereq(B().boo(), "B")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000935 class C(A):
936 def boo(self): return "C"
Guido van Rossum45704552001-10-08 16:35:45 +0000937 vereq(C().spam(), "A")
938 vereq(C().boo(), "C")
Tim Peters6d6c1a32001-08-02 04:15:00 +0000939 class D(B, C): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000940 vereq(D().spam(), "B")
941 vereq(D().boo(), "B")
942 vereq(D.__mro__, (D, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000943 class E(C, B): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000944 vereq(E().spam(), "B")
945 vereq(E().boo(), "C")
946 vereq(E.__mro__, (E, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000947 class F(D, E): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000948 vereq(F().spam(), "B")
949 vereq(F().boo(), "B")
950 vereq(F.__mro__, (F, D, E, B, C, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000951 class G(E, D): pass
Guido van Rossum45704552001-10-08 16:35:45 +0000952 vereq(G().spam(), "B")
953 vereq(G().boo(), "C")
954 vereq(G.__mro__, (G, E, D, C, B, A, object))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000955
Guido van Rossum37202612001-08-09 19:45:21 +0000956def objects():
957 if verbose: print "Testing object class..."
958 a = object()
Guido van Rossum45704552001-10-08 16:35:45 +0000959 vereq(a.__class__, object)
960 vereq(type(a), object)
Guido van Rossum37202612001-08-09 19:45:21 +0000961 b = object()
962 verify(a is not b)
963 verify(not hasattr(a, "foo"))
964 try:
965 a.foo = 12
Guido van Rossum6d946272001-08-10 19:42:38 +0000966 except (AttributeError, TypeError):
Guido van Rossum37202612001-08-09 19:45:21 +0000967 pass
968 else:
969 verify(0, "object() should not allow setting a foo attribute")
970 verify(not hasattr(object(), "__dict__"))
971
972 class Cdict(object):
973 pass
974 x = Cdict()
Guido van Rossum45704552001-10-08 16:35:45 +0000975 vereq(x.__dict__, {})
Guido van Rossum37202612001-08-09 19:45:21 +0000976 x.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000977 vereq(x.foo, 1)
978 vereq(x.__dict__, {'foo': 1})
Guido van Rossum37202612001-08-09 19:45:21 +0000979
Tim Peters6d6c1a32001-08-02 04:15:00 +0000980def slots():
981 if verbose: print "Testing __slots__..."
982 class C0(object):
983 __slots__ = []
984 x = C0()
985 verify(not hasattr(x, "__dict__"))
986 verify(not hasattr(x, "foo"))
987
988 class C1(object):
989 __slots__ = ['a']
990 x = C1()
991 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +0000992 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000993 x.a = 1
Guido van Rossum45704552001-10-08 16:35:45 +0000994 vereq(x.a, 1)
Guido van Rossum6b705992001-12-04 16:23:42 +0000995 x.a = None
996 veris(x.a, None)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000997 del x.a
Guido van Rossum6b705992001-12-04 16:23:42 +0000998 verify(not hasattr(x, "a"))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000999
1000 class C3(object):
1001 __slots__ = ['a', 'b', 'c']
1002 x = C3()
1003 verify(not hasattr(x, "__dict__"))
Guido van Rossum6b705992001-12-04 16:23:42 +00001004 verify(not hasattr(x, 'a'))
1005 verify(not hasattr(x, 'b'))
1006 verify(not hasattr(x, 'c'))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001007 x.a = 1
1008 x.b = 2
1009 x.c = 3
Guido van Rossum45704552001-10-08 16:35:45 +00001010 vereq(x.a, 1)
1011 vereq(x.b, 2)
1012 vereq(x.c, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013
Guido van Rossum33bab012001-12-05 22:45:48 +00001014 # Test leaks
1015 class Counted(object):
1016 counter = 0 # counts the number of instances alive
1017 def __init__(self):
1018 Counted.counter += 1
1019 def __del__(self):
1020 Counted.counter -= 1
1021 class C(object):
1022 __slots__ = ['a', 'b', 'c']
1023 x = C()
1024 x.a = Counted()
1025 x.b = Counted()
1026 x.c = Counted()
1027 vereq(Counted.counter, 3)
1028 del x
1029 vereq(Counted.counter, 0)
1030 class D(C):
1031 pass
1032 x = D()
1033 x.a = Counted()
1034 x.z = Counted()
1035 vereq(Counted.counter, 2)
1036 del x
1037 vereq(Counted.counter, 0)
1038 class E(D):
1039 __slots__ = ['e']
1040 x = E()
1041 x.a = Counted()
1042 x.z = Counted()
1043 x.e = Counted()
1044 vereq(Counted.counter, 3)
1045 del x
1046 vereq(Counted.counter, 0)
1047
Tim Peters6d6c1a32001-08-02 04:15:00 +00001048def dynamics():
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001049 if verbose: print "Testing class attribute propagation..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001050 class D(object):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001051 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001052 class E(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001053 pass
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001054 class F(D):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001055 pass
Tim Peters6d6c1a32001-08-02 04:15:00 +00001056 D.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001057 vereq(D.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001058 # Test that dynamic attributes are inherited
Guido van Rossum45704552001-10-08 16:35:45 +00001059 vereq(E.foo, 1)
1060 vereq(F.foo, 1)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001061 # Test dynamic instances
1062 class C(object):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001063 pass
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001064 a = C()
Guido van Rossumd3077402001-08-12 05:24:18 +00001065 verify(not hasattr(a, "foobar"))
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001066 C.foobar = 2
Guido van Rossum45704552001-10-08 16:35:45 +00001067 vereq(a.foobar, 2)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001068 C.method = lambda self: 42
Guido van Rossum45704552001-10-08 16:35:45 +00001069 vereq(a.method(), 42)
Guido van Rossum9d4fe422001-08-12 03:38:18 +00001070 C.__repr__ = lambda self: "C()"
Guido van Rossum45704552001-10-08 16:35:45 +00001071 vereq(repr(a), "C()")
Guido van Rossumd3077402001-08-12 05:24:18 +00001072 C.__int__ = lambda self: 100
Guido van Rossum45704552001-10-08 16:35:45 +00001073 vereq(int(a), 100)
1074 vereq(a.foobar, 2)
Guido van Rossumd3077402001-08-12 05:24:18 +00001075 verify(not hasattr(a, "spam"))
1076 def mygetattr(self, name):
1077 if name == "spam":
1078 return "spam"
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001079 raise AttributeError
1080 C.__getattr__ = mygetattr
Guido van Rossum45704552001-10-08 16:35:45 +00001081 vereq(a.spam, "spam")
Guido van Rossumd3077402001-08-12 05:24:18 +00001082 a.new = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001083 vereq(a.new, 12)
Guido van Rossumd3077402001-08-12 05:24:18 +00001084 def mysetattr(self, name, value):
1085 if name == "spam":
1086 raise AttributeError
1087 return object.__setattr__(self, name, value)
1088 C.__setattr__ = mysetattr
1089 try:
1090 a.spam = "not spam"
1091 except AttributeError:
1092 pass
1093 else:
1094 verify(0, "expected AttributeError")
Guido van Rossum45704552001-10-08 16:35:45 +00001095 vereq(a.spam, "spam")
Guido van Rossum80e36752001-08-14 20:00:33 +00001096 class D(C):
1097 pass
1098 d = D()
1099 d.foo = 1
Guido van Rossum45704552001-10-08 16:35:45 +00001100 vereq(d.foo, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001101
Guido van Rossum7e35d572001-09-15 03:14:32 +00001102 # Test handling of int*seq and seq*int
1103 class I(int):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001104 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001105 vereq("a"*I(2), "aa")
1106 vereq(I(2)*"a", "aa")
1107 vereq(2*I(3), 6)
1108 vereq(I(3)*2, 6)
1109 vereq(I(3)*I(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001110
1111 # Test handling of long*seq and seq*long
1112 class L(long):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001113 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001114 vereq("a"*L(2L), "aa")
1115 vereq(L(2L)*"a", "aa")
1116 vereq(2*L(3), 6)
1117 vereq(L(3)*2, 6)
1118 vereq(L(3)*L(2), 6)
Guido van Rossum7e35d572001-09-15 03:14:32 +00001119
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001120 # Test comparison of classes with dynamic metaclasses
1121 class dynamicmetaclass(type):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001122 pass
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00001123 class someclass:
1124 __metaclass__ = dynamicmetaclass
1125 verify(someclass != object)
1126
Tim Peters6d6c1a32001-08-02 04:15:00 +00001127def errors():
1128 if verbose: print "Testing errors..."
1129
1130 try:
Tim Petersa427a2b2001-10-29 22:25:45 +00001131 class C(list, dict):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001132 pass
1133 except TypeError:
1134 pass
1135 else:
1136 verify(0, "inheritance from both list and dict should be illegal")
1137
1138 try:
1139 class C(object, None):
1140 pass
1141 except TypeError:
1142 pass
1143 else:
1144 verify(0, "inheritance from non-type should be illegal")
1145 class Classic:
1146 pass
1147
1148 try:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001149 class C(type(len)):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150 pass
1151 except TypeError:
1152 pass
1153 else:
Guido van Rossum8aea0cc2001-08-29 15:48:43 +00001154 verify(0, "inheritance from CFunction should be illegal")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001155
1156 try:
1157 class C(object):
1158 __slots__ = 1
1159 except TypeError:
1160 pass
1161 else:
1162 verify(0, "__slots__ = 1 should be illegal")
1163
1164 try:
1165 class C(object):
1166 __slots__ = [1]
1167 except TypeError:
1168 pass
1169 else:
1170 verify(0, "__slots__ = [1] should be illegal")
1171
1172def classmethods():
1173 if verbose: print "Testing class methods..."
1174 class C(object):
1175 def foo(*a): return a
1176 goo = classmethod(foo)
1177 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001178 vereq(C.goo(1), (C, 1))
1179 vereq(c.goo(1), (C, 1))
1180 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001181 class D(C):
1182 pass
1183 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001184 vereq(D.goo(1), (D, 1))
1185 vereq(d.goo(1), (D, 1))
1186 vereq(d.foo(1), (d, 1))
1187 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001188
1189def staticmethods():
1190 if verbose: print "Testing static methods..."
1191 class C(object):
1192 def foo(*a): return a
1193 goo = staticmethod(foo)
1194 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001195 vereq(C.goo(1), (1,))
1196 vereq(c.goo(1), (1,))
1197 vereq(c.foo(1), (c, 1,))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001198 class D(C):
1199 pass
1200 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001201 vereq(D.goo(1), (1,))
1202 vereq(d.goo(1), (1,))
1203 vereq(d.foo(1), (d, 1))
1204 vereq(D.foo(d, 1), (d, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001205
1206def classic():
1207 if verbose: print "Testing classic classes..."
1208 class C:
1209 def foo(*a): return a
1210 goo = classmethod(foo)
1211 c = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001212 vereq(C.goo(1), (C, 1))
1213 vereq(c.goo(1), (C, 1))
1214 vereq(c.foo(1), (c, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001215 class D(C):
1216 pass
1217 d = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001218 vereq(D.goo(1), (D, 1))
1219 vereq(d.goo(1), (D, 1))
1220 vereq(d.foo(1), (d, 1))
1221 vereq(D.foo(d, 1), (d, 1))
Guido van Rossum93018762001-08-17 13:40:47 +00001222 class E: # *not* subclassing from C
1223 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001224 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001225 verify(repr(C.foo.__get__(C())).startswith("<bound method "))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001226
1227def compattr():
1228 if verbose: print "Testing computed attributes..."
1229 class C(object):
1230 class computed_attribute(object):
1231 def __init__(self, get, set=None):
1232 self.__get = get
1233 self.__set = set
1234 def __get__(self, obj, type=None):
1235 return self.__get(obj)
1236 def __set__(self, obj, value):
1237 return self.__set(obj, value)
1238 def __init__(self):
1239 self.__x = 0
1240 def __get_x(self):
1241 x = self.__x
1242 self.__x = x+1
1243 return x
1244 def __set_x(self, x):
1245 self.__x = x
1246 x = computed_attribute(__get_x, __set_x)
1247 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001248 vereq(a.x, 0)
1249 vereq(a.x, 1)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001250 a.x = 10
Guido van Rossum45704552001-10-08 16:35:45 +00001251 vereq(a.x, 10)
1252 vereq(a.x, 11)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001253
1254def newslot():
1255 if verbose: print "Testing __new__ slot override..."
1256 class C(list):
1257 def __new__(cls):
1258 self = list.__new__(cls)
1259 self.foo = 1
1260 return self
1261 def __init__(self):
1262 self.foo = self.foo + 2
1263 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001264 vereq(a.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001265 verify(a.__class__ is C)
1266 class D(C):
1267 pass
1268 b = D()
Guido van Rossum45704552001-10-08 16:35:45 +00001269 vereq(b.foo, 3)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001270 verify(b.__class__ is D)
1271
Tim Peters6d6c1a32001-08-02 04:15:00 +00001272def altmro():
1273 if verbose: print "Testing mro() and overriding it..."
1274 class A(object):
1275 def f(self): return "A"
1276 class B(A):
1277 pass
1278 class C(A):
1279 def f(self): return "C"
1280 class D(B, C):
1281 pass
Guido van Rossum45704552001-10-08 16:35:45 +00001282 vereq(D.mro(), [D, B, C, A, object])
1283 vereq(D.__mro__, (D, B, C, A, object))
1284 vereq(D().f(), "C")
Guido van Rossumd3077402001-08-12 05:24:18 +00001285 class PerverseMetaType(type):
1286 def mro(cls):
1287 L = type.mro(cls)
1288 L.reverse()
1289 return L
Tim Peters6d6c1a32001-08-02 04:15:00 +00001290 class X(A,B,C,D):
1291 __metaclass__ = PerverseMetaType
Guido van Rossum45704552001-10-08 16:35:45 +00001292 vereq(X.__mro__, (object, A, C, B, D, X))
1293 vereq(X().f(), "A")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001294
1295def overloading():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001296 if verbose: print "Testing operator overloading..."
Tim Peters6d6c1a32001-08-02 04:15:00 +00001297
1298 class B(object):
1299 "Intermediate class because object doesn't have a __setattr__"
1300
1301 class C(B):
1302
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001303 def __getattr__(self, name):
Tim Peters6d6c1a32001-08-02 04:15:00 +00001304 if name == "foo":
1305 return ("getattr", name)
1306 else:
Guido van Rossum19c1cd52001-09-21 21:24:49 +00001307 raise AttributeError
Tim Peters6d6c1a32001-08-02 04:15:00 +00001308 def __setattr__(self, name, value):
1309 if name == "foo":
1310 self.setattr = (name, value)
1311 else:
1312 return B.__setattr__(self, name, value)
1313 def __delattr__(self, name):
1314 if name == "foo":
1315 self.delattr = name
1316 else:
1317 return B.__delattr__(self, name)
1318
1319 def __getitem__(self, key):
1320 return ("getitem", key)
1321 def __setitem__(self, key, value):
1322 self.setitem = (key, value)
1323 def __delitem__(self, key):
1324 self.delitem = key
1325
1326 def __getslice__(self, i, j):
1327 return ("getslice", i, j)
1328 def __setslice__(self, i, j, value):
1329 self.setslice = (i, j, value)
1330 def __delslice__(self, i, j):
1331 self.delslice = (i, j)
1332
1333 a = C()
Guido van Rossum45704552001-10-08 16:35:45 +00001334 vereq(a.foo, ("getattr", "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001335 a.foo = 12
Guido van Rossum45704552001-10-08 16:35:45 +00001336 vereq(a.setattr, ("foo", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001337 del a.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001338 vereq(a.delattr, "foo")
Tim Peters6d6c1a32001-08-02 04:15:00 +00001339
Guido van Rossum45704552001-10-08 16:35:45 +00001340 vereq(a[12], ("getitem", 12))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001341 a[12] = 21
Guido van Rossum45704552001-10-08 16:35:45 +00001342 vereq(a.setitem, (12, 21))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001343 del a[12]
Guido van Rossum45704552001-10-08 16:35:45 +00001344 vereq(a.delitem, 12)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001345
Guido van Rossum45704552001-10-08 16:35:45 +00001346 vereq(a[0:10], ("getslice", 0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001347 a[0:10] = "foo"
Guido van Rossum45704552001-10-08 16:35:45 +00001348 vereq(a.setslice, (0, 10, "foo"))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001349 del a[0:10]
Guido van Rossum45704552001-10-08 16:35:45 +00001350 vereq(a.delslice, (0, 10))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001351
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001352def methods():
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001353 if verbose: print "Testing methods..."
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001354 class C(object):
1355 def __init__(self, x):
1356 self.x = x
1357 def foo(self):
1358 return self.x
1359 c1 = C(1)
Guido van Rossum45704552001-10-08 16:35:45 +00001360 vereq(c1.foo(), 1)
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001361 class D(C):
1362 boo = C.foo
1363 goo = c1.foo
1364 d2 = D(2)
Guido van Rossum45704552001-10-08 16:35:45 +00001365 vereq(d2.foo(), 2)
1366 vereq(d2.boo(), 2)
1367 vereq(d2.goo(), 1)
Guido van Rossum93018762001-08-17 13:40:47 +00001368 class E(object):
1369 foo = C.foo
Guido van Rossum45704552001-10-08 16:35:45 +00001370 vereq(E().foo, C.foo) # i.e., unbound
Guido van Rossum84a79a82001-08-17 13:58:31 +00001371 verify(repr(C.foo.__get__(C(1))).startswith("<bound method "))
Guido van Rossumb5a136b2001-08-15 17:51:17 +00001372
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001373def specials():
1374 # Test operators like __hash__ for which a built-in default exists
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001375 if verbose: print "Testing special operators..."
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001376 # Test the default behavior for static classes
1377 class C(object):
1378 def __getitem__(self, i):
1379 if 0 <= i < 10: return i
1380 raise IndexError
1381 c1 = C()
1382 c2 = C()
1383 verify(not not c1)
Guido van Rossum45704552001-10-08 16:35:45 +00001384 vereq(hash(c1), id(c1))
1385 vereq(cmp(c1, c2), cmp(id(c1), id(c2)))
1386 vereq(c1, c1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001387 verify(c1 != c2)
1388 verify(not c1 != c1)
1389 verify(not c1 == c2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001390 # Note that the module name appears in str/repr, and that varies
1391 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001392 verify(str(c1).find('C object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001393 vereq(str(c1), repr(c1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001394 verify(-1 not in c1)
1395 for i in range(10):
1396 verify(i in c1)
1397 verify(10 not in c1)
1398 # Test the default behavior for dynamic classes
1399 class D(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001400 def __getitem__(self, i):
1401 if 0 <= i < 10: return i
1402 raise IndexError
1403 d1 = D()
1404 d2 = D()
1405 verify(not not d1)
Guido van Rossum45704552001-10-08 16:35:45 +00001406 vereq(hash(d1), id(d1))
1407 vereq(cmp(d1, d2), cmp(id(d1), id(d2)))
1408 vereq(d1, d1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001409 verify(d1 != d2)
1410 verify(not d1 != d1)
1411 verify(not d1 == d2)
Tim Peters4d2dded2001-08-16 19:50:51 +00001412 # Note that the module name appears in str/repr, and that varies
1413 # depending on whether this test is run standalone or from a framework.
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001414 verify(str(d1).find('D object at ') >= 0)
Guido van Rossum45704552001-10-08 16:35:45 +00001415 vereq(str(d1), repr(d1))
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001416 verify(-1 not in d1)
1417 for i in range(10):
1418 verify(i in d1)
1419 verify(10 not in d1)
1420 # Test overridden behavior for static classes
1421 class Proxy(object):
1422 def __init__(self, x):
1423 self.x = x
1424 def __nonzero__(self):
1425 return not not self.x
1426 def __hash__(self):
1427 return hash(self.x)
1428 def __eq__(self, other):
1429 return self.x == other
1430 def __ne__(self, other):
1431 return self.x != other
1432 def __cmp__(self, other):
1433 return cmp(self.x, other.x)
1434 def __str__(self):
1435 return "Proxy:%s" % self.x
1436 def __repr__(self):
1437 return "Proxy(%r)" % self.x
1438 def __contains__(self, value):
1439 return value in self.x
1440 p0 = Proxy(0)
1441 p1 = Proxy(1)
1442 p_1 = Proxy(-1)
1443 verify(not p0)
1444 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001445 vereq(hash(p0), hash(0))
1446 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001447 verify(p0 != p1)
1448 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001449 vereq(not p0, p1)
1450 vereq(cmp(p0, p1), -1)
1451 vereq(cmp(p0, p0), 0)
1452 vereq(cmp(p0, p_1), 1)
1453 vereq(str(p0), "Proxy:0")
1454 vereq(repr(p0), "Proxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001455 p10 = Proxy(range(10))
1456 verify(-1 not in p10)
1457 for i in range(10):
1458 verify(i in p10)
1459 verify(10 not in p10)
1460 # Test overridden behavior for dynamic classes
1461 class DProxy(object):
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001462 def __init__(self, x):
1463 self.x = x
1464 def __nonzero__(self):
1465 return not not self.x
1466 def __hash__(self):
1467 return hash(self.x)
1468 def __eq__(self, other):
1469 return self.x == other
1470 def __ne__(self, other):
1471 return self.x != other
1472 def __cmp__(self, other):
1473 return cmp(self.x, other.x)
1474 def __str__(self):
1475 return "DProxy:%s" % self.x
1476 def __repr__(self):
1477 return "DProxy(%r)" % self.x
1478 def __contains__(self, value):
1479 return value in self.x
1480 p0 = DProxy(0)
1481 p1 = DProxy(1)
1482 p_1 = DProxy(-1)
1483 verify(not p0)
1484 verify(not not p1)
Guido van Rossum45704552001-10-08 16:35:45 +00001485 vereq(hash(p0), hash(0))
1486 vereq(p0, p0)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001487 verify(p0 != p1)
1488 verify(not p0 != p0)
Guido van Rossum45704552001-10-08 16:35:45 +00001489 vereq(not p0, p1)
1490 vereq(cmp(p0, p1), -1)
1491 vereq(cmp(p0, p0), 0)
1492 vereq(cmp(p0, p_1), 1)
1493 vereq(str(p0), "DProxy:0")
1494 vereq(repr(p0), "DProxy(0)")
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001495 p10 = DProxy(range(10))
1496 verify(-1 not in p10)
1497 for i in range(10):
1498 verify(i in p10)
1499 verify(10 not in p10)
Guido van Rossum843daa82001-09-18 20:04:26 +00001500 # Safety test for __cmp__
1501 def unsafecmp(a, b):
1502 try:
1503 a.__class__.__cmp__(a, b)
1504 except TypeError:
1505 pass
1506 else:
1507 raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % (
1508 a.__class__, a, b)
1509 unsafecmp(u"123", "123")
1510 unsafecmp("123", u"123")
1511 unsafecmp(1, 1.0)
1512 unsafecmp(1.0, 1)
1513 unsafecmp(1, 1L)
1514 unsafecmp(1L, 1)
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00001515
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001516def weakrefs():
1517 if verbose: print "Testing weak references..."
1518 import weakref
1519 class C(object):
1520 pass
1521 c = C()
1522 r = weakref.ref(c)
1523 verify(r() is c)
1524 del c
1525 verify(r() is None)
1526 del r
1527 class NoWeak(object):
1528 __slots__ = ['foo']
1529 no = NoWeak()
1530 try:
1531 weakref.ref(no)
1532 except TypeError, msg:
Fred Drake4bf018b2001-10-22 21:45:25 +00001533 verify(str(msg).find("weak reference") >= 0)
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00001534 else:
1535 verify(0, "weakref.ref(no) should be illegal")
1536 class Weak(object):
1537 __slots__ = ['foo', '__weakref__']
1538 yes = Weak()
1539 r = weakref.ref(yes)
1540 verify(r() is yes)
1541 del yes
1542 verify(r() is None)
1543 del r
1544
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00001545def properties():
1546 if verbose: print "Testing property..."
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001547 class C(object):
1548 def getx(self):
1549 return self.__x
1550 def setx(self, value):
1551 self.__x = value
1552 def delx(self):
1553 del self.__x
Tim Peters66c1a522001-09-24 21:17:50 +00001554 x = property(getx, setx, delx, doc="I'm the x property.")
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001555 a = C()
1556 verify(not hasattr(a, "x"))
1557 a.x = 42
Guido van Rossum45704552001-10-08 16:35:45 +00001558 vereq(a._C__x, 42)
1559 vereq(a.x, 42)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001560 del a.x
1561 verify(not hasattr(a, "x"))
1562 verify(not hasattr(a, "_C__x"))
1563 C.x.__set__(a, 100)
Guido van Rossum45704552001-10-08 16:35:45 +00001564 vereq(C.x.__get__(a), 100)
Guido van Rossum76f0cb82001-08-24 15:24:24 +00001565## C.x.__set__(a)
1566## verify(not hasattr(a, "x"))
1567
Tim Peters66c1a522001-09-24 21:17:50 +00001568 raw = C.__dict__['x']
1569 verify(isinstance(raw, property))
1570
1571 attrs = dir(raw)
1572 verify("__doc__" in attrs)
1573 verify("fget" in attrs)
1574 verify("fset" in attrs)
1575 verify("fdel" in attrs)
1576
Guido van Rossum45704552001-10-08 16:35:45 +00001577 vereq(raw.__doc__, "I'm the x property.")
Tim Peters66c1a522001-09-24 21:17:50 +00001578 verify(raw.fget is C.__dict__['getx'])
1579 verify(raw.fset is C.__dict__['setx'])
1580 verify(raw.fdel is C.__dict__['delx'])
1581
1582 for attr in "__doc__", "fget", "fset", "fdel":
1583 try:
1584 setattr(raw, attr, 42)
1585 except TypeError, msg:
1586 if str(msg).find('readonly') < 0:
1587 raise TestFailed("when setting readonly attr %r on a "
1588 "property, got unexpected TypeError "
1589 "msg %r" % (attr, str(msg)))
1590 else:
1591 raise TestFailed("expected TypeError from trying to set "
1592 "readonly %r attr on a property" % attr)
1593
Guido van Rossumc4a18802001-08-24 16:55:27 +00001594def supers():
Guido van Rossum9881fc12001-08-24 17:07:20 +00001595 if verbose: print "Testing super..."
Guido van Rossumc4a18802001-08-24 16:55:27 +00001596
1597 class A(object):
1598 def meth(self, a):
1599 return "A(%r)" % a
1600
Guido van Rossum45704552001-10-08 16:35:45 +00001601 vereq(A().meth(1), "A(1)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001602
1603 class B(A):
1604 def __init__(self):
1605 self.__super = super(B, self)
1606 def meth(self, a):
1607 return "B(%r)" % a + self.__super.meth(a)
1608
Guido van Rossum45704552001-10-08 16:35:45 +00001609 vereq(B().meth(2), "B(2)A(2)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001610
1611 class C(A):
Guido van Rossumc4a18802001-08-24 16:55:27 +00001612 def meth(self, a):
1613 return "C(%r)" % a + self.__super.meth(a)
1614 C._C__super = super(C)
1615
Guido van Rossum45704552001-10-08 16:35:45 +00001616 vereq(C().meth(3), "C(3)A(3)")
Guido van Rossumc4a18802001-08-24 16:55:27 +00001617
1618 class D(C, B):
1619 def meth(self, a):
1620 return "D(%r)" % a + super(D, self).meth(a)
1621
Guido van Rossum5b443c62001-12-03 15:38:28 +00001622 vereq(D().meth(4), "D(4)C(4)B(4)A(4)")
1623
1624 # Test for subclassing super
1625
1626 class mysuper(super):
1627 def __init__(self, *args):
1628 return super(mysuper, self).__init__(*args)
1629
1630 class E(D):
1631 def meth(self, a):
1632 return "E(%r)" % a + mysuper(E, self).meth(a)
1633
1634 vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)")
1635
1636 class F(E):
1637 def meth(self, a):
1638 s = self.__super
1639 return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a)
1640 F._F__super = mysuper(F)
1641
1642 vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)")
1643
1644 # Make sure certain errors are raised
1645
1646 try:
1647 super(D, 42)
1648 except TypeError:
1649 pass
1650 else:
1651 raise TestFailed, "shouldn't allow super(D, 42)"
1652
1653 try:
1654 super(D, C())
1655 except TypeError:
1656 pass
1657 else:
1658 raise TestFailed, "shouldn't allow super(D, C())"
1659
1660 try:
1661 super(D).__get__(12)
1662 except TypeError:
1663 pass
1664 else:
1665 raise TestFailed, "shouldn't allow super(D).__get__(12)"
1666
1667 try:
1668 super(D).__get__(C())
1669 except TypeError:
1670 pass
1671 else:
1672 raise TestFailed, "shouldn't allow super(D).__get__(C())"
Guido van Rossumc4a18802001-08-24 16:55:27 +00001673
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001674def inherits():
1675 if verbose: print "Testing inheritance from basic types..."
1676
1677 class hexint(int):
1678 def __repr__(self):
1679 return hex(self)
1680 def __add__(self, other):
1681 return hexint(int.__add__(self, other))
1682 # (Note that overriding __radd__ doesn't work,
1683 # because the int type gets first dibs.)
Guido van Rossum45704552001-10-08 16:35:45 +00001684 vereq(repr(hexint(7) + 9), "0x10")
1685 vereq(repr(hexint(1000) + 7), "0x3ef")
Tim Peters64b5ce32001-09-10 20:52:51 +00001686 a = hexint(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001687 vereq(a, 12345)
1688 vereq(int(a), 12345)
Tim Peters64b5ce32001-09-10 20:52:51 +00001689 verify(int(a).__class__ is int)
Guido van Rossum45704552001-10-08 16:35:45 +00001690 vereq(hash(a), hash(12345))
Tim Peters73a1dfe2001-09-11 21:44:14 +00001691 verify((+a).__class__ is int)
1692 verify((a >> 0).__class__ is int)
1693 verify((a << 0).__class__ is int)
1694 verify((hexint(0) << 12).__class__ is int)
1695 verify((hexint(0) >> 12).__class__ is int)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001696
1697 class octlong(long):
1698 __slots__ = []
1699 def __str__(self):
1700 s = oct(self)
1701 if s[-1] == 'L':
1702 s = s[:-1]
1703 return s
1704 def __add__(self, other):
1705 return self.__class__(super(octlong, self).__add__(other))
1706 __radd__ = __add__
Guido van Rossum45704552001-10-08 16:35:45 +00001707 vereq(str(octlong(3) + 5), "010")
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001708 # (Note that overriding __radd__ here only seems to work
1709 # because the example uses a short int left argument.)
Guido van Rossum45704552001-10-08 16:35:45 +00001710 vereq(str(5 + octlong(3000)), "05675")
Tim Peters64b5ce32001-09-10 20:52:51 +00001711 a = octlong(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001712 vereq(a, 12345L)
1713 vereq(long(a), 12345L)
1714 vereq(hash(a), hash(12345L))
Tim Peters64b5ce32001-09-10 20:52:51 +00001715 verify(long(a).__class__ is long)
Tim Peters69c2de32001-09-11 22:31:33 +00001716 verify((+a).__class__ is long)
1717 verify((-a).__class__ is long)
1718 verify((-octlong(0)).__class__ is long)
1719 verify((a >> 0).__class__ is long)
1720 verify((a << 0).__class__ is long)
1721 verify((a - 0).__class__ is long)
1722 verify((a * 1).__class__ is long)
1723 verify((a ** 1).__class__ is long)
1724 verify((a // 1).__class__ is long)
1725 verify((1 * a).__class__ is long)
1726 verify((a | 0).__class__ is long)
1727 verify((a ^ 0).__class__ is long)
1728 verify((a & -1L).__class__ is long)
1729 verify((octlong(0) << 12).__class__ is long)
1730 verify((octlong(0) >> 12).__class__ is long)
1731 verify(abs(octlong(0)).__class__ is long)
1732
1733 # Because octlong overrides __add__, we can't check the absence of +0
1734 # optimizations using octlong.
1735 class longclone(long):
1736 pass
1737 a = longclone(1)
1738 verify((a + 0).__class__ is long)
1739 verify((0 + a).__class__ is long)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001740
1741 class precfloat(float):
1742 __slots__ = ['prec']
1743 def __init__(self, value=0.0, prec=12):
1744 self.prec = int(prec)
1745 float.__init__(value)
1746 def __repr__(self):
1747 return "%.*g" % (self.prec, self)
Guido van Rossum45704552001-10-08 16:35:45 +00001748 vereq(repr(precfloat(1.1)), "1.1")
Tim Peters64b5ce32001-09-10 20:52:51 +00001749 a = precfloat(12345)
Guido van Rossum45704552001-10-08 16:35:45 +00001750 vereq(a, 12345.0)
1751 vereq(float(a), 12345.0)
Tim Peters7a50f252001-09-10 21:28:20 +00001752 verify(float(a).__class__ is float)
Guido van Rossum45704552001-10-08 16:35:45 +00001753 vereq(hash(a), hash(12345.0))
Tim Peters0280cf72001-09-11 21:53:35 +00001754 verify((+a).__class__ is float)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001755
Tim Peters2400fa42001-09-12 19:12:49 +00001756 class madcomplex(complex):
1757 def __repr__(self):
1758 return "%.17gj%+.17g" % (self.imag, self.real)
1759 a = madcomplex(-3, 4)
Guido van Rossum45704552001-10-08 16:35:45 +00001760 vereq(repr(a), "4j-3")
Tim Peters2400fa42001-09-12 19:12:49 +00001761 base = complex(-3, 4)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001762 veris(base.__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001763 vereq(a, base)
1764 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001765 veris(complex(a).__class__, complex)
Tim Peters2400fa42001-09-12 19:12:49 +00001766 a = madcomplex(a) # just trying another form of the constructor
Guido van Rossum45704552001-10-08 16:35:45 +00001767 vereq(repr(a), "4j-3")
1768 vereq(a, base)
1769 vereq(complex(a), base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001770 veris(complex(a).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001771 vereq(hash(a), hash(base))
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001772 veris((+a).__class__, complex)
1773 veris((a + 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001774 vereq(a + 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001775 veris((a - 0).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001776 vereq(a - 0, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001777 veris((a * 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001778 vereq(a * 1, base)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00001779 veris((a / 1).__class__, complex)
Guido van Rossum45704552001-10-08 16:35:45 +00001780 vereq(a / 1, base)
Tim Peters2400fa42001-09-12 19:12:49 +00001781
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001782 class madtuple(tuple):
1783 _rev = None
1784 def rev(self):
1785 if self._rev is not None:
1786 return self._rev
1787 L = list(self)
1788 L.reverse()
1789 self._rev = self.__class__(L)
1790 return self._rev
1791 a = madtuple((1,2,3,4,5,6,7,8,9,0))
Guido van Rossum45704552001-10-08 16:35:45 +00001792 vereq(a, (1,2,3,4,5,6,7,8,9,0))
1793 vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1)))
1794 vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0)))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001795 for i in range(512):
1796 t = madtuple(range(i))
1797 u = t.rev()
1798 v = u.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001799 vereq(v, t)
Tim Peters64b5ce32001-09-10 20:52:51 +00001800 a = madtuple((1,2,3,4,5))
Guido van Rossum45704552001-10-08 16:35:45 +00001801 vereq(tuple(a), (1,2,3,4,5))
Tim Peters4c3a0a32001-09-10 23:37:46 +00001802 verify(tuple(a).__class__ is tuple)
Guido van Rossum45704552001-10-08 16:35:45 +00001803 vereq(hash(a), hash((1,2,3,4,5)))
Tim Peters7b07a412001-09-11 19:48:03 +00001804 verify(a[:].__class__ is tuple)
1805 verify((a * 1).__class__ is tuple)
1806 verify((a * 0).__class__ is tuple)
1807 verify((a + ()).__class__ is tuple)
Tim Peters64b5ce32001-09-10 20:52:51 +00001808 a = madtuple(())
Guido van Rossum45704552001-10-08 16:35:45 +00001809 vereq(tuple(a), ())
Guido van Rossum779ce4a2001-09-11 14:02:22 +00001810 verify(tuple(a).__class__ is tuple)
Tim Peters7b07a412001-09-11 19:48:03 +00001811 verify((a + a).__class__ is tuple)
1812 verify((a * 0).__class__ is tuple)
1813 verify((a * 1).__class__ is tuple)
1814 verify((a * 2).__class__ is tuple)
1815 verify(a[:].__class__ is tuple)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001816
1817 class madstring(str):
1818 _rev = None
1819 def rev(self):
1820 if self._rev is not None:
1821 return self._rev
1822 L = list(self)
1823 L.reverse()
1824 self._rev = self.__class__("".join(L))
1825 return self._rev
1826 s = madstring("abcdefghijklmnopqrstuvwxyz")
Guido van Rossum45704552001-10-08 16:35:45 +00001827 vereq(s, "abcdefghijklmnopqrstuvwxyz")
1828 vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba"))
1829 vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz"))
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001830 for i in range(256):
1831 s = madstring("".join(map(chr, range(i))))
1832 t = s.rev()
1833 u = t.rev()
Guido van Rossum45704552001-10-08 16:35:45 +00001834 vereq(u, s)
Tim Peters64b5ce32001-09-10 20:52:51 +00001835 s = madstring("12345")
Guido van Rossum45704552001-10-08 16:35:45 +00001836 vereq(str(s), "12345")
Tim Peters5a49ade2001-09-11 01:41:59 +00001837 verify(str(s).__class__ is str)
Guido van Rossumcaa9f432001-08-30 20:06:08 +00001838
Tim Peters8fa5dd02001-09-12 02:18:30 +00001839 base = "\x00" * 5
1840 s = madstring(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001841 vereq(s, base)
1842 vereq(str(s), base)
Tim Petersc636f562001-09-11 01:52:02 +00001843 verify(str(s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001844 vereq(hash(s), hash(base))
1845 vereq({s: 1}[base], 1)
1846 vereq({base: 1}[s], 1)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001847 verify((s + "").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001848 vereq(s + "", base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001849 verify(("" + s).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001850 vereq("" + s, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001851 verify((s * 0).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001852 vereq(s * 0, "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001853 verify((s * 1).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001854 vereq(s * 1, base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001855 verify((s * 2).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001856 vereq(s * 2, base + base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001857 verify(s[:].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001858 vereq(s[:], base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001859 verify(s[0:0].__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001860 vereq(s[0:0], "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001861 verify(s.strip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001862 vereq(s.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001863 verify(s.lstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001864 vereq(s.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001865 verify(s.rstrip().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001866 vereq(s.rstrip(), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001867 identitytab = ''.join([chr(i) for i in range(256)])
1868 verify(s.translate(identitytab).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001869 vereq(s.translate(identitytab), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001870 verify(s.translate(identitytab, "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001871 vereq(s.translate(identitytab, "x"), base)
1872 vereq(s.translate(identitytab, "\x00"), "")
Tim Peters8fa5dd02001-09-12 02:18:30 +00001873 verify(s.replace("x", "x").__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001874 vereq(s.replace("x", "x"), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001875 verify(s.ljust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001876 vereq(s.ljust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001877 verify(s.rjust(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001878 vereq(s.rjust(len(s)), base)
Tim Peters8fa5dd02001-09-12 02:18:30 +00001879 verify(s.center(len(s)).__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001880 vereq(s.center(len(s)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001881 verify(s.lower().__class__ is str)
Guido van Rossum45704552001-10-08 16:35:45 +00001882 vereq(s.lower(), base)
Tim Petersc636f562001-09-11 01:52:02 +00001883
Tim Peters111f6092001-09-12 07:54:51 +00001884 s = madstring("x y")
Guido van Rossum45704552001-10-08 16:35:45 +00001885 vereq(s, "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001886 verify(intern(s).__class__ is str)
1887 verify(intern(s) is intern("x y"))
Guido van Rossum45704552001-10-08 16:35:45 +00001888 vereq(intern(s), "x y")
Tim Peters111f6092001-09-12 07:54:51 +00001889
1890 i = intern("y x")
1891 s = madstring("y x")
Guido van Rossum45704552001-10-08 16:35:45 +00001892 vereq(s, i)
Tim Peters111f6092001-09-12 07:54:51 +00001893 verify(intern(s).__class__ is str)
1894 verify(intern(s) is i)
1895
1896 s = madstring(i)
1897 verify(intern(s).__class__ is str)
1898 verify(intern(s) is i)
1899
Guido van Rossum91ee7982001-08-30 20:52:40 +00001900 class madunicode(unicode):
1901 _rev = None
1902 def rev(self):
1903 if self._rev is not None:
1904 return self._rev
1905 L = list(self)
1906 L.reverse()
1907 self._rev = self.__class__(u"".join(L))
1908 return self._rev
1909 u = madunicode("ABCDEF")
Guido van Rossum45704552001-10-08 16:35:45 +00001910 vereq(u, u"ABCDEF")
1911 vereq(u.rev(), madunicode(u"FEDCBA"))
1912 vereq(u.rev().rev(), madunicode(u"ABCDEF"))
Tim Peters7a29bd52001-09-12 03:03:31 +00001913 base = u"12345"
1914 u = madunicode(base)
Guido van Rossum45704552001-10-08 16:35:45 +00001915 vereq(unicode(u), base)
Tim Peters78e0fc72001-09-11 03:07:38 +00001916 verify(unicode(u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001917 vereq(hash(u), hash(base))
1918 vereq({u: 1}[base], 1)
1919 vereq({base: 1}[u], 1)
Tim Peters7a29bd52001-09-12 03:03:31 +00001920 verify(u.strip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001921 vereq(u.strip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001922 verify(u.lstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001923 vereq(u.lstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001924 verify(u.rstrip().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001925 vereq(u.rstrip(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001926 verify(u.replace(u"x", u"x").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001927 vereq(u.replace(u"x", u"x"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001928 verify(u.replace(u"xy", u"xy").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001929 vereq(u.replace(u"xy", u"xy"), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001930 verify(u.center(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001931 vereq(u.center(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001932 verify(u.ljust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001933 vereq(u.ljust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001934 verify(u.rjust(len(u)).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001935 vereq(u.rjust(len(u)), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001936 verify(u.lower().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001937 vereq(u.lower(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001938 verify(u.upper().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001939 vereq(u.upper(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001940 verify(u.capitalize().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001941 vereq(u.capitalize(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001942 verify(u.title().__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001943 vereq(u.title(), base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001944 verify((u + u"").__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001945 vereq(u + u"", base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001946 verify((u"" + u).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001947 vereq(u"" + u, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001948 verify((u * 0).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001949 vereq(u * 0, u"")
Tim Peters7a29bd52001-09-12 03:03:31 +00001950 verify((u * 1).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001951 vereq(u * 1, base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001952 verify((u * 2).__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001953 vereq(u * 2, base + base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001954 verify(u[:].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001955 vereq(u[:], base)
Tim Peters7a29bd52001-09-12 03:03:31 +00001956 verify(u[0:0].__class__ is unicode)
Guido van Rossum45704552001-10-08 16:35:45 +00001957 vereq(u[0:0], u"")
Guido van Rossum91ee7982001-08-30 20:52:40 +00001958
Guido van Rossum12b22ff2001-10-09 20:36:44 +00001959 class sublist(list):
1960 pass
1961 a = sublist(range(5))
1962 vereq(a, range(5))
1963 a.append("hello")
1964 vereq(a, range(5) + ["hello"])
1965 a[5] = 5
1966 vereq(a, range(6))
1967 a.extend(range(6, 20))
1968 vereq(a, range(20))
1969 a[-5:] = []
1970 vereq(a, range(15))
1971 del a[10:15]
1972 vereq(len(a), 10)
1973 vereq(a, range(10))
1974 vereq(list(a), range(10))
1975 vereq(a[0], 0)
1976 vereq(a[9], 9)
1977 vereq(a[-10], 0)
1978 vereq(a[-1], 9)
1979 vereq(a[:5], range(5))
1980
Tim Peters59c9a642001-09-13 05:38:56 +00001981 class CountedInput(file):
1982 """Counts lines read by self.readline().
1983
1984 self.lineno is the 0-based ordinal of the last line read, up to
1985 a maximum of one greater than the number of lines in the file.
1986
1987 self.ateof is true if and only if the final "" line has been read,
1988 at which point self.lineno stops incrementing, and further calls
1989 to readline() continue to return "".
1990 """
1991
1992 lineno = 0
1993 ateof = 0
1994 def readline(self):
1995 if self.ateof:
1996 return ""
1997 s = file.readline(self)
1998 # Next line works too.
1999 # s = super(CountedInput, self).readline()
2000 self.lineno += 1
2001 if s == "":
2002 self.ateof = 1
2003 return s
2004
Tim Peters561f8992001-09-13 19:36:36 +00002005 f = file(name=TESTFN, mode='w')
Tim Peters59c9a642001-09-13 05:38:56 +00002006 lines = ['a\n', 'b\n', 'c\n']
2007 try:
2008 f.writelines(lines)
2009 f.close()
2010 f = CountedInput(TESTFN)
2011 for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]):
2012 got = f.readline()
Guido van Rossum45704552001-10-08 16:35:45 +00002013 vereq(expected, got)
2014 vereq(f.lineno, i)
2015 vereq(f.ateof, (i > len(lines)))
Tim Peters59c9a642001-09-13 05:38:56 +00002016 f.close()
2017 finally:
2018 try:
2019 f.close()
2020 except:
2021 pass
2022 try:
2023 import os
2024 os.unlink(TESTFN)
2025 except:
2026 pass
2027
Tim Peters808b94e2001-09-13 19:33:07 +00002028def keywords():
2029 if verbose:
2030 print "Testing keyword args to basic type constructors ..."
Guido van Rossum45704552001-10-08 16:35:45 +00002031 vereq(int(x=1), 1)
2032 vereq(float(x=2), 2.0)
2033 vereq(long(x=3), 3L)
2034 vereq(complex(imag=42, real=666), complex(666, 42))
2035 vereq(str(object=500), '500')
2036 vereq(unicode(string='abc', errors='strict'), u'abc')
2037 vereq(tuple(sequence=range(3)), (0, 1, 2))
2038 vereq(list(sequence=(0, 1, 2)), range(3))
Tim Petersa427a2b2001-10-29 22:25:45 +00002039 vereq(dict(items={1: 2}), {1: 2})
Tim Peters808b94e2001-09-13 19:33:07 +00002040
2041 for constructor in (int, float, long, complex, str, unicode,
Tim Petersa427a2b2001-10-29 22:25:45 +00002042 tuple, list, dict, file):
Tim Peters808b94e2001-09-13 19:33:07 +00002043 try:
2044 constructor(bogus_keyword_arg=1)
2045 except TypeError:
2046 pass
2047 else:
2048 raise TestFailed("expected TypeError from bogus keyword "
2049 "argument to %r" % constructor)
Tim Peters561f8992001-09-13 19:36:36 +00002050
Tim Peters8fa45672001-09-13 21:01:29 +00002051def restricted():
2052 import rexec
2053 if verbose:
2054 print "Testing interaction with restricted execution ..."
2055
2056 sandbox = rexec.RExec()
2057
2058 code1 = """f = open(%r, 'w')""" % TESTFN
2059 code2 = """f = file(%r, 'w')""" % TESTFN
2060 code3 = """\
2061f = open(%r)
2062t = type(f) # a sneaky way to get the file() constructor
2063f.close()
2064f = t(%r, 'w') # rexec can't catch this by itself
2065""" % (TESTFN, TESTFN)
2066
2067 f = open(TESTFN, 'w') # Create the file so code3 can find it.
2068 f.close()
2069
2070 try:
2071 for code in code1, code2, code3:
2072 try:
2073 sandbox.r_exec(code)
2074 except IOError, msg:
2075 if str(msg).find("restricted") >= 0:
2076 outcome = "OK"
2077 else:
2078 outcome = "got an exception, but not an expected one"
2079 else:
2080 outcome = "expected a restricted-execution exception"
2081
2082 if outcome != "OK":
2083 raise TestFailed("%s, in %r" % (outcome, code))
2084
2085 finally:
2086 try:
2087 import os
2088 os.unlink(TESTFN)
2089 except:
2090 pass
2091
Tim Peters0ab085c2001-09-14 00:25:33 +00002092def str_subclass_as_dict_key():
2093 if verbose:
2094 print "Testing a str subclass used as dict key .."
2095
2096 class cistr(str):
2097 """Sublcass of str that computes __eq__ case-insensitively.
2098
2099 Also computes a hash code of the string in canonical form.
2100 """
2101
2102 def __init__(self, value):
2103 self.canonical = value.lower()
2104 self.hashcode = hash(self.canonical)
2105
2106 def __eq__(self, other):
2107 if not isinstance(other, cistr):
2108 other = cistr(other)
2109 return self.canonical == other.canonical
2110
2111 def __hash__(self):
2112 return self.hashcode
2113
Guido van Rossum45704552001-10-08 16:35:45 +00002114 vereq(cistr('ABC'), 'abc')
2115 vereq('aBc', cistr('ABC'))
2116 vereq(str(cistr('ABC')), 'ABC')
Tim Peters0ab085c2001-09-14 00:25:33 +00002117
2118 d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3}
Guido van Rossum45704552001-10-08 16:35:45 +00002119 vereq(d[cistr('one')], 1)
2120 vereq(d[cistr('tWo')], 2)
2121 vereq(d[cistr('THrEE')], 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002122 verify(cistr('ONe') in d)
Guido van Rossum45704552001-10-08 16:35:45 +00002123 vereq(d.get(cistr('thrEE')), 3)
Tim Peters0ab085c2001-09-14 00:25:33 +00002124
Guido van Rossumab3b0342001-09-18 20:38:53 +00002125def classic_comparisons():
2126 if verbose: print "Testing classic comparisons..."
Guido van Rossum0639f592001-09-18 21:06:04 +00002127 class classic:
2128 pass
2129 for base in (classic, int, object):
Guido van Rossumab3b0342001-09-18 20:38:53 +00002130 if verbose: print " (base = %s)" % base
2131 class C(base):
2132 def __init__(self, value):
2133 self.value = int(value)
2134 def __cmp__(self, other):
2135 if isinstance(other, C):
2136 return cmp(self.value, other.value)
2137 if isinstance(other, int) or isinstance(other, long):
2138 return cmp(self.value, other)
2139 return NotImplemented
2140 c1 = C(1)
2141 c2 = C(2)
2142 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002143 vereq(c1, 1)
Guido van Rossumab3b0342001-09-18 20:38:53 +00002144 c = {1: c1, 2: c2, 3: c3}
2145 for x in 1, 2, 3:
2146 for y in 1, 2, 3:
2147 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2148 for op in "<", "<=", "==", "!=", ">", ">=":
2149 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2150 "x=%d, y=%d" % (x, y))
2151 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y))
2152 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y))
2153
Guido van Rossum0639f592001-09-18 21:06:04 +00002154def rich_comparisons():
2155 if verbose:
2156 print "Testing rich comparisons..."
Guido van Rossum22056422001-09-24 17:52:04 +00002157 class Z(complex):
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002158 pass
Guido van Rossum22056422001-09-24 17:52:04 +00002159 z = Z(1)
Guido van Rossum45704552001-10-08 16:35:45 +00002160 vereq(z, 1+0j)
2161 vereq(1+0j, z)
Guido van Rossum22056422001-09-24 17:52:04 +00002162 class ZZ(complex):
2163 def __eq__(self, other):
2164 try:
2165 return abs(self - other) <= 1e-6
2166 except:
2167 return NotImplemented
2168 zz = ZZ(1.0000003)
Guido van Rossum45704552001-10-08 16:35:45 +00002169 vereq(zz, 1+0j)
2170 vereq(1+0j, zz)
Tim Peters66c1a522001-09-24 21:17:50 +00002171
Guido van Rossum0639f592001-09-18 21:06:04 +00002172 class classic:
2173 pass
2174 for base in (classic, int, object, list):
2175 if verbose: print " (base = %s)" % base
2176 class C(base):
2177 def __init__(self, value):
2178 self.value = int(value)
2179 def __cmp__(self, other):
2180 raise TestFailed, "shouldn't call __cmp__"
2181 def __eq__(self, other):
2182 if isinstance(other, C):
2183 return self.value == other.value
2184 if isinstance(other, int) or isinstance(other, long):
2185 return self.value == other
2186 return NotImplemented
2187 def __ne__(self, other):
2188 if isinstance(other, C):
2189 return self.value != other.value
2190 if isinstance(other, int) or isinstance(other, long):
2191 return self.value != other
2192 return NotImplemented
2193 def __lt__(self, other):
2194 if isinstance(other, C):
2195 return self.value < other.value
2196 if isinstance(other, int) or isinstance(other, long):
2197 return self.value < other
2198 return NotImplemented
2199 def __le__(self, other):
2200 if isinstance(other, C):
2201 return self.value <= other.value
2202 if isinstance(other, int) or isinstance(other, long):
2203 return self.value <= other
2204 return NotImplemented
2205 def __gt__(self, other):
2206 if isinstance(other, C):
2207 return self.value > other.value
2208 if isinstance(other, int) or isinstance(other, long):
2209 return self.value > other
2210 return NotImplemented
2211 def __ge__(self, other):
2212 if isinstance(other, C):
2213 return self.value >= other.value
2214 if isinstance(other, int) or isinstance(other, long):
2215 return self.value >= other
2216 return NotImplemented
2217 c1 = C(1)
2218 c2 = C(2)
2219 c3 = C(3)
Guido van Rossum45704552001-10-08 16:35:45 +00002220 vereq(c1, 1)
Guido van Rossum0639f592001-09-18 21:06:04 +00002221 c = {1: c1, 2: c2, 3: c3}
2222 for x in 1, 2, 3:
2223 for y in 1, 2, 3:
2224 for op in "<", "<=", "==", "!=", ">", ">=":
2225 verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op),
2226 "x=%d, y=%d" % (x, y))
2227 verify(eval("c[x] %s y" % op) == eval("x %s y" % op),
2228 "x=%d, y=%d" % (x, y))
2229 verify(eval("x %s c[y]" % op) == eval("x %s y" % op),
2230 "x=%d, y=%d" % (x, y))
2231
Guido van Rossum1952e382001-09-19 01:25:16 +00002232def coercions():
2233 if verbose: print "Testing coercions..."
2234 class I(int): pass
2235 coerce(I(0), 0)
2236 coerce(0, I(0))
2237 class L(long): pass
2238 coerce(L(0), 0)
2239 coerce(L(0), 0L)
2240 coerce(0, L(0))
2241 coerce(0L, L(0))
2242 class F(float): pass
2243 coerce(F(0), 0)
2244 coerce(F(0), 0L)
2245 coerce(F(0), 0.)
2246 coerce(0, F(0))
2247 coerce(0L, F(0))
2248 coerce(0., F(0))
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002249 class C(complex): pass
Guido van Rossum1952e382001-09-19 01:25:16 +00002250 coerce(C(0), 0)
2251 coerce(C(0), 0L)
2252 coerce(C(0), 0.)
2253 coerce(C(0), 0j)
2254 coerce(0, C(0))
2255 coerce(0L, C(0))
2256 coerce(0., C(0))
2257 coerce(0j, C(0))
2258
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002259def descrdoc():
2260 if verbose: print "Testing descriptor doc strings..."
2261 def check(descr, what):
Guido van Rossum45704552001-10-08 16:35:45 +00002262 vereq(descr.__doc__, what)
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002263 check(file.closed, "flag set if the file is closed") # getset descriptor
2264 check(file.name, "file name") # member descriptor
2265
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002266def setclass():
2267 if verbose: print "Testing __class__ assignment..."
2268 class C(object): pass
2269 class D(object): pass
2270 class E(object): pass
2271 class F(D, E): pass
2272 for cls in C, D, E, F:
2273 for cls2 in C, D, E, F:
2274 x = cls()
2275 x.__class__ = cls2
2276 verify(x.__class__ is cls2)
2277 x.__class__ = cls
2278 verify(x.__class__ is cls)
2279 def cant(x, C):
2280 try:
2281 x.__class__ = C
2282 except TypeError:
2283 pass
2284 else:
2285 raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C)
2286 cant(C(), list)
2287 cant(list(), C)
2288 cant(C(), 1)
2289 cant(C(), object)
2290 cant(object(), list)
2291 cant(list(), object)
2292
Guido van Rossum6661be32001-10-26 04:26:12 +00002293def setdict():
2294 if verbose: print "Testing __dict__ assignment..."
2295 class C(object): pass
2296 a = C()
2297 a.__dict__ = {'b': 1}
2298 vereq(a.b, 1)
2299 def cant(x, dict):
2300 try:
2301 x.__dict__ = dict
2302 except TypeError:
2303 pass
2304 else:
2305 raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict)
2306 cant(a, None)
2307 cant(a, [])
2308 cant(a, 1)
Guido van Rossumd331cb52001-12-05 19:46:42 +00002309 del a.__dict__ # Deleting __dict__ is allowed
Guido van Rossum6661be32001-10-26 04:26:12 +00002310 # Classes don't allow __dict__ assignment
2311 cant(C, {})
2312
Guido van Rossum3926a632001-09-25 16:25:58 +00002313def pickles():
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002314 if verbose:
2315 print "Testing pickling and copying new-style classes and objects..."
Guido van Rossum3926a632001-09-25 16:25:58 +00002316 import pickle, cPickle
2317
2318 def sorteditems(d):
2319 L = d.items()
2320 L.sort()
2321 return L
2322
2323 global C
2324 class C(object):
2325 def __init__(self, a, b):
2326 super(C, self).__init__()
2327 self.a = a
2328 self.b = b
2329 def __repr__(self):
2330 return "C(%r, %r)" % (self.a, self.b)
2331
2332 global C1
2333 class C1(list):
2334 def __new__(cls, a, b):
2335 return super(C1, cls).__new__(cls)
2336 def __init__(self, a, b):
2337 self.a = a
2338 self.b = b
2339 def __repr__(self):
2340 return "C1(%r, %r)<%r>" % (self.a, self.b, list(self))
2341
2342 global C2
2343 class C2(int):
2344 def __new__(cls, a, b, val=0):
2345 return super(C2, cls).__new__(cls, val)
2346 def __init__(self, a, b, val=0):
2347 self.a = a
2348 self.b = b
2349 def __repr__(self):
2350 return "C2(%r, %r)<%r>" % (self.a, self.b, int(self))
2351
Guido van Rossum90c45142001-11-24 21:07:01 +00002352 global C3
2353 class C3(object):
2354 def __init__(self, foo):
2355 self.foo = foo
2356 def __getstate__(self):
2357 return self.foo
2358 def __setstate__(self, foo):
2359 self.foo = foo
2360
2361 global C4classic, C4
2362 class C4classic: # classic
2363 pass
2364 class C4(C4classic, object): # mixed inheritance
2365 pass
2366
Guido van Rossum3926a632001-09-25 16:25:58 +00002367 for p in pickle, cPickle:
2368 for bin in 0, 1:
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002369 if verbose:
2370 print p.__name__, ["text", "binary"][bin]
Guido van Rossum3926a632001-09-25 16:25:58 +00002371
2372 for cls in C, C1, C2:
2373 s = p.dumps(cls, bin)
2374 cls2 = p.loads(s)
2375 verify(cls2 is cls)
2376
2377 a = C1(1, 2); a.append(42); a.append(24)
2378 b = C2("hello", "world", 42)
2379 s = p.dumps((a, b), bin)
2380 x, y = p.loads(s)
Guido van Rossum90c45142001-11-24 21:07:01 +00002381 vereq(x.__class__, a.__class__)
2382 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2383 vereq(y.__class__, b.__class__)
2384 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2385 vereq(`x`, `a`)
2386 vereq(`y`, `b`)
Guido van Rossum3926a632001-09-25 16:25:58 +00002387 if verbose:
2388 print "a = x =", a
2389 print "b = y =", b
Guido van Rossum90c45142001-11-24 21:07:01 +00002390 # Test for __getstate__ and __setstate__ on new style class
2391 u = C3(42)
2392 s = p.dumps(u, bin)
2393 v = p.loads(s)
2394 veris(u.__class__, v.__class__)
2395 vereq(u.foo, v.foo)
2396 # Test for picklability of hybrid class
2397 u = C4()
2398 u.foo = 42
2399 s = p.dumps(u, bin)
2400 v = p.loads(s)
2401 veris(u.__class__, v.__class__)
2402 vereq(u.foo, v.foo)
Guido van Rossum3926a632001-09-25 16:25:58 +00002403
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002404 # Testing copy.deepcopy()
2405 if verbose:
2406 print "deepcopy"
2407 import copy
2408 for cls in C, C1, C2:
2409 cls2 = copy.deepcopy(cls)
2410 verify(cls2 is cls)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002411
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002412 a = C1(1, 2); a.append(42); a.append(24)
2413 b = C2("hello", "world", 42)
2414 x, y = copy.deepcopy((a, b))
Guido van Rossum90c45142001-11-24 21:07:01 +00002415 vereq(x.__class__, a.__class__)
2416 vereq(sorteditems(x.__dict__), sorteditems(a.__dict__))
2417 vereq(y.__class__, b.__class__)
2418 vereq(sorteditems(y.__dict__), sorteditems(b.__dict__))
2419 vereq(`x`, `a`)
2420 vereq(`y`, `b`)
Guido van Rossumfe1fd0e2001-10-02 19:58:32 +00002421 if verbose:
2422 print "a = x =", a
2423 print "b = y =", b
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002424
2425def copies():
2426 if verbose: print "Testing copy.copy() and copy.deepcopy()..."
2427 import copy
2428 class C(object):
2429 pass
2430
2431 a = C()
2432 a.foo = 12
2433 b = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002434 vereq(b.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002435
2436 a.bar = [1,2,3]
2437 c = copy.copy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002438 vereq(c.bar, a.bar)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002439 verify(c.bar is a.bar)
2440
2441 d = copy.deepcopy(a)
Guido van Rossum45704552001-10-08 16:35:45 +00002442 vereq(d.__dict__, a.__dict__)
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002443 a.bar.append(4)
Guido van Rossum45704552001-10-08 16:35:45 +00002444 vereq(d.bar, [1,2,3])
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002445
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002446def binopoverride():
2447 if verbose: print "Testing overrides of binary operations..."
2448 class I(int):
2449 def __repr__(self):
2450 return "I(%r)" % int(self)
2451 def __add__(self, other):
2452 return I(int(self) + int(other))
2453 __radd__ = __add__
2454 def __pow__(self, other, mod=None):
2455 if mod is None:
2456 return I(pow(int(self), int(other)))
2457 else:
2458 return I(pow(int(self), int(other), int(mod)))
2459 def __rpow__(self, other, mod=None):
2460 if mod is None:
2461 return I(pow(int(other), int(self), mod))
2462 else:
2463 return I(pow(int(other), int(self), int(mod)))
Tim Peters2f93e282001-10-04 05:27:00 +00002464
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002465 vereq(`I(1) + I(2)`, "I(3)")
2466 vereq(`I(1) + 2`, "I(3)")
2467 vereq(`1 + I(2)`, "I(3)")
2468 vereq(`I(2) ** I(3)`, "I(8)")
2469 vereq(`2 ** I(3)`, "I(8)")
2470 vereq(`I(2) ** 3`, "I(8)")
2471 vereq(`pow(I(2), I(3), I(5))`, "I(3)")
2472 class S(str):
2473 def __eq__(self, other):
2474 return self.lower() == other.lower()
2475
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002476def subclasspropagation():
2477 if verbose: print "Testing propagation of slot functions to subclasses..."
2478 class A(object):
2479 pass
2480 class B(A):
2481 pass
2482 class C(A):
2483 pass
2484 class D(B, C):
2485 pass
2486 d = D()
2487 vereq(hash(d), id(d))
2488 A.__hash__ = lambda self: 42
2489 vereq(hash(d), 42)
2490 C.__hash__ = lambda self: 314
2491 vereq(hash(d), 314)
2492 B.__hash__ = lambda self: 144
2493 vereq(hash(d), 144)
2494 D.__hash__ = lambda self: 100
2495 vereq(hash(d), 100)
2496 del D.__hash__
2497 vereq(hash(d), 144)
2498 del B.__hash__
2499 vereq(hash(d), 314)
2500 del C.__hash__
2501 vereq(hash(d), 42)
2502 del A.__hash__
2503 vereq(hash(d), id(d))
2504 d.foo = 42
2505 d.bar = 42
2506 vereq(d.foo, 42)
2507 vereq(d.bar, 42)
2508 def __getattribute__(self, name):
2509 if name == "foo":
2510 return 24
2511 return object.__getattribute__(self, name)
2512 A.__getattribute__ = __getattribute__
2513 vereq(d.foo, 24)
2514 vereq(d.bar, 42)
2515 def __getattr__(self, name):
2516 if name in ("spam", "foo", "bar"):
2517 return "hello"
2518 raise AttributeError, name
2519 B.__getattr__ = __getattr__
2520 vereq(d.spam, "hello")
2521 vereq(d.foo, 24)
2522 vereq(d.bar, 42)
2523 del A.__getattribute__
2524 vereq(d.foo, 42)
2525 del d.foo
2526 vereq(d.foo, "hello")
2527 vereq(d.bar, 42)
2528 del B.__getattr__
2529 try:
2530 d.foo
2531 except AttributeError:
2532 pass
2533 else:
2534 raise TestFailed, "d.foo should be undefined now"
Tim Petersfc57ccb2001-10-12 02:38:24 +00002535
2536def buffer_inherit():
2537 import binascii
2538 # SF bug [#470040] ParseTuple t# vs subclasses.
2539 if verbose:
2540 print "Testing that buffer interface is inherited ..."
2541
2542 class MyStr(str):
2543 pass
2544 base = 'abc'
2545 m = MyStr(base)
2546 # b2a_hex uses the buffer interface to get its argument's value, via
2547 # PyArg_ParseTuple 't#' code.
2548 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2549
2550 # It's not clear that unicode will continue to support the character
2551 # buffer interface, and this test will fail if that's taken away.
2552 class MyUni(unicode):
2553 pass
2554 base = u'abc'
2555 m = MyUni(base)
2556 vereq(binascii.b2a_hex(m), binascii.b2a_hex(base))
2557
2558 class MyInt(int):
2559 pass
2560 m = MyInt(42)
2561 try:
2562 binascii.b2a_hex(m)
2563 raise TestFailed('subclass of int should not have a buffer interface')
2564 except TypeError:
2565 pass
Tim Peters0ab085c2001-09-14 00:25:33 +00002566
Tim Petersc9933152001-10-16 20:18:24 +00002567def str_of_str_subclass():
2568 import binascii
2569 import cStringIO
2570
2571 if verbose:
2572 print "Testing __str__ defined in subclass of str ..."
2573
2574 class octetstring(str):
2575 def __str__(self):
2576 return binascii.b2a_hex(self)
2577 def __repr__(self):
2578 return self + " repr"
2579
2580 o = octetstring('A')
2581 vereq(type(o), octetstring)
2582 vereq(type(str(o)), str)
2583 vereq(type(repr(o)), str)
2584 vereq(ord(o), 0x41)
2585 vereq(str(o), '41')
2586 vereq(repr(o), 'A repr')
2587 vereq(o.__str__(), '41')
2588 vereq(o.__repr__(), 'A repr')
2589
2590 capture = cStringIO.StringIO()
2591 # Calling str() or not exercises different internal paths.
2592 print >> capture, o
2593 print >> capture, str(o)
2594 vereq(capture.getvalue(), '41\n41\n')
2595 capture.close()
2596
Guido van Rossumc8e56452001-10-22 00:43:43 +00002597def kwdargs():
2598 if verbose: print "Testing keyword arguments to __init__, __call__..."
2599 def f(a): return a
2600 vereq(f.__call__(a=42), 42)
2601 a = []
2602 list.__init__(a, sequence=[0, 1, 2])
Tim Peters1fc240e2001-10-26 05:06:50 +00002603 vereq(a, [0, 1, 2])
Guido van Rossumc8e56452001-10-22 00:43:43 +00002604
Guido van Rossumed87ad82001-10-30 02:33:02 +00002605def delhook():
2606 if verbose: print "Testing __del__ hook..."
2607 log = []
2608 class C(object):
2609 def __del__(self):
2610 log.append(1)
2611 c = C()
2612 vereq(log, [])
2613 del c
2614 vereq(log, [1])
2615
Guido van Rossum29d26062001-12-11 04:37:34 +00002616 class D(object): pass
2617 d = D()
2618 try: del d[0]
2619 except TypeError: pass
2620 else: raise TestFailed, "invalid del() didn't raise TypeError"
2621
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002622def hashinherit():
2623 if verbose: print "Testing hash of mutable subclasses..."
2624
2625 class mydict(dict):
2626 pass
2627 d = mydict()
2628 try:
2629 hash(d)
2630 except TypeError:
2631 pass
2632 else:
2633 raise TestFailed, "hash() of dict subclass should fail"
2634
2635 class mylist(list):
2636 pass
2637 d = mylist()
2638 try:
2639 hash(d)
2640 except TypeError:
2641 pass
2642 else:
2643 raise TestFailed, "hash() of list subclass should fail"
2644
Guido van Rossum29d26062001-12-11 04:37:34 +00002645def strops():
2646 try: 'a' + 5
2647 except TypeError: pass
2648 else: raise TestFailed, "'' + 5 doesn't raise TypeError"
2649
2650 try: ''.split('')
2651 except ValueError: pass
2652 else: raise TestFailed, "''.split('') doesn't raise ValueError"
2653
2654 try: ''.join([0])
2655 except TypeError: pass
2656 else: raise TestFailed, "''.join([0]) doesn't raise TypeError"
2657
2658 try: ''.rindex('5')
2659 except ValueError: pass
2660 else: raise TestFailed, "''.rindex('5') doesn't raise ValueError"
2661
2662 try: ''.replace('', '')
2663 except ValueError: pass
2664 else: raise TestFailed, "''.replace('', '') doesn't raise ValueError"
2665
2666 try: '%(n)s' % None
2667 except TypeError: pass
2668 else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError"
2669
2670 try: '%(n' % {}
2671 except ValueError: pass
2672 else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError"
2673
2674 try: '%*s' % ('abc')
2675 except TypeError: pass
2676 else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError"
2677
2678 try: '%*.*s' % ('abc', 5)
2679 except TypeError: pass
2680 else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError"
2681
2682 try: '%s' % (1, 2)
2683 except TypeError: pass
2684 else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError"
2685
2686 try: '%' % None
2687 except ValueError: pass
2688 else: raise TestFailed, "'%' % None doesn't raise ValueError"
2689
2690 vereq('534253'.isdigit(), 1)
2691 vereq('534253x'.isdigit(), 0)
2692 vereq('%c' % 5, '\x05')
2693 vereq('%c' % '5', '5')
2694
2695
2696
2697
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002698def test_main():
Tim Peters2f93e282001-10-04 05:27:00 +00002699 class_docstrings()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002700 lists()
2701 dicts()
Tim Peters25786c02001-09-02 08:22:48 +00002702 dict_constructor()
Tim Peters5d2b77c2001-09-03 05:47:38 +00002703 test_dir()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002704 ints()
2705 longs()
2706 floats()
2707 complexes()
2708 spamlists()
2709 spamdicts()
2710 pydicts()
2711 pylists()
2712 metaclass()
2713 pymods()
2714 multi()
2715 diamond()
Guido van Rossum37202612001-08-09 19:45:21 +00002716 objects()
Tim Peters6d6c1a32001-08-02 04:15:00 +00002717 slots()
2718 dynamics()
2719 errors()
2720 classmethods()
2721 staticmethods()
2722 classic()
2723 compattr()
2724 newslot()
2725 altmro()
2726 overloading()
Guido van Rossumb5a136b2001-08-15 17:51:17 +00002727 methods()
Guido van Rossuma4ff6ab2001-08-15 23:57:59 +00002728 specials()
Guido van Rossum65d5d7f2001-08-17 21:27:53 +00002729 weakrefs()
Guido van Rossum8bce4ac2001-09-06 21:56:42 +00002730 properties()
Guido van Rossumc4a18802001-08-24 16:55:27 +00002731 supers()
Guido van Rossumcaa9f432001-08-30 20:06:08 +00002732 inherits()
Tim Peters808b94e2001-09-13 19:33:07 +00002733 keywords()
Tim Peters8fa45672001-09-13 21:01:29 +00002734 restricted()
Tim Peters0ab085c2001-09-14 00:25:33 +00002735 str_subclass_as_dict_key()
Guido van Rossumab3b0342001-09-18 20:38:53 +00002736 classic_comparisons()
Guido van Rossum0639f592001-09-18 21:06:04 +00002737 rich_comparisons()
Guido van Rossum1952e382001-09-19 01:25:16 +00002738 coercions()
Guido van Rossum8b9cc7e2001-09-20 21:49:53 +00002739 descrdoc()
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002740 setclass()
Guido van Rossum6661be32001-10-26 04:26:12 +00002741 setdict()
Guido van Rossum3926a632001-09-25 16:25:58 +00002742 pickles()
Guido van Rossum6cef6d52001-09-28 18:13:29 +00002743 copies()
Guido van Rossum4bb1e362001-09-28 23:49:48 +00002744 binopoverride()
Guido van Rossum875eeaa2001-10-11 18:33:53 +00002745 subclasspropagation()
Tim Petersfc57ccb2001-10-12 02:38:24 +00002746 buffer_inherit()
Tim Petersc9933152001-10-16 20:18:24 +00002747 str_of_str_subclass()
Guido van Rossumc8e56452001-10-22 00:43:43 +00002748 kwdargs()
Guido van Rossumed87ad82001-10-30 02:33:02 +00002749 delhook()
Guido van Rossumdbb53d92001-12-03 16:32:18 +00002750 hashinherit()
Guido van Rossum29d26062001-12-11 04:37:34 +00002751 strops()
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002752 if verbose: print "All OK"
Tim Peters6d6c1a32001-08-02 04:15:00 +00002753
Guido van Rossuma56b42b2001-09-20 21:39:07 +00002754if __name__ == "__main__":
2755 test_main()