blob: d39ea56ae9e9ca89258e420c0175ed5df248c5da [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
Hai Shi96a6a6d2020-07-09 21:25:10 +08006from test.support import import_helper
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02007# Skip this test if the _testcapi module isn't available.
Hai Shi96a6a6d2020-07-09 21:25:10 +08008_testcapi = import_helper.import_module('_testcapi')
Larry Hastings83a9f482012-03-20 20:06:16 +00009from _testcapi import getargs_keywords, getargs_keyword_only
Thomas Hellera4ea6032003-04-17 18:55:45 +000010
Victor Stinner765531d2013-03-26 01:11:54 +010011# > How about the following counterproposal. This also changes some of
12# > the other format codes to be a little more regular.
13# >
14# > Code C type Range check
15# >
16# > b unsigned char 0..UCHAR_MAX
17# > h signed short SHRT_MIN..SHRT_MAX
18# > B unsigned char none **
19# > H unsigned short none **
20# > k * unsigned long none
21# > I * unsigned int 0..UINT_MAX
22#
23#
24# > i int INT_MIN..INT_MAX
25# > l long LONG_MIN..LONG_MAX
26#
27# > K * unsigned long long none
28# > L long long LLONG_MIN..LLONG_MAX
29#
30# > Notes:
31# >
32# > * New format codes.
33# >
34# > ** Changed from previous "range-and-a-half" to "none"; the
35# > range-and-a-half checking wasn't particularly useful.
36#
Serhiy Storchaka483405b2015-02-17 10:14:30 +020037# Plus a C API or two, e.g. PyLong_AsUnsignedLongMask() ->
38# unsigned long and PyLong_AsUnsignedLongLongMask() -> unsigned
Victor Stinner765531d2013-03-26 01:11:54 +010039# long long (if that exists).
Thomas Hellera4ea6032003-04-17 18:55:45 +000040
41LARGE = 0x7FFFFFFF
Guido van Rossume2a383d2007-01-15 16:59:06 +000042VERY_LARGE = 0xFF0000121212121212121242
Thomas Hellera4ea6032003-04-17 18:55:45 +000043
44from _testcapi import UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, INT_MAX, \
Mark Dickinson1554b182009-12-20 16:03:30 +000045 INT_MIN, LONG_MIN, LONG_MAX, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX, \
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030046 SHRT_MIN, SHRT_MAX, FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX
47
48DBL_MAX_EXP = sys.float_info.max_exp
49INF = float('inf')
50NAN = float('nan')
Thomas Hellera4ea6032003-04-17 18:55:45 +000051
Thomas Hellera4ea6032003-04-17 18:55:45 +000052# fake, they are not defined in Python's header files
53LLONG_MAX = 2**63-1
54LLONG_MIN = -2**63
55ULLONG_MAX = 2**64-1
56
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +020057class Index:
58 def __index__(self):
59 return 99
60
61class IndexIntSubclass(int):
62 def __index__(self):
63 return 99
64
65class BadIndex:
66 def __index__(self):
67 return 1.0
68
69class BadIndex2:
70 def __index__(self):
71 return True
72
73class BadIndex3(int):
74 def __index__(self):
75 return True
76
77
Thomas Hellera4ea6032003-04-17 18:55:45 +000078class Int:
79 def __int__(self):
80 return 99
81
Serhiy Storchaka31a65542013-12-11 21:07:54 +020082class IntSubclass(int):
83 def __int__(self):
84 return 99
85
86class BadInt:
87 def __int__(self):
88 return 1.0
89
90class BadInt2:
91 def __int__(self):
92 return True
93
94class BadInt3(int):
95 def __int__(self):
96 return True
97
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030098
99class Float:
100 def __float__(self):
101 return 4.25
102
103class FloatSubclass(float):
104 pass
105
106class FloatSubclass2(float):
107 def __float__(self):
108 return 4.25
109
110class BadFloat:
111 def __float__(self):
112 return 687
113
114class BadFloat2:
115 def __float__(self):
116 return FloatSubclass(4.25)
117
118class BadFloat3(float):
119 def __float__(self):
120 return FloatSubclass(4.25)
121
122
123class Complex:
124 def __complex__(self):
125 return 4.25+0.5j
126
127class ComplexSubclass(complex):
128 pass
129
130class ComplexSubclass2(complex):
131 def __complex__(self):
132 return 4.25+0.5j
133
134class BadComplex:
135 def __complex__(self):
136 return 1.25
137
138class BadComplex2:
139 def __complex__(self):
140 return ComplexSubclass(4.25+0.5j)
141
142class BadComplex3(complex):
143 def __complex__(self):
144 return ComplexSubclass(4.25+0.5j)
145
146
Serhiy Storchakace412872016-05-08 23:36:44 +0300147class TupleSubclass(tuple):
148 pass
149
150class DictSubclass(dict):
151 pass
152
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200153
Thomas Hellera4ea6032003-04-17 18:55:45 +0000154class Unsigned_TestCase(unittest.TestCase):
155 def test_b(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000156 from _testcapi import getargs_b
Thomas Hellera4ea6032003-04-17 18:55:45 +0000157 # b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000158 self.assertRaises(TypeError, getargs_b, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200159 self.assertEqual(99, getargs_b(Index()))
160 self.assertEqual(0, getargs_b(IndexIntSubclass()))
161 self.assertRaises(TypeError, getargs_b, BadIndex())
162 with self.assertWarns(DeprecationWarning):
163 self.assertEqual(1, getargs_b(BadIndex2()))
164 self.assertEqual(0, getargs_b(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300165 self.assertRaises(TypeError, getargs_b, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200166 self.assertEqual(0, getargs_b(IntSubclass()))
167 self.assertRaises(TypeError, getargs_b, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300168 self.assertRaises(TypeError, getargs_b, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200169 self.assertEqual(0, getargs_b(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000170
Thomas Heller54aa5782003-04-24 16:15:29 +0000171 self.assertRaises(OverflowError, getargs_b, -1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000172 self.assertEqual(0, getargs_b(0))
173 self.assertEqual(UCHAR_MAX, getargs_b(UCHAR_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000174 self.assertRaises(OverflowError, getargs_b, UCHAR_MAX + 1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000175
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000176 self.assertEqual(42, getargs_b(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000177 self.assertRaises(OverflowError, getargs_b, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000178
Thomas Hellera4ea6032003-04-17 18:55:45 +0000179 def test_B(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000180 from _testcapi import getargs_B
Thomas Hellera4ea6032003-04-17 18:55:45 +0000181 # B returns 'unsigned char', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000182 self.assertRaises(TypeError, getargs_B, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200183 self.assertEqual(99, getargs_B(Index()))
184 self.assertEqual(0, getargs_B(IndexIntSubclass()))
185 self.assertRaises(TypeError, getargs_B, BadIndex())
186 with self.assertWarns(DeprecationWarning):
187 self.assertEqual(1, getargs_B(BadIndex2()))
188 self.assertEqual(0, getargs_B(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300189 self.assertRaises(TypeError, getargs_B, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200190 self.assertEqual(0, getargs_B(IntSubclass()))
191 self.assertRaises(TypeError, getargs_B, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300192 self.assertRaises(TypeError, getargs_B, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200193 self.assertEqual(0, getargs_B(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000194
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000195 self.assertEqual(UCHAR_MAX, getargs_B(-1))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000196 self.assertEqual(0, getargs_B(0))
197 self.assertEqual(UCHAR_MAX, getargs_B(UCHAR_MAX))
198 self.assertEqual(0, getargs_B(UCHAR_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000199
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000200 self.assertEqual(42, getargs_B(42))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000201 self.assertEqual(UCHAR_MAX & VERY_LARGE, getargs_B(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000202
203 def test_H(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000204 from _testcapi import getargs_H
Thomas Hellera4ea6032003-04-17 18:55:45 +0000205 # H returns 'unsigned short', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000206 self.assertRaises(TypeError, getargs_H, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200207 self.assertEqual(99, getargs_H(Index()))
208 self.assertEqual(0, getargs_H(IndexIntSubclass()))
209 self.assertRaises(TypeError, getargs_H, BadIndex())
210 with self.assertWarns(DeprecationWarning):
211 self.assertEqual(1, getargs_H(BadIndex2()))
212 self.assertEqual(0, getargs_H(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300213 self.assertRaises(TypeError, getargs_H, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200214 self.assertEqual(0, getargs_H(IntSubclass()))
215 self.assertRaises(TypeError, getargs_H, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300216 self.assertRaises(TypeError, getargs_H, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200217 self.assertEqual(0, getargs_H(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000218
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000219 self.assertEqual(USHRT_MAX, getargs_H(-1))
220 self.assertEqual(0, getargs_H(0))
221 self.assertEqual(USHRT_MAX, getargs_H(USHRT_MAX))
222 self.assertEqual(0, getargs_H(USHRT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000223
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000224 self.assertEqual(42, getargs_H(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000225
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000226 self.assertEqual(VERY_LARGE & USHRT_MAX, getargs_H(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000227
228 def test_I(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000229 from _testcapi import getargs_I
Thomas Hellera4ea6032003-04-17 18:55:45 +0000230 # I returns 'unsigned int', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000231 self.assertRaises(TypeError, getargs_I, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200232 self.assertEqual(99, getargs_I(Index()))
233 self.assertEqual(0, getargs_I(IndexIntSubclass()))
234 self.assertRaises(TypeError, getargs_I, BadIndex())
235 with self.assertWarns(DeprecationWarning):
236 self.assertEqual(1, getargs_I(BadIndex2()))
237 self.assertEqual(0, getargs_I(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300238 self.assertRaises(TypeError, getargs_I, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200239 self.assertEqual(0, getargs_I(IntSubclass()))
240 self.assertRaises(TypeError, getargs_I, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300241 self.assertRaises(TypeError, getargs_I, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200242 self.assertEqual(0, getargs_I(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000243
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000244 self.assertEqual(UINT_MAX, getargs_I(-1))
245 self.assertEqual(0, getargs_I(0))
246 self.assertEqual(UINT_MAX, getargs_I(UINT_MAX))
247 self.assertEqual(0, getargs_I(UINT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000248
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000249 self.assertEqual(42, getargs_I(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000250
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000251 self.assertEqual(VERY_LARGE & UINT_MAX, getargs_I(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000252
253 def test_k(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000254 from _testcapi import getargs_k
Thomas Hellera4ea6032003-04-17 18:55:45 +0000255 # k returns 'unsigned long', no range checking
256 # it does not accept float, or instances with __int__
Thomas Heller54aa5782003-04-24 16:15:29 +0000257 self.assertRaises(TypeError, getargs_k, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200258 self.assertRaises(TypeError, getargs_k, Index())
259 self.assertEqual(0, getargs_k(IndexIntSubclass()))
260 self.assertRaises(TypeError, getargs_k, BadIndex())
261 self.assertRaises(TypeError, getargs_k, BadIndex2())
262 self.assertEqual(0, getargs_k(BadIndex3()))
Thomas Heller54aa5782003-04-24 16:15:29 +0000263 self.assertRaises(TypeError, getargs_k, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200264 self.assertEqual(0, getargs_k(IntSubclass()))
265 self.assertRaises(TypeError, getargs_k, BadInt())
266 self.assertRaises(TypeError, getargs_k, BadInt2())
267 self.assertEqual(0, getargs_k(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000268
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000269 self.assertEqual(ULONG_MAX, getargs_k(-1))
270 self.assertEqual(0, getargs_k(0))
271 self.assertEqual(ULONG_MAX, getargs_k(ULONG_MAX))
272 self.assertEqual(0, getargs_k(ULONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000273
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000274 self.assertEqual(42, getargs_k(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000275
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000276 self.assertEqual(VERY_LARGE & ULONG_MAX, getargs_k(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000277
278class Signed_TestCase(unittest.TestCase):
Mark Dickinson1554b182009-12-20 16:03:30 +0000279 def test_h(self):
280 from _testcapi import getargs_h
281 # h returns 'short', and does range checking (SHRT_MIN ... SHRT_MAX)
282 self.assertRaises(TypeError, getargs_h, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200283 self.assertEqual(99, getargs_h(Index()))
284 self.assertEqual(0, getargs_h(IndexIntSubclass()))
285 self.assertRaises(TypeError, getargs_h, BadIndex())
286 with self.assertWarns(DeprecationWarning):
287 self.assertEqual(1, getargs_h(BadIndex2()))
288 self.assertEqual(0, getargs_h(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300289 self.assertRaises(TypeError, getargs_h, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200290 self.assertEqual(0, getargs_h(IntSubclass()))
291 self.assertRaises(TypeError, getargs_h, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300292 self.assertRaises(TypeError, getargs_h, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200293 self.assertEqual(0, getargs_h(BadInt3()))
Mark Dickinson1554b182009-12-20 16:03:30 +0000294
295 self.assertRaises(OverflowError, getargs_h, SHRT_MIN-1)
296 self.assertEqual(SHRT_MIN, getargs_h(SHRT_MIN))
297 self.assertEqual(SHRT_MAX, getargs_h(SHRT_MAX))
298 self.assertRaises(OverflowError, getargs_h, SHRT_MAX+1)
299
300 self.assertEqual(42, getargs_h(42))
301 self.assertRaises(OverflowError, getargs_h, VERY_LARGE)
302
Thomas Hellera4ea6032003-04-17 18:55:45 +0000303 def test_i(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000304 from _testcapi import getargs_i
Thomas Hellera4ea6032003-04-17 18:55:45 +0000305 # i returns 'int', and does range checking (INT_MIN ... INT_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000306 self.assertRaises(TypeError, getargs_i, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200307 self.assertEqual(99, getargs_i(Index()))
308 self.assertEqual(0, getargs_i(IndexIntSubclass()))
309 self.assertRaises(TypeError, getargs_i, BadIndex())
310 with self.assertWarns(DeprecationWarning):
311 self.assertEqual(1, getargs_i(BadIndex2()))
312 self.assertEqual(0, getargs_i(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300313 self.assertRaises(TypeError, getargs_i, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200314 self.assertEqual(0, getargs_i(IntSubclass()))
315 self.assertRaises(TypeError, getargs_i, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300316 self.assertRaises(TypeError, getargs_i, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200317 self.assertEqual(0, getargs_i(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000318
Thomas Heller54aa5782003-04-24 16:15:29 +0000319 self.assertRaises(OverflowError, getargs_i, INT_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000320 self.assertEqual(INT_MIN, getargs_i(INT_MIN))
321 self.assertEqual(INT_MAX, getargs_i(INT_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000322 self.assertRaises(OverflowError, getargs_i, INT_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000323
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000324 self.assertEqual(42, getargs_i(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000325 self.assertRaises(OverflowError, getargs_i, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000326
327 def test_l(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000328 from _testcapi import getargs_l
Thomas Hellera4ea6032003-04-17 18:55:45 +0000329 # l returns 'long', and does range checking (LONG_MIN ... LONG_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000330 self.assertRaises(TypeError, getargs_l, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200331 self.assertEqual(99, getargs_l(Index()))
332 self.assertEqual(0, getargs_l(IndexIntSubclass()))
333 self.assertRaises(TypeError, getargs_l, BadIndex())
334 with self.assertWarns(DeprecationWarning):
335 self.assertEqual(1, getargs_l(BadIndex2()))
336 self.assertEqual(0, getargs_l(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300337 self.assertRaises(TypeError, getargs_l, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200338 self.assertEqual(0, getargs_l(IntSubclass()))
339 self.assertRaises(TypeError, getargs_l, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300340 self.assertRaises(TypeError, getargs_l, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200341 self.assertEqual(0, getargs_l(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000342
Thomas Heller54aa5782003-04-24 16:15:29 +0000343 self.assertRaises(OverflowError, getargs_l, LONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000344 self.assertEqual(LONG_MIN, getargs_l(LONG_MIN))
345 self.assertEqual(LONG_MAX, getargs_l(LONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000346 self.assertRaises(OverflowError, getargs_l, LONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000347
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000348 self.assertEqual(42, getargs_l(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000349 self.assertRaises(OverflowError, getargs_l, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000350
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000351 def test_n(self):
352 from _testcapi import getargs_n
353 # n returns 'Py_ssize_t', and does range checking
354 # (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX)
Thomas Woutersd8073282006-04-21 11:36:13 +0000355 self.assertRaises(TypeError, getargs_n, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200356 self.assertEqual(99, getargs_n(Index()))
357 self.assertEqual(0, getargs_n(IndexIntSubclass()))
358 self.assertRaises(TypeError, getargs_n, BadIndex())
359 with self.assertWarns(DeprecationWarning):
360 self.assertEqual(1, getargs_n(BadIndex2()))
361 self.assertEqual(0, getargs_n(BadIndex3()))
Trent Nelson35133582008-04-22 19:02:40 +0000362 self.assertRaises(TypeError, getargs_n, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200363 self.assertEqual(0, getargs_n(IntSubclass()))
364 self.assertRaises(TypeError, getargs_n, BadInt())
365 self.assertRaises(TypeError, getargs_n, BadInt2())
366 self.assertEqual(0, getargs_n(BadInt3()))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000367
368 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000369 self.assertEqual(PY_SSIZE_T_MIN, getargs_n(PY_SSIZE_T_MIN))
370 self.assertEqual(PY_SSIZE_T_MAX, getargs_n(PY_SSIZE_T_MAX))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000371 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MAX+1)
372
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000373 self.assertEqual(42, getargs_n(42))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000374 self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
375
Thomas Hellera4ea6032003-04-17 18:55:45 +0000376
377class LongLong_TestCase(unittest.TestCase):
378 def test_L(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000379 from _testcapi import getargs_L
Mark Dickinsonde604012010-01-01 19:27:32 +0000380 # L returns 'long long', and does range checking (LLONG_MIN
381 # ... LLONG_MAX)
Mark Dickinsonc7301312010-06-10 16:05:10 +0000382 self.assertRaises(TypeError, getargs_L, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000383 self.assertRaises(TypeError, getargs_L, "Hello")
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200384 self.assertEqual(99, getargs_L(Index()))
385 self.assertEqual(0, getargs_L(IndexIntSubclass()))
386 self.assertRaises(TypeError, getargs_L, BadIndex())
387 with self.assertWarns(DeprecationWarning):
388 self.assertEqual(1, getargs_L(BadIndex2()))
389 self.assertEqual(0, getargs_L(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300390 self.assertRaises(TypeError, getargs_L, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200391 self.assertEqual(0, getargs_L(IntSubclass()))
392 self.assertRaises(TypeError, getargs_L, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300393 self.assertRaises(TypeError, getargs_L, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200394 self.assertEqual(0, getargs_L(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000395
Thomas Heller54aa5782003-04-24 16:15:29 +0000396 self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000397 self.assertEqual(LLONG_MIN, getargs_L(LLONG_MIN))
398 self.assertEqual(LLONG_MAX, getargs_L(LLONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000399 self.assertRaises(OverflowError, getargs_L, LLONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000400
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000401 self.assertEqual(42, getargs_L(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000402 self.assertRaises(OverflowError, getargs_L, VERY_LARGE)
Tim Peters0eadaac2003-04-24 16:02:54 +0000403
Thomas Hellera4ea6032003-04-17 18:55:45 +0000404 def test_K(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000405 from _testcapi import getargs_K
Thomas Hellera4ea6032003-04-17 18:55:45 +0000406 # K return 'unsigned long long', no range checking
Thomas Heller54aa5782003-04-24 16:15:29 +0000407 self.assertRaises(TypeError, getargs_K, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200408 self.assertRaises(TypeError, getargs_K, Index())
409 self.assertEqual(0, getargs_K(IndexIntSubclass()))
410 self.assertRaises(TypeError, getargs_K, BadIndex())
411 self.assertRaises(TypeError, getargs_K, BadIndex2())
412 self.assertEqual(0, getargs_K(BadIndex3()))
Thomas Heller54aa5782003-04-24 16:15:29 +0000413 self.assertRaises(TypeError, getargs_K, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200414 self.assertEqual(0, getargs_K(IntSubclass()))
415 self.assertRaises(TypeError, getargs_K, BadInt())
416 self.assertRaises(TypeError, getargs_K, BadInt2())
417 self.assertEqual(0, getargs_K(BadInt3()))
418
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000419 self.assertEqual(ULLONG_MAX, getargs_K(ULLONG_MAX))
420 self.assertEqual(0, getargs_K(0))
421 self.assertEqual(0, getargs_K(ULLONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000422
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000423 self.assertEqual(42, getargs_K(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000424
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000425 self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000426
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300427
428class Float_TestCase(unittest.TestCase):
429 def assertEqualWithSign(self, actual, expected):
430 self.assertEqual(actual, expected)
431 self.assertEqual(math.copysign(1, actual), math.copysign(1, expected))
432
433 def test_f(self):
434 from _testcapi import getargs_f
435 self.assertEqual(getargs_f(4.25), 4.25)
436 self.assertEqual(getargs_f(4), 4.0)
437 self.assertRaises(TypeError, getargs_f, 4.25+0j)
438 self.assertEqual(getargs_f(Float()), 4.25)
439 self.assertEqual(getargs_f(FloatSubclass(7.5)), 7.5)
440 self.assertEqual(getargs_f(FloatSubclass2(7.5)), 7.5)
441 self.assertRaises(TypeError, getargs_f, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300442 with self.assertWarns(DeprecationWarning):
443 self.assertEqual(getargs_f(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300444 self.assertEqual(getargs_f(BadFloat3(7.5)), 7.5)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300445 self.assertEqual(getargs_f(Index()), 99.0)
446 self.assertRaises(TypeError, getargs_f, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300447
448 for x in (FLT_MIN, -FLT_MIN, FLT_MAX, -FLT_MAX, INF, -INF):
449 self.assertEqual(getargs_f(x), x)
450 if FLT_MAX < DBL_MAX:
451 self.assertEqual(getargs_f(DBL_MAX), INF)
452 self.assertEqual(getargs_f(-DBL_MAX), -INF)
453 if FLT_MIN > DBL_MIN:
454 self.assertEqualWithSign(getargs_f(DBL_MIN), 0.0)
455 self.assertEqualWithSign(getargs_f(-DBL_MIN), -0.0)
456 self.assertEqualWithSign(getargs_f(0.0), 0.0)
457 self.assertEqualWithSign(getargs_f(-0.0), -0.0)
458 r = getargs_f(NAN)
459 self.assertNotEqual(r, r)
460
Benjamin Peterson2bb69a52017-09-10 23:50:46 -0700461 @support.requires_IEEE_754
462 def test_f_rounding(self):
463 from _testcapi import getargs_f
464 self.assertEqual(getargs_f(3.40282356e38), FLT_MAX)
465 self.assertEqual(getargs_f(-3.40282356e38), -FLT_MAX)
466
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300467 def test_d(self):
468 from _testcapi import getargs_d
469 self.assertEqual(getargs_d(4.25), 4.25)
470 self.assertEqual(getargs_d(4), 4.0)
471 self.assertRaises(TypeError, getargs_d, 4.25+0j)
472 self.assertEqual(getargs_d(Float()), 4.25)
473 self.assertEqual(getargs_d(FloatSubclass(7.5)), 7.5)
474 self.assertEqual(getargs_d(FloatSubclass2(7.5)), 7.5)
475 self.assertRaises(TypeError, getargs_d, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300476 with self.assertWarns(DeprecationWarning):
477 self.assertEqual(getargs_d(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300478 self.assertEqual(getargs_d(BadFloat3(7.5)), 7.5)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300479 self.assertEqual(getargs_d(Index()), 99.0)
480 self.assertRaises(TypeError, getargs_d, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300481
482 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
483 self.assertEqual(getargs_d(x), x)
484 self.assertRaises(OverflowError, getargs_d, 1<<DBL_MAX_EXP)
485 self.assertRaises(OverflowError, getargs_d, -1<<DBL_MAX_EXP)
486 self.assertEqualWithSign(getargs_d(0.0), 0.0)
487 self.assertEqualWithSign(getargs_d(-0.0), -0.0)
488 r = getargs_d(NAN)
489 self.assertNotEqual(r, r)
490
491 def test_D(self):
492 from _testcapi import getargs_D
493 self.assertEqual(getargs_D(4.25+0.5j), 4.25+0.5j)
494 self.assertEqual(getargs_D(4.25), 4.25+0j)
495 self.assertEqual(getargs_D(4), 4.0+0j)
496 self.assertEqual(getargs_D(Complex()), 4.25+0.5j)
497 self.assertEqual(getargs_D(ComplexSubclass(7.5+0.25j)), 7.5+0.25j)
498 self.assertEqual(getargs_D(ComplexSubclass2(7.5+0.25j)), 7.5+0.25j)
499 self.assertRaises(TypeError, getargs_D, BadComplex())
Serhiy Storchaka671079e2017-03-24 21:28:43 +0200500 with self.assertWarns(DeprecationWarning):
501 self.assertEqual(getargs_D(BadComplex2()), 4.25+0.5j)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300502 self.assertEqual(getargs_D(BadComplex3(7.5+0.25j)), 7.5+0.25j)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300503 self.assertEqual(getargs_D(Index()), 99.0+0j)
504 self.assertRaises(TypeError, getargs_D, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300505
506 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
507 c = complex(x, 1.0)
508 self.assertEqual(getargs_D(c), c)
509 c = complex(1.0, x)
510 self.assertEqual(getargs_D(c), c)
511 self.assertEqualWithSign(getargs_D(complex(0.0, 1.0)).real, 0.0)
512 self.assertEqualWithSign(getargs_D(complex(-0.0, 1.0)).real, -0.0)
513 self.assertEqualWithSign(getargs_D(complex(1.0, 0.0)).imag, 0.0)
514 self.assertEqualWithSign(getargs_D(complex(1.0, -0.0)).imag, -0.0)
515
516
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700517class Paradox:
518 "This statement is false."
519 def __bool__(self):
520 raise NotImplementedError
521
522class Boolean_TestCase(unittest.TestCase):
523 def test_p(self):
524 from _testcapi import getargs_p
525 self.assertEqual(0, getargs_p(False))
526 self.assertEqual(0, getargs_p(None))
527 self.assertEqual(0, getargs_p(0))
528 self.assertEqual(0, getargs_p(0.0))
529 self.assertEqual(0, getargs_p(0j))
530 self.assertEqual(0, getargs_p(''))
531 self.assertEqual(0, getargs_p(()))
532 self.assertEqual(0, getargs_p([]))
533 self.assertEqual(0, getargs_p({}))
534
535 self.assertEqual(1, getargs_p(True))
536 self.assertEqual(1, getargs_p(1))
537 self.assertEqual(1, getargs_p(1.0))
538 self.assertEqual(1, getargs_p(1j))
539 self.assertEqual(1, getargs_p('x'))
540 self.assertEqual(1, getargs_p((1,)))
541 self.assertEqual(1, getargs_p([1]))
542 self.assertEqual(1, getargs_p({1:2}))
543 self.assertEqual(1, getargs_p(unittest.TestCase))
544
545 self.assertRaises(NotImplementedError, getargs_p, Paradox())
546
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000547
548class Tuple_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300549 def test_args(self):
550 from _testcapi import get_args
551
552 ret = get_args(1, 2)
553 self.assertEqual(ret, (1, 2))
554 self.assertIs(type(ret), tuple)
555
556 ret = get_args(1, *(2, 3))
557 self.assertEqual(ret, (1, 2, 3))
558 self.assertIs(type(ret), tuple)
559
560 ret = get_args(*[1, 2])
561 self.assertEqual(ret, (1, 2))
562 self.assertIs(type(ret), tuple)
563
564 ret = get_args(*TupleSubclass([1, 2]))
565 self.assertEqual(ret, (1, 2))
Serhiy Storchaka63dc5482016-09-22 19:41:20 +0300566 self.assertIs(type(ret), tuple)
Serhiy Storchakace412872016-05-08 23:36:44 +0300567
568 ret = get_args()
569 self.assertIn(ret, ((), None))
570 self.assertIn(type(ret), (tuple, type(None)))
571
572 ret = get_args(*())
573 self.assertIn(ret, ((), None))
574 self.assertIn(type(ret), (tuple, type(None)))
575
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000576 def test_tuple(self):
577 from _testcapi import getargs_tuple
578
579 ret = getargs_tuple(1, (2, 3))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000580 self.assertEqual(ret, (1,2,3))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000581
582 # make sure invalid tuple arguments are handled correctly
583 class seq:
584 def __len__(self):
585 return 2
586 def __getitem__(self, n):
587 raise ValueError
588 self.assertRaises(TypeError, getargs_tuple, 1, seq())
589
Christian Heimes380f7f22008-02-28 11:19:05 +0000590class Keywords_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300591 def test_kwargs(self):
592 from _testcapi import get_kwargs
593
594 ret = get_kwargs(a=1, b=2)
595 self.assertEqual(ret, {'a': 1, 'b': 2})
596 self.assertIs(type(ret), dict)
597
598 ret = get_kwargs(a=1, **{'b': 2, 'c': 3})
599 self.assertEqual(ret, {'a': 1, 'b': 2, 'c': 3})
600 self.assertIs(type(ret), dict)
601
602 ret = get_kwargs(**DictSubclass({'a': 1, 'b': 2}))
603 self.assertEqual(ret, {'a': 1, 'b': 2})
604 self.assertIs(type(ret), dict)
605
606 ret = get_kwargs()
607 self.assertIn(ret, ({}, None))
608 self.assertIn(type(ret), (dict, type(None)))
609
610 ret = get_kwargs(**{})
611 self.assertIn(ret, ({}, None))
612 self.assertIn(type(ret), (dict, type(None)))
613
Christian Heimes380f7f22008-02-28 11:19:05 +0000614 def test_positional_args(self):
615 # using all positional args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000616 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000617 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), 10),
618 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
619 )
Victor Stinner93b55132010-05-19 00:54:06 +0000620
Christian Heimes380f7f22008-02-28 11:19:05 +0000621 def test_mixed_args(self):
622 # positional and keyword args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000623 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000624 getargs_keywords((1,2), 3, (4,(5,6)), arg4=(7,8,9), arg5=10),
625 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
626 )
Victor Stinner93b55132010-05-19 00:54:06 +0000627
Christian Heimes380f7f22008-02-28 11:19:05 +0000628 def test_keyword_args(self):
629 # all keywords
Ezio Melottib3aedd42010-11-20 19:04:17 +0000630 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000631 getargs_keywords(arg1=(1,2), arg2=3, arg3=(4,(5,6)), arg4=(7,8,9), arg5=10),
632 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
633 )
Victor Stinner93b55132010-05-19 00:54:06 +0000634
Christian Heimes380f7f22008-02-28 11:19:05 +0000635 def test_optional_args(self):
636 # missing optional keyword args, skipping tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000637 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000638 getargs_keywords(arg1=(1,2), arg2=3, arg5=10),
639 (1, 2, 3, -1, -1, -1, -1, -1, -1, 10)
640 )
Victor Stinner93b55132010-05-19 00:54:06 +0000641
Christian Heimes380f7f22008-02-28 11:19:05 +0000642 def test_required_args(self):
643 # required arg missing
644 try:
645 getargs_keywords(arg1=(1,2))
646 except TypeError as err:
Michael Seifert64c8f702017-04-09 09:47:12 +0200647 self.assertEqual(
648 str(err), "function missing required argument 'arg2' (pos 2)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000649 else:
650 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000651
Christian Heimes380f7f22008-02-28 11:19:05 +0000652 def test_too_many_args(self):
653 try:
654 getargs_keywords((1,2),3,(4,(5,6)),(7,8,9),10,111)
655 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000656 self.assertEqual(str(err), "function takes at most 5 arguments (6 given)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000657 else:
658 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000659
Christian Heimes380f7f22008-02-28 11:19:05 +0000660 def test_invalid_keyword(self):
661 # extraneous keyword arg
662 try:
663 getargs_keywords((1,2),3,arg5=10,arg666=666)
664 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000665 self.assertEqual(str(err), "'arg666' is an invalid keyword argument for this function")
Christian Heimes380f7f22008-02-28 11:19:05 +0000666 else:
667 self.fail('TypeError should have been raised')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000668
Victor Stinner93b55132010-05-19 00:54:06 +0000669 def test_surrogate_keyword(self):
670 try:
671 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), **{'\uDC80': 10})
672 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000673 self.assertEqual(str(err), "'\udc80' is an invalid keyword argument for this function")
Victor Stinner93b55132010-05-19 00:54:06 +0000674 else:
675 self.fail('TypeError should have been raised')
676
Larry Hastings83a9f482012-03-20 20:06:16 +0000677class KeywordOnly_TestCase(unittest.TestCase):
678 def test_positional_args(self):
679 # using all possible positional args
680 self.assertEqual(
681 getargs_keyword_only(1, 2),
682 (1, 2, -1)
683 )
684
685 def test_mixed_args(self):
686 # positional and keyword args
687 self.assertEqual(
688 getargs_keyword_only(1, 2, keyword_only=3),
689 (1, 2, 3)
690 )
691
692 def test_keyword_args(self):
693 # all keywords
694 self.assertEqual(
695 getargs_keyword_only(required=1, optional=2, keyword_only=3),
696 (1, 2, 3)
697 )
698
699 def test_optional_args(self):
700 # missing optional keyword args, skipping tuples
701 self.assertEqual(
702 getargs_keyword_only(required=1, optional=2),
703 (1, 2, -1)
704 )
705 self.assertEqual(
706 getargs_keyword_only(required=1, keyword_only=3),
707 (1, -1, 3)
708 )
709
710 def test_required_args(self):
711 self.assertEqual(
712 getargs_keyword_only(1),
713 (1, -1, -1)
714 )
715 self.assertEqual(
716 getargs_keyword_only(required=1),
717 (1, -1, -1)
718 )
719 # required arg missing
720 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200721 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000722 getargs_keyword_only(optional=2)
723
724 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200725 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000726 getargs_keyword_only(keyword_only=3)
727
728 def test_too_many_args(self):
729 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200730 r"function takes at most 2 positional arguments \(3 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000731 getargs_keyword_only(1, 2, 3)
732
733 with self.assertRaisesRegex(TypeError,
R David Murray44b548d2016-09-08 13:59:53 -0400734 r"function takes at most 3 arguments \(4 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000735 getargs_keyword_only(1, 2, 3, keyword_only=5)
736
737 def test_invalid_keyword(self):
738 # extraneous keyword arg
739 with self.assertRaisesRegex(TypeError,
740 "'monster' is an invalid keyword argument for this function"):
741 getargs_keyword_only(1, 2, monster=666)
742
743 def test_surrogate_keyword(self):
744 with self.assertRaisesRegex(TypeError,
745 "'\udc80' is an invalid keyword argument for this function"):
746 getargs_keyword_only(1, 2, **{'\uDC80': 10})
747
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200748
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300749class PositionalOnlyAndKeywords_TestCase(unittest.TestCase):
750 from _testcapi import getargs_positional_only_and_keywords as getargs
751
752 def test_positional_args(self):
753 # using all possible positional args
754 self.assertEqual(self.getargs(1, 2, 3), (1, 2, 3))
755
756 def test_mixed_args(self):
757 # positional and keyword args
758 self.assertEqual(self.getargs(1, 2, keyword=3), (1, 2, 3))
759
760 def test_optional_args(self):
761 # missing optional args
762 self.assertEqual(self.getargs(1, 2), (1, 2, -1))
763 self.assertEqual(self.getargs(1, keyword=3), (1, -1, 3))
764
765 def test_required_args(self):
766 self.assertEqual(self.getargs(1), (1, -1, -1))
767 # required positional arg missing
768 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +0530769 r"function takes at least 1 positional argument \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300770 self.getargs()
771
772 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +0530773 r"function takes at least 1 positional argument \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300774 self.getargs(keyword=3)
775
776 def test_empty_keyword(self):
777 with self.assertRaisesRegex(TypeError,
778 "'' is an invalid keyword argument for this function"):
779 self.getargs(1, 2, **{'': 666})
780
781
Victor Stinner06e49dd2010-06-13 18:21:50 +0000782class Bytes_TestCase(unittest.TestCase):
Eli Bendersky906b88f2011-07-29 07:05:08 +0300783 def test_c(self):
784 from _testcapi import getargs_c
785 self.assertRaises(TypeError, getargs_c, b'abc') # len > 1
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200786 self.assertEqual(getargs_c(b'a'), 97)
787 self.assertEqual(getargs_c(bytearray(b'a')), 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300788 self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
789 self.assertRaises(TypeError, getargs_c, 's')
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200790 self.assertRaises(TypeError, getargs_c, 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300791 self.assertRaises(TypeError, getargs_c, None)
792
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200793 def test_y(self):
794 from _testcapi import getargs_y
795 self.assertRaises(TypeError, getargs_y, 'abc\xe9')
796 self.assertEqual(getargs_y(b'bytes'), b'bytes')
797 self.assertRaises(ValueError, getargs_y, b'nul:\0')
798 self.assertRaises(TypeError, getargs_y, bytearray(b'bytearray'))
799 self.assertRaises(TypeError, getargs_y, memoryview(b'memoryview'))
800 self.assertRaises(TypeError, getargs_y, None)
801
802 def test_y_star(self):
803 from _testcapi import getargs_y_star
804 self.assertRaises(TypeError, getargs_y_star, 'abc\xe9')
805 self.assertEqual(getargs_y_star(b'bytes'), b'bytes')
806 self.assertEqual(getargs_y_star(b'nul:\0'), b'nul:\0')
807 self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
808 self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
809 self.assertRaises(TypeError, getargs_y_star, None)
810
811 def test_y_hash(self):
812 from _testcapi import getargs_y_hash
813 self.assertRaises(TypeError, getargs_y_hash, 'abc\xe9')
814 self.assertEqual(getargs_y_hash(b'bytes'), b'bytes')
815 self.assertEqual(getargs_y_hash(b'nul:\0'), b'nul:\0')
816 self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
817 self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
818 self.assertRaises(TypeError, getargs_y_hash, None)
819
820 def test_w_star(self):
821 # getargs_w_star() modifies first and last byte
822 from _testcapi import getargs_w_star
823 self.assertRaises(TypeError, getargs_w_star, 'abc\xe9')
824 self.assertRaises(TypeError, getargs_w_star, b'bytes')
825 self.assertRaises(TypeError, getargs_w_star, b'nul:\0')
826 self.assertRaises(TypeError, getargs_w_star, memoryview(b'bytes'))
827 buf = bytearray(b'bytearray')
828 self.assertEqual(getargs_w_star(buf), b'[ytearra]')
829 self.assertEqual(buf, bytearray(b'[ytearra]'))
830 buf = bytearray(b'memoryview')
831 self.assertEqual(getargs_w_star(memoryview(buf)), b'[emoryvie]')
832 self.assertEqual(buf, bytearray(b'[emoryvie]'))
833 self.assertRaises(TypeError, getargs_w_star, None)
834
835
836class String_TestCase(unittest.TestCase):
837 def test_C(self):
838 from _testcapi import getargs_C
839 self.assertRaises(TypeError, getargs_C, 'abc') # len > 1
840 self.assertEqual(getargs_C('a'), 97)
841 self.assertEqual(getargs_C('\u20ac'), 0x20ac)
842 self.assertEqual(getargs_C('\U0001f40d'), 0x1f40d)
843 self.assertRaises(TypeError, getargs_C, b'a')
844 self.assertRaises(TypeError, getargs_C, bytearray(b'a'))
845 self.assertRaises(TypeError, getargs_C, memoryview(b'a'))
846 self.assertRaises(TypeError, getargs_C, 97)
847 self.assertRaises(TypeError, getargs_C, None)
848
Victor Stinner06e49dd2010-06-13 18:21:50 +0000849 def test_s(self):
850 from _testcapi import getargs_s
851 self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300852 self.assertRaises(ValueError, getargs_s, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000853 self.assertRaises(TypeError, getargs_s, b'bytes')
854 self.assertRaises(TypeError, getargs_s, bytearray(b'bytearray'))
855 self.assertRaises(TypeError, getargs_s, memoryview(b'memoryview'))
856 self.assertRaises(TypeError, getargs_s, None)
857
858 def test_s_star(self):
859 from _testcapi import getargs_s_star
860 self.assertEqual(getargs_s_star('abc\xe9'), b'abc\xc3\xa9')
861 self.assertEqual(getargs_s_star('nul:\0'), b'nul:\0')
862 self.assertEqual(getargs_s_star(b'bytes'), b'bytes')
863 self.assertEqual(getargs_s_star(bytearray(b'bytearray')), b'bytearray')
864 self.assertEqual(getargs_s_star(memoryview(b'memoryview')), b'memoryview')
865 self.assertRaises(TypeError, getargs_s_star, None)
866
867 def test_s_hash(self):
868 from _testcapi import getargs_s_hash
869 self.assertEqual(getargs_s_hash('abc\xe9'), b'abc\xc3\xa9')
870 self.assertEqual(getargs_s_hash('nul:\0'), b'nul:\0')
871 self.assertEqual(getargs_s_hash(b'bytes'), b'bytes')
872 self.assertRaises(TypeError, getargs_s_hash, bytearray(b'bytearray'))
873 self.assertRaises(TypeError, getargs_s_hash, memoryview(b'memoryview'))
874 self.assertRaises(TypeError, getargs_s_hash, None)
875
876 def test_z(self):
877 from _testcapi import getargs_z
878 self.assertEqual(getargs_z('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300879 self.assertRaises(ValueError, getargs_z, 'nul:\0')
Victor Stinner4aae1eb2010-06-24 22:08:25 +0000880 self.assertRaises(TypeError, getargs_z, b'bytes')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000881 self.assertRaises(TypeError, getargs_z, bytearray(b'bytearray'))
882 self.assertRaises(TypeError, getargs_z, memoryview(b'memoryview'))
883 self.assertIsNone(getargs_z(None))
884
885 def test_z_star(self):
886 from _testcapi import getargs_z_star
887 self.assertEqual(getargs_z_star('abc\xe9'), b'abc\xc3\xa9')
888 self.assertEqual(getargs_z_star('nul:\0'), b'nul:\0')
889 self.assertEqual(getargs_z_star(b'bytes'), b'bytes')
890 self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
891 self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
892 self.assertIsNone(getargs_z_star(None))
893
894 def test_z_hash(self):
895 from _testcapi import getargs_z_hash
896 self.assertEqual(getargs_z_hash('abc\xe9'), b'abc\xc3\xa9')
897 self.assertEqual(getargs_z_hash('nul:\0'), b'nul:\0')
898 self.assertEqual(getargs_z_hash(b'bytes'), b'bytes')
899 self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
900 self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
901 self.assertIsNone(getargs_z_hash(None))
902
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200903 def test_es(self):
904 from _testcapi import getargs_es
905 self.assertEqual(getargs_es('abc\xe9'), b'abc\xc3\xa9')
906 self.assertEqual(getargs_es('abc\xe9', 'latin1'), b'abc\xe9')
907 self.assertRaises(UnicodeEncodeError, getargs_es, 'abc\xe9', 'ascii')
908 self.assertRaises(LookupError, getargs_es, 'abc\xe9', 'spam')
909 self.assertRaises(TypeError, getargs_es, b'bytes', 'latin1')
910 self.assertRaises(TypeError, getargs_es, bytearray(b'bytearray'), 'latin1')
911 self.assertRaises(TypeError, getargs_es, memoryview(b'memoryview'), 'latin1')
912 self.assertRaises(TypeError, getargs_es, None, 'latin1')
913 self.assertRaises(TypeError, getargs_es, 'nul:\0', 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000914
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200915 def test_et(self):
916 from _testcapi import getargs_et
917 self.assertEqual(getargs_et('abc\xe9'), b'abc\xc3\xa9')
918 self.assertEqual(getargs_et('abc\xe9', 'latin1'), b'abc\xe9')
919 self.assertRaises(UnicodeEncodeError, getargs_et, 'abc\xe9', 'ascii')
920 self.assertRaises(LookupError, getargs_et, 'abc\xe9', 'spam')
921 self.assertEqual(getargs_et(b'bytes', 'latin1'), b'bytes')
922 self.assertEqual(getargs_et(bytearray(b'bytearray'), 'latin1'), b'bytearray')
923 self.assertRaises(TypeError, getargs_et, memoryview(b'memoryview'), 'latin1')
924 self.assertRaises(TypeError, getargs_et, None, 'latin1')
925 self.assertRaises(TypeError, getargs_et, 'nul:\0', 'latin1')
926 self.assertRaises(TypeError, getargs_et, b'nul:\0', 'latin1')
927 self.assertRaises(TypeError, getargs_et, bytearray(b'nul:\0'), 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000928
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200929 def test_es_hash(self):
930 from _testcapi import getargs_es_hash
931 self.assertEqual(getargs_es_hash('abc\xe9'), b'abc\xc3\xa9')
932 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1'), b'abc\xe9')
933 self.assertRaises(UnicodeEncodeError, getargs_es_hash, 'abc\xe9', 'ascii')
934 self.assertRaises(LookupError, getargs_es_hash, 'abc\xe9', 'spam')
935 self.assertRaises(TypeError, getargs_es_hash, b'bytes', 'latin1')
936 self.assertRaises(TypeError, getargs_es_hash, bytearray(b'bytearray'), 'latin1')
937 self.assertRaises(TypeError, getargs_es_hash, memoryview(b'memoryview'), 'latin1')
938 self.assertRaises(TypeError, getargs_es_hash, None, 'latin1')
939 self.assertEqual(getargs_es_hash('nul:\0', 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000940
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200941 buf = bytearray(b'x'*8)
942 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
943 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
944 buf = bytearray(b'x'*5)
945 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
946 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
947 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200948 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200949 self.assertEqual(buf, bytearray(b'x'*4))
950 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200951 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Victor Stinner25e8ec42010-06-25 00:02:38 +0000952
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200953 def test_et_hash(self):
954 from _testcapi import getargs_et_hash
955 self.assertEqual(getargs_et_hash('abc\xe9'), b'abc\xc3\xa9')
956 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1'), b'abc\xe9')
957 self.assertRaises(UnicodeEncodeError, getargs_et_hash, 'abc\xe9', 'ascii')
958 self.assertRaises(LookupError, getargs_et_hash, 'abc\xe9', 'spam')
959 self.assertEqual(getargs_et_hash(b'bytes', 'latin1'), b'bytes')
960 self.assertEqual(getargs_et_hash(bytearray(b'bytearray'), 'latin1'), b'bytearray')
961 self.assertRaises(TypeError, getargs_et_hash, memoryview(b'memoryview'), 'latin1')
962 self.assertRaises(TypeError, getargs_et_hash, None, 'latin1')
963 self.assertEqual(getargs_et_hash('nul:\0', 'latin1'), b'nul:\0')
964 self.assertEqual(getargs_et_hash(b'nul:\0', 'latin1'), b'nul:\0')
965 self.assertEqual(getargs_et_hash(bytearray(b'nul:\0'), 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000966
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200967 buf = bytearray(b'x'*8)
968 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
969 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
970 buf = bytearray(b'x'*5)
971 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
972 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
973 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200974 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200975 self.assertEqual(buf, bytearray(b'x'*4))
976 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200977 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200978
Victor Stinner06e49dd2010-06-13 18:21:50 +0000979 def test_u(self):
980 from _testcapi import getargs_u
981 self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300982 self.assertRaises(ValueError, getargs_u, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000983 self.assertRaises(TypeError, getargs_u, b'bytes')
984 self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
985 self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
986 self.assertRaises(TypeError, getargs_u, None)
987
988 def test_u_hash(self):
989 from _testcapi import getargs_u_hash
990 self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
991 self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
992 self.assertRaises(TypeError, getargs_u_hash, b'bytes')
993 self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
994 self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
995 self.assertRaises(TypeError, getargs_u_hash, None)
996
997 def test_Z(self):
998 from _testcapi import getargs_Z
999 self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001000 self.assertRaises(ValueError, getargs_Z, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +00001001 self.assertRaises(TypeError, getargs_Z, b'bytes')
1002 self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
1003 self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
1004 self.assertIsNone(getargs_Z(None))
1005
1006 def test_Z_hash(self):
1007 from _testcapi import getargs_Z_hash
1008 self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
1009 self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
1010 self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
1011 self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
1012 self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
1013 self.assertIsNone(getargs_Z_hash(None))
1014
1015
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001016class Object_TestCase(unittest.TestCase):
1017 def test_S(self):
1018 from _testcapi import getargs_S
1019 obj = b'bytes'
1020 self.assertIs(getargs_S(obj), obj)
1021 self.assertRaises(TypeError, getargs_S, bytearray(b'bytearray'))
1022 self.assertRaises(TypeError, getargs_S, 'str')
1023 self.assertRaises(TypeError, getargs_S, None)
1024 self.assertRaises(TypeError, getargs_S, memoryview(obj))
1025
1026 def test_Y(self):
1027 from _testcapi import getargs_Y
1028 obj = bytearray(b'bytearray')
1029 self.assertIs(getargs_Y(obj), obj)
1030 self.assertRaises(TypeError, getargs_Y, b'bytes')
1031 self.assertRaises(TypeError, getargs_Y, 'str')
1032 self.assertRaises(TypeError, getargs_Y, None)
1033 self.assertRaises(TypeError, getargs_Y, memoryview(obj))
1034
1035 def test_U(self):
1036 from _testcapi import getargs_U
1037 obj = 'str'
1038 self.assertIs(getargs_U(obj), obj)
1039 self.assertRaises(TypeError, getargs_U, b'bytes')
1040 self.assertRaises(TypeError, getargs_U, bytearray(b'bytearray'))
1041 self.assertRaises(TypeError, getargs_U, None)
1042
1043
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001044# Bug #6012
1045class Test6012(unittest.TestCase):
1046 def test(self):
1047 self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
1048
1049
1050class SkipitemTest(unittest.TestCase):
1051
1052 def test_skipitem(self):
1053 """
1054 If this test failed, you probably added a new "format unit"
1055 in Python/getargs.c, but neglected to update our poor friend
1056 skipitem() in the same file. (If so, shame on you!)
1057
1058 With a few exceptions**, this function brute-force tests all
1059 printable ASCII*** characters (32 to 126 inclusive) as format units,
1060 checking to see that PyArg_ParseTupleAndKeywords() return consistent
1061 errors both when the unit is attempted to be used and when it is
1062 skipped. If the format unit doesn't exist, we'll get one of two
1063 specific error messages (one for used, one for skipped); if it does
1064 exist we *won't* get that error--we'll get either no error or some
1065 other error. If we get the specific "does not exist" error for one
1066 test and not for the other, there's a mismatch, and the test fails.
1067
1068 ** Some format units have special funny semantics and it would
1069 be difficult to accommodate them here. Since these are all
1070 well-established and properly skipped in skipitem() we can
1071 get away with not testing them--this test is really intended
1072 to catch *new* format units.
1073
1074 *** Python C source files must be ASCII. Therefore it's impossible
1075 to have non-ASCII format units.
1076
1077 """
1078 empty_tuple = ()
1079 tuple_1 = (0,)
1080 dict_b = {'b':1}
1081 keywords = ["a", "b"]
1082
1083 for i in range(32, 127):
1084 c = chr(i)
1085
1086 # skip parentheses, the error reporting is inconsistent about them
1087 # skip 'e', it's always a two-character code
1088 # skip '|' and '$', they don't represent arguments anyway
1089 if c in '()e|$':
1090 continue
1091
1092 # test the format unit when not skipped
1093 format = c + "i"
1094 try:
1095 _testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
1096 format, keywords)
1097 when_not_skipped = False
1098 except SystemError as e:
1099 s = "argument 1 (impossible<bad format char>)"
1100 when_not_skipped = (str(e) == s)
1101 except TypeError:
1102 when_not_skipped = False
1103
1104 # test the format unit when skipped
1105 optional_format = "|" + format
1106 try:
1107 _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b,
1108 optional_format, keywords)
1109 when_skipped = False
1110 except SystemError as e:
1111 s = "impossible<bad format char>: '{}'".format(format)
1112 when_skipped = (str(e) == s)
1113
1114 message = ("test_skipitem_parity: "
1115 "detected mismatch between convertsimple and skipitem "
1116 "for format unit '{}' ({}), not skipped {}, skipped {}".format(
1117 c, i, when_skipped, when_not_skipped))
1118 self.assertIs(when_skipped, when_not_skipped, message)
1119
1120 def test_skipitem_with_suffix(self):
1121 parse = _testcapi.parse_tuple_and_keywords
1122 empty_tuple = ()
1123 tuple_1 = (0,)
1124 dict_b = {'b':1}
1125 keywords = ["a", "b"]
1126
1127 supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*')
1128 for c in string.ascii_letters:
1129 for c2 in '#*':
1130 f = c + c2
1131 with self.subTest(format=f):
1132 optional_format = "|" + f + "i"
1133 if f in supported:
1134 parse(empty_tuple, dict_b, optional_format, keywords)
1135 else:
1136 with self.assertRaisesRegex(SystemError,
1137 'impossible<bad format char>'):
1138 parse(empty_tuple, dict_b, optional_format, keywords)
1139
1140 for c in map(chr, range(32, 128)):
1141 f = 'e' + c
1142 optional_format = "|" + f + "i"
1143 with self.subTest(format=f):
1144 if c in 'st':
1145 parse(empty_tuple, dict_b, optional_format, keywords)
1146 else:
1147 with self.assertRaisesRegex(SystemError,
1148 'impossible<bad format char>'):
1149 parse(empty_tuple, dict_b, optional_format, keywords)
1150
1151
1152class ParseTupleAndKeywords_Test(unittest.TestCase):
1153
1154 def test_parse_tuple_and_keywords(self):
1155 # Test handling errors in the parse_tuple_and_keywords helper itself
1156 self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords,
1157 (), {}, 42, [])
1158 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1159 (), {}, '', 42)
1160 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1161 (), {}, '', [''] * 42)
1162 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1163 (), {}, '', [42])
1164
1165 def test_bad_use(self):
1166 # Test handling invalid format and keywords in
1167 # PyArg_ParseTupleAndKeywords()
1168 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1169 (1,), {}, '||O', ['a'])
1170 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1171 (1, 2), {}, '|O|O', ['a', 'b'])
1172 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1173 (), {'a': 1}, '$$O', ['a'])
1174 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1175 (), {'a': 1, 'b': 2}, '$O$O', ['a', 'b'])
1176 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1177 (), {'a': 1}, '$|O', ['a'])
1178 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1179 (), {'a': 1, 'b': 2}, '$O|O', ['a', 'b'])
1180 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1181 (1,), {}, '|O', ['a', 'b'])
1182 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1183 (1,), {}, '|OO', ['a'])
1184 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1185 (), {}, '|$O', [''])
1186 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1187 (), {}, '|OO', ['a', ''])
1188
1189 def test_positional_only(self):
1190 parse = _testcapi.parse_tuple_and_keywords
1191
1192 parse((1, 2, 3), {}, 'OOO', ['', '', 'a'])
1193 parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a'])
1194 with self.assertRaisesRegex(TypeError,
1195 r'function takes at least 2 positional arguments \(1 given\)'):
1196 parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
1197 parse((1,), {}, 'O|OO', ['', '', 'a'])
1198 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301199 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001200 parse((), {}, 'O|OO', ['', '', 'a'])
1201 parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
1202 with self.assertRaisesRegex(TypeError,
1203 r'function takes exactly 2 positional arguments \(1 given\)'):
1204 parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
1205 parse((1,), {}, 'O|O$O', ['', '', 'a'])
1206 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301207 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001208 parse((), {}, 'O|O$O', ['', '', 'a'])
1209 with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'):
1210 parse((1,), {}, 'O|$OO', ['', '', 'a'])
1211 with self.assertRaisesRegex(SystemError, 'Empty keyword'):
1212 parse((1,), {}, 'O|OO', ['', 'a', ''])
1213
1214
1215class Test_testcapi(unittest.TestCase):
1216 locals().update((name, getattr(_testcapi, name))
1217 for name in dir(_testcapi)
1218 if name.startswith('test_') and name.endswith('_code'))
1219
1220
Thomas Hellera4ea6032003-04-17 18:55:45 +00001221if __name__ == "__main__":
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001222 unittest.main()