Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / src / nas,5.n2.os.2 / lib / python / lib / python2.4 / test / test_extcall.py
CommitLineData
86530b38
AT
1from test.test_support import verify, verbose, TestFailed, sortdict
2from UserList import UserList
3
4def e(a, b):
5 print a, b
6
7def f(*a, **k):
8 print a, sortdict(k)
9
10def g(x, *y, **z):
11 print x, y, sortdict(z)
12
13def h(j=1, a=2, h=3):
14 print j, a, h
15
16f()
17f(1)
18f(1, 2)
19f(1, 2, 3)
20
21f(1, 2, 3, *(4, 5))
22f(1, 2, 3, *[4, 5])
23f(1, 2, 3, *UserList([4, 5]))
24f(1, 2, 3, **{'a':4, 'b':5})
25f(1, 2, 3, *(4, 5), **{'a':6, 'b':7})
26f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b':9})
27
28# Verify clearing of SF bug #733667
29try:
30 e(c=3)
31except TypeError:
32 pass
33else:
34 print "should raise TypeError: e() got an unexpected keyword argument 'c'"
35
36try:
37 g()
38except TypeError, err:
39 print "TypeError:", err
40else:
41 print "should raise TypeError: not enough arguments; expected 1, got 0"
42
43try:
44 g(*())
45except TypeError, err:
46 print "TypeError:", err
47else:
48 print "should raise TypeError: not enough arguments; expected 1, got 0"
49
50try:
51 g(*(), **{})
52except TypeError, err:
53 print "TypeError:", err
54else:
55 print "should raise TypeError: not enough arguments; expected 1, got 0"
56
57g(1)
58g(1, 2)
59g(1, 2, 3)
60g(1, 2, 3, *(4, 5))
61class Nothing: pass
62try:
63 g(*Nothing())
64except TypeError, attr:
65 pass
66else:
67 print "should raise TypeError"
68
69class Nothing:
70 def __len__(self):
71 return 5
72try:
73 g(*Nothing())
74except TypeError, attr:
75 pass
76else:
77 print "should raise TypeError"
78
79class Nothing:
80 def __len__(self):
81 return 5
82 def __getitem__(self, i):
83 if i < 3:
84 return i
85 else:
86 raise IndexError, i
87g(*Nothing())
88
89class Nothing:
90 def __init__(self):
91 self.c = 0
92 def __iter__(self):
93 return self
94try:
95 g(*Nothing())
96except TypeError, attr:
97 pass
98else:
99 print "should raise TypeError"
100
101class Nothing:
102 def __init__(self):
103 self.c = 0
104 def __iter__(self):
105 return self
106 def next(self):
107 if self.c == 4:
108 raise StopIteration
109 c = self.c
110 self.c += 1
111 return c
112g(*Nothing())
113
114# make sure the function call doesn't stomp on the dictionary?
115d = {'a': 1, 'b': 2, 'c': 3}
116d2 = d.copy()
117verify(d == d2)
118g(1, d=4, **d)
119print sortdict(d)
120print sortdict(d2)
121verify(d == d2, "function call modified dictionary")
122
123# what about willful misconduct?
124def saboteur(**kw):
125 kw['x'] = locals() # yields a cyclic kw
126 return kw
127d = {}
128kw = saboteur(a=1, **d)
129verify(d == {})
130# break the cycle
131del kw['x']
132
133try:
134 g(1, 2, 3, **{'x':4, 'y':5})
135except TypeError, err:
136 print err
137else:
138 print "should raise TypeError: keyword parameter redefined"
139
140try:
141 g(1, 2, 3, a=4, b=5, *(6, 7), **{'a':8, 'b':9})
142except TypeError, err:
143 print err
144else:
145 print "should raise TypeError: keyword parameter redefined"
146
147try:
148 f(**{1:2})
149except TypeError, err:
150 print err
151else:
152 print "should raise TypeError: keywords must be strings"
153
154try:
155 h(**{'e': 2})
156except TypeError, err:
157 print err
158else:
159 print "should raise TypeError: unexpected keyword argument: e"
160
161try:
162 h(*h)
163except TypeError, err:
164 print err
165else:
166 print "should raise TypeError: * argument must be a tuple"
167
168try:
169 dir(*h)
170except TypeError, err:
171 print err
172else:
173 print "should raise TypeError: * argument must be a tuple"
174
175try:
176 None(*h)
177except TypeError, err:
178 print err
179else:
180 print "should raise TypeError: * argument must be a tuple"
181
182try:
183 h(**h)
184except TypeError, err:
185 print err
186else:
187 print "should raise TypeError: ** argument must be a dictionary"
188
189try:
190 dir(**h)
191except TypeError, err:
192 print err
193else:
194 print "should raise TypeError: ** argument must be a dictionary"
195
196try:
197 None(**h)
198except TypeError, err:
199 print err
200else:
201 print "should raise TypeError: ** argument must be a dictionary"
202
203try:
204 dir(b=1,**{'b':1})
205except TypeError, err:
206 print err
207else:
208 print "should raise TypeError: dir() got multiple values for keyword argument 'b'"
209
210def f2(*a, **b):
211 return a, b
212
213d = {}
214for i in range(512):
215 key = 'k%d' % i
216 d[key] = i
217a, b = f2(1, *(2, 3), **d)
218print len(a), len(b), b == d
219
220class Foo:
221 def method(self, arg1, arg2):
222 return arg1 + arg2
223
224x = Foo()
225print Foo.method(*(x, 1, 2))
226print Foo.method(x, *(1, 2))
227try:
228 print Foo.method(*(1, 2, 3))
229except TypeError, err:
230 pass
231else:
232 print 'expected a TypeError for unbound method call'
233try:
234 print Foo.method(1, *(2, 3))
235except TypeError, err:
236 pass
237else:
238 print 'expected a TypeError for unbound method call'
239
240# A PyCFunction that takes only positional parameters should allow an
241# empty keyword dictionary to pass without a complaint, but raise a
242# TypeError if the dictionary is non-empty.
243id(1, **{})
244try:
245 id(1, **{"foo": 1})
246except TypeError:
247 pass
248else:
249 raise TestFailed, 'expected TypeError; no exception raised'
250
251a, b, d, e, v, k = 'A', 'B', 'D', 'E', 'V', 'K'
252funcs = []
253maxargs = {}
254for args in ['', 'a', 'ab']:
255 for defargs in ['', 'd', 'de']:
256 for vararg in ['', 'v']:
257 for kwarg in ['', 'k']:
258 name = 'z' + args + defargs + vararg + kwarg
259 arglist = list(args) + map(
260 lambda x: '%s="%s"' % (x, x), defargs)
261 if vararg: arglist.append('*' + vararg)
262 if kwarg: arglist.append('**' + kwarg)
263 decl = (('def %s(%s): print "ok %s", a, b, d, e, v, ' +
264 'type(k) is type ("") and k or sortdict(k)')
265 % (name, ', '.join(arglist), name))
266 exec(decl)
267 func = eval(name)
268 funcs.append(func)
269 maxargs[func] = len(args + defargs)
270
271for name in ['za', 'zade', 'zabk', 'zabdv', 'zabdevk']:
272 func = eval(name)
273 for args in [(), (1, 2), (1, 2, 3, 4, 5)]:
274 for kwargs in ['', 'a', 'd', 'ad', 'abde']:
275 kwdict = {}
276 for k in kwargs: kwdict[k] = k + k
277 print func.func_name, args, sortdict(kwdict), '->',
278 try: func(*args, **kwdict)
279 except TypeError, err: print err