Home | History | Annotate | Download | only in test
      1 import unittest
      2 import math
      3 import string
      4 import sys
      5 from test import support
      6 # Skip this test if the _testcapi module isn't available.
      7 _testcapi = support.import_module('_testcapi')
      8 from _testcapi import getargs_keywords, getargs_keyword_only
      9 
     10 # > 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 #
     36 # Plus a C API or two, e.g. PyLong_AsUnsignedLongMask() ->
     37 # unsigned long and PyLong_AsUnsignedLongLongMask() -> unsigned
     38 # long long (if that exists).
     39 
     40 LARGE = 0x7FFFFFFF
     41 VERY_LARGE = 0xFF0000121212121212121242
     42 
     43 from _testcapi import UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, INT_MAX, \
     44      INT_MIN, LONG_MIN, LONG_MAX, PY_SSIZE_T_MIN, PY_SSIZE_T_MAX, \
     45      SHRT_MIN, SHRT_MAX, FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX
     46 
     47 DBL_MAX_EXP = sys.float_info.max_exp
     48 INF = float('inf')
     49 NAN = float('nan')
     50 
     51 # fake, they are not defined in Python's header files
     52 LLONG_MAX = 2**63-1
     53 LLONG_MIN = -2**63
     54 ULLONG_MAX = 2**64-1
     55 
     56 class Int:
     57     def __int__(self):
     58         return 99
     59 
     60 class IntSubclass(int):
     61     def __int__(self):
     62         return 99
     63 
     64 class BadInt:
     65     def __int__(self):
     66         return 1.0
     67 
     68 class BadInt2:
     69     def __int__(self):
     70         return True
     71 
     72 class BadInt3(int):
     73     def __int__(self):
     74         return True
     75 
     76 
     77 class Float:
     78     def __float__(self):
     79         return 4.25
     80 
     81 class FloatSubclass(float):
     82     pass
     83 
     84 class FloatSubclass2(float):
     85     def __float__(self):
     86         return 4.25
     87 
     88 class BadFloat:
     89     def __float__(self):
     90         return 687
     91 
     92 class BadFloat2:
     93     def __float__(self):
     94         return FloatSubclass(4.25)
     95 
     96 class BadFloat3(float):
     97     def __float__(self):
     98         return FloatSubclass(4.25)
     99 
    100 
    101 class Complex:
    102     def __complex__(self):
    103         return 4.25+0.5j
    104 
    105 class ComplexSubclass(complex):
    106     pass
    107 
    108 class ComplexSubclass2(complex):
    109     def __complex__(self):
    110         return 4.25+0.5j
    111 
    112 class BadComplex:
    113     def __complex__(self):
    114         return 1.25
    115 
    116 class BadComplex2:
    117     def __complex__(self):
    118         return ComplexSubclass(4.25+0.5j)
    119 
    120 class BadComplex3(complex):
    121     def __complex__(self):
    122         return ComplexSubclass(4.25+0.5j)
    123 
    124 
    125 class TupleSubclass(tuple):
    126     pass
    127 
    128 class DictSubclass(dict):
    129     pass
    130 
    131 
    132 class Unsigned_TestCase(unittest.TestCase):
    133     def test_b(self):
    134         from _testcapi import getargs_b
    135         # b returns 'unsigned char', and does range checking (0 ... UCHAR_MAX)
    136         self.assertRaises(TypeError, getargs_b, 3.14)
    137         self.assertEqual(99, getargs_b(Int()))
    138         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()))
    143 
    144         self.assertRaises(OverflowError, getargs_b, -1)
    145         self.assertEqual(0, getargs_b(0))
    146         self.assertEqual(UCHAR_MAX, getargs_b(UCHAR_MAX))
    147         self.assertRaises(OverflowError, getargs_b, UCHAR_MAX + 1)
    148 
    149         self.assertEqual(42, getargs_b(42))
    150         self.assertRaises(OverflowError, getargs_b, VERY_LARGE)
    151 
    152     def test_B(self):
    153         from _testcapi import getargs_B
    154         # B returns 'unsigned char', no range checking
    155         self.assertRaises(TypeError, getargs_B, 3.14)
    156         self.assertEqual(99, getargs_B(Int()))
    157         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()))
    162 
    163         self.assertEqual(UCHAR_MAX, getargs_B(-1))
    164         self.assertEqual(0, getargs_B(0))
    165         self.assertEqual(UCHAR_MAX, getargs_B(UCHAR_MAX))
    166         self.assertEqual(0, getargs_B(UCHAR_MAX+1))
    167 
    168         self.assertEqual(42, getargs_B(42))
    169         self.assertEqual(UCHAR_MAX & VERY_LARGE, getargs_B(VERY_LARGE))
    170 
    171     def test_H(self):
    172         from _testcapi import getargs_H
    173         # H returns 'unsigned short', no range checking
    174         self.assertRaises(TypeError, getargs_H, 3.14)
    175         self.assertEqual(99, getargs_H(Int()))
    176         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()))
    181 
    182         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))
    186 
    187         self.assertEqual(42, getargs_H(42))
    188 
    189         self.assertEqual(VERY_LARGE & USHRT_MAX, getargs_H(VERY_LARGE))
    190 
    191     def test_I(self):
    192         from _testcapi import getargs_I
    193         # I returns 'unsigned int', no range checking
    194         self.assertRaises(TypeError, getargs_I, 3.14)
    195         self.assertEqual(99, getargs_I(Int()))
    196         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()))
    201 
    202         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))
    206 
    207         self.assertEqual(42, getargs_I(42))
    208 
    209         self.assertEqual(VERY_LARGE & UINT_MAX, getargs_I(VERY_LARGE))
    210 
    211     def test_k(self):
    212         from _testcapi import getargs_k
    213         # k returns 'unsigned long', no range checking
    214         # it does not accept float, or instances with __int__
    215         self.assertRaises(TypeError, getargs_k, 3.14)
    216         self.assertRaises(TypeError, getargs_k, Int())
    217         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()))
    221 
    222         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))
    226 
    227         self.assertEqual(42, getargs_k(42))
    228 
    229         self.assertEqual(VERY_LARGE & ULONG_MAX, getargs_k(VERY_LARGE))
    230 
    231 class Signed_TestCase(unittest.TestCase):
    232     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()))
    237         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()))
    242 
    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 
    251     def test_i(self):
    252         from _testcapi import getargs_i
    253         # i returns 'int', and does range checking (INT_MIN ... INT_MAX)
    254         self.assertRaises(TypeError, getargs_i, 3.14)
    255         self.assertEqual(99, getargs_i(Int()))
    256         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()))
    261 
    262         self.assertRaises(OverflowError, getargs_i, INT_MIN-1)
    263         self.assertEqual(INT_MIN, getargs_i(INT_MIN))
    264         self.assertEqual(INT_MAX, getargs_i(INT_MAX))
    265         self.assertRaises(OverflowError, getargs_i, INT_MAX+1)
    266 
    267         self.assertEqual(42, getargs_i(42))
    268         self.assertRaises(OverflowError, getargs_i, VERY_LARGE)
    269 
    270     def test_l(self):
    271         from _testcapi import getargs_l
    272         # l returns 'long', and does range checking (LONG_MIN ... LONG_MAX)
    273         self.assertRaises(TypeError, getargs_l, 3.14)
    274         self.assertEqual(99, getargs_l(Int()))
    275         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()))
    280 
    281         self.assertRaises(OverflowError, getargs_l, LONG_MIN-1)
    282         self.assertEqual(LONG_MIN, getargs_l(LONG_MIN))
    283         self.assertEqual(LONG_MAX, getargs_l(LONG_MAX))
    284         self.assertRaises(OverflowError, getargs_l, LONG_MAX+1)
    285 
    286         self.assertEqual(42, getargs_l(42))
    287         self.assertRaises(OverflowError, getargs_l, VERY_LARGE)
    288 
    289     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)
    293         self.assertRaises(TypeError, getargs_n, 3.14)
    294         self.assertRaises(TypeError, getargs_n, Int())
    295         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()))
    299 
    300         self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MIN-1)
    301         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))
    303         self.assertRaises(OverflowError, getargs_n, PY_SSIZE_T_MAX+1)
    304 
    305         self.assertEqual(42, getargs_n(42))
    306         self.assertRaises(OverflowError, getargs_n, VERY_LARGE)
    307 
    308 
    309 class LongLong_TestCase(unittest.TestCase):
    310     def test_L(self):
    311         from _testcapi import getargs_L
    312         # L returns 'long long', and does range checking (LLONG_MIN
    313         # ... LLONG_MAX)
    314         self.assertRaises(TypeError, getargs_L, 3.14)
    315         self.assertRaises(TypeError, getargs_L, "Hello")
    316         self.assertEqual(99, getargs_L(Int()))
    317         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()))
    322 
    323         self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)
    324         self.assertEqual(LLONG_MIN, getargs_L(LLONG_MIN))
    325         self.assertEqual(LLONG_MAX, getargs_L(LLONG_MAX))
    326         self.assertRaises(OverflowError, getargs_L, LLONG_MAX+1)
    327 
    328         self.assertEqual(42, getargs_L(42))
    329         self.assertRaises(OverflowError, getargs_L, VERY_LARGE)
    330 
    331     def test_K(self):
    332         from _testcapi import getargs_K
    333         # K return 'unsigned long long', no range checking
    334         self.assertRaises(TypeError, getargs_K, 3.14)
    335         self.assertRaises(TypeError, getargs_K, Int())
    336         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 
    341         self.assertEqual(ULLONG_MAX, getargs_K(ULLONG_MAX))
    342         self.assertEqual(0, getargs_K(0))
    343         self.assertEqual(0, getargs_K(ULLONG_MAX+1))
    344 
    345         self.assertEqual(42, getargs_K(42))
    346 
    347         self.assertEqual(VERY_LARGE & ULLONG_MAX, getargs_K(VERY_LARGE))
    348 
    349 
    350 class 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())
    364         with self.assertWarns(DeprecationWarning):
    365             self.assertEqual(getargs_f(BadFloat2()), 4.25)
    366         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 
    381     @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 
    387     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())
    396         with self.assertWarns(DeprecationWarning):
    397             self.assertEqual(getargs_d(BadFloat2()), 4.25)
    398         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())
    418         with self.assertWarns(DeprecationWarning):
    419             self.assertEqual(getargs_D(BadComplex2()), 4.25+0.5j)
    420         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 
    433 class Paradox:
    434     "This statement is false."
    435     def __bool__(self):
    436         raise NotImplementedError
    437 
    438 class 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 
    463 
    464 class Tuple_TestCase(unittest.TestCase):
    465     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))
    482         self.assertIs(type(ret), tuple)
    483 
    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 
    492     def test_tuple(self):
    493         from _testcapi import getargs_tuple
    494 
    495         ret = getargs_tuple(1, (2, 3))
    496         self.assertEqual(ret, (1,2,3))
    497 
    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 
    506 class Keywords_TestCase(unittest.TestCase):
    507     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 
    530     def test_positional_args(self):
    531         # using all positional args
    532         self.assertEqual(
    533             getargs_keywords((1,2), 3, (4,(5,6)), (7,8,9), 10),
    534             (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    535             )
    536 
    537     def test_mixed_args(self):
    538         # positional and keyword args
    539         self.assertEqual(
    540             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             )
    543 
    544     def test_keyword_args(self):
    545         # all keywords
    546         self.assertEqual(
    547             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             )
    550 
    551     def test_optional_args(self):
    552         # missing optional keyword args, skipping tuples
    553         self.assertEqual(
    554             getargs_keywords(arg1=(1,2), arg2=3, arg5=10),
    555             (1, 2, 3, -1, -1, -1, -1, -1, -1, 10)
    556             )
    557 
    558     def test_required_args(self):
    559         # required arg missing
    560         try:
    561             getargs_keywords(arg1=(1,2))
    562         except TypeError as err:
    563             self.assertEqual(
    564                 str(err), "function missing required argument 'arg2' (pos 2)")
    565         else:
    566             self.fail('TypeError should have been raised')
    567 
    568     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:
    572             self.assertEqual(str(err), "function takes at most 5 arguments (6 given)")
    573         else:
    574             self.fail('TypeError should have been raised')
    575 
    576     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:
    581             self.assertEqual(str(err), "'arg666' is an invalid keyword argument for this function")
    582         else:
    583             self.fail('TypeError should have been raised')
    584 
    585     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:
    589             self.assertEqual(str(err), "'\udc80' is an invalid keyword argument for this function")
    590         else:
    591             self.fail('TypeError should have been raised')
    592 
    593 class 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,
    637             r"function missing required argument 'required' \(pos 1\)"):
    638             getargs_keyword_only(optional=2)
    639 
    640         with self.assertRaisesRegex(TypeError,
    641             r"function missing required argument 'required' \(pos 1\)"):
    642             getargs_keyword_only(keyword_only=3)
    643 
    644     def test_too_many_args(self):
    645         with self.assertRaisesRegex(TypeError,
    646             r"function takes at most 2 positional arguments \(3 given\)"):
    647             getargs_keyword_only(1, 2, 3)
    648 
    649         with self.assertRaisesRegex(TypeError,
    650             r"function takes at most 3 arguments \(4 given\)"):
    651             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 
    664 
    665 class 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,
    685             r"function takes at least 1 positional arguments \(0 given\)"):
    686             self.getargs()
    687 
    688         with self.assertRaisesRegex(TypeError,
    689             r"function takes at least 1 positional arguments \(0 given\)"):
    690             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 
    698 class Bytes_TestCase(unittest.TestCase):
    699     def test_c(self):
    700         from _testcapi import getargs_c
    701         self.assertRaises(TypeError, getargs_c, b'abc')  # len > 1
    702         self.assertEqual(getargs_c(b'a'), 97)
    703         self.assertEqual(getargs_c(bytearray(b'a')), 97)
    704         self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
    705         self.assertRaises(TypeError, getargs_c, 's')
    706         self.assertRaises(TypeError, getargs_c, 97)
    707         self.assertRaises(TypeError, getargs_c, None)
    708 
    709     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 
    752 class 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 
    765     def test_s(self):
    766         from _testcapi import getargs_s
    767         self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
    768         self.assertRaises(ValueError, getargs_s, 'nul:\0')
    769         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')
    795         self.assertRaises(ValueError, getargs_z, 'nul:\0')
    796         self.assertRaises(TypeError, getargs_z, b'bytes')
    797         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 
    819     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')
    830 
    831     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')
    844 
    845     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')
    856 
    857         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)
    864         self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
    865         self.assertEqual(buf, bytearray(b'x'*4))
    866         buf = bytearray()
    867         self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
    868 
    869     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')
    882 
    883         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)
    890         self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
    891         self.assertEqual(buf, bytearray(b'x'*4))
    892         buf = bytearray()
    893         self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
    894 
    895     def test_u(self):
    896         from _testcapi import getargs_u
    897         self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')
    898         self.assertRaises(ValueError, getargs_u, 'nul:\0')
    899         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')
    916         self.assertRaises(ValueError, getargs_Z, 'nul:\0')
    917         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 
    932 class 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 
    960 # Bug #6012
    961 class Test6012(unittest.TestCase):
    962     def test(self):
    963         self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
    964 
    965 
    966 class 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 
   1068 class 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 
   1131 class 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 
   1137 if __name__ == "__main__":
   1138     unittest.main()
   1139