blob: 44a01a48105f37ddda52a16cc17f74381cabfc1b [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
Thomas Hellera4ea6032003-04-17 18:55:45 +000056class Int:
57 def __int__(self):
58 return 99
59
Serhiy Storchaka31a65542013-12-11 21:07:54 +020060class IntSubclass(int):
61 def __int__(self):
62 return 99
63
64class BadInt:
65 def __int__(self):
66 return 1.0
67
68class BadInt2:
69 def __int__(self):
70 return True
71
72class BadInt3(int):
73 def __int__(self):
74 return True
75
Serhiy Storchakaf95455d2016-05-16 10:11:47 +030076
77class Float:
78 def __float__(self):
79 return 4.25
80
81class FloatSubclass(float):
82 pass
83
84class FloatSubclass2(float):
85 def __float__(self):
86 return 4.25
87
88class BadFloat:
89 def __float__(self):
90 return 687
91
92class BadFloat2:
93 def __float__(self):
94 return FloatSubclass(4.25)
95
96class BadFloat3(float):
97 def __float__(self):
98 return FloatSubclass(4.25)
99
100
101class Complex:
102 def __complex__(self):
103 return 4.25+0.5j
104
105class ComplexSubclass(complex):
106 pass
107
108class ComplexSubclass2(complex):
109 def __complex__(self):
110 return 4.25+0.5j
111
112class BadComplex:
113 def __complex__(self):
114 return 1.25
115
116class BadComplex2:
117 def __complex__(self):
118 return ComplexSubclass(4.25+0.5j)
119
120class BadComplex3(complex):
121 def __complex__(self):
122 return ComplexSubclass(4.25+0.5j)
123
124
Serhiy Storchakace412872016-05-08 23:36:44 +0300125class TupleSubclass(tuple):
126 pass
127
128class DictSubclass(dict):
129 pass
130
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200131
Thomas Hellera4ea6032003-04-17 18:55:45 +0000132class Unsigned_TestCase(unittest.TestCase):
133 def test_b(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000134 from _testcapi import getargs_b
Thomas Hellera4ea6032003-04-17 18:55:45 +0000135 # b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000136 self.assertRaises(TypeError, getargs_b, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000137 self.assertEqual(99, getargs_b(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200138 self.assertEqual(0, getargs_b(IntSubclass()))
139 self.assertRaises(TypeError, getargs_b, BadInt())
140 with self.assertWarns(DeprecationWarning):
141 self.assertEqual(1, getargs_b(BadInt2()))
142 self.assertEqual(0, getargs_b(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000143
Thomas Heller54aa5782003-04-24 16:15:29 +0000144 self.assertRaises(OverflowError, getargs_b, -1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000145 self.assertEqual(0, getargs_b(0))
146 self.assertEqual(UCHAR_MAX, getargs_b(UCHAR_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000147 self.assertRaises(OverflowError, getargs_b, UCHAR_MAX + 1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000148
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000149 self.assertEqual(42, getargs_b(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000150 self.assertRaises(OverflowError, getargs_b, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000151
Thomas Hellera4ea6032003-04-17 18:55:45 +0000152 def test_B(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000153 from _testcapi import getargs_B
Thomas Hellera4ea6032003-04-17 18:55:45 +0000154 # B returns 'unsigned char', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000155 self.assertRaises(TypeError, getargs_B, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000156 self.assertEqual(99, getargs_B(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200157 self.assertEqual(0, getargs_B(IntSubclass()))
158 self.assertRaises(TypeError, getargs_B, BadInt())
159 with self.assertWarns(DeprecationWarning):
160 self.assertEqual(1, getargs_B(BadInt2()))
161 self.assertEqual(0, getargs_B(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000162
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000163 self.assertEqual(UCHAR_MAX, getargs_B(-1))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000164 self.assertEqual(0, getargs_B(0))
165 self.assertEqual(UCHAR_MAX, getargs_B(UCHAR_MAX))
166 self.assertEqual(0, getargs_B(UCHAR_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000167
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000168 self.assertEqual(42, getargs_B(42))
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000169 self.assertEqual(UCHAR_MAX & VERY_LARGE, getargs_B(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000170
171 def test_H(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000172 from _testcapi import getargs_H
Thomas Hellera4ea6032003-04-17 18:55:45 +0000173 # H returns 'unsigned short', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000174 self.assertRaises(TypeError, getargs_H, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000175 self.assertEqual(99, getargs_H(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200176 self.assertEqual(0, getargs_H(IntSubclass()))
177 self.assertRaises(TypeError, getargs_H, BadInt())
178 with self.assertWarns(DeprecationWarning):
179 self.assertEqual(1, getargs_H(BadInt2()))
180 self.assertEqual(0, getargs_H(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000181
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000182 self.assertEqual(USHRT_MAX, getargs_H(-1))
183 self.assertEqual(0, getargs_H(0))
184 self.assertEqual(USHRT_MAX, getargs_H(USHRT_MAX))
185 self.assertEqual(0, getargs_H(USHRT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000186
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000187 self.assertEqual(42, getargs_H(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000188
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000189 self.assertEqual(VERY_LARGE & USHRT_MAX, getargs_H(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000190
191 def test_I(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000192 from _testcapi import getargs_I
Thomas Hellera4ea6032003-04-17 18:55:45 +0000193 # I returns 'unsigned int', no range checking
Thomas Woutersc9471232006-04-15 09:15:11 +0000194 self.assertRaises(TypeError, getargs_I, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000195 self.assertEqual(99, getargs_I(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200196 self.assertEqual(0, getargs_I(IntSubclass()))
197 self.assertRaises(TypeError, getargs_I, BadInt())
198 with self.assertWarns(DeprecationWarning):
199 self.assertEqual(1, getargs_I(BadInt2()))
200 self.assertEqual(0, getargs_I(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000201
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000202 self.assertEqual(UINT_MAX, getargs_I(-1))
203 self.assertEqual(0, getargs_I(0))
204 self.assertEqual(UINT_MAX, getargs_I(UINT_MAX))
205 self.assertEqual(0, getargs_I(UINT_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000206
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000207 self.assertEqual(42, getargs_I(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000208
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000209 self.assertEqual(VERY_LARGE & UINT_MAX, getargs_I(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000210
211 def test_k(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000212 from _testcapi import getargs_k
Thomas Hellera4ea6032003-04-17 18:55:45 +0000213 # k returns 'unsigned long', no range checking
214 # it does not accept float, or instances with __int__
Thomas Heller54aa5782003-04-24 16:15:29 +0000215 self.assertRaises(TypeError, getargs_k, 3.14)
Thomas Heller54aa5782003-04-24 16:15:29 +0000216 self.assertRaises(TypeError, getargs_k, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200217 self.assertEqual(0, getargs_k(IntSubclass()))
218 self.assertRaises(TypeError, getargs_k, BadInt())
219 self.assertRaises(TypeError, getargs_k, BadInt2())
220 self.assertEqual(0, getargs_k(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000221
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000222 self.assertEqual(ULONG_MAX, getargs_k(-1))
223 self.assertEqual(0, getargs_k(0))
224 self.assertEqual(ULONG_MAX, getargs_k(ULONG_MAX))
225 self.assertEqual(0, getargs_k(ULONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000226
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000227 self.assertEqual(42, getargs_k(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000228
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000229 self.assertEqual(VERY_LARGE & ULONG_MAX, getargs_k(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000230
231class Signed_TestCase(unittest.TestCase):
Mark Dickinson1554b182009-12-20 16:03:30 +0000232 def test_h(self):
233 from _testcapi import getargs_h
234 # h returns 'short', and does range checking (SHRT_MIN ... SHRT_MAX)
235 self.assertRaises(TypeError, getargs_h, 3.14)
236 self.assertEqual(99, getargs_h(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200237 self.assertEqual(0, getargs_h(IntSubclass()))
238 self.assertRaises(TypeError, getargs_h, BadInt())
239 with self.assertWarns(DeprecationWarning):
240 self.assertEqual(1, getargs_h(BadInt2()))
241 self.assertEqual(0, getargs_h(BadInt3()))
Mark Dickinson1554b182009-12-20 16:03:30 +0000242
243 self.assertRaises(OverflowError, getargs_h, SHRT_MIN-1)
244 self.assertEqual(SHRT_MIN, getargs_h(SHRT_MIN))
245 self.assertEqual(SHRT_MAX, getargs_h(SHRT_MAX))
246 self.assertRaises(OverflowError, getargs_h, SHRT_MAX+1)
247
248 self.assertEqual(42, getargs_h(42))
249 self.assertRaises(OverflowError, getargs_h, VERY_LARGE)
250
Thomas Hellera4ea6032003-04-17 18:55:45 +0000251 def test_i(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000252 from _testcapi import getargs_i
Thomas Hellera4ea6032003-04-17 18:55:45 +0000253 # i returns 'int', and does range checking (INT_MIN ... INT_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000254 self.assertRaises(TypeError, getargs_i, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000255 self.assertEqual(99, getargs_i(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200256 self.assertEqual(0, getargs_i(IntSubclass()))
257 self.assertRaises(TypeError, getargs_i, BadInt())
258 with self.assertWarns(DeprecationWarning):
259 self.assertEqual(1, getargs_i(BadInt2()))
260 self.assertEqual(0, getargs_i(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000261
Thomas Heller54aa5782003-04-24 16:15:29 +0000262 self.assertRaises(OverflowError, getargs_i, INT_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000263 self.assertEqual(INT_MIN, getargs_i(INT_MIN))
264 self.assertEqual(INT_MAX, getargs_i(INT_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000265 self.assertRaises(OverflowError, getargs_i, INT_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000266
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000267 self.assertEqual(42, getargs_i(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000268 self.assertRaises(OverflowError, getargs_i, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000269
270 def test_l(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000271 from _testcapi import getargs_l
Thomas Hellera4ea6032003-04-17 18:55:45 +0000272 # l returns 'long', and does range checking (LONG_MIN ... LONG_MAX)
Thomas Woutersc9471232006-04-15 09:15:11 +0000273 self.assertRaises(TypeError, getargs_l, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000274 self.assertEqual(99, getargs_l(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200275 self.assertEqual(0, getargs_l(IntSubclass()))
276 self.assertRaises(TypeError, getargs_l, BadInt())
277 with self.assertWarns(DeprecationWarning):
278 self.assertEqual(1, getargs_l(BadInt2()))
279 self.assertEqual(0, getargs_l(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000280
Thomas Heller54aa5782003-04-24 16:15:29 +0000281 self.assertRaises(OverflowError, getargs_l, LONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000282 self.assertEqual(LONG_MIN, getargs_l(LONG_MIN))
283 self.assertEqual(LONG_MAX, getargs_l(LONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000284 self.assertRaises(OverflowError, getargs_l, LONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000285
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000286 self.assertEqual(42, getargs_l(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000287 self.assertRaises(OverflowError, getargs_l, VERY_LARGE)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000288
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000289 def test_n(self):
290 from _testcapi import getargs_n
291 # n returns 'Py_ssize_t', and does range checking
292 # (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX)
Thomas Woutersd8073282006-04-21 11:36:13 +0000293 self.assertRaises(TypeError, getargs_n, 3.14)
Trent Nelson35133582008-04-22 19:02:40 +0000294 self.assertRaises(TypeError, getargs_n, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200295 self.assertEqual(0, getargs_n(IntSubclass()))
296 self.assertRaises(TypeError, getargs_n, BadInt())
297 self.assertRaises(TypeError, getargs_n, BadInt2())
298 self.assertEqual(0, getargs_n(BadInt3()))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000299
300 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000301 self.assertEqual(PY_SSIZE_T_MIN, getargs_n(PY_SSIZE_T_MIN))
302 self.assertEqual(PY_SSIZE_T_MAX, getargs_n(PY_SSIZE_T_MAX))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000303 self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MAX+1)
304
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000305 self.assertEqual(42, getargs_n(42))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000306 self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
307
Thomas Hellera4ea6032003-04-17 18:55:45 +0000308
309class LongLong_TestCase(unittest.TestCase):
310 def test_L(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000311 from _testcapi import getargs_L
Mark Dickinsonde604012010-01-01 19:27:32 +0000312 # L returns 'long long', and does range checking (LLONG_MIN
313 # ... LLONG_MAX)
Mark Dickinsonc7301312010-06-10 16:05:10 +0000314 self.assertRaises(TypeError, getargs_L, 3.14)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000315 self.assertRaises(TypeError, getargs_L, "Hello")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000316 self.assertEqual(99, getargs_L(Int()))
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200317 self.assertEqual(0, getargs_L(IntSubclass()))
318 self.assertRaises(TypeError, getargs_L, BadInt())
319 with self.assertWarns(DeprecationWarning):
320 self.assertEqual(1, getargs_L(BadInt2()))
321 self.assertEqual(0, getargs_L(BadInt3()))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000322
Thomas Heller54aa5782003-04-24 16:15:29 +0000323 self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000324 self.assertEqual(LLONG_MIN, getargs_L(LLONG_MIN))
325 self.assertEqual(LLONG_MAX, getargs_L(LLONG_MAX))
Thomas Heller54aa5782003-04-24 16:15:29 +0000326 self.assertRaises(OverflowError, getargs_L, LLONG_MAX+1)
Thomas Hellera4ea6032003-04-17 18:55:45 +0000327
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000328 self.assertEqual(42, getargs_L(42))
Thomas Heller54aa5782003-04-24 16:15:29 +0000329 self.assertRaises(OverflowError, getargs_L, VERY_LARGE)
Tim Peters0eadaac2003-04-24 16:02:54 +0000330
Thomas Hellera4ea6032003-04-17 18:55:45 +0000331 def test_K(self):
Thomas Heller54aa5782003-04-24 16:15:29 +0000332 from _testcapi import getargs_K
Thomas Hellera4ea6032003-04-17 18:55:45 +0000333 # K return 'unsigned long long', no range checking
Thomas Heller54aa5782003-04-24 16:15:29 +0000334 self.assertRaises(TypeError, getargs_K, 3.14)
Thomas Heller54aa5782003-04-24 16:15:29 +0000335 self.assertRaises(TypeError, getargs_K, Int())
Serhiy Storchaka31a65542013-12-11 21:07:54 +0200336 self.assertEqual(0, getargs_K(IntSubclass()))
337 self.assertRaises(TypeError, getargs_K, BadInt())
338 self.assertRaises(TypeError, getargs_K, BadInt2())
339 self.assertEqual(0, getargs_K(BadInt3()))
340
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000341 self.assertEqual(ULLONG_MAX, getargs_K(ULLONG_MAX))
342 self.assertEqual(0, getargs_K(0))
343 self.assertEqual(0, getargs_K(ULLONG_MAX+1))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000344
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000345 self.assertEqual(42, getargs_K(42))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000346
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000347 self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE))
Thomas Hellera4ea6032003-04-17 18:55:45 +0000348
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300349
350class Float_TestCase(unittest.TestCase):
351 def assertEqualWithSign(self, actual, expected):
352 self.assertEqual(actual, expected)
353 self.assertEqual(math.copysign(1, actual), math.copysign(1, expected))
354
355 def test_f(self):
356 from _testcapi import getargs_f
357 self.assertEqual(getargs_f(4.25), 4.25)
358 self.assertEqual(getargs_f(4), 4.0)
359 self.assertRaises(TypeError, getargs_f, 4.25+0j)
360 self.assertEqual(getargs_f(Float()), 4.25)
361 self.assertEqual(getargs_f(FloatSubclass(7.5)), 7.5)
362 self.assertEqual(getargs_f(FloatSubclass2(7.5)), 7.5)
363 self.assertRaises(TypeError, getargs_f, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300364 with self.assertWarns(DeprecationWarning):
365 self.assertEqual(getargs_f(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300366 self.assertEqual(getargs_f(BadFloat3(7.5)), 7.5)
367
368 for x in (FLT_MIN, -FLT_MIN, FLT_MAX, -FLT_MAX, INF, -INF):
369 self.assertEqual(getargs_f(x), x)
370 if FLT_MAX < DBL_MAX:
371 self.assertEqual(getargs_f(DBL_MAX), INF)
372 self.assertEqual(getargs_f(-DBL_MAX), -INF)
373 if FLT_MIN > DBL_MIN:
374 self.assertEqualWithSign(getargs_f(DBL_MIN), 0.0)
375 self.assertEqualWithSign(getargs_f(-DBL_MIN), -0.0)
376 self.assertEqualWithSign(getargs_f(0.0), 0.0)
377 self.assertEqualWithSign(getargs_f(-0.0), -0.0)
378 r = getargs_f(NAN)
379 self.assertNotEqual(r, r)
380
Benjamin Peterson2bb69a52017-09-10 23:50:46 -0700381 @support.requires_IEEE_754
382 def test_f_rounding(self):
383 from _testcapi import getargs_f
384 self.assertEqual(getargs_f(3.40282356e38), FLT_MAX)
385 self.assertEqual(getargs_f(-3.40282356e38), -FLT_MAX)
386
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300387 def test_d(self):
388 from _testcapi import getargs_d
389 self.assertEqual(getargs_d(4.25), 4.25)
390 self.assertEqual(getargs_d(4), 4.0)
391 self.assertRaises(TypeError, getargs_d, 4.25+0j)
392 self.assertEqual(getargs_d(Float()), 4.25)
393 self.assertEqual(getargs_d(FloatSubclass(7.5)), 7.5)
394 self.assertEqual(getargs_d(FloatSubclass2(7.5)), 7.5)
395 self.assertRaises(TypeError, getargs_d, BadFloat())
Serhiy Storchaka16931c32016-06-03 21:42:55 +0300396 with self.assertWarns(DeprecationWarning):
397 self.assertEqual(getargs_d(BadFloat2()), 4.25)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300398 self.assertEqual(getargs_d(BadFloat3(7.5)), 7.5)
399
400 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
401 self.assertEqual(getargs_d(x), x)
402 self.assertRaises(OverflowError, getargs_d, 1<<DBL_MAX_EXP)
403 self.assertRaises(OverflowError, getargs_d, -1<<DBL_MAX_EXP)
404 self.assertEqualWithSign(getargs_d(0.0), 0.0)
405 self.assertEqualWithSign(getargs_d(-0.0), -0.0)
406 r = getargs_d(NAN)
407 self.assertNotEqual(r, r)
408
409 def test_D(self):
410 from _testcapi import getargs_D
411 self.assertEqual(getargs_D(4.25+0.5j), 4.25+0.5j)
412 self.assertEqual(getargs_D(4.25), 4.25+0j)
413 self.assertEqual(getargs_D(4), 4.0+0j)
414 self.assertEqual(getargs_D(Complex()), 4.25+0.5j)
415 self.assertEqual(getargs_D(ComplexSubclass(7.5+0.25j)), 7.5+0.25j)
416 self.assertEqual(getargs_D(ComplexSubclass2(7.5+0.25j)), 7.5+0.25j)
417 self.assertRaises(TypeError, getargs_D, BadComplex())
Serhiy Storchaka671079e2017-03-24 21:28:43 +0200418 with self.assertWarns(DeprecationWarning):
419 self.assertEqual(getargs_D(BadComplex2()), 4.25+0.5j)
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300420 self.assertEqual(getargs_D(BadComplex3(7.5+0.25j)), 7.5+0.25j)
421
422 for x in (DBL_MIN, -DBL_MIN, DBL_MAX, -DBL_MAX, INF, -INF):
423 c = complex(x, 1.0)
424 self.assertEqual(getargs_D(c), c)
425 c = complex(1.0, x)
426 self.assertEqual(getargs_D(c), c)
427 self.assertEqualWithSign(getargs_D(complex(0.0, 1.0)).real, 0.0)
428 self.assertEqualWithSign(getargs_D(complex(-0.0, 1.0)).real, -0.0)
429 self.assertEqualWithSign(getargs_D(complex(1.0, 0.0)).imag, 0.0)
430 self.assertEqualWithSign(getargs_D(complex(1.0, -0.0)).imag, -0.0)
431
432
Larry Hastingsfaf91e72012-05-05 16:54:29 -0700433class Paradox:
434 "This statement is false."
435 def __bool__(self):
436 raise NotImplementedError
437
438class Boolean_TestCase(unittest.TestCase):
439 def test_p(self):
440 from _testcapi import getargs_p
441 self.assertEqual(0, getargs_p(False))
442 self.assertEqual(0, getargs_p(None))
443 self.assertEqual(0, getargs_p(0))
444 self.assertEqual(0, getargs_p(0.0))
445 self.assertEqual(0, getargs_p(0j))
446 self.assertEqual(0, getargs_p(''))
447 self.assertEqual(0, getargs_p(()))
448 self.assertEqual(0, getargs_p([]))
449 self.assertEqual(0, getargs_p({}))
450
451 self.assertEqual(1, getargs_p(True))
452 self.assertEqual(1, getargs_p(1))
453 self.assertEqual(1, getargs_p(1.0))
454 self.assertEqual(1, getargs_p(1j))
455 self.assertEqual(1, getargs_p('x'))
456 self.assertEqual(1, getargs_p((1,)))
457 self.assertEqual(1, getargs_p([1]))
458 self.assertEqual(1, getargs_p({1:2}))
459 self.assertEqual(1, getargs_p(unittest.TestCase))
460
461 self.assertRaises(NotImplementedError, getargs_p, Paradox())
462
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000463
464class Tuple_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300465 def test_args(self):
466 from _testcapi import get_args
467
468 ret = get_args(1, 2)
469 self.assertEqual(ret, (1, 2))
470 self.assertIs(type(ret), tuple)
471
472 ret = get_args(1, *(2, 3))
473 self.assertEqual(ret, (1, 2, 3))
474 self.assertIs(type(ret), tuple)
475
476 ret = get_args(*[1, 2])
477 self.assertEqual(ret, (1, 2))
478 self.assertIs(type(ret), tuple)
479
480 ret = get_args(*TupleSubclass([1, 2]))
481 self.assertEqual(ret, (1, 2))
Serhiy Storchaka63dc5482016-09-22 19:41:20 +0300482 self.assertIs(type(ret), tuple)
Serhiy Storchakace412872016-05-08 23:36:44 +0300483
484 ret = get_args()
485 self.assertIn(ret, ((), None))
486 self.assertIn(type(ret), (tuple, type(None)))
487
488 ret = get_args(*())
489 self.assertIn(ret, ((), None))
490 self.assertIn(type(ret), (tuple, type(None)))
491
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000492 def test_tuple(self):
493 from _testcapi import getargs_tuple
494
495 ret = getargs_tuple(1, (2, 3))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000496 self.assertEqual(ret, (1,2,3))
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000497
498 # make sure invalid tuple arguments are handled correctly
499 class seq:
500 def __len__(self):
501 return 2
502 def __getitem__(self, n):
503 raise ValueError
504 self.assertRaises(TypeError, getargs_tuple, 1, seq())
505
Christian Heimes380f7f22008-02-28 11:19:05 +0000506class Keywords_TestCase(unittest.TestCase):
Serhiy Storchakace412872016-05-08 23:36:44 +0300507 def test_kwargs(self):
508 from _testcapi import get_kwargs
509
510 ret = get_kwargs(a=1, b=2)
511 self.assertEqual(ret, {'a': 1, 'b': 2})
512 self.assertIs(type(ret), dict)
513
514 ret = get_kwargs(a=1, **{'b': 2, 'c': 3})
515 self.assertEqual(ret, {'a': 1, 'b': 2, 'c': 3})
516 self.assertIs(type(ret), dict)
517
518 ret = get_kwargs(**DictSubclass({'a': 1, 'b': 2}))
519 self.assertEqual(ret, {'a': 1, 'b': 2})
520 self.assertIs(type(ret), dict)
521
522 ret = get_kwargs()
523 self.assertIn(ret, ({}, None))
524 self.assertIn(type(ret), (dict, type(None)))
525
526 ret = get_kwargs(**{})
527 self.assertIn(ret, ({}, None))
528 self.assertIn(type(ret), (dict, type(None)))
529
Christian Heimes380f7f22008-02-28 11:19:05 +0000530 def test_positional_args(self):
531 # using all positional args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000532 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000533 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), 10),
534 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
535 )
Victor Stinner93b55132010-05-19 00:54:06 +0000536
Christian Heimes380f7f22008-02-28 11:19:05 +0000537 def test_mixed_args(self):
538 # positional and keyword args
Ezio Melottib3aedd42010-11-20 19:04:17 +0000539 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000540 getargs_keywords((1,2), 3, (4,(5,6)), arg4=(7,8,9), arg5=10),
541 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
542 )
Victor Stinner93b55132010-05-19 00:54:06 +0000543
Christian Heimes380f7f22008-02-28 11:19:05 +0000544 def test_keyword_args(self):
545 # all keywords
Ezio Melottib3aedd42010-11-20 19:04:17 +0000546 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000547 getargs_keywords(arg1=(1,2), arg2=3, arg3=(4,(5,6)), arg4=(7,8,9), arg5=10),
548 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
549 )
Victor Stinner93b55132010-05-19 00:54:06 +0000550
Christian Heimes380f7f22008-02-28 11:19:05 +0000551 def test_optional_args(self):
552 # missing optional keyword args, skipping tuples
Ezio Melottib3aedd42010-11-20 19:04:17 +0000553 self.assertEqual(
Christian Heimes380f7f22008-02-28 11:19:05 +0000554 getargs_keywords(arg1=(1,2), arg2=3, arg5=10),
555 (1, 2, 3, -1, -1, -1, -1, -1, -1, 10)
556 )
Victor Stinner93b55132010-05-19 00:54:06 +0000557
Christian Heimes380f7f22008-02-28 11:19:05 +0000558 def test_required_args(self):
559 # required arg missing
560 try:
561 getargs_keywords(arg1=(1,2))
562 except TypeError as err:
Michael Seifert64c8f702017-04-09 09:47:12 +0200563 self.assertEqual(
564 str(err), "function missing required argument 'arg2' (pos 2)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000565 else:
566 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000567
Christian Heimes380f7f22008-02-28 11:19:05 +0000568 def test_too_many_args(self):
569 try:
570 getargs_keywords((1,2),3,(4,(5,6)),(7,8,9),10,111)
571 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000572 self.assertEqual(str(err), "function takes at most 5 arguments (6 given)")
Christian Heimes380f7f22008-02-28 11:19:05 +0000573 else:
574 self.fail('TypeError should have been raised')
Victor Stinner93b55132010-05-19 00:54:06 +0000575
Christian Heimes380f7f22008-02-28 11:19:05 +0000576 def test_invalid_keyword(self):
577 # extraneous keyword arg
578 try:
579 getargs_keywords((1,2),3,arg5=10,arg666=666)
580 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000581 self.assertEqual(str(err), "'arg666' is an invalid keyword argument for this function")
Christian Heimes380f7f22008-02-28 11:19:05 +0000582 else:
583 self.fail('TypeError should have been raised')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000584
Victor Stinner93b55132010-05-19 00:54:06 +0000585 def test_surrogate_keyword(self):
586 try:
587 getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), **{'\uDC80': 10})
588 except TypeError as err:
Ezio Melottib3aedd42010-11-20 19:04:17 +0000589 self.assertEqual(str(err), "'\udc80' is an invalid keyword argument for this function")
Victor Stinner93b55132010-05-19 00:54:06 +0000590 else:
591 self.fail('TypeError should have been raised')
592
Larry Hastings83a9f482012-03-20 20:06:16 +0000593class KeywordOnly_TestCase(unittest.TestCase):
594 def test_positional_args(self):
595 # using all possible positional args
596 self.assertEqual(
597 getargs_keyword_only(1, 2),
598 (1, 2, -1)
599 )
600
601 def test_mixed_args(self):
602 # positional and keyword args
603 self.assertEqual(
604 getargs_keyword_only(1, 2, keyword_only=3),
605 (1, 2, 3)
606 )
607
608 def test_keyword_args(self):
609 # all keywords
610 self.assertEqual(
611 getargs_keyword_only(required=1, optional=2, keyword_only=3),
612 (1, 2, 3)
613 )
614
615 def test_optional_args(self):
616 # missing optional keyword args, skipping tuples
617 self.assertEqual(
618 getargs_keyword_only(required=1, optional=2),
619 (1, 2, -1)
620 )
621 self.assertEqual(
622 getargs_keyword_only(required=1, keyword_only=3),
623 (1, -1, 3)
624 )
625
626 def test_required_args(self):
627 self.assertEqual(
628 getargs_keyword_only(1),
629 (1, -1, -1)
630 )
631 self.assertEqual(
632 getargs_keyword_only(required=1),
633 (1, -1, -1)
634 )
635 # required arg missing
636 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200637 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000638 getargs_keyword_only(optional=2)
639
640 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200641 r"function missing required argument 'required' \(pos 1\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000642 getargs_keyword_only(keyword_only=3)
643
644 def test_too_many_args(self):
645 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200646 r"function takes at most 2 positional arguments \(3 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000647 getargs_keyword_only(1, 2, 3)
648
649 with self.assertRaisesRegex(TypeError,
R David Murray44b548d2016-09-08 13:59:53 -0400650 r"function takes at most 3 arguments \(4 given\)"):
Larry Hastings83a9f482012-03-20 20:06:16 +0000651 getargs_keyword_only(1, 2, 3, keyword_only=5)
652
653 def test_invalid_keyword(self):
654 # extraneous keyword arg
655 with self.assertRaisesRegex(TypeError,
656 "'monster' is an invalid keyword argument for this function"):
657 getargs_keyword_only(1, 2, monster=666)
658
659 def test_surrogate_keyword(self):
660 with self.assertRaisesRegex(TypeError,
661 "'\udc80' is an invalid keyword argument for this function"):
662 getargs_keyword_only(1, 2, **{'\uDC80': 10})
663
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200664
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300665class PositionalOnlyAndKeywords_TestCase(unittest.TestCase):
666 from _testcapi import getargs_positional_only_and_keywords as getargs
667
668 def test_positional_args(self):
669 # using all possible positional args
670 self.assertEqual(self.getargs(1, 2, 3), (1, 2, 3))
671
672 def test_mixed_args(self):
673 # positional and keyword args
674 self.assertEqual(self.getargs(1, 2, keyword=3), (1, 2, 3))
675
676 def test_optional_args(self):
677 # missing optional args
678 self.assertEqual(self.getargs(1, 2), (1, 2, -1))
679 self.assertEqual(self.getargs(1, keyword=3), (1, -1, 3))
680
681 def test_required_args(self):
682 self.assertEqual(self.getargs(1), (1, -1, -1))
683 # required positional arg missing
684 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200685 r"function takes at least 1 positional arguments \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300686 self.getargs()
687
688 with self.assertRaisesRegex(TypeError,
Michael Seifert64c8f702017-04-09 09:47:12 +0200689 r"function takes at least 1 positional arguments \(0 given\)"):
Serhiy Storchakaf41b82f2016-06-09 16:30:29 +0300690 self.getargs(keyword=3)
691
692 def test_empty_keyword(self):
693 with self.assertRaisesRegex(TypeError,
694 "'' is an invalid keyword argument for this function"):
695 self.getargs(1, 2, **{'': 666})
696
697
Victor Stinner06e49dd2010-06-13 18:21:50 +0000698class Bytes_TestCase(unittest.TestCase):
Eli Bendersky906b88f2011-07-29 07:05:08 +0300699 def test_c(self):
700 from _testcapi import getargs_c
701 self.assertRaises(TypeError, getargs_c, b'abc') # len > 1
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200702 self.assertEqual(getargs_c(b'a'), 97)
703 self.assertEqual(getargs_c(bytearray(b'a')), 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300704 self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
705 self.assertRaises(TypeError, getargs_c, 's')
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200706 self.assertRaises(TypeError, getargs_c, 97)
Eli Bendersky906b88f2011-07-29 07:05:08 +0300707 self.assertRaises(TypeError, getargs_c, None)
708
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200709 def test_y(self):
710 from _testcapi import getargs_y
711 self.assertRaises(TypeError, getargs_y, 'abc\xe9')
712 self.assertEqual(getargs_y(b'bytes'), b'bytes')
713 self.assertRaises(ValueError, getargs_y, b'nul:\0')
714 self.assertRaises(TypeError, getargs_y, bytearray(b'bytearray'))
715 self.assertRaises(TypeError, getargs_y, memoryview(b'memoryview'))
716 self.assertRaises(TypeError, getargs_y, None)
717
718 def test_y_star(self):
719 from _testcapi import getargs_y_star
720 self.assertRaises(TypeError, getargs_y_star, 'abc\xe9')
721 self.assertEqual(getargs_y_star(b'bytes'), b'bytes')
722 self.assertEqual(getargs_y_star(b'nul:\0'), b'nul:\0')
723 self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
724 self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
725 self.assertRaises(TypeError, getargs_y_star, None)
726
727 def test_y_hash(self):
728 from _testcapi import getargs_y_hash
729 self.assertRaises(TypeError, getargs_y_hash, 'abc\xe9')
730 self.assertEqual(getargs_y_hash(b'bytes'), b'bytes')
731 self.assertEqual(getargs_y_hash(b'nul:\0'), b'nul:\0')
732 self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
733 self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
734 self.assertRaises(TypeError, getargs_y_hash, None)
735
736 def test_w_star(self):
737 # getargs_w_star() modifies first and last byte
738 from _testcapi import getargs_w_star
739 self.assertRaises(TypeError, getargs_w_star, 'abc\xe9')
740 self.assertRaises(TypeError, getargs_w_star, b'bytes')
741 self.assertRaises(TypeError, getargs_w_star, b'nul:\0')
742 self.assertRaises(TypeError, getargs_w_star, memoryview(b'bytes'))
743 buf = bytearray(b'bytearray')
744 self.assertEqual(getargs_w_star(buf), b'[ytearra]')
745 self.assertEqual(buf, bytearray(b'[ytearra]'))
746 buf = bytearray(b'memoryview')
747 self.assertEqual(getargs_w_star(memoryview(buf)), b'[emoryvie]')
748 self.assertEqual(buf, bytearray(b'[emoryvie]'))
749 self.assertRaises(TypeError, getargs_w_star, None)
750
751
752class String_TestCase(unittest.TestCase):
753 def test_C(self):
754 from _testcapi import getargs_C
755 self.assertRaises(TypeError, getargs_C, 'abc') # len > 1
756 self.assertEqual(getargs_C('a'), 97)
757 self.assertEqual(getargs_C('\u20ac'), 0x20ac)
758 self.assertEqual(getargs_C('\U0001f40d'), 0x1f40d)
759 self.assertRaises(TypeError, getargs_C, b'a')
760 self.assertRaises(TypeError, getargs_C, bytearray(b'a'))
761 self.assertRaises(TypeError, getargs_C, memoryview(b'a'))
762 self.assertRaises(TypeError, getargs_C, 97)
763 self.assertRaises(TypeError, getargs_C, None)
764
Victor Stinner06e49dd2010-06-13 18:21:50 +0000765 def test_s(self):
766 from _testcapi import getargs_s
767 self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300768 self.assertRaises(ValueError, getargs_s, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000769 self.assertRaises(TypeError, getargs_s, b'bytes')
770 self.assertRaises(TypeError, getargs_s, bytearray(b'bytearray'))
771 self.assertRaises(TypeError, getargs_s, memoryview(b'memoryview'))
772 self.assertRaises(TypeError, getargs_s, None)
773
774 def test_s_star(self):
775 from _testcapi import getargs_s_star
776 self.assertEqual(getargs_s_star('abc\xe9'), b'abc\xc3\xa9')
777 self.assertEqual(getargs_s_star('nul:\0'), b'nul:\0')
778 self.assertEqual(getargs_s_star(b'bytes'), b'bytes')
779 self.assertEqual(getargs_s_star(bytearray(b'bytearray')), b'bytearray')
780 self.assertEqual(getargs_s_star(memoryview(b'memoryview')), b'memoryview')
781 self.assertRaises(TypeError, getargs_s_star, None)
782
783 def test_s_hash(self):
784 from _testcapi import getargs_s_hash
785 self.assertEqual(getargs_s_hash('abc\xe9'), b'abc\xc3\xa9')
786 self.assertEqual(getargs_s_hash('nul:\0'), b'nul:\0')
787 self.assertEqual(getargs_s_hash(b'bytes'), b'bytes')
788 self.assertRaises(TypeError, getargs_s_hash, bytearray(b'bytearray'))
789 self.assertRaises(TypeError, getargs_s_hash, memoryview(b'memoryview'))
790 self.assertRaises(TypeError, getargs_s_hash, None)
791
792 def test_z(self):
793 from _testcapi import getargs_z
794 self.assertEqual(getargs_z('abc\xe9'), b'abc\xc3\xa9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300795 self.assertRaises(ValueError, getargs_z, 'nul:\0')
Victor Stinner4aae1eb2010-06-24 22:08:25 +0000796 self.assertRaises(TypeError, getargs_z, b'bytes')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000797 self.assertRaises(TypeError, getargs_z, bytearray(b'bytearray'))
798 self.assertRaises(TypeError, getargs_z, memoryview(b'memoryview'))
799 self.assertIsNone(getargs_z(None))
800
801 def test_z_star(self):
802 from _testcapi import getargs_z_star
803 self.assertEqual(getargs_z_star('abc\xe9'), b'abc\xc3\xa9')
804 self.assertEqual(getargs_z_star('nul:\0'), b'nul:\0')
805 self.assertEqual(getargs_z_star(b'bytes'), b'bytes')
806 self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
807 self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
808 self.assertIsNone(getargs_z_star(None))
809
810 def test_z_hash(self):
811 from _testcapi import getargs_z_hash
812 self.assertEqual(getargs_z_hash('abc\xe9'), b'abc\xc3\xa9')
813 self.assertEqual(getargs_z_hash('nul:\0'), b'nul:\0')
814 self.assertEqual(getargs_z_hash(b'bytes'), b'bytes')
815 self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
816 self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
817 self.assertIsNone(getargs_z_hash(None))
818
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200819 def test_es(self):
820 from _testcapi import getargs_es
821 self.assertEqual(getargs_es('abc\xe9'), b'abc\xc3\xa9')
822 self.assertEqual(getargs_es('abc\xe9', 'latin1'), b'abc\xe9')
823 self.assertRaises(UnicodeEncodeError, getargs_es, 'abc\xe9', 'ascii')
824 self.assertRaises(LookupError, getargs_es, 'abc\xe9', 'spam')
825 self.assertRaises(TypeError, getargs_es, b'bytes', 'latin1')
826 self.assertRaises(TypeError, getargs_es, bytearray(b'bytearray'), 'latin1')
827 self.assertRaises(TypeError, getargs_es, memoryview(b'memoryview'), 'latin1')
828 self.assertRaises(TypeError, getargs_es, None, 'latin1')
829 self.assertRaises(TypeError, getargs_es, 'nul:\0', 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000830
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200831 def test_et(self):
832 from _testcapi import getargs_et
833 self.assertEqual(getargs_et('abc\xe9'), b'abc\xc3\xa9')
834 self.assertEqual(getargs_et('abc\xe9', 'latin1'), b'abc\xe9')
835 self.assertRaises(UnicodeEncodeError, getargs_et, 'abc\xe9', 'ascii')
836 self.assertRaises(LookupError, getargs_et, 'abc\xe9', 'spam')
837 self.assertEqual(getargs_et(b'bytes', 'latin1'), b'bytes')
838 self.assertEqual(getargs_et(bytearray(b'bytearray'), 'latin1'), b'bytearray')
839 self.assertRaises(TypeError, getargs_et, memoryview(b'memoryview'), 'latin1')
840 self.assertRaises(TypeError, getargs_et, None, 'latin1')
841 self.assertRaises(TypeError, getargs_et, 'nul:\0', 'latin1')
842 self.assertRaises(TypeError, getargs_et, b'nul:\0', 'latin1')
843 self.assertRaises(TypeError, getargs_et, bytearray(b'nul:\0'), 'latin1')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000844
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200845 def test_es_hash(self):
846 from _testcapi import getargs_es_hash
847 self.assertEqual(getargs_es_hash('abc\xe9'), b'abc\xc3\xa9')
848 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1'), b'abc\xe9')
849 self.assertRaises(UnicodeEncodeError, getargs_es_hash, 'abc\xe9', 'ascii')
850 self.assertRaises(LookupError, getargs_es_hash, 'abc\xe9', 'spam')
851 self.assertRaises(TypeError, getargs_es_hash, b'bytes', 'latin1')
852 self.assertRaises(TypeError, getargs_es_hash, bytearray(b'bytearray'), 'latin1')
853 self.assertRaises(TypeError, getargs_es_hash, memoryview(b'memoryview'), 'latin1')
854 self.assertRaises(TypeError, getargs_es_hash, None, 'latin1')
855 self.assertEqual(getargs_es_hash('nul:\0', 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000856
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200857 buf = bytearray(b'x'*8)
858 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
859 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
860 buf = bytearray(b'x'*5)
861 self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
862 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
863 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200864 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200865 self.assertEqual(buf, bytearray(b'x'*4))
866 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200867 self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
Victor Stinner25e8ec42010-06-25 00:02:38 +0000868
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200869 def test_et_hash(self):
870 from _testcapi import getargs_et_hash
871 self.assertEqual(getargs_et_hash('abc\xe9'), b'abc\xc3\xa9')
872 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1'), b'abc\xe9')
873 self.assertRaises(UnicodeEncodeError, getargs_et_hash, 'abc\xe9', 'ascii')
874 self.assertRaises(LookupError, getargs_et_hash, 'abc\xe9', 'spam')
875 self.assertEqual(getargs_et_hash(b'bytes', 'latin1'), b'bytes')
876 self.assertEqual(getargs_et_hash(bytearray(b'bytearray'), 'latin1'), b'bytearray')
877 self.assertRaises(TypeError, getargs_et_hash, memoryview(b'memoryview'), 'latin1')
878 self.assertRaises(TypeError, getargs_et_hash, None, 'latin1')
879 self.assertEqual(getargs_et_hash('nul:\0', 'latin1'), b'nul:\0')
880 self.assertEqual(getargs_et_hash(b'nul:\0', 'latin1'), b'nul:\0')
881 self.assertEqual(getargs_et_hash(bytearray(b'nul:\0'), 'latin1'), b'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000882
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200883 buf = bytearray(b'x'*8)
884 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
885 self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
886 buf = bytearray(b'x'*5)
887 self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
888 self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
889 buf = bytearray(b'x'*4)
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200890 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200891 self.assertEqual(buf, bytearray(b'x'*4))
892 buf = bytearray()
Serhiy Storchaka4cd63ef2016-02-08 01:22:47 +0200893 self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
Serhiy Storchakac8241fd2016-01-28 19:49:54 +0200894
Victor Stinner06e49dd2010-06-13 18:21:50 +0000895 def test_u(self):
896 from _testcapi import getargs_u
897 self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300898 self.assertRaises(ValueError, getargs_u, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000899 self.assertRaises(TypeError, getargs_u, b'bytes')
900 self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
901 self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
902 self.assertRaises(TypeError, getargs_u, None)
903
904 def test_u_hash(self):
905 from _testcapi import getargs_u_hash
906 self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
907 self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
908 self.assertRaises(TypeError, getargs_u_hash, b'bytes')
909 self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
910 self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
911 self.assertRaises(TypeError, getargs_u_hash, None)
912
913 def test_Z(self):
914 from _testcapi import getargs_Z
915 self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
Serhiy Storchakad8a14472014-09-06 20:07:17 +0300916 self.assertRaises(ValueError, getargs_Z, 'nul:\0')
Victor Stinner06e49dd2010-06-13 18:21:50 +0000917 self.assertRaises(TypeError, getargs_Z, b'bytes')
918 self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
919 self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
920 self.assertIsNone(getargs_Z(None))
921
922 def test_Z_hash(self):
923 from _testcapi import getargs_Z_hash
924 self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
925 self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
926 self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
927 self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
928 self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
929 self.assertIsNone(getargs_Z_hash(None))
930
931
Serhiy Storchakaf95455d2016-05-16 10:11:47 +0300932class Object_TestCase(unittest.TestCase):
933 def test_S(self):
934 from _testcapi import getargs_S
935 obj = b'bytes'
936 self.assertIs(getargs_S(obj), obj)
937 self.assertRaises(TypeError, getargs_S, bytearray(b'bytearray'))
938 self.assertRaises(TypeError, getargs_S, 'str')
939 self.assertRaises(TypeError, getargs_S, None)
940 self.assertRaises(TypeError, getargs_S, memoryview(obj))
941
942 def test_Y(self):
943 from _testcapi import getargs_Y
944 obj = bytearray(b'bytearray')
945 self.assertIs(getargs_Y(obj), obj)
946 self.assertRaises(TypeError, getargs_Y, b'bytes')
947 self.assertRaises(TypeError, getargs_Y, 'str')
948 self.assertRaises(TypeError, getargs_Y, None)
949 self.assertRaises(TypeError, getargs_Y, memoryview(obj))
950
951 def test_U(self):
952 from _testcapi import getargs_U
953 obj = 'str'
954 self.assertIs(getargs_U(obj), obj)
955 self.assertRaises(TypeError, getargs_U, b'bytes')
956 self.assertRaises(TypeError, getargs_U, bytearray(b'bytearray'))
957 self.assertRaises(TypeError, getargs_U, None)
958
959
Serhiy Storchaka8f7bb102018-08-06 16:50:19 +0300960# Bug #6012
961class Test6012(unittest.TestCase):
962 def test(self):
963 self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
964
965
966class SkipitemTest(unittest.TestCase):
967
968 def test_skipitem(self):
969 """
970 If this test failed, you probably added a new "format unit"
971 in Python/getargs.c, but neglected to update our poor friend
972 skipitem() in the same file. (If so, shame on you!)
973
974 With a few exceptions**, this function brute-force tests all
975 printable ASCII*** characters (32 to 126 inclusive) as format units,
976 checking to see that PyArg_ParseTupleAndKeywords() return consistent
977 errors both when the unit is attempted to be used and when it is
978 skipped. If the format unit doesn't exist, we'll get one of two
979 specific error messages (one for used, one for skipped); if it does
980 exist we *won't* get that error--we'll get either no error or some
981 other error. If we get the specific "does not exist" error for one
982 test and not for the other, there's a mismatch, and the test fails.
983
984 ** Some format units have special funny semantics and it would
985 be difficult to accommodate them here. Since these are all
986 well-established and properly skipped in skipitem() we can
987 get away with not testing them--this test is really intended
988 to catch *new* format units.
989
990 *** Python C source files must be ASCII. Therefore it's impossible
991 to have non-ASCII format units.
992
993 """
994 empty_tuple = ()
995 tuple_1 = (0,)
996 dict_b = {'b':1}
997 keywords = ["a", "b"]
998
999 for i in range(32, 127):
1000 c = chr(i)
1001
1002 # skip parentheses, the error reporting is inconsistent about them
1003 # skip 'e', it's always a two-character code
1004 # skip '|' and '$', they don't represent arguments anyway
1005 if c in '()e|$':
1006 continue
1007
1008 # test the format unit when not skipped
1009 format = c + "i"
1010 try:
1011 _testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
1012 format, keywords)
1013 when_not_skipped = False
1014 except SystemError as e:
1015 s = "argument 1 (impossible<bad format char>)"
1016 when_not_skipped = (str(e) == s)
1017 except TypeError:
1018 when_not_skipped = False
1019
1020 # test the format unit when skipped
1021 optional_format = "|" + format
1022 try:
1023 _testcapi.parse_tuple_and_keywords(empty_tuple, dict_b,
1024 optional_format, keywords)
1025 when_skipped = False
1026 except SystemError as e:
1027 s = "impossible<bad format char>: '{}'".format(format)
1028 when_skipped = (str(e) == s)
1029
1030 message = ("test_skipitem_parity: "
1031 "detected mismatch between convertsimple and skipitem "
1032 "for format unit '{}' ({}), not skipped {}, skipped {}".format(
1033 c, i, when_skipped, when_not_skipped))
1034 self.assertIs(when_skipped, when_not_skipped, message)
1035
1036 def test_skipitem_with_suffix(self):
1037 parse = _testcapi.parse_tuple_and_keywords
1038 empty_tuple = ()
1039 tuple_1 = (0,)
1040 dict_b = {'b':1}
1041 keywords = ["a", "b"]
1042
1043 supported = ('s#', 's*', 'z#', 'z*', 'u#', 'Z#', 'y#', 'y*', 'w#', 'w*')
1044 for c in string.ascii_letters:
1045 for c2 in '#*':
1046 f = c + c2
1047 with self.subTest(format=f):
1048 optional_format = "|" + f + "i"
1049 if f in supported:
1050 parse(empty_tuple, dict_b, optional_format, keywords)
1051 else:
1052 with self.assertRaisesRegex(SystemError,
1053 'impossible<bad format char>'):
1054 parse(empty_tuple, dict_b, optional_format, keywords)
1055
1056 for c in map(chr, range(32, 128)):
1057 f = 'e' + c
1058 optional_format = "|" + f + "i"
1059 with self.subTest(format=f):
1060 if c in 'st':
1061 parse(empty_tuple, dict_b, optional_format, keywords)
1062 else:
1063 with self.assertRaisesRegex(SystemError,
1064 'impossible<bad format char>'):
1065 parse(empty_tuple, dict_b, optional_format, keywords)
1066
1067
1068class ParseTupleAndKeywords_Test(unittest.TestCase):
1069
1070 def test_parse_tuple_and_keywords(self):
1071 # Test handling errors in the parse_tuple_and_keywords helper itself
1072 self.assertRaises(TypeError, _testcapi.parse_tuple_and_keywords,
1073 (), {}, 42, [])
1074 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1075 (), {}, '', 42)
1076 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1077 (), {}, '', [''] * 42)
1078 self.assertRaises(ValueError, _testcapi.parse_tuple_and_keywords,
1079 (), {}, '', [42])
1080
1081 def test_bad_use(self):
1082 # Test handling invalid format and keywords in
1083 # PyArg_ParseTupleAndKeywords()
1084 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1085 (1,), {}, '||O', ['a'])
1086 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1087 (1, 2), {}, '|O|O', ['a', 'b'])
1088 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1089 (), {'a': 1}, '$$O', ['a'])
1090 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1091 (), {'a': 1, 'b': 2}, '$O$O', ['a', 'b'])
1092 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1093 (), {'a': 1}, '$|O', ['a'])
1094 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1095 (), {'a': 1, 'b': 2}, '$O|O', ['a', 'b'])
1096 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1097 (1,), {}, '|O', ['a', 'b'])
1098 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1099 (1,), {}, '|OO', ['a'])
1100 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1101 (), {}, '|$O', [''])
1102 self.assertRaises(SystemError, _testcapi.parse_tuple_and_keywords,
1103 (), {}, '|OO', ['a', ''])
1104
1105 def test_positional_only(self):
1106 parse = _testcapi.parse_tuple_and_keywords
1107
1108 parse((1, 2, 3), {}, 'OOO', ['', '', 'a'])
1109 parse((1, 2), {'a': 3}, 'OOO', ['', '', 'a'])
1110 with self.assertRaisesRegex(TypeError,
1111 r'function takes at least 2 positional arguments \(1 given\)'):
1112 parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
1113 parse((1,), {}, 'O|OO', ['', '', 'a'])
1114 with self.assertRaisesRegex(TypeError,
1115 r'function takes at least 1 positional arguments \(0 given\)'):
1116 parse((), {}, 'O|OO', ['', '', 'a'])
1117 parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
1118 with self.assertRaisesRegex(TypeError,
1119 r'function takes exactly 2 positional arguments \(1 given\)'):
1120 parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
1121 parse((1,), {}, 'O|O$O', ['', '', 'a'])
1122 with self.assertRaisesRegex(TypeError,
1123 r'function takes at least 1 positional arguments \(0 given\)'):
1124 parse((), {}, 'O|O$O', ['', '', 'a'])
1125 with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'):
1126 parse((1,), {}, 'O|$OO', ['', '', 'a'])
1127 with self.assertRaisesRegex(SystemError, 'Empty keyword'):
1128 parse((1,), {}, 'O|OO', ['', 'a', ''])
1129
1130
1131class Test_testcapi(unittest.TestCase):
1132 locals().update((name, getattr(_testcapi, name))
1133 for name in dir(_testcapi)
1134 if name.startswith('test_') and name.endswith('_code'))
1135
1136
Thomas Hellera4ea6032003-04-17 18:55:45 +00001137if __name__ == "__main__":
Brett Cannon3e9a9ae2013-06-12 21:25:59 -04001138 unittest.main()