blob: e0db9e40e650b6a0f0ed9209134e4e4196bc434c [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
Inada Naoki91a639a2021-02-22 22:11:48 +09007from test.support import warnings_helper
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02008# Skip this test if the _testcapi module isn't available.
Hai Shi96a6a6d2020-07-09 21:25:10 +08009_testcapi = import_helper.import_module('_testcapi')
Larry Hastings83a9f482012-03-20 20:06:16 +000010from _testcapi import getargs_keywords, getargs_keyword_only
Thomas Hellera4ea6032003-04-17 18:55:45 +000011
Victor Stinner765531d2013-03-26 01:11:54 +010012# > How about the following counterproposal. This also changes some of
13# > the other format codes to be a little more regular.
14# >
15# > Code C type Range check
16# >
17# > b unsigned char 0..UCHAR_MAX
18# > h signed short SHRT_MIN..SHRT_MAX
19# > B unsigned char none **
20# > H unsigned short none **
21# > k * unsigned long none
22# > I * unsigned int 0..UINT_MAX
23#
24#
25# > i int INT_MIN..INT_MAX
26# > l long LONG_MIN..LONG_MAX
27#
28# > K * unsigned long long none
29# > L long long LLONG_MIN..LLONG_MAX
30#
31# > Notes:
32# >
33# > * New format codes.
34# >
35# > ** Changed from previous "range-and-a-half" to "none"; the
36# > range-and-a-half checking wasn't particularly useful.
37#
Serhiy Storchaka483405b2015-02-17 10:14:30 +020038# Plus a C API or two, e.g. PyLong_AsUnsignedLongMask() ->
39# unsigned long and PyLong_AsUnsignedLongLongMask() -> unsigned
Victor Stinner765531d2013-03-26 01:11:54 +010040# long long (if that exists).
Thomas Hellera4ea6032003-04-17 18:55:45 +000041
42LARGE = 0x7FFFFFFF
Guido van Rossume2a383d2007-01-15 16:59:06 +000043VERY_LARGE = 0xFF0000121212121212121242
Thomas Hellera4ea6032003-04-17 18:55:45 +000044
45from _testcapi import UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, INT_MAX, \
Mark Dickinson1554b182009-12-20 16:03:30 +000046 INT_MIN, LONG_MIN, LONG_MAX, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX, \
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030047 SHRT_MIN, SHRT_MAX, FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX
48
49DBL_MAX_EXP = sys.float_info.max_exp
50INF = float('inf')
51NAN = float('nan')
Thomas Hellera4ea6032003-04-17 18:55:45 +000052
Thomas Hellera4ea6032003-04-17 18:55:45 +000053# fake, they are not defined in Python's header files
54LLONG_MAX = 2**63-1
55LLONG_MIN = -2**63
56ULLONG_MAX = 2**64-1
57
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +020058class Index:
59 def __index__(self):
60 return 99
61
62class IndexIntSubclass(int):
63 def __index__(self):
64 return 99
65
66class BadIndex:
67 def __index__(self):
68 return 1.0
69
70class BadIndex2:
71 def __index__(self):
72 return True
73
74class BadIndex3(int):
75 def __index__(self):
76 return True
77
78
Thomas Hellera4ea6032003-04-17 18:55:45 +000079class Int:
80 def __int__(self):
81 return 99
82
Serhiy Storchaka31a65542013-12-11 21:07:54 +020083class IntSubclass(int):
84 def __int__(self):
85 return 99
86
87class BadInt:
88 def __int__(self):
89 return 1.0
90
91class BadInt2:
92 def __int__(self):
93 return True
94
95class BadInt3(int):
96 def __int__(self):
97 return True
98
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030099
100class Float:
101 def __float__(self):
102 return 4.25
103
104class FloatSubclass(float):
105 pass
106
107class FloatSubclass2(float):
108 def __float__(self):
109 return 4.25
110
111class BadFloat:
112 def __float__(self):
113 return 687
114
115class BadFloat2:
116 def __float__(self):
117 return FloatSubclass(4.25)
118
119class BadFloat3(float):
120 def __float__(self):
121 return FloatSubclass(4.25)
122
123
124class Complex:
125 def __complex__(self):
126 return 4.25+0.5j
127
128class ComplexSubclass(complex):
129 pass
130
131class ComplexSubclass2(complex):
132 def __complex__(self):
133 return 4.25+0.5j
134
135class BadComplex:
136 def __complex__(self):
137 return 1.25
138
139class BadComplex2:
140 def __complex__(self):
141 return ComplexSubclass(4.25+0.5j)
142
143class BadComplex3(complex):
144 def __complex__(self):
145 return ComplexSubclass(4.25+0.5j)
146
147
Serhiy Storchakace412872016-05-08 23:36:44 +0300148class TupleSubclass(tuple):
149 pass
150
151class DictSubclass(dict):
152 pass
153
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200154
Thomas Hellera4ea6032003-04-17 18:55:45 +0000155class Unsigned_TestCase(unittest.TestCase):
156 def test_b(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000157 from _testcapi import getargs_b
Thomas Hellera4ea6032003-04-17 18:55:45 +0000158 # b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000159 self.assertRaises(TypeError, getargs_b, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200160 self.assertEqual(99, getargs_b(Index()))
161 self.assertEqual(0, getargs_b(IndexIntSubclass()))
162 self.assertRaises(TypeError, getargs_b, BadIndex())
163 with self.assertWarns(DeprecationWarning):
164 self.assertEqual(1, getargs_b(BadIndex2()))
165 self.assertEqual(0, getargs_b(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300166 self.assertRaises(TypeError, getargs_b, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200167 self.assertEqual(0, getargs_b(IntSubclass()))
168 self.assertRaises(TypeError, getargs_b, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300169 self.assertRaises(TypeError, getargs_b, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200170 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()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300190 self.assertRaises(TypeError, getargs_B, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200191 self.assertEqual(0, getargs_B(IntSubclass()))
192 self.assertRaises(TypeError, getargs_B, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300193 self.assertRaises(TypeError, getargs_B, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200194 self.assertEqual(0, getargs_B(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000195
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000196 self.assertEqual(UCHAR_MAX, getargs_B(-1))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000197 self.assertEqual(0, getargs_B(0))
198 self.assertEqual(UCHAR_MAX, getargs_B(UCHAR_MAX))
199 self.assertEqual(0, getargs_B(UCHAR_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000200
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000201 self.assertEqual(42, getargs_B(42))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000202 self.assertEqual(UCHAR_MAX & VERY_LARGE, getargs_B(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000203
204 def test_H(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000205 from _testcapi import getargs_H
Thomas Hellera4ea6032003-04-17 18:55:45 +0000206 # H returns 'unsigned short', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000207 self.assertRaises(TypeError, getargs_H, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200208 self.assertEqual(99, getargs_H(Index()))
209 self.assertEqual(0, getargs_H(IndexIntSubclass()))
210 self.assertRaises(TypeError, getargs_H, BadIndex())
211 with self.assertWarns(DeprecationWarning):
212 self.assertEqual(1, getargs_H(BadIndex2()))
213 self.assertEqual(0, getargs_H(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300214 self.assertRaises(TypeError, getargs_H, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200215 self.assertEqual(0, getargs_H(IntSubclass()))
216 self.assertRaises(TypeError, getargs_H, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300217 self.assertRaises(TypeError, getargs_H, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200218 self.assertEqual(0, getargs_H(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000219
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000220 self.assertEqual(USHRT_MAX, getargs_H(-1))
221 self.assertEqual(0, getargs_H(0))
222 self.assertEqual(USHRT_MAX, getargs_H(USHRT_MAX))
223 self.assertEqual(0, getargs_H(USHRT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000224
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000225 self.assertEqual(42, getargs_H(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000226
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000227 self.assertEqual(VERY_LARGE & USHRT_MAX, getargs_H(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000228
229 def test_I(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000230 from _testcapi import getargs_I
Thomas Hellera4ea6032003-04-17 18:55:45 +0000231 # I returns 'unsigned int', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000232 self.assertRaises(TypeError, getargs_I, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200233 self.assertEqual(99, getargs_I(Index()))
234 self.assertEqual(0, getargs_I(IndexIntSubclass()))
235 self.assertRaises(TypeError, getargs_I, BadIndex())
236 with self.assertWarns(DeprecationWarning):
237 self.assertEqual(1, getargs_I(BadIndex2()))
238 self.assertEqual(0, getargs_I(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300239 self.assertRaises(TypeError, getargs_I, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200240 self.assertEqual(0, getargs_I(IntSubclass()))
241 self.assertRaises(TypeError, getargs_I, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300242 self.assertRaises(TypeError, getargs_I, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200243 self.assertEqual(0, getargs_I(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000244
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000245 self.assertEqual(UINT_MAX, getargs_I(-1))
246 self.assertEqual(0, getargs_I(0))
247 self.assertEqual(UINT_MAX, getargs_I(UINT_MAX))
248 self.assertEqual(0, getargs_I(UINT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000249
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000250 self.assertEqual(42, getargs_I(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000251
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000252 self.assertEqual(VERY_LARGE & UINT_MAX, getargs_I(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000253
254 def test_k(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000255 from _testcapi import getargs_k
Thomas Hellera4ea6032003-04-17 18:55:45 +0000256 # k returns 'unsigned long', no range checking
257 # it does not accept float, or instances with __int__
Thomas Heller54aa5782003-04-24 16:15:29 +0000258 self.assertRaises(TypeError, getargs_k, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200259 self.assertRaises(TypeError, getargs_k, Index())
260 self.assertEqual(0, getargs_k(IndexIntSubclass()))
261 self.assertRaises(TypeError, getargs_k, BadIndex())
262 self.assertRaises(TypeError, getargs_k, BadIndex2())
263 self.assertEqual(0, getargs_k(BadIndex3()))
Thomas Heller54aa5782003-04-24 16:15:29 +0000264 self.assertRaises(TypeError, getargs_k, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200265 self.assertEqual(0, getargs_k(IntSubclass()))
266 self.assertRaises(TypeError, getargs_k, BadInt())
267 self.assertRaises(TypeError, getargs_k, BadInt2())
268 self.assertEqual(0, getargs_k(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000269
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000270 self.assertEqual(ULONG_MAX, getargs_k(-1))
271 self.assertEqual(0, getargs_k(0))
272 self.assertEqual(ULONG_MAX, getargs_k(ULONG_MAX))
273 self.assertEqual(0, getargs_k(ULONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000274
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000275 self.assertEqual(42, getargs_k(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000276
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000277 self.assertEqual(VERY_LARGE & ULONG_MAX, getargs_k(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000278
279class Signed_TestCase(unittest.TestCase):
Mark Dickinson1554b182009-12-20 16:03:30 +0000280 def test_h(self):
281 from _testcapi import getargs_h
282 # h returns 'short', and does range checking (SHRT_MIN ... SHRT_MAX)
283 self.assertRaises(TypeError, getargs_h, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200284 self.assertEqual(99, getargs_h(Index()))
285 self.assertEqual(0, getargs_h(IndexIntSubclass()))
286 self.assertRaises(TypeError, getargs_h, BadIndex())
287 with self.assertWarns(DeprecationWarning):
288 self.assertEqual(1, getargs_h(BadIndex2()))
289 self.assertEqual(0, getargs_h(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300290 self.assertRaises(TypeError, getargs_h, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200291 self.assertEqual(0, getargs_h(IntSubclass()))
292 self.assertRaises(TypeError, getargs_h, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300293 self.assertRaises(TypeError, getargs_h, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200294 self.assertEqual(0, getargs_h(BadInt3()))
Mark Dickinson1554b182009-12-20 16:03:30 +0000295
296 self.assertRaises(OverflowError, getargs_h, SHRT_MIN-1)
297 self.assertEqual(SHRT_MIN, getargs_h(SHRT_MIN))
298 self.assertEqual(SHRT_MAX, getargs_h(SHRT_MAX))
299 self.assertRaises(OverflowError, getargs_h, SHRT_MAX+1)
300
301 self.assertEqual(42, getargs_h(42))
302 self.assertRaises(OverflowError, getargs_h, VERY_LARGE)
303
Thomas Hellera4ea6032003-04-17 18:55:45 +0000304 def test_i(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000305 from _testcapi import getargs_i
Thomas Hellera4ea6032003-04-17 18:55:45 +0000306 # i returns 'int', and does range checking (INT_MIN ... INT_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000307 self.assertRaises(TypeError, getargs_i, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200308 self.assertEqual(99, getargs_i(Index()))
309 self.assertEqual(0, getargs_i(IndexIntSubclass()))
310 self.assertRaises(TypeError, getargs_i, BadIndex())
311 with self.assertWarns(DeprecationWarning):
312 self.assertEqual(1, getargs_i(BadIndex2()))
313 self.assertEqual(0, getargs_i(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300314 self.assertRaises(TypeError, getargs_i, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200315 self.assertEqual(0, getargs_i(IntSubclass()))
316 self.assertRaises(TypeError, getargs_i, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300317 self.assertRaises(TypeError, getargs_i, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200318 self.assertEqual(0, getargs_i(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000319
Thomas Heller54aa5782003-04-24 16:15:29 +0000320 self.assertRaises(OverflowError, getargs_i, INT_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000321 self.assertEqual(INT_MIN, getargs_i(INT_MIN))
322 self.assertEqual(INT_MAX, getargs_i(INT_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000323 self.assertRaises(OverflowError, getargs_i, INT_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000324
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000325 self.assertEqual(42, getargs_i(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000326 self.assertRaises(OverflowError, getargs_i, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000327
328 def test_l(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000329 from _testcapi import getargs_l
Thomas Hellera4ea6032003-04-17 18:55:45 +0000330 # l returns 'long', and does range checking (LONG_MIN ... LONG_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000331 self.assertRaises(TypeError, getargs_l, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200332 self.assertEqual(99, getargs_l(Index()))
333 self.assertEqual(0, getargs_l(IndexIntSubclass()))
334 self.assertRaises(TypeError, getargs_l, BadIndex())
335 with self.assertWarns(DeprecationWarning):
336 self.assertEqual(1, getargs_l(BadIndex2()))
337 self.assertEqual(0, getargs_l(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300338 self.assertRaises(TypeError, getargs_l, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200339 self.assertEqual(0, getargs_l(IntSubclass()))
340 self.assertRaises(TypeError, getargs_l, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300341 self.assertRaises(TypeError, getargs_l, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200342 self.assertEqual(0, getargs_l(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000343
Thomas Heller54aa5782003-04-24 16:15:29 +0000344 self.assertRaises(OverflowError, getargs_l, LONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000345 self.assertEqual(LONG_MIN, getargs_l(LONG_MIN))
346 self.assertEqual(LONG_MAX, getargs_l(LONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000347 self.assertRaises(OverflowError, getargs_l, LONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000348
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000349 self.assertEqual(42, getargs_l(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000350 self.assertRaises(OverflowError, getargs_l, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000351
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000352 def test_n(self):
353 from _testcapi import getargs_n
354 # n returns 'Py_ssize_t', and does range checking
355 # (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX)
Thomas Woutersd8073282006-04-21 11:36:13 +0000356 self.assertRaises(TypeError, getargs_n, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200357 self.assertEqual(99, getargs_n(Index()))
358 self.assertEqual(0, getargs_n(IndexIntSubclass()))
359 self.assertRaises(TypeError, getargs_n, BadIndex())
360 with self.assertWarns(DeprecationWarning):
361 self.assertEqual(1, getargs_n(BadIndex2()))
362 self.assertEqual(0, getargs_n(BadIndex3()))
Trent Nelson35133582008-04-22 19:02:40 +0000363 self.assertRaises(TypeError, getargs_n, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200364 self.assertEqual(0, getargs_n(IntSubclass()))
365 self.assertRaises(TypeError, getargs_n, BadInt())
366 self.assertRaises(TypeError, getargs_n, BadInt2())
367 self.assertEqual(0, getargs_n(BadInt3()))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000368
369 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000370 self.assertEqual(PY_SSIZE_T_MIN, getargs_n(PY_SSIZE_T_MIN))
371 self.assertEqual(PY_SSIZE_T_MAX, getargs_n(PY_SSIZE_T_MAX))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000372 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MAX+1)
373
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000374 self.assertEqual(42, getargs_n(42))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000375 self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
376
Thomas Hellera4ea6032003-04-17 18:55:45 +0000377
378class LongLong_TestCase(unittest.TestCase):
379 def test_L(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000380 from _testcapi import getargs_L
Mark Dickinsonde604012010-01-01 19:27:32 +0000381 # L returns 'long long', and does range checking (LLONG_MIN
382 # ... LLONG_MAX)
Mark Dickinsonc7301312010-06-10 16:05:10 +0000383 self.assertRaises(TypeError, getargs_L, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000384 self.assertRaises(TypeError, getargs_L, "Hello")
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200385 self.assertEqual(99, getargs_L(Index()))
386 self.assertEqual(0, getargs_L(IndexIntSubclass()))
387 self.assertRaises(TypeError, getargs_L, BadIndex())
388 with self.assertWarns(DeprecationWarning):
389 self.assertEqual(1, getargs_L(BadIndex2()))
390 self.assertEqual(0, getargs_L(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300391 self.assertRaises(TypeError, getargs_L, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200392 self.assertEqual(0, getargs_L(IntSubclass()))
393 self.assertRaises(TypeError, getargs_L, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300394 self.assertRaises(TypeError, getargs_L, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200395 self.assertEqual(0, getargs_L(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000396
Thomas Heller54aa5782003-04-24 16:15:29 +0000397 self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000398 self.assertEqual(LLONG_MIN, getargs_L(LLONG_MIN))
399 self.assertEqual(LLONG_MAX, getargs_L(LLONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000400 self.assertRaises(OverflowError, getargs_L, LLONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000401
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000402 self.assertEqual(42, getargs_L(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000403 self.assertRaises(OverflowError, getargs_L, VERY_LARGE)
Tim Peters0eadaac2003-04-24 16:02:54 +0000404
Thomas Hellera4ea6032003-04-17 18:55:45 +0000405 def test_K(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000406 from _testcapi import getargs_K
Thomas Hellera4ea6032003-04-17 18:55:45 +0000407 # K return 'unsigned long long', no range checking
Thomas Heller54aa5782003-04-24 16:15:29 +0000408 self.assertRaises(TypeError, getargs_K, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200409 self.assertRaises(TypeError, getargs_K, Index())
410 self.assertEqual(0, getargs_K(IndexIntSubclass()))
411 self.assertRaises(TypeError, getargs_K, BadIndex())
412 self.assertRaises(TypeError, getargs_K, BadIndex2())
413 self.assertEqual(0, getargs_K(BadIndex3()))
Thomas Heller54aa5782003-04-24 16:15:29 +0000414 self.assertRaises(TypeError, getargs_K, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200415 self.assertEqual(0, getargs_K(IntSubclass()))
416 self.assertRaises(TypeError, getargs_K, BadInt())
417 self.assertRaises(TypeError, getargs_K, BadInt2())
418 self.assertEqual(0, getargs_K(BadInt3()))
419
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000420 self.assertEqual(ULLONG_MAX, getargs_K(ULLONG_MAX))
421 self.assertEqual(0, getargs_K(0))
422 self.assertEqual(0, getargs_K(ULLONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000423
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000424 self.assertEqual(42, getargs_K(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000425
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000426 self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000427
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300428
429class Float_TestCase(unittest.TestCase):
430 def assertEqualWithSign(self, actual, expected):
431 self.assertEqual(actual, expected)
432 self.assertEqual(math.copysign(1, actual), math.copysign(1, expected))
433
434 def test_f(self):
435 from _testcapi import getargs_f
436 self.assertEqual(getargs_f(4.25), 4.25)
437 self.assertEqual(getargs_f(4), 4.0)
438 self.assertRaises(TypeError, getargs_f, 4.25+0j)
439 self.assertEqual(getargs_f(Float()), 4.25)
440 self.assertEqual(getargs_f(FloatSubclass(7.5)), 7.5)
441 self.assertEqual(getargs_f(FloatSubclass2(7.5)), 7.5)
442 self.assertRaises(TypeError, getargs_f, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300443 with self.assertWarns(DeprecationWarning):
444 self.assertEqual(getargs_f(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300445 self.assertEqual(getargs_f(BadFloat3(7.5)), 7.5)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300446 self.assertEqual(getargs_f(Index()), 99.0)
447 self.assertRaises(TypeError, getargs_f, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300448
449 for x in (FLT_MIN, -FLT_MIN, FLT_MAX, -FLT_MAX, INF, -INF):
450 self.assertEqual(getargs_f(x), x)
451 if FLT_MAX < DBL_MAX:
452 self.assertEqual(getargs_f(DBL_MAX), INF)
453 self.assertEqual(getargs_f(-DBL_MAX), -INF)
454 if FLT_MIN > DBL_MIN:
455 self.assertEqualWithSign(getargs_f(DBL_MIN), 0.0)
456 self.assertEqualWithSign(getargs_f(-DBL_MIN), -0.0)
457 self.assertEqualWithSign(getargs_f(0.0), 0.0)
458 self.assertEqualWithSign(getargs_f(-0.0), -0.0)
459 r = getargs_f(NAN)
460 self.assertNotEqual(r, r)
461
Benjamin Peterson2bb69a52017-09-10 23:50:46 -0700462 @support.requires_IEEE_754
463 def test_f_rounding(self):
464 from _testcapi import getargs_f
465 self.assertEqual(getargs_f(3.40282356e38), FLT_MAX)
466 self.assertEqual(getargs_f(-3.40282356e38), -FLT_MAX)
467
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300468 def test_d(self):
469 from _testcapi import getargs_d
470 self.assertEqual(getargs_d(4.25), 4.25)
471 self.assertEqual(getargs_d(4), 4.0)
472 self.assertRaises(TypeError, getargs_d, 4.25+0j)
473 self.assertEqual(getargs_d(Float()), 4.25)
474 self.assertEqual(getargs_d(FloatSubclass(7.5)), 7.5)
475 self.assertEqual(getargs_d(FloatSubclass2(7.5)), 7.5)
476 self.assertRaises(TypeError, getargs_d, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300477 with self.assertWarns(DeprecationWarning):
478 self.assertEqual(getargs_d(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300479 self.assertEqual(getargs_d(BadFloat3(7.5)), 7.5)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300480 self.assertEqual(getargs_d(Index()), 99.0)
481 self.assertRaises(TypeError, getargs_d, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300482
483 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
484 self.assertEqual(getargs_d(x), x)
485 self.assertRaises(OverflowError, getargs_d, 1<<DBL_MAX_EXP)
486 self.assertRaises(OverflowError, getargs_d, -1<<DBL_MAX_EXP)
487 self.assertEqualWithSign(getargs_d(0.0), 0.0)
488 self.assertEqualWithSign(getargs_d(-0.0), -0.0)
489 r = getargs_d(NAN)
490 self.assertNotEqual(r, r)
491
492 def test_D(self):
493 from _testcapi import getargs_D
494 self.assertEqual(getargs_D(4.25+0.5j), 4.25+0.5j)
495 self.assertEqual(getargs_D(4.25), 4.25+0j)
496 self.assertEqual(getargs_D(4), 4.0+0j)
497 self.assertEqual(getargs_D(Complex()), 4.25+0.5j)
498 self.assertEqual(getargs_D(ComplexSubclass(7.5+0.25j)), 7.5+0.25j)
499 self.assertEqual(getargs_D(ComplexSubclass2(7.5+0.25j)), 7.5+0.25j)
500 self.assertRaises(TypeError, getargs_D, BadComplex())
Serhiy Storchaka671079e2017-03-24 21:28:43 +0200501 with self.assertWarns(DeprecationWarning):
502 self.assertEqual(getargs_D(BadComplex2()), 4.25+0.5j)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300503 self.assertEqual(getargs_D(BadComplex3(7.5+0.25j)), 7.5+0.25j)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300504 self.assertEqual(getargs_D(Index()), 99.0+0j)
505 self.assertRaises(TypeError, getargs_D, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300506
507 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
508 c = complex(x, 1.0)
509 self.assertEqual(getargs_D(c), c)
510 c = complex(1.0, x)
511 self.assertEqual(getargs_D(c), c)
512 self.assertEqualWithSign(getargs_D(complex(0.0, 1.0)).real, 0.0)
513 self.assertEqualWithSign(getargs_D(complex(-0.0, 1.0)).real, -0.0)
514 self.assertEqualWithSign(getargs_D(complex(1.0, 0.0)).imag, 0.0)
515 self.assertEqualWithSign(getargs_D(complex(1.0, -0.0)).imag, -0.0)
516
517
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700518class Paradox:
519 "This statement is false."
520 def __bool__(self):
521 raise NotImplementedError
522
523class Boolean_TestCase(unittest.TestCase):
524 def test_p(self):
525 from _testcapi import getargs_p
526 self.assertEqual(0, getargs_p(False))
527 self.assertEqual(0, getargs_p(None))
528 self.assertEqual(0, getargs_p(0))
529 self.assertEqual(0, getargs_p(0.0))
530 self.assertEqual(0, getargs_p(0j))
531 self.assertEqual(0, getargs_p(''))
532 self.assertEqual(0, getargs_p(()))
533 self.assertEqual(0, getargs_p([]))
534 self.assertEqual(0, getargs_p({}))
535
536 self.assertEqual(1, getargs_p(True))
537 self.assertEqual(1, getargs_p(1))
538 self.assertEqual(1, getargs_p(1.0))
539 self.assertEqual(1, getargs_p(1j))
540 self.assertEqual(1, getargs_p('x'))
541 self.assertEqual(1, getargs_p((1,)))
542 self.assertEqual(1, getargs_p([1]))
543 self.assertEqual(1, getargs_p({1:2}))
544 self.assertEqual(1, getargs_p(unittest.TestCase))
545
546 self.assertRaises(NotImplementedError, getargs_p, Paradox())
547
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000548
549class Tuple_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300550 def test_args(self):
551 from _testcapi import get_args
552
553 ret = get_args(1, 2)
554 self.assertEqual(ret, (1, 2))
555 self.assertIs(type(ret), tuple)
556
557 ret = get_args(1, *(2, 3))
558 self.assertEqual(ret, (1, 2, 3))
559 self.assertIs(type(ret), tuple)
560
561 ret = get_args(*[1, 2])
562 self.assertEqual(ret, (1, 2))
563 self.assertIs(type(ret), tuple)
564
565 ret = get_args(*TupleSubclass([1, 2]))
566 self.assertEqual(ret, (1, 2))
Serhiy Storchaka63dc5482016-09-22 19:41:20 +0300567 self.assertIs(type(ret), tuple)
Serhiy Storchakace412872016-05-08 23:36:44 +0300568
569 ret = get_args()
570 self.assertIn(ret, ((), None))
571 self.assertIn(type(ret), (tuple, type(None)))
572
573 ret = get_args(*())
574 self.assertIn(ret, ((), None))
575 self.assertIn(type(ret), (tuple, type(None)))
576
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000577 def test_tuple(self):
578 from _testcapi import getargs_tuple
579
580 ret = getargs_tuple(1, (2, 3))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000581 self.assertEqual(ret, (1,2,3))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000582
583 # make sure invalid tuple arguments are handled correctly
584 class seq:
585 def __len__(self):
586 return 2
587 def __getitem__(self, n):
588 raise ValueError
589 self.assertRaises(TypeError, getargs_tuple, 1, seq())
590
Christian Heimes380f7f22008-02-28 11:19:05 +0000591class Keywords_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300592 def test_kwargs(self):
593 from _testcapi import get_kwargs
594
595 ret = get_kwargs(a=1, b=2)
596 self.assertEqual(ret, {'a': 1, 'b': 2})
597 self.assertIs(type(ret), dict)
598
599 ret = get_kwargs(a=1, **{'b': 2, 'c': 3})
600 self.assertEqual(ret, {'a': 1, 'b': 2, 'c': 3})
601 self.assertIs(type(ret), dict)
602
603 ret = get_kwargs(**DictSubclass({'a': 1, 'b': 2}))
604 self.assertEqual(ret, {'a': 1, 'b': 2})
605 self.assertIs(type(ret), dict)
606
607 ret = get_kwargs()
608 self.assertIn(ret, ({}, None))
609 self.assertIn(type(ret), (dict, type(None)))
610
611 ret = get_kwargs(**{})
612 self.assertIn(ret, ({}, None))
613 self.assertIn(type(ret), (dict, type(None)))
614
Christian Heimes380f7f22008-02-28 11:19:05 +0000615 def test_positional_args(self):
616 # using all positional args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000617 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000618 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), 10),
619 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
620 )
Victor Stinner93b55132010-05-19 00:54:06 +0000621
Christian Heimes380f7f22008-02-28 11:19:05 +0000622 def test_mixed_args(self):
623 # positional and keyword args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000624 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000625 getargs_keywords((1,2), 3, (4,(5,6)), arg4=(7,8,9), arg5=10),
626 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
627 )
Victor Stinner93b55132010-05-19 00:54:06 +0000628
Christian Heimes380f7f22008-02-28 11:19:05 +0000629 def test_keyword_args(self):
630 # all keywords
Ezio Melottib3aedd42010-11-20 19:04:17 +0000631 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000632 getargs_keywords(arg1=(1,2), arg2=3, arg3=(4,(5,6)), arg4=(7,8,9), arg5=10),
633 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
634 )
Victor Stinner93b55132010-05-19 00:54:06 +0000635
Christian Heimes380f7f22008-02-28 11:19:05 +0000636 def test_optional_args(self):
637 # missing optional keyword args, skipping tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000638 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000639 getargs_keywords(arg1=(1,2), arg2=3, arg5=10),
640 (1, 2, 3, -1, -1, -1, -1, -1, -1, 10)
641 )
Victor Stinner93b55132010-05-19 00:54:06 +0000642
Christian Heimes380f7f22008-02-28 11:19:05 +0000643 def test_required_args(self):
644 # required arg missing
645 try:
646 getargs_keywords(arg1=(1,2))
647 except TypeError as err:
Michael Seifert64c8f702017-04-09 09:47:12 +0200648 self.assertEqual(
649 str(err), "function missing required argument 'arg2' (pos 2)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000650 else:
651 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000652
Christian Heimes380f7f22008-02-28 11:19:05 +0000653 def test_too_many_args(self):
654 try:
655 getargs_keywords((1,2),3,(4,(5,6)),(7,8,9),10,111)
656 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000657 self.assertEqual(str(err), "function takes at most 5 arguments (6 given)")
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_invalid_keyword(self):
662 # extraneous keyword arg
663 try:
664 getargs_keywords((1,2),3,arg5=10,arg666=666)
665 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000666 self.assertEqual(str(err), "'arg666' is an invalid keyword argument for this function")
Christian Heimes380f7f22008-02-28 11:19:05 +0000667 else:
668 self.fail('TypeError should have been raised')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000669
Victor Stinner93b55132010-05-19 00:54:06 +0000670 def test_surrogate_keyword(self):
671 try:
672 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), **{'\uDC80': 10})
673 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000674 self.assertEqual(str(err), "'\udc80' is an invalid keyword argument for this function")
Victor Stinner93b55132010-05-19 00:54:06 +0000675 else:
676 self.fail('TypeError should have been raised')
677
Larry Hastings83a9f482012-03-20 20:06:16 +0000678class KeywordOnly_TestCase(unittest.TestCase):
679 def test_positional_args(self):
680 # using all possible positional args
681 self.assertEqual(
682 getargs_keyword_only(1, 2),
683 (1, 2, -1)
684 )
685
686 def test_mixed_args(self):
687 # positional and keyword args
688 self.assertEqual(
689 getargs_keyword_only(1, 2, keyword_only=3),
690 (1, 2, 3)
691 )
692
693 def test_keyword_args(self):
694 # all keywords
695 self.assertEqual(
696 getargs_keyword_only(required=1, optional=2, keyword_only=3),
697 (1, 2, 3)
698 )
699
700 def test_optional_args(self):
701 # missing optional keyword args, skipping tuples
702 self.assertEqual(
703 getargs_keyword_only(required=1, optional=2),
704 (1, 2, -1)
705 )
706 self.assertEqual(
707 getargs_keyword_only(required=1, keyword_only=3),
708 (1, -1, 3)
709 )
710
711 def test_required_args(self):
712 self.assertEqual(
713 getargs_keyword_only(1),
714 (1, -1, -1)
715 )
716 self.assertEqual(
717 getargs_keyword_only(required=1),
718 (1, -1, -1)
719 )
720 # required arg missing
721 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200722 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000723 getargs_keyword_only(optional=2)
724
725 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200726 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000727 getargs_keyword_only(keyword_only=3)
728
729 def test_too_many_args(self):
730 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200731 r"function takes at most 2 positional arguments \(3 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000732 getargs_keyword_only(1, 2, 3)
733
734 with self.assertRaisesRegex(TypeError,
R David Murray44b548d2016-09-08 13:59:53 -0400735 r"function takes at most 3 arguments \(4 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000736 getargs_keyword_only(1, 2, 3, keyword_only=5)
737
738 def test_invalid_keyword(self):
739 # extraneous keyword arg
740 with self.assertRaisesRegex(TypeError,
741 "'monster' is an invalid keyword argument for this function"):
742 getargs_keyword_only(1, 2, monster=666)
743
744 def test_surrogate_keyword(self):
745 with self.assertRaisesRegex(TypeError,
746 "'\udc80' is an invalid keyword argument for this function"):
747 getargs_keyword_only(1, 2, **{'\uDC80': 10})
748
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200749
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300750class PositionalOnlyAndKeywords_TestCase(unittest.TestCase):
751 from _testcapi import getargs_positional_only_and_keywords as getargs
752
753 def test_positional_args(self):
754 # using all possible positional args
755 self.assertEqual(self.getargs(1, 2, 3), (1, 2, 3))
756
757 def test_mixed_args(self):
758 # positional and keyword args
759 self.assertEqual(self.getargs(1, 2, keyword=3), (1, 2, 3))
760
761 def test_optional_args(self):
762 # missing optional args
763 self.assertEqual(self.getargs(1, 2), (1, 2, -1))
764 self.assertEqual(self.getargs(1, keyword=3), (1, -1, 3))
765
766 def test_required_args(self):
767 self.assertEqual(self.getargs(1), (1, -1, -1))
768 # required positional arg missing
769 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +0530770 r"function takes at least 1 positional argument \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300771 self.getargs()
772
773 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +0530774 r"function takes at least 1 positional argument \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300775 self.getargs(keyword=3)
776
777 def test_empty_keyword(self):
778 with self.assertRaisesRegex(TypeError,
779 "'' is an invalid keyword argument for this function"):
780 self.getargs(1, 2, **{'': 666})
781
782
Victor Stinner06e49dd2010-06-13 18:21:50 +0000783class Bytes_TestCase(unittest.TestCase):
Eli Bendersky906b88f2011-07-29 07:05:08 +0300784 def test_c(self):
785 from _testcapi import getargs_c
786 self.assertRaises(TypeError, getargs_c, b'abc') # len > 1
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200787 self.assertEqual(getargs_c(b'a'), 97)
788 self.assertEqual(getargs_c(bytearray(b'a')), 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300789 self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
790 self.assertRaises(TypeError, getargs_c, 's')
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200791 self.assertRaises(TypeError, getargs_c, 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300792 self.assertRaises(TypeError, getargs_c, None)
793
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200794 def test_y(self):
795 from _testcapi import getargs_y
796 self.assertRaises(TypeError, getargs_y, 'abc\xe9')
797 self.assertEqual(getargs_y(b'bytes'), b'bytes')
798 self.assertRaises(ValueError, getargs_y, b'nul:\0')
799 self.assertRaises(TypeError, getargs_y, bytearray(b'bytearray'))
800 self.assertRaises(TypeError, getargs_y, memoryview(b'memoryview'))
801 self.assertRaises(TypeError, getargs_y, None)
802
803 def test_y_star(self):
804 from _testcapi import getargs_y_star
805 self.assertRaises(TypeError, getargs_y_star, 'abc\xe9')
806 self.assertEqual(getargs_y_star(b'bytes'), b'bytes')
807 self.assertEqual(getargs_y_star(b'nul:\0'), b'nul:\0')
808 self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
809 self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
810 self.assertRaises(TypeError, getargs_y_star, None)
811
812 def test_y_hash(self):
813 from _testcapi import getargs_y_hash
814 self.assertRaises(TypeError, getargs_y_hash, 'abc\xe9')
815 self.assertEqual(getargs_y_hash(b'bytes'), b'bytes')
816 self.assertEqual(getargs_y_hash(b'nul:\0'), b'nul:\0')
817 self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
818 self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
819 self.assertRaises(TypeError, getargs_y_hash, None)
820
821 def test_w_star(self):
822 # getargs_w_star() modifies first and last byte
823 from _testcapi import getargs_w_star
824 self.assertRaises(TypeError, getargs_w_star, 'abc\xe9')
825 self.assertRaises(TypeError, getargs_w_star, b'bytes')
826 self.assertRaises(TypeError, getargs_w_star, b'nul:\0')
827 self.assertRaises(TypeError, getargs_w_star, memoryview(b'bytes'))
828 buf = bytearray(b'bytearray')
829 self.assertEqual(getargs_w_star(buf), b'[ytearra]')
830 self.assertEqual(buf, bytearray(b'[ytearra]'))
831 buf = bytearray(b'memoryview')
832 self.assertEqual(getargs_w_star(memoryview(buf)), b'[emoryvie]')
833 self.assertEqual(buf, bytearray(b'[emoryvie]'))
834 self.assertRaises(TypeError, getargs_w_star, None)
835
836
837class String_TestCase(unittest.TestCase):
838 def test_C(self):
839 from _testcapi import getargs_C
840 self.assertRaises(TypeError, getargs_C, 'abc') # len > 1
841 self.assertEqual(getargs_C('a'), 97)
842 self.assertEqual(getargs_C('\u20ac'), 0x20ac)
843 self.assertEqual(getargs_C('\U0001f40d'), 0x1f40d)
844 self.assertRaises(TypeError, getargs_C, b'a')
845 self.assertRaises(TypeError, getargs_C, bytearray(b'a'))
846 self.assertRaises(TypeError, getargs_C, memoryview(b'a'))
847 self.assertRaises(TypeError, getargs_C, 97)
848 self.assertRaises(TypeError, getargs_C, None)
849
Victor Stinner06e49dd2010-06-13 18:21:50 +0000850 def test_s(self):
851 from _testcapi import getargs_s
852 self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300853 self.assertRaises(ValueError, getargs_s, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000854 self.assertRaises(TypeError, getargs_s, b'bytes')
855 self.assertRaises(TypeError, getargs_s, bytearray(b'bytearray'))
856 self.assertRaises(TypeError, getargs_s, memoryview(b'memoryview'))
857 self.assertRaises(TypeError, getargs_s, None)
858
859 def test_s_star(self):
860 from _testcapi import getargs_s_star
861 self.assertEqual(getargs_s_star('abc\xe9'), b'abc\xc3\xa9')
862 self.assertEqual(getargs_s_star('nul:\0'), b'nul:\0')
863 self.assertEqual(getargs_s_star(b'bytes'), b'bytes')
864 self.assertEqual(getargs_s_star(bytearray(b'bytearray')), b'bytearray')
865 self.assertEqual(getargs_s_star(memoryview(b'memoryview')), b'memoryview')
866 self.assertRaises(TypeError, getargs_s_star, None)
867
868 def test_s_hash(self):
869 from _testcapi import getargs_s_hash
870 self.assertEqual(getargs_s_hash('abc\xe9'), b'abc\xc3\xa9')
871 self.assertEqual(getargs_s_hash('nul:\0'), b'nul:\0')
872 self.assertEqual(getargs_s_hash(b'bytes'), b'bytes')
873 self.assertRaises(TypeError, getargs_s_hash, bytearray(b'bytearray'))
874 self.assertRaises(TypeError, getargs_s_hash, memoryview(b'memoryview'))
875 self.assertRaises(TypeError, getargs_s_hash, None)
876
Miss Islington (bot)569ca812021-05-06 20:18:42 -0700877 def test_s_hash_int(self):
878 # "s#" without PY_SSIZE_T_CLEAN defined.
879 from _testcapi import getargs_s_hash_int
880 self.assertRaises(SystemError, getargs_s_hash_int, "abc")
881 self.assertRaises(SystemError, getargs_s_hash_int, x=42)
882 # getargs_s_hash_int() don't raise SystemError because skipitem() is not called.
883
Victor Stinner06e49dd2010-06-13 18:21:50 +0000884 def test_z(self):
885 from _testcapi import getargs_z
886 self.assertEqual(getargs_z('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300887 self.assertRaises(ValueError, getargs_z, 'nul:\0')
Victor Stinner4aae1eb2010-06-24 22:08:25 +0000888 self.assertRaises(TypeError, getargs_z, b'bytes')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000889 self.assertRaises(TypeError, getargs_z, bytearray(b'bytearray'))
890 self.assertRaises(TypeError, getargs_z, memoryview(b'memoryview'))
891 self.assertIsNone(getargs_z(None))
892
893 def test_z_star(self):
894 from _testcapi import getargs_z_star
895 self.assertEqual(getargs_z_star('abc\xe9'), b'abc\xc3\xa9')
896 self.assertEqual(getargs_z_star('nul:\0'), b'nul:\0')
897 self.assertEqual(getargs_z_star(b'bytes'), b'bytes')
898 self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
899 self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
900 self.assertIsNone(getargs_z_star(None))
901
902 def test_z_hash(self):
903 from _testcapi import getargs_z_hash
904 self.assertEqual(getargs_z_hash('abc\xe9'), b'abc\xc3\xa9')
905 self.assertEqual(getargs_z_hash('nul:\0'), b'nul:\0')
906 self.assertEqual(getargs_z_hash(b'bytes'), b'bytes')
907 self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
908 self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
909 self.assertIsNone(getargs_z_hash(None))
910
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200911 def test_es(self):
912 from _testcapi import getargs_es
913 self.assertEqual(getargs_es('abc\xe9'), b'abc\xc3\xa9')
914 self.assertEqual(getargs_es('abc\xe9', 'latin1'), b'abc\xe9')
915 self.assertRaises(UnicodeEncodeError, getargs_es, 'abc\xe9', 'ascii')
916 self.assertRaises(LookupError, getargs_es, 'abc\xe9', 'spam')
917 self.assertRaises(TypeError, getargs_es, b'bytes', 'latin1')
918 self.assertRaises(TypeError, getargs_es, bytearray(b'bytearray'), 'latin1')
919 self.assertRaises(TypeError, getargs_es, memoryview(b'memoryview'), 'latin1')
920 self.assertRaises(TypeError, getargs_es, None, 'latin1')
921 self.assertRaises(TypeError, getargs_es, 'nul:\0', 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000922
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200923 def test_et(self):
924 from _testcapi import getargs_et
925 self.assertEqual(getargs_et('abc\xe9'), b'abc\xc3\xa9')
926 self.assertEqual(getargs_et('abc\xe9', 'latin1'), b'abc\xe9')
927 self.assertRaises(UnicodeEncodeError, getargs_et, 'abc\xe9', 'ascii')
928 self.assertRaises(LookupError, getargs_et, 'abc\xe9', 'spam')
929 self.assertEqual(getargs_et(b'bytes', 'latin1'), b'bytes')
930 self.assertEqual(getargs_et(bytearray(b'bytearray'), 'latin1'), b'bytearray')
931 self.assertRaises(TypeError, getargs_et, memoryview(b'memoryview'), 'latin1')
932 self.assertRaises(TypeError, getargs_et, None, 'latin1')
933 self.assertRaises(TypeError, getargs_et, 'nul:\0', 'latin1')
934 self.assertRaises(TypeError, getargs_et, b'nul:\0', 'latin1')
935 self.assertRaises(TypeError, getargs_et, bytearray(b'nul:\0'), 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000936
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200937 def test_es_hash(self):
938 from _testcapi import getargs_es_hash
939 self.assertEqual(getargs_es_hash('abc\xe9'), b'abc\xc3\xa9')
940 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1'), b'abc\xe9')
941 self.assertRaises(UnicodeEncodeError, getargs_es_hash, 'abc\xe9', 'ascii')
942 self.assertRaises(LookupError, getargs_es_hash, 'abc\xe9', 'spam')
943 self.assertRaises(TypeError, getargs_es_hash, b'bytes', 'latin1')
944 self.assertRaises(TypeError, getargs_es_hash, bytearray(b'bytearray'), 'latin1')
945 self.assertRaises(TypeError, getargs_es_hash, memoryview(b'memoryview'), 'latin1')
946 self.assertRaises(TypeError, getargs_es_hash, None, 'latin1')
947 self.assertEqual(getargs_es_hash('nul:\0', 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000948
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200949 buf = bytearray(b'x'*8)
950 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
951 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
952 buf = bytearray(b'x'*5)
953 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
954 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
955 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200956 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200957 self.assertEqual(buf, bytearray(b'x'*4))
958 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200959 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Victor Stinner25e8ec42010-06-25 00:02:38 +0000960
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200961 def test_et_hash(self):
962 from _testcapi import getargs_et_hash
963 self.assertEqual(getargs_et_hash('abc\xe9'), b'abc\xc3\xa9')
964 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1'), b'abc\xe9')
965 self.assertRaises(UnicodeEncodeError, getargs_et_hash, 'abc\xe9', 'ascii')
966 self.assertRaises(LookupError, getargs_et_hash, 'abc\xe9', 'spam')
967 self.assertEqual(getargs_et_hash(b'bytes', 'latin1'), b'bytes')
968 self.assertEqual(getargs_et_hash(bytearray(b'bytearray'), 'latin1'), b'bytearray')
969 self.assertRaises(TypeError, getargs_et_hash, memoryview(b'memoryview'), 'latin1')
970 self.assertRaises(TypeError, getargs_et_hash, None, 'latin1')
971 self.assertEqual(getargs_et_hash('nul:\0', 'latin1'), b'nul:\0')
972 self.assertEqual(getargs_et_hash(b'nul:\0', 'latin1'), b'nul:\0')
973 self.assertEqual(getargs_et_hash(bytearray(b'nul:\0'), 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000974
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200975 buf = bytearray(b'x'*8)
976 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
977 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
978 buf = bytearray(b'x'*5)
979 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
980 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
981 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200982 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200983 self.assertEqual(buf, bytearray(b'x'*4))
984 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200985 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200986
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +0300987 @support.requires_legacy_unicode_capi
Victor Stinner06e49dd2010-06-13 18:21:50 +0000988 def test_u(self):
989 from _testcapi import getargs_u
Inada Naoki91a639a2021-02-22 22:11:48 +0900990 with self.assertWarns(DeprecationWarning):
991 self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
992 with self.assertWarns(DeprecationWarning):
993 self.assertRaises(ValueError, getargs_u, 'nul:\0')
994 with self.assertWarns(DeprecationWarning):
995 self.assertRaises(TypeError, getargs_u, b'bytes')
996 with self.assertWarns(DeprecationWarning):
997 self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
998 with self.assertWarns(DeprecationWarning):
999 self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
1000 with self.assertWarns(DeprecationWarning):
1001 self.assertRaises(TypeError, getargs_u, None)
Victor Stinner06e49dd2010-06-13 18:21:50 +00001002
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001003 @support.requires_legacy_unicode_capi
Victor Stinner06e49dd2010-06-13 18:21:50 +00001004 def test_u_hash(self):
1005 from _testcapi import getargs_u_hash
Inada Naoki91a639a2021-02-22 22:11:48 +09001006 with self.assertWarns(DeprecationWarning):
1007 self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
1008 with self.assertWarns(DeprecationWarning):
1009 self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
1010 with self.assertWarns(DeprecationWarning):
1011 self.assertRaises(TypeError, getargs_u_hash, b'bytes')
1012 with self.assertWarns(DeprecationWarning):
1013 self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
1014 with self.assertWarns(DeprecationWarning):
1015 self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
1016 with self.assertWarns(DeprecationWarning):
1017 self.assertRaises(TypeError, getargs_u_hash, None)
Victor Stinner06e49dd2010-06-13 18:21:50 +00001018
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001019 @support.requires_legacy_unicode_capi
Victor Stinner06e49dd2010-06-13 18:21:50 +00001020 def test_Z(self):
1021 from _testcapi import getargs_Z
Inada Naoki91a639a2021-02-22 22:11:48 +09001022 with self.assertWarns(DeprecationWarning):
1023 self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
1024 with self.assertWarns(DeprecationWarning):
1025 self.assertRaises(ValueError, getargs_Z, 'nul:\0')
1026 with self.assertWarns(DeprecationWarning):
1027 self.assertRaises(TypeError, getargs_Z, b'bytes')
1028 with self.assertWarns(DeprecationWarning):
1029 self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
1030 with self.assertWarns(DeprecationWarning):
1031 self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
1032 with self.assertWarns(DeprecationWarning):
1033 self.assertIsNone(getargs_Z(None))
Victor Stinner06e49dd2010-06-13 18:21:50 +00001034
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001035 @support.requires_legacy_unicode_capi
Victor Stinner06e49dd2010-06-13 18:21:50 +00001036 def test_Z_hash(self):
1037 from _testcapi import getargs_Z_hash
Inada Naoki91a639a2021-02-22 22:11:48 +09001038 with self.assertWarns(DeprecationWarning):
1039 self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
1040 with self.assertWarns(DeprecationWarning):
1041 self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
1042 with self.assertWarns(DeprecationWarning):
1043 self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
1044 with self.assertWarns(DeprecationWarning):
1045 self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
1046 with self.assertWarns(DeprecationWarning):
1047 self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
1048 with self.assertWarns(DeprecationWarning):
1049 self.assertIsNone(getargs_Z_hash(None))
Victor Stinner06e49dd2010-06-13 18:21:50 +00001050
1051
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001052class Object_TestCase(unittest.TestCase):
1053 def test_S(self):
1054 from _testcapi import getargs_S
1055 obj = b'bytes'
1056 self.assertIs(getargs_S(obj), obj)
1057 self.assertRaises(TypeError, getargs_S, bytearray(b'bytearray'))
1058 self.assertRaises(TypeError, getargs_S, 'str')
1059 self.assertRaises(TypeError, getargs_S, None)
1060 self.assertRaises(TypeError, getargs_S, memoryview(obj))
1061
1062 def test_Y(self):
1063 from _testcapi import getargs_Y
1064 obj = bytearray(b'bytearray')
1065 self.assertIs(getargs_Y(obj), obj)
1066 self.assertRaises(TypeError, getargs_Y, b'bytes')
1067 self.assertRaises(TypeError, getargs_Y, 'str')
1068 self.assertRaises(TypeError, getargs_Y, None)
1069 self.assertRaises(TypeError, getargs_Y, memoryview(obj))
1070
1071 def test_U(self):
1072 from _testcapi import getargs_U
1073 obj = 'str'
1074 self.assertIs(getargs_U(obj), obj)
1075 self.assertRaises(TypeError, getargs_U, b'bytes')
1076 self.assertRaises(TypeError, getargs_U, bytearray(b'bytearray'))
1077 self.assertRaises(TypeError, getargs_U, None)
1078
1079
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001080# Bug #6012
1081class Test6012(unittest.TestCase):
1082 def test(self):
1083 self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
1084
1085
1086class SkipitemTest(unittest.TestCase):
1087
Inada Naoki91a639a2021-02-22 22:11:48 +09001088 # u, and Z raises DeprecationWarning
1089 @warnings_helper.ignore_warnings(category=DeprecationWarning)
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001090 def test_skipitem(self):
1091 """
1092 If this test failed, you probably added a new "format unit"
1093 in Python/getargs.c, but neglected to update our poor friend
1094 skipitem() in the same file. (If so, shame on you!)
1095
1096 With a few exceptions**, this function brute-force tests all
1097 printable ASCII*** characters (32 to 126 inclusive) as format units,
1098 checking to see that PyArg_ParseTupleAndKeywords() return consistent
1099 errors both when the unit is attempted to be used and when it is
1100 skipped. If the format unit doesn't exist, we'll get one of two
1101 specific error messages (one for used, one for skipped); if it does
1102 exist we *won't* get that error--we'll get either no error or some
1103 other error. If we get the specific "does not exist" error for one
1104 test and not for the other, there's a mismatch, and the test fails.
1105
1106 ** Some format units have special funny semantics and it would
1107 be difficult to accommodate them here. Since these are all
1108 well-established and properly skipped in skipitem() we can
1109 get away with not testing them--this test is really intended
1110 to catch *new* format units.
1111
1112 *** Python C source files must be ASCII. Therefore it's impossible
1113 to have non-ASCII format units.
1114
1115 """
1116 empty_tuple = ()
1117 tuple_1 = (0,)
1118 dict_b = {'b':1}
1119 keywords = ["a", "b"]
1120
1121 for i in range(32, 127):
1122 c = chr(i)
1123
1124 # skip parentheses, the error reporting is inconsistent about them
1125 # skip 'e', it's always a two-character code
1126 # skip '|' and '$', they don't represent arguments anyway
1127 if c in '()e|$':
1128 continue
1129
1130 # test the format unit when not skipped
1131 format = c + "i"
1132 try:
1133 _testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
1134 format, keywords)
1135 when_not_skipped = False
1136 except SystemError as e:
1137 s = "argument 1 (impossible<bad format char>)"
1138 when_not_skipped = (str(e) == s)
1139 except TypeError:
1140 when_not_skipped = False
1141
1142 # test the format unit when skipped
1143 optional_format = "|" + format
1144 try:
1145 _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b,
1146 optional_format, keywords)
1147 when_skipped = False
1148 except SystemError as e:
1149 s = "impossible<bad format char>: '{}'".format(format)
1150 when_skipped = (str(e) == s)
1151
1152 message = ("test_skipitem_parity: "
1153 "detected mismatch between convertsimple and skipitem "
1154 "for format unit '{}' ({}), not skipped {}, skipped {}".format(
1155 c, i, when_skipped, when_not_skipped))
1156 self.assertIs(when_skipped, when_not_skipped, message)
1157
1158 def test_skipitem_with_suffix(self):
1159 parse = _testcapi.parse_tuple_and_keywords
1160 empty_tuple = ()
1161 tuple_1 = (0,)
1162 dict_b = {'b':1}
1163 keywords = ["a", "b"]
1164
1165 supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*')
1166 for c in string.ascii_letters:
1167 for c2 in '#*':
1168 f = c + c2
1169 with self.subTest(format=f):
1170 optional_format = "|" + f + "i"
1171 if f in supported:
1172 parse(empty_tuple, dict_b, optional_format, keywords)
1173 else:
1174 with self.assertRaisesRegex(SystemError,
1175 'impossible<bad format char>'):
1176 parse(empty_tuple, dict_b, optional_format, keywords)
1177
1178 for c in map(chr, range(32, 128)):
1179 f = 'e' + c
1180 optional_format = "|" + f + "i"
1181 with self.subTest(format=f):
1182 if c in 'st':
1183 parse(empty_tuple, dict_b, optional_format, keywords)
1184 else:
1185 with self.assertRaisesRegex(SystemError,
1186 'impossible<bad format char>'):
1187 parse(empty_tuple, dict_b, optional_format, keywords)
1188
1189
1190class ParseTupleAndKeywords_Test(unittest.TestCase):
1191
1192 def test_parse_tuple_and_keywords(self):
1193 # Test handling errors in the parse_tuple_and_keywords helper itself
1194 self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords,
1195 (), {}, 42, [])
1196 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1197 (), {}, '', 42)
1198 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1199 (), {}, '', [''] * 42)
1200 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1201 (), {}, '', [42])
1202
1203 def test_bad_use(self):
1204 # Test handling invalid format and keywords in
1205 # PyArg_ParseTupleAndKeywords()
1206 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1207 (1,), {}, '||O', ['a'])
1208 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1209 (1, 2), {}, '|O|O', ['a', 'b'])
1210 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1211 (), {'a': 1}, '$$O', ['a'])
1212 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1213 (), {'a': 1, 'b': 2}, '$O$O', ['a', 'b'])
1214 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1215 (), {'a': 1}, '$|O', ['a'])
1216 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1217 (), {'a': 1, 'b': 2}, '$O|O', ['a', 'b'])
1218 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1219 (1,), {}, '|O', ['a', 'b'])
1220 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1221 (1,), {}, '|OO', ['a'])
1222 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1223 (), {}, '|$O', [''])
1224 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1225 (), {}, '|OO', ['a', ''])
1226
1227 def test_positional_only(self):
1228 parse = _testcapi.parse_tuple_and_keywords
1229
1230 parse((1, 2, 3), {}, 'OOO', ['', '', 'a'])
1231 parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a'])
1232 with self.assertRaisesRegex(TypeError,
1233 r'function takes at least 2 positional arguments \(1 given\)'):
1234 parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
1235 parse((1,), {}, 'O|OO', ['', '', 'a'])
1236 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301237 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001238 parse((), {}, 'O|OO', ['', '', 'a'])
1239 parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
1240 with self.assertRaisesRegex(TypeError,
1241 r'function takes exactly 2 positional arguments \(1 given\)'):
1242 parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
1243 parse((1,), {}, 'O|O$O', ['', '', 'a'])
1244 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301245 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001246 parse((), {}, 'O|O$O', ['', '', 'a'])
1247 with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'):
1248 parse((1,), {}, 'O|$OO', ['', '', 'a'])
1249 with self.assertRaisesRegex(SystemError, 'Empty keyword'):
1250 parse((1,), {}, 'O|OO', ['', 'a', ''])
1251
1252
1253class Test_testcapi(unittest.TestCase):
1254 locals().update((name, getattr(_testcapi, name))
1255 for name in dir(_testcapi)
1256 if name.startswith('test_') and name.endswith('_code'))
1257
Inada Naoki91a639a2021-02-22 22:11:48 +09001258 @warnings_helper.ignore_warnings(category=DeprecationWarning)
1259 def test_u_code(self):
1260 _testcapi.test_u_code()
1261
1262 @warnings_helper.ignore_warnings(category=DeprecationWarning)
1263 def test_Z_code(self):
1264 _testcapi.test_Z_code()
1265
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001266
Thomas Hellera4ea6032003-04-17 18:55:45 +00001267if __name__ == "__main__":
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001268 unittest.main()