blob: 0dec5b1874e6d6501a563fefcca087d07a176131 [file] [log] [blame]
Thomas Hellera4ea6032003-04-17 18:55:45 +00001import unittest
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03002import math
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03003import string
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03004import sys
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02006# Skip this test if the _testcapi module isn't available.
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03007_testcapi = support.import_module('_testcapi')
Larry Hastings83a9f482012-03-20 20:06:16 +00008from _testcapi import getargs_keywords, getargs_keyword_only
Thomas Hellera4ea6032003-04-17 18:55:45 +00009
Victor Stinner765531d2013-03-26 01:11:54 +010010# > How about the following counterproposal. This also changes some of
11# > the other format codes to be a little more regular.
12# >
13# > Code C type Range check
14# >
15# > b unsigned char 0..UCHAR_MAX
16# > h signed short SHRT_MIN..SHRT_MAX
17# > B unsigned char none **
18# > H unsigned short none **
19# > k * unsigned long none
20# > I * unsigned int 0..UINT_MAX
21#
22#
23# > i int INT_MIN..INT_MAX
24# > l long LONG_MIN..LONG_MAX
25#
26# > K * unsigned long long none
27# > L long long LLONG_MIN..LLONG_MAX
28#
29# > Notes:
30# >
31# > * New format codes.
32# >
33# > ** Changed from previous "range-and-a-half" to "none"; the
34# > range-and-a-half checking wasn't particularly useful.
35#
Serhiy Storchaka483405b2015-02-17 10:14:30 +020036# Plus a C API or two, e.g. PyLong_AsUnsignedLongMask() ->
37# unsigned long and PyLong_AsUnsignedLongLongMask() -> unsigned
Victor Stinner765531d2013-03-26 01:11:54 +010038# long long (if that exists).
Thomas Hellera4ea6032003-04-17 18:55:45 +000039
40LARGE = 0x7FFFFFFF
Guido van Rossume2a383d2007-01-15 16:59:06 +000041VERY_LARGE = 0xFF0000121212121212121242
Thomas Hellera4ea6032003-04-17 18:55:45 +000042
43from _testcapi import UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, INT_MAX, \
Mark Dickinson1554b182009-12-20 16:03:30 +000044 INT_MIN, LONG_MIN, LONG_MAX, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX, \
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030045 SHRT_MIN, SHRT_MAX, FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX
46
47DBL_MAX_EXP = sys.float_info.max_exp
48INF = float('inf')
49NAN = float('nan')
Thomas Hellera4ea6032003-04-17 18:55:45 +000050
Thomas Hellera4ea6032003-04-17 18:55:45 +000051# fake, they are not defined in Python's header files
52LLONG_MAX = 2**63-1
53LLONG_MIN = -2**63
54ULLONG_MAX = 2**64-1
55
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +020056class Index:
57 def __index__(self):
58 return 99
59
60class IndexIntSubclass(int):
61 def __index__(self):
62 return 99
63
64class BadIndex:
65 def __index__(self):
66 return 1.0
67
68class BadIndex2:
69 def __index__(self):
70 return True
71
72class BadIndex3(int):
73 def __index__(self):
74 return True
75
76
Thomas Hellera4ea6032003-04-17 18:55:45 +000077class Int:
78 def __int__(self):
79 return 99
80
Serhiy Storchaka31a65542013-12-11 21:07:54 +020081class IntSubclass(int):
82 def __int__(self):
83 return 99
84
85class BadInt:
86 def __int__(self):
87 return 1.0
88
89class BadInt2:
90 def __int__(self):
91 return True
92
93class BadInt3(int):
94 def __int__(self):
95 return True
96
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030097
98class Float:
99 def __float__(self):
100 return 4.25
101
102class FloatSubclass(float):
103 pass
104
105class FloatSubclass2(float):
106 def __float__(self):
107 return 4.25
108
109class BadFloat:
110 def __float__(self):
111 return 687
112
113class BadFloat2:
114 def __float__(self):
115 return FloatSubclass(4.25)
116
117class BadFloat3(float):
118 def __float__(self):
119 return FloatSubclass(4.25)
120
121
122class Complex:
123 def __complex__(self):
124 return 4.25+0.5j
125
126class ComplexSubclass(complex):
127 pass
128
129class ComplexSubclass2(complex):
130 def __complex__(self):
131 return 4.25+0.5j
132
133class BadComplex:
134 def __complex__(self):
135 return 1.25
136
137class BadComplex2:
138 def __complex__(self):
139 return ComplexSubclass(4.25+0.5j)
140
141class BadComplex3(complex):
142 def __complex__(self):
143 return ComplexSubclass(4.25+0.5j)
144
145
Serhiy Storchakace412872016-05-08 23:36:44 +0300146class TupleSubclass(tuple):
147 pass
148
149class DictSubclass(dict):
150 pass
151
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200152
Thomas Hellera4ea6032003-04-17 18:55:45 +0000153class Unsigned_TestCase(unittest.TestCase):
154 def test_b(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000155 from _testcapi import getargs_b
Thomas Hellera4ea6032003-04-17 18:55:45 +0000156 # b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000157 self.assertRaises(TypeError, getargs_b, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200158 self.assertEqual(99, getargs_b(Index()))
159 self.assertEqual(0, getargs_b(IndexIntSubclass()))
160 self.assertRaises(TypeError, getargs_b, BadIndex())
161 with self.assertWarns(DeprecationWarning):
162 self.assertEqual(1, getargs_b(BadIndex2()))
163 self.assertEqual(0, getargs_b(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300164 self.assertRaises(TypeError, getargs_b, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200165 self.assertEqual(0, getargs_b(IntSubclass()))
166 self.assertRaises(TypeError, getargs_b, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300167 self.assertRaises(TypeError, getargs_b, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200168 self.assertEqual(0, getargs_b(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000169
Thomas Heller54aa5782003-04-24 16:15:29 +0000170 self.assertRaises(OverflowError, getargs_b, -1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000171 self.assertEqual(0, getargs_b(0))
172 self.assertEqual(UCHAR_MAX, getargs_b(UCHAR_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000173 self.assertRaises(OverflowError, getargs_b, UCHAR_MAX + 1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000174
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000175 self.assertEqual(42, getargs_b(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000176 self.assertRaises(OverflowError, getargs_b, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000177
Thomas Hellera4ea6032003-04-17 18:55:45 +0000178 def test_B(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000179 from _testcapi import getargs_B
Thomas Hellera4ea6032003-04-17 18:55:45 +0000180 # B returns 'unsigned char', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000181 self.assertRaises(TypeError, getargs_B, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200182 self.assertEqual(99, getargs_B(Index()))
183 self.assertEqual(0, getargs_B(IndexIntSubclass()))
184 self.assertRaises(TypeError, getargs_B, BadIndex())
185 with self.assertWarns(DeprecationWarning):
186 self.assertEqual(1, getargs_B(BadIndex2()))
187 self.assertEqual(0, getargs_B(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300188 self.assertRaises(TypeError, getargs_B, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200189 self.assertEqual(0, getargs_B(IntSubclass()))
190 self.assertRaises(TypeError, getargs_B, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300191 self.assertRaises(TypeError, getargs_B, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200192 self.assertEqual(0, getargs_B(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000193
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000194 self.assertEqual(UCHAR_MAX, getargs_B(-1))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000195 self.assertEqual(0, getargs_B(0))
196 self.assertEqual(UCHAR_MAX, getargs_B(UCHAR_MAX))
197 self.assertEqual(0, getargs_B(UCHAR_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000198
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000199 self.assertEqual(42, getargs_B(42))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000200 self.assertEqual(UCHAR_MAX & VERY_LARGE, getargs_B(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000201
202 def test_H(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000203 from _testcapi import getargs_H
Thomas Hellera4ea6032003-04-17 18:55:45 +0000204 # H returns 'unsigned short', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000205 self.assertRaises(TypeError, getargs_H, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200206 self.assertEqual(99, getargs_H(Index()))
207 self.assertEqual(0, getargs_H(IndexIntSubclass()))
208 self.assertRaises(TypeError, getargs_H, BadIndex())
209 with self.assertWarns(DeprecationWarning):
210 self.assertEqual(1, getargs_H(BadIndex2()))
211 self.assertEqual(0, getargs_H(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300212 self.assertRaises(TypeError, getargs_H, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200213 self.assertEqual(0, getargs_H(IntSubclass()))
214 self.assertRaises(TypeError, getargs_H, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300215 self.assertRaises(TypeError, getargs_H, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200216 self.assertEqual(0, getargs_H(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000217
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000218 self.assertEqual(USHRT_MAX, getargs_H(-1))
219 self.assertEqual(0, getargs_H(0))
220 self.assertEqual(USHRT_MAX, getargs_H(USHRT_MAX))
221 self.assertEqual(0, getargs_H(USHRT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000222
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000223 self.assertEqual(42, getargs_H(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000224
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000225 self.assertEqual(VERY_LARGE & USHRT_MAX, getargs_H(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000226
227 def test_I(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000228 from _testcapi import getargs_I
Thomas Hellera4ea6032003-04-17 18:55:45 +0000229 # I returns 'unsigned int', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000230 self.assertRaises(TypeError, getargs_I, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200231 self.assertEqual(99, getargs_I(Index()))
232 self.assertEqual(0, getargs_I(IndexIntSubclass()))
233 self.assertRaises(TypeError, getargs_I, BadIndex())
234 with self.assertWarns(DeprecationWarning):
235 self.assertEqual(1, getargs_I(BadIndex2()))
236 self.assertEqual(0, getargs_I(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300237 self.assertRaises(TypeError, getargs_I, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200238 self.assertEqual(0, getargs_I(IntSubclass()))
239 self.assertRaises(TypeError, getargs_I, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300240 self.assertRaises(TypeError, getargs_I, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200241 self.assertEqual(0, getargs_I(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000242
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000243 self.assertEqual(UINT_MAX, getargs_I(-1))
244 self.assertEqual(0, getargs_I(0))
245 self.assertEqual(UINT_MAX, getargs_I(UINT_MAX))
246 self.assertEqual(0, getargs_I(UINT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000247
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000248 self.assertEqual(42, getargs_I(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000249
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000250 self.assertEqual(VERY_LARGE & UINT_MAX, getargs_I(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000251
252 def test_k(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000253 from _testcapi import getargs_k
Thomas Hellera4ea6032003-04-17 18:55:45 +0000254 # k returns 'unsigned long', no range checking
255 # it does not accept float, or instances with __int__
Thomas Heller54aa5782003-04-24 16:15:29 +0000256 self.assertRaises(TypeError, getargs_k, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200257 self.assertRaises(TypeError, getargs_k, Index())
258 self.assertEqual(0, getargs_k(IndexIntSubclass()))
259 self.assertRaises(TypeError, getargs_k, BadIndex())
260 self.assertRaises(TypeError, getargs_k, BadIndex2())
261 self.assertEqual(0, getargs_k(BadIndex3()))
Thomas Heller54aa5782003-04-24 16:15:29 +0000262 self.assertRaises(TypeError, getargs_k, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200263 self.assertEqual(0, getargs_k(IntSubclass()))
264 self.assertRaises(TypeError, getargs_k, BadInt())
265 self.assertRaises(TypeError, getargs_k, BadInt2())
266 self.assertEqual(0, getargs_k(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000267
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertEqual(ULONG_MAX, getargs_k(-1))
269 self.assertEqual(0, getargs_k(0))
270 self.assertEqual(ULONG_MAX, getargs_k(ULONG_MAX))
271 self.assertEqual(0, getargs_k(ULONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000272
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000273 self.assertEqual(42, getargs_k(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000274
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000275 self.assertEqual(VERY_LARGE & ULONG_MAX, getargs_k(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000276
277class Signed_TestCase(unittest.TestCase):
Mark Dickinson1554b182009-12-20 16:03:30 +0000278 def test_h(self):
279 from _testcapi import getargs_h
280 # h returns 'short', and does range checking (SHRT_MIN ... SHRT_MAX)
281 self.assertRaises(TypeError, getargs_h, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200282 self.assertEqual(99, getargs_h(Index()))
283 self.assertEqual(0, getargs_h(IndexIntSubclass()))
284 self.assertRaises(TypeError, getargs_h, BadIndex())
285 with self.assertWarns(DeprecationWarning):
286 self.assertEqual(1, getargs_h(BadIndex2()))
287 self.assertEqual(0, getargs_h(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300288 self.assertRaises(TypeError, getargs_h, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200289 self.assertEqual(0, getargs_h(IntSubclass()))
290 self.assertRaises(TypeError, getargs_h, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300291 self.assertRaises(TypeError, getargs_h, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200292 self.assertEqual(0, getargs_h(BadInt3()))
Mark Dickinson1554b182009-12-20 16:03:30 +0000293
294 self.assertRaises(OverflowError, getargs_h, SHRT_MIN-1)
295 self.assertEqual(SHRT_MIN, getargs_h(SHRT_MIN))
296 self.assertEqual(SHRT_MAX, getargs_h(SHRT_MAX))
297 self.assertRaises(OverflowError, getargs_h, SHRT_MAX+1)
298
299 self.assertEqual(42, getargs_h(42))
300 self.assertRaises(OverflowError, getargs_h, VERY_LARGE)
301
Thomas Hellera4ea6032003-04-17 18:55:45 +0000302 def test_i(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000303 from _testcapi import getargs_i
Thomas Hellera4ea6032003-04-17 18:55:45 +0000304 # i returns 'int', and does range checking (INT_MIN ... INT_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000305 self.assertRaises(TypeError, getargs_i, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200306 self.assertEqual(99, getargs_i(Index()))
307 self.assertEqual(0, getargs_i(IndexIntSubclass()))
308 self.assertRaises(TypeError, getargs_i, BadIndex())
309 with self.assertWarns(DeprecationWarning):
310 self.assertEqual(1, getargs_i(BadIndex2()))
311 self.assertEqual(0, getargs_i(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300312 self.assertRaises(TypeError, getargs_i, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200313 self.assertEqual(0, getargs_i(IntSubclass()))
314 self.assertRaises(TypeError, getargs_i, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300315 self.assertRaises(TypeError, getargs_i, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200316 self.assertEqual(0, getargs_i(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000317
Thomas Heller54aa5782003-04-24 16:15:29 +0000318 self.assertRaises(OverflowError, getargs_i, INT_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000319 self.assertEqual(INT_MIN, getargs_i(INT_MIN))
320 self.assertEqual(INT_MAX, getargs_i(INT_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000321 self.assertRaises(OverflowError, getargs_i, INT_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000322
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000323 self.assertEqual(42, getargs_i(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000324 self.assertRaises(OverflowError, getargs_i, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000325
326 def test_l(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000327 from _testcapi import getargs_l
Thomas Hellera4ea6032003-04-17 18:55:45 +0000328 # l returns 'long', and does range checking (LONG_MIN ... LONG_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000329 self.assertRaises(TypeError, getargs_l, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200330 self.assertEqual(99, getargs_l(Index()))
331 self.assertEqual(0, getargs_l(IndexIntSubclass()))
332 self.assertRaises(TypeError, getargs_l, BadIndex())
333 with self.assertWarns(DeprecationWarning):
334 self.assertEqual(1, getargs_l(BadIndex2()))
335 self.assertEqual(0, getargs_l(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300336 self.assertRaises(TypeError, getargs_l, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200337 self.assertEqual(0, getargs_l(IntSubclass()))
338 self.assertRaises(TypeError, getargs_l, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300339 self.assertRaises(TypeError, getargs_l, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200340 self.assertEqual(0, getargs_l(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000341
Thomas Heller54aa5782003-04-24 16:15:29 +0000342 self.assertRaises(OverflowError, getargs_l, LONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000343 self.assertEqual(LONG_MIN, getargs_l(LONG_MIN))
344 self.assertEqual(LONG_MAX, getargs_l(LONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000345 self.assertRaises(OverflowError, getargs_l, LONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000346
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000347 self.assertEqual(42, getargs_l(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000348 self.assertRaises(OverflowError, getargs_l, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000349
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000350 def test_n(self):
351 from _testcapi import getargs_n
352 # n returns 'Py_ssize_t', and does range checking
353 # (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX)
Thomas Woutersd8073282006-04-21 11:36:13 +0000354 self.assertRaises(TypeError, getargs_n, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200355 self.assertEqual(99, getargs_n(Index()))
356 self.assertEqual(0, getargs_n(IndexIntSubclass()))
357 self.assertRaises(TypeError, getargs_n, BadIndex())
358 with self.assertWarns(DeprecationWarning):
359 self.assertEqual(1, getargs_n(BadIndex2()))
360 self.assertEqual(0, getargs_n(BadIndex3()))
Trent Nelson35133582008-04-22 19:02:40 +0000361 self.assertRaises(TypeError, getargs_n, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200362 self.assertEqual(0, getargs_n(IntSubclass()))
363 self.assertRaises(TypeError, getargs_n, BadInt())
364 self.assertRaises(TypeError, getargs_n, BadInt2())
365 self.assertEqual(0, getargs_n(BadInt3()))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000366
367 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000368 self.assertEqual(PY_SSIZE_T_MIN, getargs_n(PY_SSIZE_T_MIN))
369 self.assertEqual(PY_SSIZE_T_MAX, getargs_n(PY_SSIZE_T_MAX))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000370 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MAX+1)
371
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000372 self.assertEqual(42, getargs_n(42))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000373 self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
374
Thomas Hellera4ea6032003-04-17 18:55:45 +0000375
376class LongLong_TestCase(unittest.TestCase):
377 def test_L(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000378 from _testcapi import getargs_L
Mark Dickinsonde604012010-01-01 19:27:32 +0000379 # L returns 'long long', and does range checking (LLONG_MIN
380 # ... LLONG_MAX)
Mark Dickinsonc7301312010-06-10 16:05:10 +0000381 self.assertRaises(TypeError, getargs_L, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000382 self.assertRaises(TypeError, getargs_L, "Hello")
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200383 self.assertEqual(99, getargs_L(Index()))
384 self.assertEqual(0, getargs_L(IndexIntSubclass()))
385 self.assertRaises(TypeError, getargs_L, BadIndex())
386 with self.assertWarns(DeprecationWarning):
387 self.assertEqual(1, getargs_L(BadIndex2()))
388 self.assertEqual(0, getargs_L(BadIndex3()))
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300389 self.assertRaises(TypeError, getargs_L, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200390 self.assertEqual(0, getargs_L(IntSubclass()))
391 self.assertRaises(TypeError, getargs_L, BadInt())
Serhiy Storchaka578c3952020-05-26 18:43:38 +0300392 self.assertRaises(TypeError, getargs_L, BadInt2())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200393 self.assertEqual(0, getargs_L(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000394
Thomas Heller54aa5782003-04-24 16:15:29 +0000395 self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000396 self.assertEqual(LLONG_MIN, getargs_L(LLONG_MIN))
397 self.assertEqual(LLONG_MAX, getargs_L(LLONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000398 self.assertRaises(OverflowError, getargs_L, LLONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000399
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000400 self.assertEqual(42, getargs_L(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000401 self.assertRaises(OverflowError, getargs_L, VERY_LARGE)
Tim Peters0eadaac2003-04-24 16:02:54 +0000402
Thomas Hellera4ea6032003-04-17 18:55:45 +0000403 def test_K(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000404 from _testcapi import getargs_K
Thomas Hellera4ea6032003-04-17 18:55:45 +0000405 # K return 'unsigned long long', no range checking
Thomas Heller54aa5782003-04-24 16:15:29 +0000406 self.assertRaises(TypeError, getargs_K, 3.14)
Serhiy Storchaka6a44f6e2019-02-25 17:57:58 +0200407 self.assertRaises(TypeError, getargs_K, Index())
408 self.assertEqual(0, getargs_K(IndexIntSubclass()))
409 self.assertRaises(TypeError, getargs_K, BadIndex())
410 self.assertRaises(TypeError, getargs_K, BadIndex2())
411 self.assertEqual(0, getargs_K(BadIndex3()))
Thomas Heller54aa5782003-04-24 16:15:29 +0000412 self.assertRaises(TypeError, getargs_K, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200413 self.assertEqual(0, getargs_K(IntSubclass()))
414 self.assertRaises(TypeError, getargs_K, BadInt())
415 self.assertRaises(TypeError, getargs_K, BadInt2())
416 self.assertEqual(0, getargs_K(BadInt3()))
417
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000418 self.assertEqual(ULLONG_MAX, getargs_K(ULLONG_MAX))
419 self.assertEqual(0, getargs_K(0))
420 self.assertEqual(0, getargs_K(ULLONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000421
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000422 self.assertEqual(42, getargs_K(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000423
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000424 self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000425
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300426
427class Float_TestCase(unittest.TestCase):
428 def assertEqualWithSign(self, actual, expected):
429 self.assertEqual(actual, expected)
430 self.assertEqual(math.copysign(1, actual), math.copysign(1, expected))
431
432 def test_f(self):
433 from _testcapi import getargs_f
434 self.assertEqual(getargs_f(4.25), 4.25)
435 self.assertEqual(getargs_f(4), 4.0)
436 self.assertRaises(TypeError, getargs_f, 4.25+0j)
437 self.assertEqual(getargs_f(Float()), 4.25)
438 self.assertEqual(getargs_f(FloatSubclass(7.5)), 7.5)
439 self.assertEqual(getargs_f(FloatSubclass2(7.5)), 7.5)
440 self.assertRaises(TypeError, getargs_f, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300441 with self.assertWarns(DeprecationWarning):
442 self.assertEqual(getargs_f(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300443 self.assertEqual(getargs_f(BadFloat3(7.5)), 7.5)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300444 self.assertEqual(getargs_f(Index()), 99.0)
445 self.assertRaises(TypeError, getargs_f, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300446
447 for x in (FLT_MIN, -FLT_MIN, FLT_MAX, -FLT_MAX, INF, -INF):
448 self.assertEqual(getargs_f(x), x)
449 if FLT_MAX < DBL_MAX:
450 self.assertEqual(getargs_f(DBL_MAX), INF)
451 self.assertEqual(getargs_f(-DBL_MAX), -INF)
452 if FLT_MIN > DBL_MIN:
453 self.assertEqualWithSign(getargs_f(DBL_MIN), 0.0)
454 self.assertEqualWithSign(getargs_f(-DBL_MIN), -0.0)
455 self.assertEqualWithSign(getargs_f(0.0), 0.0)
456 self.assertEqualWithSign(getargs_f(-0.0), -0.0)
457 r = getargs_f(NAN)
458 self.assertNotEqual(r, r)
459
Benjamin Peterson2bb69a52017-09-10 23:50:46 -0700460 @support.requires_IEEE_754
461 def test_f_rounding(self):
462 from _testcapi import getargs_f
463 self.assertEqual(getargs_f(3.40282356e38), FLT_MAX)
464 self.assertEqual(getargs_f(-3.40282356e38), -FLT_MAX)
465
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300466 def test_d(self):
467 from _testcapi import getargs_d
468 self.assertEqual(getargs_d(4.25), 4.25)
469 self.assertEqual(getargs_d(4), 4.0)
470 self.assertRaises(TypeError, getargs_d, 4.25+0j)
471 self.assertEqual(getargs_d(Float()), 4.25)
472 self.assertEqual(getargs_d(FloatSubclass(7.5)), 7.5)
473 self.assertEqual(getargs_d(FloatSubclass2(7.5)), 7.5)
474 self.assertRaises(TypeError, getargs_d, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300475 with self.assertWarns(DeprecationWarning):
476 self.assertEqual(getargs_d(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300477 self.assertEqual(getargs_d(BadFloat3(7.5)), 7.5)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300478 self.assertEqual(getargs_d(Index()), 99.0)
479 self.assertRaises(TypeError, getargs_d, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300480
481 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
482 self.assertEqual(getargs_d(x), x)
483 self.assertRaises(OverflowError, getargs_d, 1<<DBL_MAX_EXP)
484 self.assertRaises(OverflowError, getargs_d, -1<<DBL_MAX_EXP)
485 self.assertEqualWithSign(getargs_d(0.0), 0.0)
486 self.assertEqualWithSign(getargs_d(-0.0), -0.0)
487 r = getargs_d(NAN)
488 self.assertNotEqual(r, r)
489
490 def test_D(self):
491 from _testcapi import getargs_D
492 self.assertEqual(getargs_D(4.25+0.5j), 4.25+0.5j)
493 self.assertEqual(getargs_D(4.25), 4.25+0j)
494 self.assertEqual(getargs_D(4), 4.0+0j)
495 self.assertEqual(getargs_D(Complex()), 4.25+0.5j)
496 self.assertEqual(getargs_D(ComplexSubclass(7.5+0.25j)), 7.5+0.25j)
497 self.assertEqual(getargs_D(ComplexSubclass2(7.5+0.25j)), 7.5+0.25j)
498 self.assertRaises(TypeError, getargs_D, BadComplex())
Serhiy Storchaka671079e2017-03-24 21:28:43 +0200499 with self.assertWarns(DeprecationWarning):
500 self.assertEqual(getargs_D(BadComplex2()), 4.25+0.5j)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300501 self.assertEqual(getargs_D(BadComplex3(7.5+0.25j)), 7.5+0.25j)
Serhiy Storchakabdbad712019-06-02 00:05:48 +0300502 self.assertEqual(getargs_D(Index()), 99.0+0j)
503 self.assertRaises(TypeError, getargs_D, Int())
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300504
505 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
506 c = complex(x, 1.0)
507 self.assertEqual(getargs_D(c), c)
508 c = complex(1.0, x)
509 self.assertEqual(getargs_D(c), c)
510 self.assertEqualWithSign(getargs_D(complex(0.0, 1.0)).real, 0.0)
511 self.assertEqualWithSign(getargs_D(complex(-0.0, 1.0)).real, -0.0)
512 self.assertEqualWithSign(getargs_D(complex(1.0, 0.0)).imag, 0.0)
513 self.assertEqualWithSign(getargs_D(complex(1.0, -0.0)).imag, -0.0)
514
515
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700516class Paradox:
517 "This statement is false."
518 def __bool__(self):
519 raise NotImplementedError
520
521class Boolean_TestCase(unittest.TestCase):
522 def test_p(self):
523 from _testcapi import getargs_p
524 self.assertEqual(0, getargs_p(False))
525 self.assertEqual(0, getargs_p(None))
526 self.assertEqual(0, getargs_p(0))
527 self.assertEqual(0, getargs_p(0.0))
528 self.assertEqual(0, getargs_p(0j))
529 self.assertEqual(0, getargs_p(''))
530 self.assertEqual(0, getargs_p(()))
531 self.assertEqual(0, getargs_p([]))
532 self.assertEqual(0, getargs_p({}))
533
534 self.assertEqual(1, getargs_p(True))
535 self.assertEqual(1, getargs_p(1))
536 self.assertEqual(1, getargs_p(1.0))
537 self.assertEqual(1, getargs_p(1j))
538 self.assertEqual(1, getargs_p('x'))
539 self.assertEqual(1, getargs_p((1,)))
540 self.assertEqual(1, getargs_p([1]))
541 self.assertEqual(1, getargs_p({1:2}))
542 self.assertEqual(1, getargs_p(unittest.TestCase))
543
544 self.assertRaises(NotImplementedError, getargs_p, Paradox())
545
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000546
547class Tuple_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300548 def test_args(self):
549 from _testcapi import get_args
550
551 ret = get_args(1, 2)
552 self.assertEqual(ret, (1, 2))
553 self.assertIs(type(ret), tuple)
554
555 ret = get_args(1, *(2, 3))
556 self.assertEqual(ret, (1, 2, 3))
557 self.assertIs(type(ret), tuple)
558
559 ret = get_args(*[1, 2])
560 self.assertEqual(ret, (1, 2))
561 self.assertIs(type(ret), tuple)
562
563 ret = get_args(*TupleSubclass([1, 2]))
564 self.assertEqual(ret, (1, 2))
Serhiy Storchaka63dc5482016-09-22 19:41:20 +0300565 self.assertIs(type(ret), tuple)
Serhiy Storchakace412872016-05-08 23:36:44 +0300566
567 ret = get_args()
568 self.assertIn(ret, ((), None))
569 self.assertIn(type(ret), (tuple, type(None)))
570
571 ret = get_args(*())
572 self.assertIn(ret, ((), None))
573 self.assertIn(type(ret), (tuple, type(None)))
574
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000575 def test_tuple(self):
576 from _testcapi import getargs_tuple
577
578 ret = getargs_tuple(1, (2, 3))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000579 self.assertEqual(ret, (1,2,3))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000580
581 # make sure invalid tuple arguments are handled correctly
582 class seq:
583 def __len__(self):
584 return 2
585 def __getitem__(self, n):
586 raise ValueError
587 self.assertRaises(TypeError, getargs_tuple, 1, seq())
588
Christian Heimes380f7f22008-02-28 11:19:05 +0000589class Keywords_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300590 def test_kwargs(self):
591 from _testcapi import get_kwargs
592
593 ret = get_kwargs(a=1, b=2)
594 self.assertEqual(ret, {'a': 1, 'b': 2})
595 self.assertIs(type(ret), dict)
596
597 ret = get_kwargs(a=1, **{'b': 2, 'c': 3})
598 self.assertEqual(ret, {'a': 1, 'b': 2, 'c': 3})
599 self.assertIs(type(ret), dict)
600
601 ret = get_kwargs(**DictSubclass({'a': 1, 'b': 2}))
602 self.assertEqual(ret, {'a': 1, 'b': 2})
603 self.assertIs(type(ret), dict)
604
605 ret = get_kwargs()
606 self.assertIn(ret, ({}, None))
607 self.assertIn(type(ret), (dict, type(None)))
608
609 ret = get_kwargs(**{})
610 self.assertIn(ret, ({}, None))
611 self.assertIn(type(ret), (dict, type(None)))
612
Christian Heimes380f7f22008-02-28 11:19:05 +0000613 def test_positional_args(self):
614 # using all positional args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000615 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000616 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), 10),
617 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
618 )
Victor Stinner93b55132010-05-19 00:54:06 +0000619
Christian Heimes380f7f22008-02-28 11:19:05 +0000620 def test_mixed_args(self):
621 # positional and keyword args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000622 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000623 getargs_keywords((1,2), 3, (4,(5,6)), arg4=(7,8,9), arg5=10),
624 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
625 )
Victor Stinner93b55132010-05-19 00:54:06 +0000626
Christian Heimes380f7f22008-02-28 11:19:05 +0000627 def test_keyword_args(self):
628 # all keywords
Ezio Melottib3aedd42010-11-20 19:04:17 +0000629 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000630 getargs_keywords(arg1=(1,2), arg2=3, arg3=(4,(5,6)), arg4=(7,8,9), arg5=10),
631 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
632 )
Victor Stinner93b55132010-05-19 00:54:06 +0000633
Christian Heimes380f7f22008-02-28 11:19:05 +0000634 def test_optional_args(self):
635 # missing optional keyword args, skipping tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000636 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000637 getargs_keywords(arg1=(1,2), arg2=3, arg5=10),
638 (1, 2, 3, -1, -1, -1, -1, -1, -1, 10)
639 )
Victor Stinner93b55132010-05-19 00:54:06 +0000640
Christian Heimes380f7f22008-02-28 11:19:05 +0000641 def test_required_args(self):
642 # required arg missing
643 try:
644 getargs_keywords(arg1=(1,2))
645 except TypeError as err:
Michael Seifert64c8f702017-04-09 09:47:12 +0200646 self.assertEqual(
647 str(err), "function missing required argument 'arg2' (pos 2)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000648 else:
649 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000650
Christian Heimes380f7f22008-02-28 11:19:05 +0000651 def test_too_many_args(self):
652 try:
653 getargs_keywords((1,2),3,(4,(5,6)),(7,8,9),10,111)
654 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000655 self.assertEqual(str(err), "function takes at most 5 arguments (6 given)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000656 else:
657 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000658
Christian Heimes380f7f22008-02-28 11:19:05 +0000659 def test_invalid_keyword(self):
660 # extraneous keyword arg
661 try:
662 getargs_keywords((1,2),3,arg5=10,arg666=666)
663 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000664 self.assertEqual(str(err), "'arg666' is an invalid keyword argument for this function")
Christian Heimes380f7f22008-02-28 11:19:05 +0000665 else:
666 self.fail('TypeError should have been raised')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000667
Victor Stinner93b55132010-05-19 00:54:06 +0000668 def test_surrogate_keyword(self):
669 try:
670 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), **{'\uDC80': 10})
671 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000672 self.assertEqual(str(err), "'\udc80' is an invalid keyword argument for this function")
Victor Stinner93b55132010-05-19 00:54:06 +0000673 else:
674 self.fail('TypeError should have been raised')
675
Larry Hastings83a9f482012-03-20 20:06:16 +0000676class KeywordOnly_TestCase(unittest.TestCase):
677 def test_positional_args(self):
678 # using all possible positional args
679 self.assertEqual(
680 getargs_keyword_only(1, 2),
681 (1, 2, -1)
682 )
683
684 def test_mixed_args(self):
685 # positional and keyword args
686 self.assertEqual(
687 getargs_keyword_only(1, 2, keyword_only=3),
688 (1, 2, 3)
689 )
690
691 def test_keyword_args(self):
692 # all keywords
693 self.assertEqual(
694 getargs_keyword_only(required=1, optional=2, keyword_only=3),
695 (1, 2, 3)
696 )
697
698 def test_optional_args(self):
699 # missing optional keyword args, skipping tuples
700 self.assertEqual(
701 getargs_keyword_only(required=1, optional=2),
702 (1, 2, -1)
703 )
704 self.assertEqual(
705 getargs_keyword_only(required=1, keyword_only=3),
706 (1, -1, 3)
707 )
708
709 def test_required_args(self):
710 self.assertEqual(
711 getargs_keyword_only(1),
712 (1, -1, -1)
713 )
714 self.assertEqual(
715 getargs_keyword_only(required=1),
716 (1, -1, -1)
717 )
718 # required arg missing
719 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200720 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000721 getargs_keyword_only(optional=2)
722
723 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200724 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000725 getargs_keyword_only(keyword_only=3)
726
727 def test_too_many_args(self):
728 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200729 r"function takes at most 2 positional arguments \(3 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000730 getargs_keyword_only(1, 2, 3)
731
732 with self.assertRaisesRegex(TypeError,
R David Murray44b548d2016-09-08 13:59:53 -0400733 r"function takes at most 3 arguments \(4 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000734 getargs_keyword_only(1, 2, 3, keyword_only=5)
735
736 def test_invalid_keyword(self):
737 # extraneous keyword arg
738 with self.assertRaisesRegex(TypeError,
739 "'monster' is an invalid keyword argument for this function"):
740 getargs_keyword_only(1, 2, monster=666)
741
742 def test_surrogate_keyword(self):
743 with self.assertRaisesRegex(TypeError,
744 "'\udc80' is an invalid keyword argument for this function"):
745 getargs_keyword_only(1, 2, **{'\uDC80': 10})
746
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200747
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300748class PositionalOnlyAndKeywords_TestCase(unittest.TestCase):
749 from _testcapi import getargs_positional_only_and_keywords as getargs
750
751 def test_positional_args(self):
752 # using all possible positional args
753 self.assertEqual(self.getargs(1, 2, 3), (1, 2, 3))
754
755 def test_mixed_args(self):
756 # positional and keyword args
757 self.assertEqual(self.getargs(1, 2, keyword=3), (1, 2, 3))
758
759 def test_optional_args(self):
760 # missing optional args
761 self.assertEqual(self.getargs(1, 2), (1, 2, -1))
762 self.assertEqual(self.getargs(1, keyword=3), (1, -1, 3))
763
764 def test_required_args(self):
765 self.assertEqual(self.getargs(1), (1, -1, -1))
766 # required positional arg missing
767 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +0530768 r"function takes at least 1 positional argument \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300769 self.getargs()
770
771 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +0530772 r"function takes at least 1 positional argument \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300773 self.getargs(keyword=3)
774
775 def test_empty_keyword(self):
776 with self.assertRaisesRegex(TypeError,
777 "'' is an invalid keyword argument for this function"):
778 self.getargs(1, 2, **{'': 666})
779
780
Victor Stinner06e49dd2010-06-13 18:21:50 +0000781class Bytes_TestCase(unittest.TestCase):
Eli Bendersky906b88f2011-07-29 07:05:08 +0300782 def test_c(self):
783 from _testcapi import getargs_c
784 self.assertRaises(TypeError, getargs_c, b'abc') # len > 1
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200785 self.assertEqual(getargs_c(b'a'), 97)
786 self.assertEqual(getargs_c(bytearray(b'a')), 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300787 self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
788 self.assertRaises(TypeError, getargs_c, 's')
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200789 self.assertRaises(TypeError, getargs_c, 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300790 self.assertRaises(TypeError, getargs_c, None)
791
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200792 def test_y(self):
793 from _testcapi import getargs_y
794 self.assertRaises(TypeError, getargs_y, 'abc\xe9')
795 self.assertEqual(getargs_y(b'bytes'), b'bytes')
796 self.assertRaises(ValueError, getargs_y, b'nul:\0')
797 self.assertRaises(TypeError, getargs_y, bytearray(b'bytearray'))
798 self.assertRaises(TypeError, getargs_y, memoryview(b'memoryview'))
799 self.assertRaises(TypeError, getargs_y, None)
800
801 def test_y_star(self):
802 from _testcapi import getargs_y_star
803 self.assertRaises(TypeError, getargs_y_star, 'abc\xe9')
804 self.assertEqual(getargs_y_star(b'bytes'), b'bytes')
805 self.assertEqual(getargs_y_star(b'nul:\0'), b'nul:\0')
806 self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
807 self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
808 self.assertRaises(TypeError, getargs_y_star, None)
809
810 def test_y_hash(self):
811 from _testcapi import getargs_y_hash
812 self.assertRaises(TypeError, getargs_y_hash, 'abc\xe9')
813 self.assertEqual(getargs_y_hash(b'bytes'), b'bytes')
814 self.assertEqual(getargs_y_hash(b'nul:\0'), b'nul:\0')
815 self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
816 self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
817 self.assertRaises(TypeError, getargs_y_hash, None)
818
819 def test_w_star(self):
820 # getargs_w_star() modifies first and last byte
821 from _testcapi import getargs_w_star
822 self.assertRaises(TypeError, getargs_w_star, 'abc\xe9')
823 self.assertRaises(TypeError, getargs_w_star, b'bytes')
824 self.assertRaises(TypeError, getargs_w_star, b'nul:\0')
825 self.assertRaises(TypeError, getargs_w_star, memoryview(b'bytes'))
826 buf = bytearray(b'bytearray')
827 self.assertEqual(getargs_w_star(buf), b'[ytearra]')
828 self.assertEqual(buf, bytearray(b'[ytearra]'))
829 buf = bytearray(b'memoryview')
830 self.assertEqual(getargs_w_star(memoryview(buf)), b'[emoryvie]')
831 self.assertEqual(buf, bytearray(b'[emoryvie]'))
832 self.assertRaises(TypeError, getargs_w_star, None)
833
834
835class String_TestCase(unittest.TestCase):
836 def test_C(self):
837 from _testcapi import getargs_C
838 self.assertRaises(TypeError, getargs_C, 'abc') # len > 1
839 self.assertEqual(getargs_C('a'), 97)
840 self.assertEqual(getargs_C('\u20ac'), 0x20ac)
841 self.assertEqual(getargs_C('\U0001f40d'), 0x1f40d)
842 self.assertRaises(TypeError, getargs_C, b'a')
843 self.assertRaises(TypeError, getargs_C, bytearray(b'a'))
844 self.assertRaises(TypeError, getargs_C, memoryview(b'a'))
845 self.assertRaises(TypeError, getargs_C, 97)
846 self.assertRaises(TypeError, getargs_C, None)
847
Victor Stinner06e49dd2010-06-13 18:21:50 +0000848 def test_s(self):
849 from _testcapi import getargs_s
850 self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300851 self.assertRaises(ValueError, getargs_s, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000852 self.assertRaises(TypeError, getargs_s, b'bytes')
853 self.assertRaises(TypeError, getargs_s, bytearray(b'bytearray'))
854 self.assertRaises(TypeError, getargs_s, memoryview(b'memoryview'))
855 self.assertRaises(TypeError, getargs_s, None)
856
857 def test_s_star(self):
858 from _testcapi import getargs_s_star
859 self.assertEqual(getargs_s_star('abc\xe9'), b'abc\xc3\xa9')
860 self.assertEqual(getargs_s_star('nul:\0'), b'nul:\0')
861 self.assertEqual(getargs_s_star(b'bytes'), b'bytes')
862 self.assertEqual(getargs_s_star(bytearray(b'bytearray')), b'bytearray')
863 self.assertEqual(getargs_s_star(memoryview(b'memoryview')), b'memoryview')
864 self.assertRaises(TypeError, getargs_s_star, None)
865
866 def test_s_hash(self):
867 from _testcapi import getargs_s_hash
868 self.assertEqual(getargs_s_hash('abc\xe9'), b'abc\xc3\xa9')
869 self.assertEqual(getargs_s_hash('nul:\0'), b'nul:\0')
870 self.assertEqual(getargs_s_hash(b'bytes'), b'bytes')
871 self.assertRaises(TypeError, getargs_s_hash, bytearray(b'bytearray'))
872 self.assertRaises(TypeError, getargs_s_hash, memoryview(b'memoryview'))
873 self.assertRaises(TypeError, getargs_s_hash, None)
874
875 def test_z(self):
876 from _testcapi import getargs_z
877 self.assertEqual(getargs_z('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300878 self.assertRaises(ValueError, getargs_z, 'nul:\0')
Victor Stinner4aae1eb2010-06-24 22:08:25 +0000879 self.assertRaises(TypeError, getargs_z, b'bytes')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000880 self.assertRaises(TypeError, getargs_z, bytearray(b'bytearray'))
881 self.assertRaises(TypeError, getargs_z, memoryview(b'memoryview'))
882 self.assertIsNone(getargs_z(None))
883
884 def test_z_star(self):
885 from _testcapi import getargs_z_star
886 self.assertEqual(getargs_z_star('abc\xe9'), b'abc\xc3\xa9')
887 self.assertEqual(getargs_z_star('nul:\0'), b'nul:\0')
888 self.assertEqual(getargs_z_star(b'bytes'), b'bytes')
889 self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
890 self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
891 self.assertIsNone(getargs_z_star(None))
892
893 def test_z_hash(self):
894 from _testcapi import getargs_z_hash
895 self.assertEqual(getargs_z_hash('abc\xe9'), b'abc\xc3\xa9')
896 self.assertEqual(getargs_z_hash('nul:\0'), b'nul:\0')
897 self.assertEqual(getargs_z_hash(b'bytes'), b'bytes')
898 self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
899 self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
900 self.assertIsNone(getargs_z_hash(None))
901
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200902 def test_es(self):
903 from _testcapi import getargs_es
904 self.assertEqual(getargs_es('abc\xe9'), b'abc\xc3\xa9')
905 self.assertEqual(getargs_es('abc\xe9', 'latin1'), b'abc\xe9')
906 self.assertRaises(UnicodeEncodeError, getargs_es, 'abc\xe9', 'ascii')
907 self.assertRaises(LookupError, getargs_es, 'abc\xe9', 'spam')
908 self.assertRaises(TypeError, getargs_es, b'bytes', 'latin1')
909 self.assertRaises(TypeError, getargs_es, bytearray(b'bytearray'), 'latin1')
910 self.assertRaises(TypeError, getargs_es, memoryview(b'memoryview'), 'latin1')
911 self.assertRaises(TypeError, getargs_es, None, 'latin1')
912 self.assertRaises(TypeError, getargs_es, 'nul:\0', 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000913
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200914 def test_et(self):
915 from _testcapi import getargs_et
916 self.assertEqual(getargs_et('abc\xe9'), b'abc\xc3\xa9')
917 self.assertEqual(getargs_et('abc\xe9', 'latin1'), b'abc\xe9')
918 self.assertRaises(UnicodeEncodeError, getargs_et, 'abc\xe9', 'ascii')
919 self.assertRaises(LookupError, getargs_et, 'abc\xe9', 'spam')
920 self.assertEqual(getargs_et(b'bytes', 'latin1'), b'bytes')
921 self.assertEqual(getargs_et(bytearray(b'bytearray'), 'latin1'), b'bytearray')
922 self.assertRaises(TypeError, getargs_et, memoryview(b'memoryview'), 'latin1')
923 self.assertRaises(TypeError, getargs_et, None, 'latin1')
924 self.assertRaises(TypeError, getargs_et, 'nul:\0', 'latin1')
925 self.assertRaises(TypeError, getargs_et, b'nul:\0', 'latin1')
926 self.assertRaises(TypeError, getargs_et, bytearray(b'nul:\0'), 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000927
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200928 def test_es_hash(self):
929 from _testcapi import getargs_es_hash
930 self.assertEqual(getargs_es_hash('abc\xe9'), b'abc\xc3\xa9')
931 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1'), b'abc\xe9')
932 self.assertRaises(UnicodeEncodeError, getargs_es_hash, 'abc\xe9', 'ascii')
933 self.assertRaises(LookupError, getargs_es_hash, 'abc\xe9', 'spam')
934 self.assertRaises(TypeError, getargs_es_hash, b'bytes', 'latin1')
935 self.assertRaises(TypeError, getargs_es_hash, bytearray(b'bytearray'), 'latin1')
936 self.assertRaises(TypeError, getargs_es_hash, memoryview(b'memoryview'), 'latin1')
937 self.assertRaises(TypeError, getargs_es_hash, None, 'latin1')
938 self.assertEqual(getargs_es_hash('nul:\0', 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000939
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200940 buf = bytearray(b'x'*8)
941 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
942 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
943 buf = bytearray(b'x'*5)
944 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
945 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
946 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200947 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200948 self.assertEqual(buf, bytearray(b'x'*4))
949 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200950 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Victor Stinner25e8ec42010-06-25 00:02:38 +0000951
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200952 def test_et_hash(self):
953 from _testcapi import getargs_et_hash
954 self.assertEqual(getargs_et_hash('abc\xe9'), b'abc\xc3\xa9')
955 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1'), b'abc\xe9')
956 self.assertRaises(UnicodeEncodeError, getargs_et_hash, 'abc\xe9', 'ascii')
957 self.assertRaises(LookupError, getargs_et_hash, 'abc\xe9', 'spam')
958 self.assertEqual(getargs_et_hash(b'bytes', 'latin1'), b'bytes')
959 self.assertEqual(getargs_et_hash(bytearray(b'bytearray'), 'latin1'), b'bytearray')
960 self.assertRaises(TypeError, getargs_et_hash, memoryview(b'memoryview'), 'latin1')
961 self.assertRaises(TypeError, getargs_et_hash, None, 'latin1')
962 self.assertEqual(getargs_et_hash('nul:\0', 'latin1'), b'nul:\0')
963 self.assertEqual(getargs_et_hash(b'nul:\0', 'latin1'), b'nul:\0')
964 self.assertEqual(getargs_et_hash(bytearray(b'nul:\0'), 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000965
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200966 buf = bytearray(b'x'*8)
967 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
968 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
969 buf = bytearray(b'x'*5)
970 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
971 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
972 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200973 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200974 self.assertEqual(buf, bytearray(b'x'*4))
975 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200976 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200977
Victor Stinner06e49dd2010-06-13 18:21:50 +0000978 def test_u(self):
979 from _testcapi import getargs_u
980 self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300981 self.assertRaises(ValueError, getargs_u, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000982 self.assertRaises(TypeError, getargs_u, b'bytes')
983 self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
984 self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
985 self.assertRaises(TypeError, getargs_u, None)
986
987 def test_u_hash(self):
988 from _testcapi import getargs_u_hash
989 self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
990 self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
991 self.assertRaises(TypeError, getargs_u_hash, b'bytes')
992 self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
993 self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
994 self.assertRaises(TypeError, getargs_u_hash, None)
995
996 def test_Z(self):
997 from _testcapi import getargs_Z
998 self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300999 self.assertRaises(ValueError, getargs_Z, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +00001000 self.assertRaises(TypeError, getargs_Z, b'bytes')
1001 self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
1002 self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
1003 self.assertIsNone(getargs_Z(None))
1004
1005 def test_Z_hash(self):
1006 from _testcapi import getargs_Z_hash
1007 self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
1008 self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
1009 self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
1010 self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
1011 self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
1012 self.assertIsNone(getargs_Z_hash(None))
1013
1014
Serhiy Storchakaf95455d2016-05-16 10:11:47 +03001015class Object_TestCase(unittest.TestCase):
1016 def test_S(self):
1017 from _testcapi import getargs_S
1018 obj = b'bytes'
1019 self.assertIs(getargs_S(obj), obj)
1020 self.assertRaises(TypeError, getargs_S, bytearray(b'bytearray'))
1021 self.assertRaises(TypeError, getargs_S, 'str')
1022 self.assertRaises(TypeError, getargs_S, None)
1023 self.assertRaises(TypeError, getargs_S, memoryview(obj))
1024
1025 def test_Y(self):
1026 from _testcapi import getargs_Y
1027 obj = bytearray(b'bytearray')
1028 self.assertIs(getargs_Y(obj), obj)
1029 self.assertRaises(TypeError, getargs_Y, b'bytes')
1030 self.assertRaises(TypeError, getargs_Y, 'str')
1031 self.assertRaises(TypeError, getargs_Y, None)
1032 self.assertRaises(TypeError, getargs_Y, memoryview(obj))
1033
1034 def test_U(self):
1035 from _testcapi import getargs_U
1036 obj = 'str'
1037 self.assertIs(getargs_U(obj), obj)
1038 self.assertRaises(TypeError, getargs_U, b'bytes')
1039 self.assertRaises(TypeError, getargs_U, bytearray(b'bytearray'))
1040 self.assertRaises(TypeError, getargs_U, None)
1041
1042
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001043# Bug #6012
1044class Test6012(unittest.TestCase):
1045 def test(self):
1046 self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
1047
1048
1049class SkipitemTest(unittest.TestCase):
1050
1051 def test_skipitem(self):
1052 """
1053 If this test failed, you probably added a new "format unit"
1054 in Python/getargs.c, but neglected to update our poor friend
1055 skipitem() in the same file. (If so, shame on you!)
1056
1057 With a few exceptions**, this function brute-force tests all
1058 printable ASCII*** characters (32 to 126 inclusive) as format units,
1059 checking to see that PyArg_ParseTupleAndKeywords() return consistent
1060 errors both when the unit is attempted to be used and when it is
1061 skipped. If the format unit doesn't exist, we'll get one of two
1062 specific error messages (one for used, one for skipped); if it does
1063 exist we *won't* get that error--we'll get either no error or some
1064 other error. If we get the specific "does not exist" error for one
1065 test and not for the other, there's a mismatch, and the test fails.
1066
1067 ** Some format units have special funny semantics and it would
1068 be difficult to accommodate them here. Since these are all
1069 well-established and properly skipped in skipitem() we can
1070 get away with not testing them--this test is really intended
1071 to catch *new* format units.
1072
1073 *** Python C source files must be ASCII. Therefore it's impossible
1074 to have non-ASCII format units.
1075
1076 """
1077 empty_tuple = ()
1078 tuple_1 = (0,)
1079 dict_b = {'b':1}
1080 keywords = ["a", "b"]
1081
1082 for i in range(32, 127):
1083 c = chr(i)
1084
1085 # skip parentheses, the error reporting is inconsistent about them
1086 # skip 'e', it's always a two-character code
1087 # skip '|' and '$', they don't represent arguments anyway
1088 if c in '()e|$':
1089 continue
1090
1091 # test the format unit when not skipped
1092 format = c + "i"
1093 try:
1094 _testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
1095 format, keywords)
1096 when_not_skipped = False
1097 except SystemError as e:
1098 s = "argument 1 (impossible<bad format char>)"
1099 when_not_skipped = (str(e) == s)
1100 except TypeError:
1101 when_not_skipped = False
1102
1103 # test the format unit when skipped
1104 optional_format = "|" + format
1105 try:
1106 _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b,
1107 optional_format, keywords)
1108 when_skipped = False
1109 except SystemError as e:
1110 s = "impossible<bad format char>: '{}'".format(format)
1111 when_skipped = (str(e) == s)
1112
1113 message = ("test_skipitem_parity: "
1114 "detected mismatch between convertsimple and skipitem "
1115 "for format unit '{}' ({}), not skipped {}, skipped {}".format(
1116 c, i, when_skipped, when_not_skipped))
1117 self.assertIs(when_skipped, when_not_skipped, message)
1118
1119 def test_skipitem_with_suffix(self):
1120 parse = _testcapi.parse_tuple_and_keywords
1121 empty_tuple = ()
1122 tuple_1 = (0,)
1123 dict_b = {'b':1}
1124 keywords = ["a", "b"]
1125
1126 supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*')
1127 for c in string.ascii_letters:
1128 for c2 in '#*':
1129 f = c + c2
1130 with self.subTest(format=f):
1131 optional_format = "|" + f + "i"
1132 if f in supported:
1133 parse(empty_tuple, dict_b, optional_format, keywords)
1134 else:
1135 with self.assertRaisesRegex(SystemError,
1136 'impossible<bad format char>'):
1137 parse(empty_tuple, dict_b, optional_format, keywords)
1138
1139 for c in map(chr, range(32, 128)):
1140 f = 'e' + c
1141 optional_format = "|" + f + "i"
1142 with self.subTest(format=f):
1143 if c in 'st':
1144 parse(empty_tuple, dict_b, optional_format, keywords)
1145 else:
1146 with self.assertRaisesRegex(SystemError,
1147 'impossible<bad format char>'):
1148 parse(empty_tuple, dict_b, optional_format, keywords)
1149
1150
1151class ParseTupleAndKeywords_Test(unittest.TestCase):
1152
1153 def test_parse_tuple_and_keywords(self):
1154 # Test handling errors in the parse_tuple_and_keywords helper itself
1155 self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords,
1156 (), {}, 42, [])
1157 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1158 (), {}, '', 42)
1159 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1160 (), {}, '', [''] * 42)
1161 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1162 (), {}, '', [42])
1163
1164 def test_bad_use(self):
1165 # Test handling invalid format and keywords in
1166 # PyArg_ParseTupleAndKeywords()
1167 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1168 (1,), {}, '||O', ['a'])
1169 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1170 (1, 2), {}, '|O|O', ['a', 'b'])
1171 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1172 (), {'a': 1}, '$$O', ['a'])
1173 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1174 (), {'a': 1, 'b': 2}, '$O$O', ['a', 'b'])
1175 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1176 (), {'a': 1}, '$|O', ['a'])
1177 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1178 (), {'a': 1, 'b': 2}, '$O|O', ['a', 'b'])
1179 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1180 (1,), {}, '|O', ['a', 'b'])
1181 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1182 (1,), {}, '|OO', ['a'])
1183 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1184 (), {}, '|$O', [''])
1185 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1186 (), {}, '|OO', ['a', ''])
1187
1188 def test_positional_only(self):
1189 parse = _testcapi.parse_tuple_and_keywords
1190
1191 parse((1, 2, 3), {}, 'OOO', ['', '', 'a'])
1192 parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a'])
1193 with self.assertRaisesRegex(TypeError,
1194 r'function takes at least 2 positional arguments \(1 given\)'):
1195 parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
1196 parse((1,), {}, 'O|OO', ['', '', 'a'])
1197 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301198 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001199 parse((), {}, 'O|OO', ['', '', 'a'])
1200 parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
1201 with self.assertRaisesRegex(TypeError,
1202 r'function takes exactly 2 positional arguments \(1 given\)'):
1203 parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
1204 parse((1,), {}, 'O|O$O', ['', '', 'a'])
1205 with self.assertRaisesRegex(TypeError,
Xtreak63262782018-12-21 20:15:13 +05301206 r'function takes at least 1 positional argument \(0 given\)'):
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +03001207 parse((), {}, 'O|O$O', ['', '', 'a'])
1208 with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'):
1209 parse((1,), {}, 'O|$OO', ['', '', 'a'])
1210 with self.assertRaisesRegex(SystemError, 'Empty keyword'):
1211 parse((1,), {}, 'O|OO', ['', 'a', ''])
1212
1213
1214class Test_testcapi(unittest.TestCase):
1215 locals().update((name, getattr(_testcapi, name))
1216 for name in dir(_testcapi)
1217 if name.startswith('test_') and name.endswith('_code'))
1218
1219
Thomas Hellera4ea6032003-04-17 18:55:45 +00001220if __name__ == "__main__":
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001221 unittest.main()