blob: 07e2d151379182f81339c97cf3fb5589d16d9aa7 [file] [log] [blame]
Thomas Hellera4ea6032003-04-17 18:55:45 +00001import unittest
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03002import math
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03003import string
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004import sys
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02006# Skip this test if the _testcapi module isn't available.
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03007_testcapi = support.import_module('_testcapi')
Larry Hastings83a9f482012-03-20 20:06:16 +00008from _testcapi import getargs_keywords, getargs_keyword_only
Thomas Hellera4ea6032003-04-17 18:55:45 +00009
Victor Stinner765531d2013-03-26 01:11:54 +010010# > How about the following counterproposal. This also changes some of
11# > the other format codes to be a little more regular.
12# >
13# > Code C type Range check
14# >
15# > b unsigned char 0..UCHAR_MAX
16# > h signed short SHRT_MIN..SHRT_MAX
17# > B unsigned char none **
18# > H unsigned short none **
19# > k * unsigned long none
20# > I * unsigned int 0..UINT_MAX
21#
22#
23# > i int INT_MIN..INT_MAX
24# > l long LONG_MIN..LONG_MAX
25#
26# > K * unsigned long long none
27# > L long long LLONG_MIN..LLONG_MAX
28#
29# > Notes:
30# >
31# > * New format codes.
32# >
33# > ** Changed from previous "range-and-a-half" to "none"; the
34# > range-and-a-half checking wasn't particularly useful.
35#
Serhiy Storchaka483405b2015-02-17 10:14:30 +020036# Plus a C API or two, e.g. PyLong_AsUnsignedLongMask() ->
37# unsigned long and PyLong_AsUnsignedLongLongMask() -> unsigned
Victor Stinner765531d2013-03-26 01:11:54 +010038# long long (if that exists).
Thomas Hellera4ea6032003-04-17 18:55:45 +000039
40LARGE = 0x7FFFFFFF
Guido van Rossume2a383d2007-01-15 16:59:06 +000041VERY_LARGE = 0xFF0000121212121212121242
Thomas Hellera4ea6032003-04-17 18:55:45 +000042
43from _testcapi import UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, INT_MAX, \
Mark Dickinson1554b182009-12-20 16:03:30 +000044 INT_MIN, LONG_MIN, LONG_MAX, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX, \
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030045 SHRT_MIN, SHRT_MAX, FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX
46
47DBL_MAX_EXP = sys.float_info.max_exp
48INF = float('inf')
49NAN = float('nan')
Thomas Hellera4ea6032003-04-17 18:55:45 +000050
Thomas Hellera4ea6032003-04-17 18:55:45 +000051# fake, they are not defined in Python's header files
52LLONG_MAX = 2**63-1
53LLONG_MIN = -2**63
54ULLONG_MAX = 2**64-1
55
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +020056class Index:
57 def __index__(self):
58 return 99
59
60class IndexIntSubclass(int):
61 def __index__(self):
62 return 99
63
64class BadIndex:
65 def __index__(self):
66 return 1.0
67
68class BadIndex2:
69 def __index__(self):
70 return True
71
72class BadIndex3(int):
73 def __index__(self):
74 return True
75
76
Thomas Hellera4ea6032003-04-17 18:55:45 +000077class Int:
78 def __int__(self):
79 return 99
80
Serhiy Storchaka31a65542013-12-11 21:07:54 +020081class IntSubclass(int):
82 def __int__(self):
83 return 99
84
85class BadInt:
86 def __int__(self):
87 return 1.0
88
89class BadInt2:
90 def __int__(self):
91 return True
92
93class BadInt3(int):
94 def __int__(self):
95 return True
96
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030097
98class Float:
99 def __float__(self):
100 return 4.25
101
102class FloatSubclass(float):
103 pass
104
105class FloatSubclass2(float):
106 def __float__(self):
107 return 4.25
108
109class BadFloat:
110 def __float__(self):
111 return 687
112
113class BadFloat2:
114 def __float__(self):
115 return FloatSubclass(4.25)
116
117class BadFloat3(float):
118 def __float__(self):
119 return FloatSubclass(4.25)
120
121
122class Complex:
123 def __complex__(self):
124 return 4.25+0.5j
125
126class ComplexSubclass(complex):
127 pass
128
129class ComplexSubclass2(complex):
130 def __complex__(self):
131 return 4.25+0.5j
132
133class BadComplex:
134 def __complex__(self):
135 return 1.25
136
137class BadComplex2:
138 def __complex__(self):
139 return ComplexSubclass(4.25+0.5j)
140
141class BadComplex3(complex):
142 def __complex__(self):
143 return ComplexSubclass(4.25+0.5j)
144
145
Serhiy Storchakace412872016-05-08 23:36:44 +0300146class TupleSubclass(tuple):
147 pass
148
149class DictSubclass(dict):
150 pass
151
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200152
Thomas Hellera4ea6032003-04-17 18:55:45 +0000153class Unsigned_TestCase(unittest.TestCase):
154 def test_b(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000155 from _testcapi import getargs_b
Thomas Hellera4ea6032003-04-17 18:55:45 +0000156 # b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000157 self.assertRaises(TypeError, getargs_b, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200158 self.assertEqual(99, getargs_b(Index()))
159 self.assertEqual(0, getargs_b(IndexIntSubclass()))
160 self.assertRaises(TypeError, getargs_b, BadIndex())
161 with self.assertWarns(DeprecationWarning):
162 self.assertEqual(1, getargs_b(BadIndex2()))
163 self.assertEqual(0, getargs_b(BadIndex3()))
164 with self.assertWarns(DeprecationWarning):
165 self.assertEqual(99, getargs_b(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200166 self.assertEqual(0, getargs_b(IntSubclass()))
167 self.assertRaises(TypeError, getargs_b, BadInt())
168 with self.assertWarns(DeprecationWarning):
169 self.assertEqual(1, getargs_b(BadInt2()))
170 self.assertEqual(0, getargs_b(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000171
Thomas Heller54aa5782003-04-24 16:15:29 +0000172 self.assertRaises(OverflowError, getargs_b, -1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000173 self.assertEqual(0, getargs_b(0))
174 self.assertEqual(UCHAR_MAX, getargs_b(UCHAR_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000175 self.assertRaises(OverflowError, getargs_b, UCHAR_MAX + 1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000176
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000177 self.assertEqual(42, getargs_b(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000178 self.assertRaises(OverflowError, getargs_b, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000179
Thomas Hellera4ea6032003-04-17 18:55:45 +0000180 def test_B(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000181 from _testcapi import getargs_B
Thomas Hellera4ea6032003-04-17 18:55:45 +0000182 # B returns 'unsigned char', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000183 self.assertRaises(TypeError, getargs_B, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200184 self.assertEqual(99, getargs_B(Index()))
185 self.assertEqual(0, getargs_B(IndexIntSubclass()))
186 self.assertRaises(TypeError, getargs_B, BadIndex())
187 with self.assertWarns(DeprecationWarning):
188 self.assertEqual(1, getargs_B(BadIndex2()))
189 self.assertEqual(0, getargs_B(BadIndex3()))
190 with self.assertWarns(DeprecationWarning):
191 self.assertEqual(99, getargs_B(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200192 self.assertEqual(0, getargs_B(IntSubclass()))
193 self.assertRaises(TypeError, getargs_B, BadInt())
194 with self.assertWarns(DeprecationWarning):
195 self.assertEqual(1, getargs_B(BadInt2()))
196 self.assertEqual(0, getargs_B(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000197
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000198 self.assertEqual(UCHAR_MAX, getargs_B(-1))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000199 self.assertEqual(0, getargs_B(0))
200 self.assertEqual(UCHAR_MAX, getargs_B(UCHAR_MAX))
201 self.assertEqual(0, getargs_B(UCHAR_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000202
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000203 self.assertEqual(42, getargs_B(42))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000204 self.assertEqual(UCHAR_MAX & VERY_LARGE, getargs_B(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000205
206 def test_H(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000207 from _testcapi import getargs_H
Thomas Hellera4ea6032003-04-17 18:55:45 +0000208 # H returns 'unsigned short', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000209 self.assertRaises(TypeError, getargs_H, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200210 self.assertEqual(99, getargs_H(Index()))
211 self.assertEqual(0, getargs_H(IndexIntSubclass()))
212 self.assertRaises(TypeError, getargs_H, BadIndex())
213 with self.assertWarns(DeprecationWarning):
214 self.assertEqual(1, getargs_H(BadIndex2()))
215 self.assertEqual(0, getargs_H(BadIndex3()))
216 with self.assertWarns(DeprecationWarning):
217 self.assertEqual(99, getargs_H(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200218 self.assertEqual(0, getargs_H(IntSubclass()))
219 self.assertRaises(TypeError, getargs_H, BadInt())
220 with self.assertWarns(DeprecationWarning):
221 self.assertEqual(1, getargs_H(BadInt2()))
222 self.assertEqual(0, getargs_H(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000223
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000224 self.assertEqual(USHRT_MAX, getargs_H(-1))
225 self.assertEqual(0, getargs_H(0))
226 self.assertEqual(USHRT_MAX, getargs_H(USHRT_MAX))
227 self.assertEqual(0, getargs_H(USHRT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000228
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000229 self.assertEqual(42, getargs_H(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000230
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000231 self.assertEqual(VERY_LARGE & USHRT_MAX, getargs_H(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000232
233 def test_I(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000234 from _testcapi import getargs_I
Thomas Hellera4ea6032003-04-17 18:55:45 +0000235 # I returns 'unsigned int', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000236 self.assertRaises(TypeError, getargs_I, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200237 self.assertEqual(99, getargs_I(Index()))
238 self.assertEqual(0, getargs_I(IndexIntSubclass()))
239 self.assertRaises(TypeError, getargs_I, BadIndex())
240 with self.assertWarns(DeprecationWarning):
241 self.assertEqual(1, getargs_I(BadIndex2()))
242 self.assertEqual(0, getargs_I(BadIndex3()))
243 with self.assertWarns(DeprecationWarning):
244 self.assertEqual(99, getargs_I(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200245 self.assertEqual(0, getargs_I(IntSubclass()))
246 self.assertRaises(TypeError, getargs_I, BadInt())
247 with self.assertWarns(DeprecationWarning):
248 self.assertEqual(1, getargs_I(BadInt2()))
249 self.assertEqual(0, getargs_I(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000250
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000251 self.assertEqual(UINT_MAX, getargs_I(-1))
252 self.assertEqual(0, getargs_I(0))
253 self.assertEqual(UINT_MAX, getargs_I(UINT_MAX))
254 self.assertEqual(0, getargs_I(UINT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000255
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000256 self.assertEqual(42, getargs_I(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000257
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000258 self.assertEqual(VERY_LARGE & UINT_MAX, getargs_I(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000259
260 def test_k(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000261 from _testcapi import getargs_k
Thomas Hellera4ea6032003-04-17 18:55:45 +0000262 # k returns 'unsigned long', no range checking
263 # it does not accept float, or instances with __int__
Thomas Heller54aa5782003-04-24 16:15:29 +0000264 self.assertRaises(TypeError, getargs_k, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200265 self.assertRaises(TypeError, getargs_k, Index())
266 self.assertEqual(0, getargs_k(IndexIntSubclass()))
267 self.assertRaises(TypeError, getargs_k, BadIndex())
268 self.assertRaises(TypeError, getargs_k, BadIndex2())
269 self.assertEqual(0, getargs_k(BadIndex3()))
Thomas Heller54aa5782003-04-24 16:15:29 +0000270 self.assertRaises(TypeError, getargs_k, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200271 self.assertEqual(0, getargs_k(IntSubclass()))
272 self.assertRaises(TypeError, getargs_k, BadInt())
273 self.assertRaises(TypeError, getargs_k, BadInt2())
274 self.assertEqual(0, getargs_k(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000275
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000276 self.assertEqual(ULONG_MAX, getargs_k(-1))
277 self.assertEqual(0, getargs_k(0))
278 self.assertEqual(ULONG_MAX, getargs_k(ULONG_MAX))
279 self.assertEqual(0, getargs_k(ULONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000280
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000281 self.assertEqual(42, getargs_k(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000282
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000283 self.assertEqual(VERY_LARGE & ULONG_MAX, getargs_k(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000284
285class Signed_TestCase(unittest.TestCase):
Mark Dickinson1554b182009-12-20 16:03:30 +0000286 def test_h(self):
287 from _testcapi import getargs_h
288 # h returns 'short', and does range checking (SHRT_MIN ... SHRT_MAX)
289 self.assertRaises(TypeError, getargs_h, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200290 self.assertEqual(99, getargs_h(Index()))
291 self.assertEqual(0, getargs_h(IndexIntSubclass()))
292 self.assertRaises(TypeError, getargs_h, BadIndex())
293 with self.assertWarns(DeprecationWarning):
294 self.assertEqual(1, getargs_h(BadIndex2()))
295 self.assertEqual(0, getargs_h(BadIndex3()))
296 with self.assertWarns(DeprecationWarning):
297 self.assertEqual(99, getargs_h(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200298 self.assertEqual(0, getargs_h(IntSubclass()))
299 self.assertRaises(TypeError, getargs_h, BadInt())
300 with self.assertWarns(DeprecationWarning):
301 self.assertEqual(1, getargs_h(BadInt2()))
302 self.assertEqual(0, getargs_h(BadInt3()))
Mark Dickinson1554b182009-12-20 16:03:30 +0000303
304 self.assertRaises(OverflowError, getargs_h, SHRT_MIN-1)
305 self.assertEqual(SHRT_MIN, getargs_h(SHRT_MIN))
306 self.assertEqual(SHRT_MAX, getargs_h(SHRT_MAX))
307 self.assertRaises(OverflowError, getargs_h, SHRT_MAX+1)
308
309 self.assertEqual(42, getargs_h(42))
310 self.assertRaises(OverflowError, getargs_h, VERY_LARGE)
311
Thomas Hellera4ea6032003-04-17 18:55:45 +0000312 def test_i(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000313 from _testcapi import getargs_i
Thomas Hellera4ea6032003-04-17 18:55:45 +0000314 # i returns 'int', and does range checking (INT_MIN ... INT_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000315 self.assertRaises(TypeError, getargs_i, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200316 self.assertEqual(99, getargs_i(Index()))
317 self.assertEqual(0, getargs_i(IndexIntSubclass()))
318 self.assertRaises(TypeError, getargs_i, BadIndex())
319 with self.assertWarns(DeprecationWarning):
320 self.assertEqual(1, getargs_i(BadIndex2()))
321 self.assertEqual(0, getargs_i(BadIndex3()))
322 with self.assertWarns(DeprecationWarning):
323 self.assertEqual(99, getargs_i(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200324 self.assertEqual(0, getargs_i(IntSubclass()))
325 self.assertRaises(TypeError, getargs_i, BadInt())
326 with self.assertWarns(DeprecationWarning):
327 self.assertEqual(1, getargs_i(BadInt2()))
328 self.assertEqual(0, getargs_i(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000329
Thomas Heller54aa5782003-04-24 16:15:29 +0000330 self.assertRaises(OverflowError, getargs_i, INT_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000331 self.assertEqual(INT_MIN, getargs_i(INT_MIN))
332 self.assertEqual(INT_MAX, getargs_i(INT_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000333 self.assertRaises(OverflowError, getargs_i, INT_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000334
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000335 self.assertEqual(42, getargs_i(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000336 self.assertRaises(OverflowError, getargs_i, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000337
338 def test_l(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000339 from _testcapi import getargs_l
Thomas Hellera4ea6032003-04-17 18:55:45 +0000340 # l returns 'long', and does range checking (LONG_MIN ... LONG_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000341 self.assertRaises(TypeError, getargs_l, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200342 self.assertEqual(99, getargs_l(Index()))
343 self.assertEqual(0, getargs_l(IndexIntSubclass()))
344 self.assertRaises(TypeError, getargs_l, BadIndex())
345 with self.assertWarns(DeprecationWarning):
346 self.assertEqual(1, getargs_l(BadIndex2()))
347 self.assertEqual(0, getargs_l(BadIndex3()))
348 with self.assertWarns(DeprecationWarning):
349 self.assertEqual(99, getargs_l(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200350 self.assertEqual(0, getargs_l(IntSubclass()))
351 self.assertRaises(TypeError, getargs_l, BadInt())
352 with self.assertWarns(DeprecationWarning):
353 self.assertEqual(1, getargs_l(BadInt2()))
354 self.assertEqual(0, getargs_l(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000355
Thomas Heller54aa5782003-04-24 16:15:29 +0000356 self.assertRaises(OverflowError, getargs_l, LONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000357 self.assertEqual(LONG_MIN, getargs_l(LONG_MIN))
358 self.assertEqual(LONG_MAX, getargs_l(LONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000359 self.assertRaises(OverflowError, getargs_l, LONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000360
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000361 self.assertEqual(42, getargs_l(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000362 self.assertRaises(OverflowError, getargs_l, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000363
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000364 def test_n(self):
365 from _testcapi import getargs_n
366 # n returns 'Py_ssize_t', and does range checking
367 # (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX)
Thomas Woutersd8073282006-04-21 11:36:13 +0000368 self.assertRaises(TypeError, getargs_n, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200369 self.assertEqual(99, getargs_n(Index()))
370 self.assertEqual(0, getargs_n(IndexIntSubclass()))
371 self.assertRaises(TypeError, getargs_n, BadIndex())
372 with self.assertWarns(DeprecationWarning):
373 self.assertEqual(1, getargs_n(BadIndex2()))
374 self.assertEqual(0, getargs_n(BadIndex3()))
Trent Nelson35133582008-04-22 19:02:40 +0000375 self.assertRaises(TypeError, getargs_n, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200376 self.assertEqual(0, getargs_n(IntSubclass()))
377 self.assertRaises(TypeError, getargs_n, BadInt())
378 self.assertRaises(TypeError, getargs_n, BadInt2())
379 self.assertEqual(0, getargs_n(BadInt3()))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000380
381 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000382 self.assertEqual(PY_SSIZE_T_MIN, getargs_n(PY_SSIZE_T_MIN))
383 self.assertEqual(PY_SSIZE_T_MAX, getargs_n(PY_SSIZE_T_MAX))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000384 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MAX+1)
385
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000386 self.assertEqual(42, getargs_n(42))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000387 self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
388
Thomas Hellera4ea6032003-04-17 18:55:45 +0000389
390class LongLong_TestCase(unittest.TestCase):
391 def test_L(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000392 from _testcapi import getargs_L
Mark Dickinsonde604012010-01-01 19:27:32 +0000393 # L returns 'long long', and does range checking (LLONG_MIN
394 # ... LLONG_MAX)
Mark Dickinsonc7301312010-06-10 16:05:10 +0000395 self.assertRaises(TypeError, getargs_L, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000396 self.assertRaises(TypeError, getargs_L, "Hello")
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200397 self.assertEqual(99, getargs_L(Index()))
398 self.assertEqual(0, getargs_L(IndexIntSubclass()))
399 self.assertRaises(TypeError, getargs_L, BadIndex())
400 with self.assertWarns(DeprecationWarning):
401 self.assertEqual(1, getargs_L(BadIndex2()))
402 self.assertEqual(0, getargs_L(BadIndex3()))
403 with self.assertWarns(DeprecationWarning):
404 self.assertEqual(99, getargs_L(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200405 self.assertEqual(0, getargs_L(IntSubclass()))
406 self.assertRaises(TypeError, getargs_L, BadInt())
407 with self.assertWarns(DeprecationWarning):
408 self.assertEqual(1, getargs_L(BadInt2()))
409 self.assertEqual(0, getargs_L(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000410
Thomas Heller54aa5782003-04-24 16:15:29 +0000411 self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000412 self.assertEqual(LLONG_MIN, getargs_L(LLONG_MIN))
413 self.assertEqual(LLONG_MAX, getargs_L(LLONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000414 self.assertRaises(OverflowError, getargs_L, LLONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000415
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000416 self.assertEqual(42, getargs_L(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000417 self.assertRaises(OverflowError, getargs_L, VERY_LARGE)
Tim Peters0eadaac2003-04-24 16:02:54 +0000418
Thomas Hellera4ea6032003-04-17 18:55:45 +0000419 def test_K(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000420 from _testcapi import getargs_K
Thomas Hellera4ea6032003-04-17 18:55:45 +0000421 # K return 'unsigned long long', no range checking
Thomas Heller54aa5782003-04-24 16:15:29 +0000422 self.assertRaises(TypeError, getargs_K, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200423 self.assertRaises(TypeError, getargs_K, Index())
424 self.assertEqual(0, getargs_K(IndexIntSubclass()))
425 self.assertRaises(TypeError, getargs_K, BadIndex())
426 self.assertRaises(TypeError, getargs_K, BadIndex2())
427 self.assertEqual(0, getargs_K(BadIndex3()))
Thomas Heller54aa5782003-04-24 16:15:29 +0000428 self.assertRaises(TypeError, getargs_K, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200429 self.assertEqual(0, getargs_K(IntSubclass()))
430 self.assertRaises(TypeError, getargs_K, BadInt())
431 self.assertRaises(TypeError, getargs_K, BadInt2())
432 self.assertEqual(0, getargs_K(BadInt3()))
433
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000434 self.assertEqual(ULLONG_MAX, getargs_K(ULLONG_MAX))
435 self.assertEqual(0, getargs_K(0))
436 self.assertEqual(0, getargs_K(ULLONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000437
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000438 self.assertEqual(42, getargs_K(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000439
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000440 self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000441
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300442
443class Float_TestCase(unittest.TestCase):
444 def assertEqualWithSign(self, actual, expected):
445 self.assertEqual(actual, expected)
446 self.assertEqual(math.copysign(1, actual), math.copysign(1, expected))
447
448 def test_f(self):
449 from _testcapi import getargs_f
450 self.assertEqual(getargs_f(4.25), 4.25)
451 self.assertEqual(getargs_f(4), 4.0)
452 self.assertRaises(TypeError, getargs_f, 4.25+0j)
453 self.assertEqual(getargs_f(Float()), 4.25)
454 self.assertEqual(getargs_f(FloatSubclass(7.5)), 7.5)
455 self.assertEqual(getargs_f(FloatSubclass2(7.5)), 7.5)
456 self.assertRaises(TypeError, getargs_f, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300457 with self.assertWarns(DeprecationWarning):
458 self.assertEqual(getargs_f(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300459 self.assertEqual(getargs_f(BadFloat3(7.5)), 7.5)
460
461 for x in (FLT_MIN, -FLT_MIN, FLT_MAX, -FLT_MAX, INF, -INF):
462 self.assertEqual(getargs_f(x), x)
463 if FLT_MAX < DBL_MAX:
464 self.assertEqual(getargs_f(DBL_MAX), INF)
465 self.assertEqual(getargs_f(-DBL_MAX), -INF)
466 if FLT_MIN > DBL_MIN:
467 self.assertEqualWithSign(getargs_f(DBL_MIN), 0.0)
468 self.assertEqualWithSign(getargs_f(-DBL_MIN), -0.0)
469 self.assertEqualWithSign(getargs_f(0.0), 0.0)
470 self.assertEqualWithSign(getargs_f(-0.0), -0.0)
471 r = getargs_f(NAN)
472 self.assertNotEqual(r, r)
473
Benjamin Peterson2bb69a52017-09-10 23:50:46 -0700474 @support.requires_IEEE_754
475 def test_f_rounding(self):
476 from _testcapi import getargs_f
477 self.assertEqual(getargs_f(3.40282356e38), FLT_MAX)
478 self.assertEqual(getargs_f(-3.40282356e38), -FLT_MAX)
479
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300480 def test_d(self):
481 from _testcapi import getargs_d
482 self.assertEqual(getargs_d(4.25), 4.25)
483 self.assertEqual(getargs_d(4), 4.0)
484 self.assertRaises(TypeError, getargs_d, 4.25+0j)
485 self.assertEqual(getargs_d(Float()), 4.25)
486 self.assertEqual(getargs_d(FloatSubclass(7.5)), 7.5)
487 self.assertEqual(getargs_d(FloatSubclass2(7.5)), 7.5)
488 self.assertRaises(TypeError, getargs_d, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300489 with self.assertWarns(DeprecationWarning):
490 self.assertEqual(getargs_d(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300491 self.assertEqual(getargs_d(BadFloat3(7.5)), 7.5)
492
493 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
494 self.assertEqual(getargs_d(x), x)
495 self.assertRaises(OverflowError, getargs_d, 1<<DBL_MAX_EXP)
496 self.assertRaises(OverflowError, getargs_d, -1<<DBL_MAX_EXP)
497 self.assertEqualWithSign(getargs_d(0.0), 0.0)
498 self.assertEqualWithSign(getargs_d(-0.0), -0.0)
499 r = getargs_d(NAN)
500 self.assertNotEqual(r, r)
501
502 def test_D(self):
503 from _testcapi import getargs_D
504 self.assertEqual(getargs_D(4.25+0.5j), 4.25+0.5j)
505 self.assertEqual(getargs_D(4.25), 4.25+0j)
506 self.assertEqual(getargs_D(4), 4.0+0j)
507 self.assertEqual(getargs_D(Complex()), 4.25+0.5j)
508 self.assertEqual(getargs_D(ComplexSubclass(7.5+0.25j)), 7.5+0.25j)
509 self.assertEqual(getargs_D(ComplexSubclass2(7.5+0.25j)), 7.5+0.25j)
510 self.assertRaises(TypeError, getargs_D, BadComplex())
Serhiy Storchaka671079e2017-03-24 21:28:43 +0200511 with self.assertWarns(DeprecationWarning):
512 self.assertEqual(getargs_D(BadComplex2()), 4.25+0.5j)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300513 self.assertEqual(getargs_D(BadComplex3(7.5+0.25j)), 7.5+0.25j)
514
515 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
516 c = complex(x, 1.0)
517 self.assertEqual(getargs_D(c), c)
518 c = complex(1.0, x)
519 self.assertEqual(getargs_D(c), c)
520 self.assertEqualWithSign(getargs_D(complex(0.0, 1.0)).real, 0.0)
521 self.assertEqualWithSign(getargs_D(complex(-0.0, 1.0)).real, -0.0)
522 self.assertEqualWithSign(getargs_D(complex(1.0, 0.0)).imag, 0.0)
523 self.assertEqualWithSign(getargs_D(complex(1.0, -0.0)).imag, -0.0)
524
525
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700526class Paradox:
527 "This statement is false."
528 def __bool__(self):
529 raise NotImplementedError
530
531class Boolean_TestCase(unittest.TestCase):
532 def test_p(self):
533 from _testcapi import getargs_p
534 self.assertEqual(0, getargs_p(False))
535 self.assertEqual(0, getargs_p(None))
536 self.assertEqual(0, getargs_p(0))
537 self.assertEqual(0, getargs_p(0.0))
538 self.assertEqual(0, getargs_p(0j))
539 self.assertEqual(0, getargs_p(''))
540 self.assertEqual(0, getargs_p(()))
541 self.assertEqual(0, getargs_p([]))
542 self.assertEqual(0, getargs_p({}))
543
544 self.assertEqual(1, getargs_p(True))
545 self.assertEqual(1, getargs_p(1))
546 self.assertEqual(1, getargs_p(1.0))
547 self.assertEqual(1, getargs_p(1j))
548 self.assertEqual(1, getargs_p('x'))
549 self.assertEqual(1, getargs_p((1,)))
550 self.assertEqual(1, getargs_p([1]))
551 self.assertEqual(1, getargs_p({1:2}))
552 self.assertEqual(1, getargs_p(unittest.TestCase))
553
554 self.assertRaises(NotImplementedError, getargs_p, Paradox())
555
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000556
557class Tuple_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300558 def test_args(self):
559 from _testcapi import get_args
560
561 ret = get_args(1, 2)
562 self.assertEqual(ret, (1, 2))
563 self.assertIs(type(ret), tuple)
564
565 ret = get_args(1, *(2, 3))
566 self.assertEqual(ret, (1, 2, 3))
567 self.assertIs(type(ret), tuple)
568
569 ret = get_args(*[1, 2])
570 self.assertEqual(ret, (1, 2))
571 self.assertIs(type(ret), tuple)
572
573 ret = get_args(*TupleSubclass([1, 2]))
574 self.assertEqual(ret, (1, 2))
Serhiy Storchaka63dc5482016-09-22 19:41:20 +0300575 self.assertIs(type(ret), tuple)
Serhiy Storchakace412872016-05-08 23:36:44 +0300576
577 ret = get_args()
578 self.assertIn(ret, ((), None))
579 self.assertIn(type(ret), (tuple, type(None)))
580
581 ret = get_args(*())
582 self.assertIn(ret, ((), None))
583 self.assertIn(type(ret), (tuple, type(None)))
584
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000585 def test_tuple(self):
586 from _testcapi import getargs_tuple
587
588 ret = getargs_tuple(1, (2, 3))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000589 self.assertEqual(ret, (1,2,3))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000590
591 # make sure invalid tuple arguments are handled correctly
592 class seq:
593 def __len__(self):
594 return 2
595 def __getitem__(self, n):
596 raise ValueError
597 self.assertRaises(TypeError, getargs_tuple, 1, seq())
598
Christian Heimes380f7f22008-02-28 11:19:05 +0000599class Keywords_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300600 def test_kwargs(self):
601 from _testcapi import get_kwargs
602
603 ret = get_kwargs(a=1, b=2)
604 self.assertEqual(ret, {'a': 1, 'b': 2})
605 self.assertIs(type(ret), dict)
606
607 ret = get_kwargs(a=1, **{'b': 2, 'c': 3})
608 self.assertEqual(ret, {'a': 1, 'b': 2, 'c': 3})
609 self.assertIs(type(ret), dict)
610
611 ret = get_kwargs(**DictSubclass({'a': 1, 'b': 2}))
612 self.assertEqual(ret, {'a': 1, 'b': 2})
613 self.assertIs(type(ret), dict)
614
615 ret = get_kwargs()
616 self.assertIn(ret, ({}, None))
617 self.assertIn(type(ret), (dict, type(None)))
618
619 ret = get_kwargs(**{})
620 self.assertIn(ret, ({}, None))
621 self.assertIn(type(ret), (dict, type(None)))
622
Christian Heimes380f7f22008-02-28 11:19:05 +0000623 def test_positional_args(self):
624 # using all positional args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000625 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000626 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), 10),
627 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
628 )
Victor Stinner93b55132010-05-19 00:54:06 +0000629
Christian Heimes380f7f22008-02-28 11:19:05 +0000630 def test_mixed_args(self):
631 # positional and keyword args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000632 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000633 getargs_keywords((1,2), 3, (4,(5,6)), arg4=(7,8,9), arg5=10),
634 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
635 )
Victor Stinner93b55132010-05-19 00:54:06 +0000636
Christian Heimes380f7f22008-02-28 11:19:05 +0000637 def test_keyword_args(self):
638 # all keywords
Ezio Melottib3aedd42010-11-20 19:04:17 +0000639 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000640 getargs_keywords(arg1=(1,2), arg2=3, arg3=(4,(5,6)), arg4=(7,8,9), arg5=10),
641 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
642 )
Victor Stinner93b55132010-05-19 00:54:06 +0000643
Christian Heimes380f7f22008-02-28 11:19:05 +0000644 def test_optional_args(self):
645 # missing optional keyword args, skipping tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000646 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000647 getargs_keywords(arg1=(1,2), arg2=3, arg5=10),
648 (1, 2, 3, -1, -1, -1, -1, -1, -1, 10)
649 )
Victor Stinner93b55132010-05-19 00:54:06 +0000650
Christian Heimes380f7f22008-02-28 11:19:05 +0000651 def test_required_args(self):
652 # required arg missing
653 try:
654 getargs_keywords(arg1=(1,2))
655 except TypeError as err:
Michael Seifert64c8f702017-04-09 09:47:12 +0200656 self.assertEqual(
657 str(err), "function missing required argument 'arg2' (pos 2)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000658 else:
659 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000660
Christian Heimes380f7f22008-02-28 11:19:05 +0000661 def test_too_many_args(self):
662 try:
663 getargs_keywords((1,2),3,(4,(5,6)),(7,8,9),10,111)
664 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000665 self.assertEqual(str(err), "function takes at most 5 arguments (6 given)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000666 else:
667 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000668
Christian Heimes380f7f22008-02-28 11:19:05 +0000669 def test_invalid_keyword(self):
670 # extraneous keyword arg
671 try:
672 getargs_keywords((1,2),3,arg5=10,arg666=666)
673 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000674 self.assertEqual(str(err), "'arg666' is an invalid keyword argument for this function")
Christian Heimes380f7f22008-02-28 11:19:05 +0000675 else:
676 self.fail('TypeError should have been raised')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000677
Victor Stinner93b55132010-05-19 00:54:06 +0000678 def test_surrogate_keyword(self):
679 try:
680 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), **{'\uDC80': 10})
681 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000682 self.assertEqual(str(err), "'\udc80' is an invalid keyword argument for this function")
Victor Stinner93b55132010-05-19 00:54:06 +0000683 else:
684 self.fail('TypeError should have been raised')
685
Larry Hastings83a9f482012-03-20 20:06:16 +0000686class KeywordOnly_TestCase(unittest.TestCase):
687 def test_positional_args(self):
688 # using all possible positional args
689 self.assertEqual(
690 getargs_keyword_only(1, 2),
691 (1, 2, -1)
692 )
693
694 def test_mixed_args(self):
695 # positional and keyword args
696 self.assertEqual(
697 getargs_keyword_only(1, 2, keyword_only=3),
698 (1, 2, 3)
699 )
700
701 def test_keyword_args(self):
702 # all keywords
703 self.assertEqual(
704 getargs_keyword_only(required=1, optional=2, keyword_only=3),
705 (1, 2, 3)
706 )
707
708 def test_optional_args(self):
709 # missing optional keyword args, skipping tuples
710 self.assertEqual(
711 getargs_keyword_only(required=1, optional=2),
712 (1, 2, -1)
713 )
714 self.assertEqual(
715 getargs_keyword_only(required=1, keyword_only=3),
716 (1, -1, 3)
717 )
718
719 def test_required_args(self):
720 self.assertEqual(
721 getargs_keyword_only(1),
722 (1, -1, -1)
723 )
724 self.assertEqual(
725 getargs_keyword_only(required=1),
726 (1, -1, -1)
727 )
728 # required arg missing
729 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200730 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000731 getargs_keyword_only(optional=2)
732
733 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200734 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000735 getargs_keyword_only(keyword_only=3)
736
737 def test_too_many_args(self):
738 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200739 r"function takes at most 2 positional arguments \(3 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000740 getargs_keyword_only(1, 2, 3)
741
742 with self.assertRaisesRegex(TypeError,
R David Murray44b548d2016-09-08 13:59:53 -0400743 r"function takes at most 3 arguments \(4 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000744 getargs_keyword_only(1, 2, 3, keyword_only=5)
745
746 def test_invalid_keyword(self):
747 # extraneous keyword arg
748 with self.assertRaisesRegex(TypeError,
749 "'monster' is an invalid keyword argument for this function"):
750 getargs_keyword_only(1, 2, monster=666)
751
752 def test_surrogate_keyword(self):
753 with self.assertRaisesRegex(TypeError,
754 "'\udc80' is an invalid keyword argument for this function"):
755 getargs_keyword_only(1, 2, **{'\uDC80': 10})
756
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200757
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300758class PositionalOnlyAndKeywords_TestCase(unittest.TestCase):
759 from _testcapi import getargs_positional_only_and_keywords as getargs
760
761 def test_positional_args(self):
762 # using all possible positional args
763 self.assertEqual(self.getargs(1, 2, 3), (1, 2, 3))
764
765 def test_mixed_args(self):
766 # positional and keyword args
767 self.assertEqual(self.getargs(1, 2, keyword=3), (1, 2, 3))
768
769 def test_optional_args(self):
770 # missing optional args
771 self.assertEqual(self.getargs(1, 2), (1, 2, -1))
772 self.assertEqual(self.getargs(1, keyword=3), (1, -1, 3))
773
774 def test_required_args(self):
775 self.assertEqual(self.getargs(1), (1, -1, -1))
776 # required positional arg missing
777 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +0530778 r"function takes at least 1 positional argument \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300779 self.getargs()
780
781 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +0530782 r"function takes at least 1 positional argument \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300783 self.getargs(keyword=3)
784
785 def test_empty_keyword(self):
786 with self.assertRaisesRegex(TypeError,
787 "'' is an invalid keyword argument for this function"):
788 self.getargs(1, 2, **{'': 666})
789
790
Victor Stinner06e49dd2010-06-13 18:21:50 +0000791class Bytes_TestCase(unittest.TestCase):
Eli Bendersky906b88f2011-07-29 07:05:08 +0300792 def test_c(self):
793 from _testcapi import getargs_c
794 self.assertRaises(TypeError, getargs_c, b'abc') # len > 1
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200795 self.assertEqual(getargs_c(b'a'), 97)
796 self.assertEqual(getargs_c(bytearray(b'a')), 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300797 self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
798 self.assertRaises(TypeError, getargs_c, 's')
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200799 self.assertRaises(TypeError, getargs_c, 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300800 self.assertRaises(TypeError, getargs_c, None)
801
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200802 def test_y(self):
803 from _testcapi import getargs_y
804 self.assertRaises(TypeError, getargs_y, 'abc\xe9')
805 self.assertEqual(getargs_y(b'bytes'), b'bytes')
806 self.assertRaises(ValueError, getargs_y, b'nul:\0')
807 self.assertRaises(TypeError, getargs_y, bytearray(b'bytearray'))
808 self.assertRaises(TypeError, getargs_y, memoryview(b'memoryview'))
809 self.assertRaises(TypeError, getargs_y, None)
810
811 def test_y_star(self):
812 from _testcapi import getargs_y_star
813 self.assertRaises(TypeError, getargs_y_star, 'abc\xe9')
814 self.assertEqual(getargs_y_star(b'bytes'), b'bytes')
815 self.assertEqual(getargs_y_star(b'nul:\0'), b'nul:\0')
816 self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
817 self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
818 self.assertRaises(TypeError, getargs_y_star, None)
819
820 def test_y_hash(self):
821 from _testcapi import getargs_y_hash
822 self.assertRaises(TypeError, getargs_y_hash, 'abc\xe9')
823 self.assertEqual(getargs_y_hash(b'bytes'), b'bytes')
824 self.assertEqual(getargs_y_hash(b'nul:\0'), b'nul:\0')
825 self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
826 self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
827 self.assertRaises(TypeError, getargs_y_hash, None)
828
829 def test_w_star(self):
830 # getargs_w_star() modifies first and last byte
831 from _testcapi import getargs_w_star
832 self.assertRaises(TypeError, getargs_w_star, 'abc\xe9')
833 self.assertRaises(TypeError, getargs_w_star, b'bytes')
834 self.assertRaises(TypeError, getargs_w_star, b'nul:\0')
835 self.assertRaises(TypeError, getargs_w_star, memoryview(b'bytes'))
836 buf = bytearray(b'bytearray')
837 self.assertEqual(getargs_w_star(buf), b'[ytearra]')
838 self.assertEqual(buf, bytearray(b'[ytearra]'))
839 buf = bytearray(b'memoryview')
840 self.assertEqual(getargs_w_star(memoryview(buf)), b'[emoryvie]')
841 self.assertEqual(buf, bytearray(b'[emoryvie]'))
842 self.assertRaises(TypeError, getargs_w_star, None)
843
844
845class String_TestCase(unittest.TestCase):
846 def test_C(self):
847 from _testcapi import getargs_C
848 self.assertRaises(TypeError, getargs_C, 'abc') # len > 1
849 self.assertEqual(getargs_C('a'), 97)
850 self.assertEqual(getargs_C('\u20ac'), 0x20ac)
851 self.assertEqual(getargs_C('\U0001f40d'), 0x1f40d)
852 self.assertRaises(TypeError, getargs_C, b'a')
853 self.assertRaises(TypeError, getargs_C, bytearray(b'a'))
854 self.assertRaises(TypeError, getargs_C, memoryview(b'a'))
855 self.assertRaises(TypeError, getargs_C, 97)
856 self.assertRaises(TypeError, getargs_C, None)
857
Victor Stinner06e49dd2010-06-13 18:21:50 +0000858 def test_s(self):
859 from _testcapi import getargs_s
860 self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300861 self.assertRaises(ValueError, getargs_s, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000862 self.assertRaises(TypeError, getargs_s, b'bytes')
863 self.assertRaises(TypeError, getargs_s, bytearray(b'bytearray'))
864 self.assertRaises(TypeError, getargs_s, memoryview(b'memoryview'))
865 self.assertRaises(TypeError, getargs_s, None)
866
867 def test_s_star(self):
868 from _testcapi import getargs_s_star
869 self.assertEqual(getargs_s_star('abc\xe9'), b'abc\xc3\xa9')
870 self.assertEqual(getargs_s_star('nul:\0'), b'nul:\0')
871 self.assertEqual(getargs_s_star(b'bytes'), b'bytes')
872 self.assertEqual(getargs_s_star(bytearray(b'bytearray')), b'bytearray')
873 self.assertEqual(getargs_s_star(memoryview(b'memoryview')), b'memoryview')
874 self.assertRaises(TypeError, getargs_s_star, None)
875
876 def test_s_hash(self):
877 from _testcapi import getargs_s_hash
878 self.assertEqual(getargs_s_hash('abc\xe9'), b'abc\xc3\xa9')
879 self.assertEqual(getargs_s_hash('nul:\0'), b'nul:\0')
880 self.assertEqual(getargs_s_hash(b'bytes'), b'bytes')
881 self.assertRaises(TypeError, getargs_s_hash, bytearray(b'bytearray'))
882 self.assertRaises(TypeError, getargs_s_hash, memoryview(b'memoryview'))
883 self.assertRaises(TypeError, getargs_s_hash, None)
884
885 def test_z(self):
886 from _testcapi import getargs_z
887 self.assertEqual(getargs_z('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300888 self.assertRaises(ValueError, getargs_z, 'nul:\0')
Victor Stinner4aae1eb2010-06-24 22:08:25 +0000889 self.assertRaises(TypeError, getargs_z, b'bytes')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000890 self.assertRaises(TypeError, getargs_z, bytearray(b'bytearray'))
891 self.assertRaises(TypeError, getargs_z, memoryview(b'memoryview'))
892 self.assertIsNone(getargs_z(None))
893
894 def test_z_star(self):
895 from _testcapi import getargs_z_star
896 self.assertEqual(getargs_z_star('abc\xe9'), b'abc\xc3\xa9')
897 self.assertEqual(getargs_z_star('nul:\0'), b'nul:\0')
898 self.assertEqual(getargs_z_star(b'bytes'), b'bytes')
899 self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
900 self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
901 self.assertIsNone(getargs_z_star(None))
902
903 def test_z_hash(self):
904 from _testcapi import getargs_z_hash
905 self.assertEqual(getargs_z_hash('abc\xe9'), b'abc\xc3\xa9')
906 self.assertEqual(getargs_z_hash('nul:\0'), b'nul:\0')
907 self.assertEqual(getargs_z_hash(b'bytes'), b'bytes')
908 self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
909 self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
910 self.assertIsNone(getargs_z_hash(None))
911
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200912 def test_es(self):
913 from _testcapi import getargs_es
914 self.assertEqual(getargs_es('abc\xe9'), b'abc\xc3\xa9')
915 self.assertEqual(getargs_es('abc\xe9', 'latin1'), b'abc\xe9')
916 self.assertRaises(UnicodeEncodeError, getargs_es, 'abc\xe9', 'ascii')
917 self.assertRaises(LookupError, getargs_es, 'abc\xe9', 'spam')
918 self.assertRaises(TypeError, getargs_es, b'bytes', 'latin1')
919 self.assertRaises(TypeError, getargs_es, bytearray(b'bytearray'), 'latin1')
920 self.assertRaises(TypeError, getargs_es, memoryview(b'memoryview'), 'latin1')
921 self.assertRaises(TypeError, getargs_es, None, 'latin1')
922 self.assertRaises(TypeError, getargs_es, 'nul:\0', 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000923
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200924 def test_et(self):
925 from _testcapi import getargs_et
926 self.assertEqual(getargs_et('abc\xe9'), b'abc\xc3\xa9')
927 self.assertEqual(getargs_et('abc\xe9', 'latin1'), b'abc\xe9')
928 self.assertRaises(UnicodeEncodeError, getargs_et, 'abc\xe9', 'ascii')
929 self.assertRaises(LookupError, getargs_et, 'abc\xe9', 'spam')
930 self.assertEqual(getargs_et(b'bytes', 'latin1'), b'bytes')
931 self.assertEqual(getargs_et(bytearray(b'bytearray'), 'latin1'), b'bytearray')
932 self.assertRaises(TypeError, getargs_et, memoryview(b'memoryview'), 'latin1')
933 self.assertRaises(TypeError, getargs_et, None, 'latin1')
934 self.assertRaises(TypeError, getargs_et, 'nul:\0', 'latin1')
935 self.assertRaises(TypeError, getargs_et, b'nul:\0', 'latin1')
936 self.assertRaises(TypeError, getargs_et, bytearray(b'nul:\0'), 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000937
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200938 def test_es_hash(self):
939 from _testcapi import getargs_es_hash
940 self.assertEqual(getargs_es_hash('abc\xe9'), b'abc\xc3\xa9')
941 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1'), b'abc\xe9')
942 self.assertRaises(UnicodeEncodeError, getargs_es_hash, 'abc\xe9', 'ascii')
943 self.assertRaises(LookupError, getargs_es_hash, 'abc\xe9', 'spam')
944 self.assertRaises(TypeError, getargs_es_hash, b'bytes', 'latin1')
945 self.assertRaises(TypeError, getargs_es_hash, bytearray(b'bytearray'), 'latin1')
946 self.assertRaises(TypeError, getargs_es_hash, memoryview(b'memoryview'), 'latin1')
947 self.assertRaises(TypeError, getargs_es_hash, None, 'latin1')
948 self.assertEqual(getargs_es_hash('nul:\0', 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000949
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200950 buf = bytearray(b'x'*8)
951 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
952 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
953 buf = bytearray(b'x'*5)
954 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
955 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
956 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200957 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200958 self.assertEqual(buf, bytearray(b'x'*4))
959 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200960 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Victor Stinner25e8ec42010-06-25 00:02:38 +0000961
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200962 def test_et_hash(self):
963 from _testcapi import getargs_et_hash
964 self.assertEqual(getargs_et_hash('abc\xe9'), b'abc\xc3\xa9')
965 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1'), b'abc\xe9')
966 self.assertRaises(UnicodeEncodeError, getargs_et_hash, 'abc\xe9', 'ascii')
967 self.assertRaises(LookupError, getargs_et_hash, 'abc\xe9', 'spam')
968 self.assertEqual(getargs_et_hash(b'bytes', 'latin1'), b'bytes')
969 self.assertEqual(getargs_et_hash(bytearray(b'bytearray'), 'latin1'), b'bytearray')
970 self.assertRaises(TypeError, getargs_et_hash, memoryview(b'memoryview'), 'latin1')
971 self.assertRaises(TypeError, getargs_et_hash, None, 'latin1')
972 self.assertEqual(getargs_et_hash('nul:\0', 'latin1'), b'nul:\0')
973 self.assertEqual(getargs_et_hash(b'nul:\0', 'latin1'), b'nul:\0')
974 self.assertEqual(getargs_et_hash(bytearray(b'nul:\0'), 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000975
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200976 buf = bytearray(b'x'*8)
977 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
978 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
979 buf = bytearray(b'x'*5)
980 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
981 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
982 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200983 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200984 self.assertEqual(buf, bytearray(b'x'*4))
985 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200986 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200987
Victor Stinner06e49dd2010-06-13 18:21:50 +0000988 def test_u(self):
989 from _testcapi import getargs_u
990 self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300991 self.assertRaises(ValueError, getargs_u, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000992 self.assertRaises(TypeError, getargs_u, b'bytes')
993 self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
994 self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
995 self.assertRaises(TypeError, getargs_u, None)
996
997 def test_u_hash(self):
998 from _testcapi import getargs_u_hash
999 self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
1000 self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
1001 self.assertRaises(TypeError, getargs_u_hash, b'bytes')
1002 self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
1003 self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
1004 self.assertRaises(TypeError, getargs_u_hash, None)
1005
1006 def test_Z(self):
1007 from _testcapi import getargs_Z
1008 self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001009 self.assertRaises(ValueError, getargs_Z, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +00001010 self.assertRaises(TypeError, getargs_Z, b'bytes')
1011 self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
1012 self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
1013 self.assertIsNone(getargs_Z(None))
1014
1015 def test_Z_hash(self):
1016 from _testcapi import getargs_Z_hash
1017 self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
1018 self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
1019 self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
1020 self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
1021 self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
1022 self.assertIsNone(getargs_Z_hash(None))
1023
1024
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001025class Object_TestCase(unittest.TestCase):
1026 def test_S(self):
1027 from _testcapi import getargs_S
1028 obj = b'bytes'
1029 self.assertIs(getargs_S(obj), obj)
1030 self.assertRaises(TypeError, getargs_S, bytearray(b'bytearray'))
1031 self.assertRaises(TypeError, getargs_S, 'str')
1032 self.assertRaises(TypeError, getargs_S, None)
1033 self.assertRaises(TypeError, getargs_S, memoryview(obj))
1034
1035 def test_Y(self):
1036 from _testcapi import getargs_Y
1037 obj = bytearray(b'bytearray')
1038 self.assertIs(getargs_Y(obj), obj)
1039 self.assertRaises(TypeError, getargs_Y, b'bytes')
1040 self.assertRaises(TypeError, getargs_Y, 'str')
1041 self.assertRaises(TypeError, getargs_Y, None)
1042 self.assertRaises(TypeError, getargs_Y, memoryview(obj))
1043
1044 def test_U(self):
1045 from _testcapi import getargs_U
1046 obj = 'str'
1047 self.assertIs(getargs_U(obj), obj)
1048 self.assertRaises(TypeError, getargs_U, b'bytes')
1049 self.assertRaises(TypeError, getargs_U, bytearray(b'bytearray'))
1050 self.assertRaises(TypeError, getargs_U, None)
1051
1052
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001053# Bug #6012
1054class Test6012(unittest.TestCase):
1055 def test(self):
1056 self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
1057
1058
1059class SkipitemTest(unittest.TestCase):
1060
1061 def test_skipitem(self):
1062 """
1063 If this test failed, you probably added a new "format unit"
1064 in Python/getargs.c, but neglected to update our poor friend
1065 skipitem() in the same file. (If so, shame on you!)
1066
1067 With a few exceptions**, this function brute-force tests all
1068 printable ASCII*** characters (32 to 126 inclusive) as format units,
1069 checking to see that PyArg_ParseTupleAndKeywords() return consistent
1070 errors both when the unit is attempted to be used and when it is
1071 skipped. If the format unit doesn't exist, we'll get one of two
1072 specific error messages (one for used, one for skipped); if it does
1073 exist we *won't* get that error--we'll get either no error or some
1074 other error. If we get the specific "does not exist" error for one
1075 test and not for the other, there's a mismatch, and the test fails.
1076
1077 ** Some format units have special funny semantics and it would
1078 be difficult to accommodate them here. Since these are all
1079 well-established and properly skipped in skipitem() we can
1080 get away with not testing them--this test is really intended
1081 to catch *new* format units.
1082
1083 *** Python C source files must be ASCII. Therefore it's impossible
1084 to have non-ASCII format units.
1085
1086 """
1087 empty_tuple = ()
1088 tuple_1 = (0,)
1089 dict_b = {'b':1}
1090 keywords = ["a", "b"]
1091
1092 for i in range(32, 127):
1093 c = chr(i)
1094
1095 # skip parentheses, the error reporting is inconsistent about them
1096 # skip 'e', it's always a two-character code
1097 # skip '|' and '$', they don't represent arguments anyway
1098 if c in '()e|$':
1099 continue
1100
1101 # test the format unit when not skipped
1102 format = c + "i"
1103 try:
1104 _testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
1105 format, keywords)
1106 when_not_skipped = False
1107 except SystemError as e:
1108 s = "argument 1 (impossible<bad format char>)"
1109 when_not_skipped = (str(e) == s)
1110 except TypeError:
1111 when_not_skipped = False
1112
1113 # test the format unit when skipped
1114 optional_format = "|" + format
1115 try:
1116 _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b,
1117 optional_format, keywords)
1118 when_skipped = False
1119 except SystemError as e:
1120 s = "impossible<bad format char>: '{}'".format(format)
1121 when_skipped = (str(e) == s)
1122
1123 message = ("test_skipitem_parity: "
1124 "detected mismatch between convertsimple and skipitem "
1125 "for format unit '{}' ({}), not skipped {}, skipped {}".format(
1126 c, i, when_skipped, when_not_skipped))
1127 self.assertIs(when_skipped, when_not_skipped, message)
1128
1129 def test_skipitem_with_suffix(self):
1130 parse = _testcapi.parse_tuple_and_keywords
1131 empty_tuple = ()
1132 tuple_1 = (0,)
1133 dict_b = {'b':1}
1134 keywords = ["a", "b"]
1135
1136 supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*')
1137 for c in string.ascii_letters:
1138 for c2 in '#*':
1139 f = c + c2
1140 with self.subTest(format=f):
1141 optional_format = "|" + f + "i"
1142 if f in supported:
1143 parse(empty_tuple, dict_b, optional_format, keywords)
1144 else:
1145 with self.assertRaisesRegex(SystemError,
1146 'impossible<bad format char>'):
1147 parse(empty_tuple, dict_b, optional_format, keywords)
1148
1149 for c in map(chr, range(32, 128)):
1150 f = 'e' + c
1151 optional_format = "|" + f + "i"
1152 with self.subTest(format=f):
1153 if c in 'st':
1154 parse(empty_tuple, dict_b, optional_format, keywords)
1155 else:
1156 with self.assertRaisesRegex(SystemError,
1157 'impossible<bad format char>'):
1158 parse(empty_tuple, dict_b, optional_format, keywords)
1159
1160
1161class ParseTupleAndKeywords_Test(unittest.TestCase):
1162
1163 def test_parse_tuple_and_keywords(self):
1164 # Test handling errors in the parse_tuple_and_keywords helper itself
1165 self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords,
1166 (), {}, 42, [])
1167 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1168 (), {}, '', 42)
1169 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1170 (), {}, '', [''] * 42)
1171 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1172 (), {}, '', [42])
1173
1174 def test_bad_use(self):
1175 # Test handling invalid format and keywords in
1176 # PyArg_ParseTupleAndKeywords()
1177 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1178 (1,), {}, '||O', ['a'])
1179 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1180 (1, 2), {}, '|O|O', ['a', 'b'])
1181 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1182 (), {'a': 1}, '$$O', ['a'])
1183 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1184 (), {'a': 1, 'b': 2}, '$O$O', ['a', 'b'])
1185 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1186 (), {'a': 1}, '$|O', ['a'])
1187 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1188 (), {'a': 1, 'b': 2}, '$O|O', ['a', 'b'])
1189 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1190 (1,), {}, '|O', ['a', 'b'])
1191 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1192 (1,), {}, '|OO', ['a'])
1193 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1194 (), {}, '|$O', [''])
1195 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1196 (), {}, '|OO', ['a', ''])
1197
1198 def test_positional_only(self):
1199 parse = _testcapi.parse_tuple_and_keywords
1200
1201 parse((1, 2, 3), {}, 'OOO', ['', '', 'a'])
1202 parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a'])
1203 with self.assertRaisesRegex(TypeError,
1204 r'function takes at least 2 positional arguments \(1 given\)'):
1205 parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
1206 parse((1,), {}, 'O|OO', ['', '', 'a'])
1207 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301208 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001209 parse((), {}, 'O|OO', ['', '', 'a'])
1210 parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
1211 with self.assertRaisesRegex(TypeError,
1212 r'function takes exactly 2 positional arguments \(1 given\)'):
1213 parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
1214 parse((1,), {}, 'O|O$O', ['', '', 'a'])
1215 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301216 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001217 parse((), {}, 'O|O$O', ['', '', 'a'])
1218 with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'):
1219 parse((1,), {}, 'O|$OO', ['', '', 'a'])
1220 with self.assertRaisesRegex(SystemError, 'Empty keyword'):
1221 parse((1,), {}, 'O|OO', ['', 'a', ''])
1222
1223
1224class Test_testcapi(unittest.TestCase):
1225 locals().update((name, getattr(_testcapi, name))
1226 for name in dir(_testcapi)
1227 if name.startswith('test_') and name.endswith('_code'))
1228
1229
Thomas Hellera4ea6032003-04-17 18:55:45 +00001230if __name__ == "__main__":
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001231 unittest.main()