2
from test import support
3
from _testcapi import getargs_keywords, getargs_keyword_only
5
from _testcapi import getargs_L, getargs_K
7
getargs_L = None # PY_LONG_LONG not available
9
# > How about the following counterproposal. This also changes some of
10
# > the other format codes to be a little more regular.
12
# > Code C type Range check
14
# > b unsigned char 0..UCHAR_MAX
15
# > h signed short SHRT_MIN..SHRT_MAX
16
# > B unsigned char none **
17
# > H unsigned short none **
18
# > k * unsigned long none
19
# > I * unsigned int 0..UINT_MAX
22
# > i int INT_MIN..INT_MAX
23
# > l long LONG_MIN..LONG_MAX
25
# > K * unsigned long long none
26
# > L long long LLONG_MIN..LLONG_MAX
30
# > * New format codes.
32
# > ** Changed from previous "range-and-a-half" to "none"; the
33
# > range-and-a-half checking wasn't particularly useful.
35
# Plus a C API or two, e.g. PyInt_AsLongMask() ->
36
# unsigned long and PyInt_AsLongLongMask() -> unsigned
37
# long long (if that exists).
40
VERY_LARGE = 0xFF0000121212121212121242
42
from _testcapi import UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, INT_MAX, \
43
INT_MIN, LONG_MIN, LONG_MAX, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX, \
46
# fake, they are not defined in Python's header files
55
class Unsigned_TestCase(unittest.TestCase):
57
from _testcapi import getargs_b
58
# b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX)
59
self.assertRaises(TypeError, getargs_b, 3.14)
60
self.assertEqual(99, getargs_b(Int()))
62
self.assertRaises(OverflowError, getargs_b, -1)
63
self.assertEqual(0, getargs_b(0))
64
self.assertEqual(UCHAR_MAX, getargs_b(UCHAR_MAX))
65
self.assertRaises(OverflowError, getargs_b, UCHAR_MAX + 1)
67
self.assertEqual(42, getargs_b(42))
68
self.assertRaises(OverflowError, getargs_b, VERY_LARGE)
71
from _testcapi import getargs_B
72
# B returns 'unsigned char', no range checking
73
self.assertRaises(TypeError, getargs_B, 3.14)
74
self.assertEqual(99, getargs_B(Int()))
76
self.assertEqual(UCHAR_MAX, getargs_B(-1))
77
self.assertEqual(0, getargs_B(0))
78
self.assertEqual(UCHAR_MAX, getargs_B(UCHAR_MAX))
79
self.assertEqual(0, getargs_B(UCHAR_MAX+1))
81
self.assertEqual(42, getargs_B(42))
82
self.assertEqual(UCHAR_MAX & VERY_LARGE, getargs_B(VERY_LARGE))
85
from _testcapi import getargs_H
86
# H returns 'unsigned short', no range checking
87
self.assertRaises(TypeError, getargs_H, 3.14)
88
self.assertEqual(99, getargs_H(Int()))
90
self.assertEqual(USHRT_MAX, getargs_H(-1))
91
self.assertEqual(0, getargs_H(0))
92
self.assertEqual(USHRT_MAX, getargs_H(USHRT_MAX))
93
self.assertEqual(0, getargs_H(USHRT_MAX+1))
95
self.assertEqual(42, getargs_H(42))
97
self.assertEqual(VERY_LARGE & USHRT_MAX, getargs_H(VERY_LARGE))
100
from _testcapi import getargs_I
101
# I returns 'unsigned int', no range checking
102
self.assertRaises(TypeError, getargs_I, 3.14)
103
self.assertEqual(99, getargs_I(Int()))
105
self.assertEqual(UINT_MAX, getargs_I(-1))
106
self.assertEqual(0, getargs_I(0))
107
self.assertEqual(UINT_MAX, getargs_I(UINT_MAX))
108
self.assertEqual(0, getargs_I(UINT_MAX+1))
110
self.assertEqual(42, getargs_I(42))
112
self.assertEqual(VERY_LARGE & UINT_MAX, getargs_I(VERY_LARGE))
115
from _testcapi import getargs_k
116
# k returns 'unsigned long', no range checking
117
# it does not accept float, or instances with __int__
118
self.assertRaises(TypeError, getargs_k, 3.14)
119
self.assertRaises(TypeError, getargs_k, Int())
121
self.assertEqual(ULONG_MAX, getargs_k(-1))
122
self.assertEqual(0, getargs_k(0))
123
self.assertEqual(ULONG_MAX, getargs_k(ULONG_MAX))
124
self.assertEqual(0, getargs_k(ULONG_MAX+1))
126
self.assertEqual(42, getargs_k(42))
128
self.assertEqual(VERY_LARGE & ULONG_MAX, getargs_k(VERY_LARGE))
130
class Signed_TestCase(unittest.TestCase):
132
from _testcapi import getargs_h
133
# h returns 'short', and does range checking (SHRT_MIN ... SHRT_MAX)
134
self.assertRaises(TypeError, getargs_h, 3.14)
135
self.assertEqual(99, getargs_h(Int()))
137
self.assertRaises(OverflowError, getargs_h, SHRT_MIN-1)
138
self.assertEqual(SHRT_MIN, getargs_h(SHRT_MIN))
139
self.assertEqual(SHRT_MAX, getargs_h(SHRT_MAX))
140
self.assertRaises(OverflowError, getargs_h, SHRT_MAX+1)
142
self.assertEqual(42, getargs_h(42))
143
self.assertRaises(OverflowError, getargs_h, VERY_LARGE)
146
from _testcapi import getargs_i
147
# i returns 'int', and does range checking (INT_MIN ... INT_MAX)
148
self.assertRaises(TypeError, getargs_i, 3.14)
149
self.assertEqual(99, getargs_i(Int()))
151
self.assertRaises(OverflowError, getargs_i, INT_MIN-1)
152
self.assertEqual(INT_MIN, getargs_i(INT_MIN))
153
self.assertEqual(INT_MAX, getargs_i(INT_MAX))
154
self.assertRaises(OverflowError, getargs_i, INT_MAX+1)
156
self.assertEqual(42, getargs_i(42))
157
self.assertRaises(OverflowError, getargs_i, VERY_LARGE)
160
from _testcapi import getargs_l
161
# l returns 'long', and does range checking (LONG_MIN ... LONG_MAX)
162
self.assertRaises(TypeError, getargs_l, 3.14)
163
self.assertEqual(99, getargs_l(Int()))
165
self.assertRaises(OverflowError, getargs_l, LONG_MIN-1)
166
self.assertEqual(LONG_MIN, getargs_l(LONG_MIN))
167
self.assertEqual(LONG_MAX, getargs_l(LONG_MAX))
168
self.assertRaises(OverflowError, getargs_l, LONG_MAX+1)
170
self.assertEqual(42, getargs_l(42))
171
self.assertRaises(OverflowError, getargs_l, VERY_LARGE)
174
from _testcapi import getargs_n
175
# n returns 'Py_ssize_t', and does range checking
176
# (PY_SSIZE_T_MIN ... PY_SSIZE_T_MAX)
177
self.assertRaises(TypeError, getargs_n, 3.14)
178
self.assertRaises(TypeError, getargs_n, Int())
180
self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MIN-1)
181
self.assertEqual(PY_SSIZE_T_MIN, getargs_n(PY_SSIZE_T_MIN))
182
self.assertEqual(PY_SSIZE_T_MAX, getargs_n(PY_SSIZE_T_MAX))
183
self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MAX+1)
185
self.assertEqual(42, getargs_n(42))
186
self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
189
@unittest.skipIf(getargs_L is None, 'PY_LONG_LONG is not available')
190
class LongLong_TestCase(unittest.TestCase):
192
from _testcapi import getargs_L
193
# L returns 'long long', and does range checking (LLONG_MIN
195
self.assertRaises(TypeError, getargs_L, 3.14)
196
self.assertRaises(TypeError, getargs_L, "Hello")
197
self.assertEqual(99, getargs_L(Int()))
199
self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)
200
self.assertEqual(LLONG_MIN, getargs_L(LLONG_MIN))
201
self.assertEqual(LLONG_MAX, getargs_L(LLONG_MAX))
202
self.assertRaises(OverflowError, getargs_L, LLONG_MAX+1)
204
self.assertEqual(42, getargs_L(42))
205
self.assertRaises(OverflowError, getargs_L, VERY_LARGE)
208
from _testcapi import getargs_K
209
# K return 'unsigned long long', no range checking
210
self.assertRaises(TypeError, getargs_K, 3.14)
211
self.assertRaises(TypeError, getargs_K, Int())
212
self.assertEqual(ULLONG_MAX, getargs_K(ULLONG_MAX))
213
self.assertEqual(0, getargs_K(0))
214
self.assertEqual(0, getargs_K(ULLONG_MAX+1))
216
self.assertEqual(42, getargs_K(42))
218
self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE))
221
"This statement is false."
223
raise NotImplementedError
225
class Boolean_TestCase(unittest.TestCase):
227
from _testcapi import getargs_p
228
self.assertEqual(0, getargs_p(False))
229
self.assertEqual(0, getargs_p(None))
230
self.assertEqual(0, getargs_p(0))
231
self.assertEqual(0, getargs_p(0.0))
232
self.assertEqual(0, getargs_p(0j))
233
self.assertEqual(0, getargs_p(''))
234
self.assertEqual(0, getargs_p(()))
235
self.assertEqual(0, getargs_p([]))
236
self.assertEqual(0, getargs_p({}))
238
self.assertEqual(1, getargs_p(True))
239
self.assertEqual(1, getargs_p(1))
240
self.assertEqual(1, getargs_p(1.0))
241
self.assertEqual(1, getargs_p(1j))
242
self.assertEqual(1, getargs_p('x'))
243
self.assertEqual(1, getargs_p((1,)))
244
self.assertEqual(1, getargs_p([1]))
245
self.assertEqual(1, getargs_p({1:2}))
246
self.assertEqual(1, getargs_p(unittest.TestCase))
248
self.assertRaises(NotImplementedError, getargs_p, Paradox())
251
class Tuple_TestCase(unittest.TestCase):
252
def test_tuple(self):
253
from _testcapi import getargs_tuple
255
ret = getargs_tuple(1, (2, 3))
256
self.assertEqual(ret, (1,2,3))
258
# make sure invalid tuple arguments are handled correctly
262
def __getitem__(self, n):
264
self.assertRaises(TypeError, getargs_tuple, 1, seq())
266
class Keywords_TestCase(unittest.TestCase):
267
def test_positional_args(self):
268
# using all positional args
270
getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), 10),
271
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
274
def test_mixed_args(self):
275
# positional and keyword args
277
getargs_keywords((1,2), 3, (4,(5,6)), arg4=(7,8,9), arg5=10),
278
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
281
def test_keyword_args(self):
284
getargs_keywords(arg1=(1,2), arg2=3, arg3=(4,(5,6)), arg4=(7,8,9), arg5=10),
285
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
288
def test_optional_args(self):
289
# missing optional keyword args, skipping tuples
291
getargs_keywords(arg1=(1,2), arg2=3, arg5=10),
292
(1, 2, 3, -1, -1, -1, -1, -1, -1, 10)
295
def test_required_args(self):
296
# required arg missing
298
getargs_keywords(arg1=(1,2))
299
except TypeError as err:
300
self.assertEqual(str(err), "Required argument 'arg2' (pos 2) not found")
302
self.fail('TypeError should have been raised')
304
def test_too_many_args(self):
306
getargs_keywords((1,2),3,(4,(5,6)),(7,8,9),10,111)
307
except TypeError as err:
308
self.assertEqual(str(err), "function takes at most 5 arguments (6 given)")
310
self.fail('TypeError should have been raised')
312
def test_invalid_keyword(self):
313
# extraneous keyword arg
315
getargs_keywords((1,2),3,arg5=10,arg666=666)
316
except TypeError as err:
317
self.assertEqual(str(err), "'arg666' is an invalid keyword argument for this function")
319
self.fail('TypeError should have been raised')
321
def test_surrogate_keyword(self):
323
getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), **{'\uDC80': 10})
324
except TypeError as err:
325
self.assertEqual(str(err), "'\udc80' is an invalid keyword argument for this function")
327
self.fail('TypeError should have been raised')
329
class KeywordOnly_TestCase(unittest.TestCase):
330
def test_positional_args(self):
331
# using all possible positional args
333
getargs_keyword_only(1, 2),
337
def test_mixed_args(self):
338
# positional and keyword args
340
getargs_keyword_only(1, 2, keyword_only=3),
344
def test_keyword_args(self):
347
getargs_keyword_only(required=1, optional=2, keyword_only=3),
351
def test_optional_args(self):
352
# missing optional keyword args, skipping tuples
354
getargs_keyword_only(required=1, optional=2),
358
getargs_keyword_only(required=1, keyword_only=3),
362
def test_required_args(self):
364
getargs_keyword_only(1),
368
getargs_keyword_only(required=1),
371
# required arg missing
372
with self.assertRaisesRegex(TypeError,
373
"Required argument 'required' \(pos 1\) not found"):
374
getargs_keyword_only(optional=2)
376
with self.assertRaisesRegex(TypeError,
377
"Required argument 'required' \(pos 1\) not found"):
378
getargs_keyword_only(keyword_only=3)
380
def test_too_many_args(self):
381
with self.assertRaisesRegex(TypeError,
382
"Function takes at most 2 positional arguments \(3 given\)"):
383
getargs_keyword_only(1, 2, 3)
385
with self.assertRaisesRegex(TypeError,
386
"function takes at most 3 arguments \(4 given\)"):
387
getargs_keyword_only(1, 2, 3, keyword_only=5)
389
def test_invalid_keyword(self):
390
# extraneous keyword arg
391
with self.assertRaisesRegex(TypeError,
392
"'monster' is an invalid keyword argument for this function"):
393
getargs_keyword_only(1, 2, monster=666)
395
def test_surrogate_keyword(self):
396
with self.assertRaisesRegex(TypeError,
397
"'\udc80' is an invalid keyword argument for this function"):
398
getargs_keyword_only(1, 2, **{'\uDC80': 10})
400
class Bytes_TestCase(unittest.TestCase):
402
from _testcapi import getargs_c
403
self.assertRaises(TypeError, getargs_c, b'abc') # len > 1
404
self.assertEqual(getargs_c(b'a'), b'a')
405
self.assertEqual(getargs_c(bytearray(b'a')), b'a')
406
self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
407
self.assertRaises(TypeError, getargs_c, 's')
408
self.assertRaises(TypeError, getargs_c, None)
411
from _testcapi import getargs_s
412
self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
413
self.assertRaises(TypeError, getargs_s, 'nul:\0')
414
self.assertRaises(TypeError, getargs_s, b'bytes')
415
self.assertRaises(TypeError, getargs_s, bytearray(b'bytearray'))
416
self.assertRaises(TypeError, getargs_s, memoryview(b'memoryview'))
417
self.assertRaises(TypeError, getargs_s, None)
419
def test_s_star(self):
420
from _testcapi import getargs_s_star
421
self.assertEqual(getargs_s_star('abc\xe9'), b'abc\xc3\xa9')
422
self.assertEqual(getargs_s_star('nul:\0'), b'nul:\0')
423
self.assertEqual(getargs_s_star(b'bytes'), b'bytes')
424
self.assertEqual(getargs_s_star(bytearray(b'bytearray')), b'bytearray')
425
self.assertEqual(getargs_s_star(memoryview(b'memoryview')), b'memoryview')
426
self.assertRaises(TypeError, getargs_s_star, None)
428
def test_s_hash(self):
429
from _testcapi import getargs_s_hash
430
self.assertEqual(getargs_s_hash('abc\xe9'), b'abc\xc3\xa9')
431
self.assertEqual(getargs_s_hash('nul:\0'), b'nul:\0')
432
self.assertEqual(getargs_s_hash(b'bytes'), b'bytes')
433
self.assertRaises(TypeError, getargs_s_hash, bytearray(b'bytearray'))
434
self.assertRaises(TypeError, getargs_s_hash, memoryview(b'memoryview'))
435
self.assertRaises(TypeError, getargs_s_hash, None)
438
from _testcapi import getargs_z
439
self.assertEqual(getargs_z('abc\xe9'), b'abc\xc3\xa9')
440
self.assertRaises(TypeError, getargs_z, 'nul:\0')
441
self.assertRaises(TypeError, getargs_z, b'bytes')
442
self.assertRaises(TypeError, getargs_z, bytearray(b'bytearray'))
443
self.assertRaises(TypeError, getargs_z, memoryview(b'memoryview'))
444
self.assertIsNone(getargs_z(None))
446
def test_z_star(self):
447
from _testcapi import getargs_z_star
448
self.assertEqual(getargs_z_star('abc\xe9'), b'abc\xc3\xa9')
449
self.assertEqual(getargs_z_star('nul:\0'), b'nul:\0')
450
self.assertEqual(getargs_z_star(b'bytes'), b'bytes')
451
self.assertEqual(getargs_z_star(bytearray(b'bytearray')), b'bytearray')
452
self.assertEqual(getargs_z_star(memoryview(b'memoryview')), b'memoryview')
453
self.assertIsNone(getargs_z_star(None))
455
def test_z_hash(self):
456
from _testcapi import getargs_z_hash
457
self.assertEqual(getargs_z_hash('abc\xe9'), b'abc\xc3\xa9')
458
self.assertEqual(getargs_z_hash('nul:\0'), b'nul:\0')
459
self.assertEqual(getargs_z_hash(b'bytes'), b'bytes')
460
self.assertRaises(TypeError, getargs_z_hash, bytearray(b'bytearray'))
461
self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
462
self.assertIsNone(getargs_z_hash(None))
465
from _testcapi import getargs_y
466
self.assertRaises(TypeError, getargs_y, 'abc\xe9')
467
self.assertEqual(getargs_y(b'bytes'), b'bytes')
468
self.assertRaises(TypeError, getargs_y, b'nul:\0')
469
self.assertRaises(TypeError, getargs_y, bytearray(b'bytearray'))
470
self.assertRaises(TypeError, getargs_y, memoryview(b'memoryview'))
471
self.assertRaises(TypeError, getargs_y, None)
473
def test_y_star(self):
474
from _testcapi import getargs_y_star
475
self.assertRaises(TypeError, getargs_y_star, 'abc\xe9')
476
self.assertEqual(getargs_y_star(b'bytes'), b'bytes')
477
self.assertEqual(getargs_y_star(b'nul:\0'), b'nul:\0')
478
self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
479
self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
480
self.assertRaises(TypeError, getargs_y_star, None)
482
def test_y_hash(self):
483
from _testcapi import getargs_y_hash
484
self.assertRaises(TypeError, getargs_y_hash, 'abc\xe9')
485
self.assertEqual(getargs_y_hash(b'bytes'), b'bytes')
486
self.assertEqual(getargs_y_hash(b'nul:\0'), b'nul:\0')
487
self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
488
self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
489
self.assertRaises(TypeError, getargs_y_hash, None)
491
def test_w_star(self):
492
# getargs_w_star() modifies first and last byte
493
from _testcapi import getargs_w_star
494
self.assertRaises(TypeError, getargs_w_star, 'abc\xe9')
495
self.assertRaises(TypeError, getargs_w_star, b'bytes')
496
self.assertRaises(TypeError, getargs_w_star, b'nul:\0')
497
self.assertRaises(TypeError, getargs_w_star, memoryview(b'bytes'))
498
self.assertEqual(getargs_w_star(bytearray(b'bytearray')), b'[ytearra]')
499
self.assertEqual(getargs_w_star(memoryview(bytearray(b'memoryview'))),
501
self.assertRaises(TypeError, getargs_w_star, None)
504
class Unicode_TestCase(unittest.TestCase):
506
from _testcapi import getargs_u
507
self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
508
self.assertRaises(TypeError, getargs_u, 'nul:\0')
509
self.assertRaises(TypeError, getargs_u, b'bytes')
510
self.assertRaises(TypeError, getargs_u, bytearray(b'bytearray'))
511
self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview'))
512
self.assertRaises(TypeError, getargs_u, None)
514
def test_u_hash(self):
515
from _testcapi import getargs_u_hash
516
self.assertEqual(getargs_u_hash('abc\xe9'), 'abc\xe9')
517
self.assertEqual(getargs_u_hash('nul:\0'), 'nul:\0')
518
self.assertRaises(TypeError, getargs_u_hash, b'bytes')
519
self.assertRaises(TypeError, getargs_u_hash, bytearray(b'bytearray'))
520
self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview'))
521
self.assertRaises(TypeError, getargs_u_hash, None)
524
from _testcapi import getargs_Z
525
self.assertEqual(getargs_Z('abc\xe9'), 'abc\xe9')
526
self.assertRaises(TypeError, getargs_Z, 'nul:\0')
527
self.assertRaises(TypeError, getargs_Z, b'bytes')
528
self.assertRaises(TypeError, getargs_Z, bytearray(b'bytearray'))
529
self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview'))
530
self.assertIsNone(getargs_Z(None))
532
def test_Z_hash(self):
533
from _testcapi import getargs_Z_hash
534
self.assertEqual(getargs_Z_hash('abc\xe9'), 'abc\xe9')
535
self.assertEqual(getargs_Z_hash('nul:\0'), 'nul:\0')
536
self.assertRaises(TypeError, getargs_Z_hash, b'bytes')
537
self.assertRaises(TypeError, getargs_Z_hash, bytearray(b'bytearray'))
538
self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview'))
539
self.assertIsNone(getargs_Z_hash(None))
542
if __name__ == "__main__":