blob: c67e6f51a2346439babe05e61f70eb689267aa59 [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
877 def test_z(self):
878 from _testcapi import getargs_z
879 self.assertEqual(getargs_z('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300880 self.assertRaises(ValueError, getargs_z, 'nul:\0')
Victor Stinner4aae1eb2010-06-24 22:08:25 +0000881 self.assertRaises(TypeError, getargs_z, b'bytes')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000882 self.assertRaises(TypeError, getargs_z, bytearray(b'bytearray'))
883 self.assertRaises(TypeError, getargs_z, memoryview(b'memoryview'))
884 self.assertIsNone(getargs_z(None))
885
886 def test_z_star(self):
887 from _testcapi import getargs_z_star
888 self.assertEqual(getargs_z_star('abc\xe9'), b'abc\xc3\xa9')
889 self.assertEqual(getargs_z_star('nul:\0'), b'nul:\0')
890 self.assertEqual(getargs_z_star(b'bytes'), b'bytes')
891 self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
892 self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
893 self.assertIsNone(getargs_z_star(None))
894
895 def test_z_hash(self):
896 from _testcapi import getargs_z_hash
897 self.assertEqual(getargs_z_hash('abc\xe9'), b'abc\xc3\xa9')
898 self.assertEqual(getargs_z_hash('nul:\0'), b'nul:\0')
899 self.assertEqual(getargs_z_hash(b'bytes'), b'bytes')
900 self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
901 self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
902 self.assertIsNone(getargs_z_hash(None))
903
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200904 def test_es(self):
905 from _testcapi import getargs_es
906 self.assertEqual(getargs_es('abc\xe9'), b'abc\xc3\xa9')
907 self.assertEqual(getargs_es('abc\xe9', 'latin1'), b'abc\xe9')
908 self.assertRaises(UnicodeEncodeError, getargs_es, 'abc\xe9', 'ascii')
909 self.assertRaises(LookupError, getargs_es, 'abc\xe9', 'spam')
910 self.assertRaises(TypeError, getargs_es, b'bytes', 'latin1')
911 self.assertRaises(TypeError, getargs_es, bytearray(b'bytearray'), 'latin1')
912 self.assertRaises(TypeError, getargs_es, memoryview(b'memoryview'), 'latin1')
913 self.assertRaises(TypeError, getargs_es, None, 'latin1')
914 self.assertRaises(TypeError, getargs_es, 'nul:\0', 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000915
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200916 def test_et(self):
917 from _testcapi import getargs_et
918 self.assertEqual(getargs_et('abc\xe9'), b'abc\xc3\xa9')
919 self.assertEqual(getargs_et('abc\xe9', 'latin1'), b'abc\xe9')
920 self.assertRaises(UnicodeEncodeError, getargs_et, 'abc\xe9', 'ascii')
921 self.assertRaises(LookupError, getargs_et, 'abc\xe9', 'spam')
922 self.assertEqual(getargs_et(b'bytes', 'latin1'), b'bytes')
923 self.assertEqual(getargs_et(bytearray(b'bytearray'), 'latin1'), b'bytearray')
924 self.assertRaises(TypeError, getargs_et, memoryview(b'memoryview'), 'latin1')
925 self.assertRaises(TypeError, getargs_et, None, 'latin1')
926 self.assertRaises(TypeError, getargs_et, 'nul:\0', 'latin1')
927 self.assertRaises(TypeError, getargs_et, b'nul:\0', 'latin1')
928 self.assertRaises(TypeError, getargs_et, bytearray(b'nul:\0'), 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000929
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200930 def test_es_hash(self):
931 from _testcapi import getargs_es_hash
932 self.assertEqual(getargs_es_hash('abc\xe9'), b'abc\xc3\xa9')
933 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1'), b'abc\xe9')
934 self.assertRaises(UnicodeEncodeError, getargs_es_hash, 'abc\xe9', 'ascii')
935 self.assertRaises(LookupError, getargs_es_hash, 'abc\xe9', 'spam')
936 self.assertRaises(TypeError, getargs_es_hash, b'bytes', 'latin1')
937 self.assertRaises(TypeError, getargs_es_hash, bytearray(b'bytearray'), 'latin1')
938 self.assertRaises(TypeError, getargs_es_hash, memoryview(b'memoryview'), 'latin1')
939 self.assertRaises(TypeError, getargs_es_hash, None, 'latin1')
940 self.assertEqual(getargs_es_hash('nul:\0', 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000941
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200942 buf = bytearray(b'x'*8)
943 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
944 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
945 buf = bytearray(b'x'*5)
946 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
947 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
948 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200949 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200950 self.assertEqual(buf, bytearray(b'x'*4))
951 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200952 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Victor Stinner25e8ec42010-06-25 00:02:38 +0000953
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200954 def test_et_hash(self):
955 from _testcapi import getargs_et_hash
956 self.assertEqual(getargs_et_hash('abc\xe9'), b'abc\xc3\xa9')
957 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1'), b'abc\xe9')
958 self.assertRaises(UnicodeEncodeError, getargs_et_hash, 'abc\xe9', 'ascii')
959 self.assertRaises(LookupError, getargs_et_hash, 'abc\xe9', 'spam')
960 self.assertEqual(getargs_et_hash(b'bytes', 'latin1'), b'bytes')
961 self.assertEqual(getargs_et_hash(bytearray(b'bytearray'), 'latin1'), b'bytearray')
962 self.assertRaises(TypeError, getargs_et_hash, memoryview(b'memoryview'), 'latin1')
963 self.assertRaises(TypeError, getargs_et_hash, None, 'latin1')
964 self.assertEqual(getargs_et_hash('nul:\0', 'latin1'), b'nul:\0')
965 self.assertEqual(getargs_et_hash(b'nul:\0', 'latin1'), b'nul:\0')
966 self.assertEqual(getargs_et_hash(bytearray(b'nul:\0'), 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000967
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200968 buf = bytearray(b'x'*8)
969 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
970 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
971 buf = bytearray(b'x'*5)
972 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
973 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
974 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200975 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200976 self.assertEqual(buf, bytearray(b'x'*4))
977 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200978 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200979
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +0300980 @support.requires_legacy_unicode_capi
Victor Stinner06e49dd2010-06-13 18:21:50 +0000981 def test_u(self):
982 from _testcapi import getargs_u
Inada Naoki91a639a2021-02-22 22:11:48 +0900983 with self.assertWarns(DeprecationWarning):
984 self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
985 with self.assertWarns(DeprecationWarning):
986 self.assertRaises(ValueError, getargs_u, 'nul:\0')
987 with self.assertWarns(DeprecationWarning):
988 self.assertRaises(TypeError, getargs_u, b'bytes')
989 with self.assertWarns(DeprecationWarning):
990 self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
991 with self.assertWarns(DeprecationWarning):
992 self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
993 with self.assertWarns(DeprecationWarning):
994 self.assertRaises(TypeError, getargs_u, None)
Victor Stinner06e49dd2010-06-13 18:21:50 +0000995
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +0300996 @support.requires_legacy_unicode_capi
Victor Stinner06e49dd2010-06-13 18:21:50 +0000997 def test_u_hash(self):
998 from _testcapi import getargs_u_hash
Inada Naoki91a639a2021-02-22 22:11:48 +0900999 with self.assertWarns(DeprecationWarning):
1000 self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
1001 with self.assertWarns(DeprecationWarning):
1002 self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
1003 with self.assertWarns(DeprecationWarning):
1004 self.assertRaises(TypeError, getargs_u_hash, b'bytes')
1005 with self.assertWarns(DeprecationWarning):
1006 self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
1007 with self.assertWarns(DeprecationWarning):
1008 self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
1009 with self.assertWarns(DeprecationWarning):
1010 self.assertRaises(TypeError, getargs_u_hash, None)
Victor Stinner06e49dd2010-06-13 18:21:50 +00001011
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001012 @support.requires_legacy_unicode_capi
Victor Stinner06e49dd2010-06-13 18:21:50 +00001013 def test_Z(self):
1014 from _testcapi import getargs_Z
Inada Naoki91a639a2021-02-22 22:11:48 +09001015 with self.assertWarns(DeprecationWarning):
1016 self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
1017 with self.assertWarns(DeprecationWarning):
1018 self.assertRaises(ValueError, getargs_Z, 'nul:\0')
1019 with self.assertWarns(DeprecationWarning):
1020 self.assertRaises(TypeError, getargs_Z, b'bytes')
1021 with self.assertWarns(DeprecationWarning):
1022 self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
1023 with self.assertWarns(DeprecationWarning):
1024 self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
1025 with self.assertWarns(DeprecationWarning):
1026 self.assertIsNone(getargs_Z(None))
Victor Stinner06e49dd2010-06-13 18:21:50 +00001027
Serhiy Storchaka4c8f09d2020-07-10 23:26:06 +03001028 @support.requires_legacy_unicode_capi
Victor Stinner06e49dd2010-06-13 18:21:50 +00001029 def test_Z_hash(self):
1030 from _testcapi import getargs_Z_hash
Inada Naoki91a639a2021-02-22 22:11:48 +09001031 with self.assertWarns(DeprecationWarning):
1032 self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
1033 with self.assertWarns(DeprecationWarning):
1034 self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
1035 with self.assertWarns(DeprecationWarning):
1036 self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
1037 with self.assertWarns(DeprecationWarning):
1038 self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
1039 with self.assertWarns(DeprecationWarning):
1040 self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
1041 with self.assertWarns(DeprecationWarning):
1042 self.assertIsNone(getargs_Z_hash(None))
Victor Stinner06e49dd2010-06-13 18:21:50 +00001043
1044
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001045class Object_TestCase(unittest.TestCase):
1046 def test_S(self):
1047 from _testcapi import getargs_S
1048 obj = b'bytes'
1049 self.assertIs(getargs_S(obj), obj)
1050 self.assertRaises(TypeError, getargs_S, bytearray(b'bytearray'))
1051 self.assertRaises(TypeError, getargs_S, 'str')
1052 self.assertRaises(TypeError, getargs_S, None)
1053 self.assertRaises(TypeError, getargs_S, memoryview(obj))
1054
1055 def test_Y(self):
1056 from _testcapi import getargs_Y
1057 obj = bytearray(b'bytearray')
1058 self.assertIs(getargs_Y(obj), obj)
1059 self.assertRaises(TypeError, getargs_Y, b'bytes')
1060 self.assertRaises(TypeError, getargs_Y, 'str')
1061 self.assertRaises(TypeError, getargs_Y, None)
1062 self.assertRaises(TypeError, getargs_Y, memoryview(obj))
1063
1064 def test_U(self):
1065 from _testcapi import getargs_U
1066 obj = 'str'
1067 self.assertIs(getargs_U(obj), obj)
1068 self.assertRaises(TypeError, getargs_U, b'bytes')
1069 self.assertRaises(TypeError, getargs_U, bytearray(b'bytearray'))
1070 self.assertRaises(TypeError, getargs_U, None)
1071
1072
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001073# Bug #6012
1074class Test6012(unittest.TestCase):
1075 def test(self):
1076 self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
1077
1078
1079class SkipitemTest(unittest.TestCase):
1080
Inada Naoki91a639a2021-02-22 22:11:48 +09001081 # u, and Z raises DeprecationWarning
1082 @warnings_helper.ignore_warnings(category=DeprecationWarning)
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001083 def test_skipitem(self):
1084 """
1085 If this test failed, you probably added a new "format unit"
1086 in Python/getargs.c, but neglected to update our poor friend
1087 skipitem() in the same file. (If so, shame on you!)
1088
1089 With a few exceptions**, this function brute-force tests all
1090 printable ASCII*** characters (32 to 126 inclusive) as format units,
1091 checking to see that PyArg_ParseTupleAndKeywords() return consistent
1092 errors both when the unit is attempted to be used and when it is
1093 skipped. If the format unit doesn't exist, we'll get one of two
1094 specific error messages (one for used, one for skipped); if it does
1095 exist we *won't* get that error--we'll get either no error or some
1096 other error. If we get the specific "does not exist" error for one
1097 test and not for the other, there's a mismatch, and the test fails.
1098
1099 ** Some format units have special funny semantics and it would
1100 be difficult to accommodate them here. Since these are all
1101 well-established and properly skipped in skipitem() we can
1102 get away with not testing them--this test is really intended
1103 to catch *new* format units.
1104
1105 *** Python C source files must be ASCII. Therefore it's impossible
1106 to have non-ASCII format units.
1107
1108 """
1109 empty_tuple = ()
1110 tuple_1 = (0,)
1111 dict_b = {'b':1}
1112 keywords = ["a", "b"]
1113
1114 for i in range(32, 127):
1115 c = chr(i)
1116
1117 # skip parentheses, the error reporting is inconsistent about them
1118 # skip 'e', it's always a two-character code
1119 # skip '|' and '$', they don't represent arguments anyway
1120 if c in '()e|$':
1121 continue
1122
1123 # test the format unit when not skipped
1124 format = c + "i"
1125 try:
1126 _testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
1127 format, keywords)
1128 when_not_skipped = False
1129 except SystemError as e:
1130 s = "argument 1 (impossible<bad format char>)"
1131 when_not_skipped = (str(e) == s)
1132 except TypeError:
1133 when_not_skipped = False
1134
1135 # test the format unit when skipped
1136 optional_format = "|" + format
1137 try:
1138 _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b,
1139 optional_format, keywords)
1140 when_skipped = False
1141 except SystemError as e:
1142 s = "impossible<bad format char>: '{}'".format(format)
1143 when_skipped = (str(e) == s)
1144
1145 message = ("test_skipitem_parity: "
1146 "detected mismatch between convertsimple and skipitem "
1147 "for format unit '{}' ({}), not skipped {}, skipped {}".format(
1148 c, i, when_skipped, when_not_skipped))
1149 self.assertIs(when_skipped, when_not_skipped, message)
1150
1151 def test_skipitem_with_suffix(self):
1152 parse = _testcapi.parse_tuple_and_keywords
1153 empty_tuple = ()
1154 tuple_1 = (0,)
1155 dict_b = {'b':1}
1156 keywords = ["a", "b"]
1157
1158 supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*')
1159 for c in string.ascii_letters:
1160 for c2 in '#*':
1161 f = c + c2
1162 with self.subTest(format=f):
1163 optional_format = "|" + f + "i"
1164 if f in supported:
1165 parse(empty_tuple, dict_b, optional_format, keywords)
1166 else:
1167 with self.assertRaisesRegex(SystemError,
1168 'impossible<bad format char>'):
1169 parse(empty_tuple, dict_b, optional_format, keywords)
1170
1171 for c in map(chr, range(32, 128)):
1172 f = 'e' + c
1173 optional_format = "|" + f + "i"
1174 with self.subTest(format=f):
1175 if c in 'st':
1176 parse(empty_tuple, dict_b, optional_format, keywords)
1177 else:
1178 with self.assertRaisesRegex(SystemError,
1179 'impossible<bad format char>'):
1180 parse(empty_tuple, dict_b, optional_format, keywords)
1181
1182
1183class ParseTupleAndKeywords_Test(unittest.TestCase):
1184
1185 def test_parse_tuple_and_keywords(self):
1186 # Test handling errors in the parse_tuple_and_keywords helper itself
1187 self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords,
1188 (), {}, 42, [])
1189 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1190 (), {}, '', 42)
1191 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1192 (), {}, '', [''] * 42)
1193 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1194 (), {}, '', [42])
1195
1196 def test_bad_use(self):
1197 # Test handling invalid format and keywords in
1198 # PyArg_ParseTupleAndKeywords()
1199 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1200 (1,), {}, '||O', ['a'])
1201 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1202 (1, 2), {}, '|O|O', ['a', 'b'])
1203 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1204 (), {'a': 1}, '$$O', ['a'])
1205 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1206 (), {'a': 1, 'b': 2}, '$O$O', ['a', 'b'])
1207 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1208 (), {'a': 1}, '$|O', ['a'])
1209 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1210 (), {'a': 1, 'b': 2}, '$O|O', ['a', 'b'])
1211 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1212 (1,), {}, '|O', ['a', 'b'])
1213 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1214 (1,), {}, '|OO', ['a'])
1215 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1216 (), {}, '|$O', [''])
1217 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1218 (), {}, '|OO', ['a', ''])
1219
1220 def test_positional_only(self):
1221 parse = _testcapi.parse_tuple_and_keywords
1222
1223 parse((1, 2, 3), {}, 'OOO', ['', '', 'a'])
1224 parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a'])
1225 with self.assertRaisesRegex(TypeError,
1226 r'function takes at least 2 positional arguments \(1 given\)'):
1227 parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
1228 parse((1,), {}, 'O|OO', ['', '', 'a'])
1229 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301230 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001231 parse((), {}, 'O|OO', ['', '', 'a'])
1232 parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
1233 with self.assertRaisesRegex(TypeError,
1234 r'function takes exactly 2 positional arguments \(1 given\)'):
1235 parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
1236 parse((1,), {}, 'O|O$O', ['', '', 'a'])
1237 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301238 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001239 parse((), {}, 'O|O$O', ['', '', 'a'])
1240 with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'):
1241 parse((1,), {}, 'O|$OO', ['', '', 'a'])
1242 with self.assertRaisesRegex(SystemError, 'Empty keyword'):
1243 parse((1,), {}, 'O|OO', ['', 'a', ''])
1244
1245
1246class Test_testcapi(unittest.TestCase):
1247 locals().update((name, getattr(_testcapi, name))
1248 for name in dir(_testcapi)
1249 if name.startswith('test_') and name.endswith('_code'))
1250
Inada Naoki91a639a2021-02-22 22:11:48 +09001251 @warnings_helper.ignore_warnings(category=DeprecationWarning)
1252 def test_u_code(self):
1253 _testcapi.test_u_code()
1254
1255 @warnings_helper.ignore_warnings(category=DeprecationWarning)
1256 def test_Z_code(self):
1257 _testcapi.test_Z_code()
1258
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001259
Thomas Hellera4ea6032003-04-17 18:55:45 +00001260if __name__ == "__main__":
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001261 unittest.main()