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