Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c8241fd

Browse files
Issue #26198: Added tests for "es", "et", "es#", "et#" and "C" format units
of PyArg_Parse*() functions.
1 parent 22532ac commit c8241fd

2 files changed

Lines changed: 228 additions & 43 deletions

File tree

Lib/test/test_getargs2.py

Lines changed: 135 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -469,16 +469,74 @@ def test_surrogate_keyword(self):
469469
"'\udc80' is an invalid keyword argument for this function"):
470470
getargs_keyword_only(1, 2, **{'\uDC80': 10})
471471

472+
472473
class Bytes_TestCase(unittest.TestCase):
473474
def test_c(self):
474475
from _testcapi import getargs_c
475476
self.assertRaises(TypeError, getargs_c, b'abc') # len > 1
476-
self.assertEqual(getargs_c(b'a'), b'a')
477-
self.assertEqual(getargs_c(bytearray(b'a')), b'a')
477+
self.assertEqual(getargs_c(b'a'), 97)
478+
self.assertEqual(getargs_c(bytearray(b'a')), 97)
478479
self.assertRaises(TypeError, getargs_c, memoryview(b'a'))
479480
self.assertRaises(TypeError, getargs_c, 's')
481+
self.assertRaises(TypeError, getargs_c, 97)
480482
self.assertRaises(TypeError, getargs_c, None)
481483

484+
def test_y(self):
485+
from _testcapi import getargs_y
486+
self.assertRaises(TypeError, getargs_y, 'abc\xe9')
487+
self.assertEqual(getargs_y(b'bytes'), b'bytes')
488+
self.assertRaises(ValueError, getargs_y, b'nul:\0')
489+
self.assertRaises(TypeError, getargs_y, bytearray(b'bytearray'))
490+
self.assertRaises(TypeError, getargs_y, memoryview(b'memoryview'))
491+
self.assertRaises(TypeError, getargs_y, None)
492+
493+
def test_y_star(self):
494+
from _testcapi import getargs_y_star
495+
self.assertRaises(TypeError, getargs_y_star, 'abc\xe9')
496+
self.assertEqual(getargs_y_star(b'bytes'), b'bytes')
497+
self.assertEqual(getargs_y_star(b'nul:\0'), b'nul:\0')
498+
self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
499+
self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
500+
self.assertRaises(TypeError, getargs_y_star, None)
501+
502+
def test_y_hash(self):
503+
from _testcapi import getargs_y_hash
504+
self.assertRaises(TypeError, getargs_y_hash, 'abc\xe9')
505+
self.assertEqual(getargs_y_hash(b'bytes'), b'bytes')
506+
self.assertEqual(getargs_y_hash(b'nul:\0'), b'nul:\0')
507+
self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
508+
self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
509+
self.assertRaises(TypeError, getargs_y_hash, None)
510+
511+
def test_w_star(self):
512+
# getargs_w_star() modifies first and last byte
513+
from _testcapi import getargs_w_star
514+
self.assertRaises(TypeError, getargs_w_star, 'abc\xe9')
515+
self.assertRaises(TypeError, getargs_w_star, b'bytes')
516+
self.assertRaises(TypeError, getargs_w_star, b'nul:\0')
517+
self.assertRaises(TypeError, getargs_w_star, memoryview(b'bytes'))
518+
buf = bytearray(b'bytearray')
519+
self.assertEqual(getargs_w_star(buf), b'[ytearra]')
520+
self.assertEqual(buf, bytearray(b'[ytearra]'))
521+
buf = bytearray(b'memoryview')
522+
self.assertEqual(getargs_w_star(memoryview(buf)), b'[emoryvie]')
523+
self.assertEqual(buf, bytearray(b'[emoryvie]'))
524+
self.assertRaises(TypeError, getargs_w_star, None)
525+
526+
527+
class String_TestCase(unittest.TestCase):
528+
def test_C(self):
529+
from _testcapi import getargs_C
530+
self.assertRaises(TypeError, getargs_C, 'abc') # len > 1
531+
self.assertEqual(getargs_C('a'), 97)
532+
self.assertEqual(getargs_C('\u20ac'), 0x20ac)
533+
self.assertEqual(getargs_C('\U0001f40d'), 0x1f40d)
534+
self.assertRaises(TypeError, getargs_C, b'a')
535+
self.assertRaises(TypeError, getargs_C, bytearray(b'a'))
536+
self.assertRaises(TypeError, getargs_C, memoryview(b'a'))
537+
self.assertRaises(TypeError, getargs_C, 97)
538+
self.assertRaises(TypeError, getargs_C, None)
539+
482540
def test_s(self):
483541
from _testcapi import getargs_s
484542
self.assertEqual(getargs_s('abc\xe9'), b'abc\xc3\xa9')
@@ -533,47 +591,82 @@ def test_z_hash(self):
533591
self.assertRaises(TypeError, getargs_z_hash, memoryview(b'memoryview'))
534592
self.assertIsNone(getargs_z_hash(None))
535593

536-
def test_y(self):
537-
from _testcapi import getargs_y
538-
self.assertRaises(TypeError, getargs_y, 'abc\xe9')
539-
self.assertEqual(getargs_y(b'bytes'), b'bytes')
540-
self.assertRaises(ValueError, getargs_y, b'nul:\0')
541-
self.assertRaises(TypeError, getargs_y, bytearray(b'bytearray'))
542-
self.assertRaises(TypeError, getargs_y, memoryview(b'memoryview'))
543-
self.assertRaises(TypeError, getargs_y, None)
544-
545-
def test_y_star(self):
546-
from _testcapi import getargs_y_star
547-
self.assertRaises(TypeError, getargs_y_star, 'abc\xe9')
548-
self.assertEqual(getargs_y_star(b'bytes'), b'bytes')
549-
self.assertEqual(getargs_y_star(b'nul:\0'), b'nul:\0')
550-
self.assertEqual(getargs_y_star(bytearray(b'bytearray')), b'bytearray')
551-
self.assertEqual(getargs_y_star(memoryview(b'memoryview')), b'memoryview')
552-
self.assertRaises(TypeError, getargs_y_star, None)
553-
554-
def test_y_hash(self):
555-
from _testcapi import getargs_y_hash
556-
self.assertRaises(TypeError, getargs_y_hash, 'abc\xe9')
557-
self.assertEqual(getargs_y_hash(b'bytes'), b'bytes')
558-
self.assertEqual(getargs_y_hash(b'nul:\0'), b'nul:\0')
559-
self.assertRaises(TypeError, getargs_y_hash, bytearray(b'bytearray'))
560-
self.assertRaises(TypeError, getargs_y_hash, memoryview(b'memoryview'))
561-
self.assertRaises(TypeError, getargs_y_hash, None)
562-
563-
def test_w_star(self):
564-
# getargs_w_star() modifies first and last byte
565-
from _testcapi import getargs_w_star
566-
self.assertRaises(TypeError, getargs_w_star, 'abc\xe9')
567-
self.assertRaises(TypeError, getargs_w_star, b'bytes')
568-
self.assertRaises(TypeError, getargs_w_star, b'nul:\0')
569-
self.assertRaises(TypeError, getargs_w_star, memoryview(b'bytes'))
570-
self.assertEqual(getargs_w_star(bytearray(b'bytearray')), b'[ytearra]')
571-
self.assertEqual(getargs_w_star(memoryview(bytearray(b'memoryview'))),
572-
b'[emoryvie]')
573-
self.assertRaises(TypeError, getargs_w_star, None)
574-
594+
def test_es(self):
595+
from _testcapi import getargs_es
596+
self.assertEqual(getargs_es('abc\xe9'), b'abc\xc3\xa9')
597+
self.assertEqual(getargs_es('abc\xe9', 'latin1'), b'abc\xe9')
598+
self.assertRaises(UnicodeEncodeError, getargs_es, 'abc\xe9', 'ascii')
599+
self.assertRaises(LookupError, getargs_es, 'abc\xe9', 'spam')
600+
self.assertRaises(TypeError, getargs_es, b'bytes', 'latin1')
601+
self.assertRaises(TypeError, getargs_es, bytearray(b'bytearray'), 'latin1')
602+
self.assertRaises(TypeError, getargs_es, memoryview(b'memoryview'), 'latin1')
603+
self.assertRaises(TypeError, getargs_es, None, 'latin1')
604+
self.assertRaises(TypeError, getargs_es, 'nul:\0', 'latin1')
605+
606+
def test_et(self):
607+
from _testcapi import getargs_et
608+
self.assertEqual(getargs_et('abc\xe9'), b'abc\xc3\xa9')
609+
self.assertEqual(getargs_et('abc\xe9', 'latin1'), b'abc\xe9')
610+
self.assertRaises(UnicodeEncodeError, getargs_et, 'abc\xe9', 'ascii')
611+
self.assertRaises(LookupError, getargs_et, 'abc\xe9', 'spam')
612+
self.assertEqual(getargs_et(b'bytes', 'latin1'), b'bytes')
613+
self.assertEqual(getargs_et(bytearray(b'bytearray'), 'latin1'), b'bytearray')
614+
self.assertRaises(TypeError, getargs_et, memoryview(b'memoryview'), 'latin1')
615+
self.assertRaises(TypeError, getargs_et, None, 'latin1')
616+
self.assertRaises(TypeError, getargs_et, 'nul:\0', 'latin1')
617+
self.assertRaises(TypeError, getargs_et, b'nul:\0', 'latin1')
618+
self.assertRaises(TypeError, getargs_et, bytearray(b'nul:\0'), 'latin1')
619+
620+
def test_es_hash(self):
621+
from _testcapi import getargs_es_hash
622+
self.assertEqual(getargs_es_hash('abc\xe9'), b'abc\xc3\xa9')
623+
self.assertEqual(getargs_es_hash('abc\xe9', 'latin1'), b'abc\xe9')
624+
self.assertRaises(UnicodeEncodeError, getargs_es_hash, 'abc\xe9', 'ascii')
625+
self.assertRaises(LookupError, getargs_es_hash, 'abc\xe9', 'spam')
626+
self.assertRaises(TypeError, getargs_es_hash, b'bytes', 'latin1')
627+
self.assertRaises(TypeError, getargs_es_hash, bytearray(b'bytearray'), 'latin1')
628+
self.assertRaises(TypeError, getargs_es_hash, memoryview(b'memoryview'), 'latin1')
629+
self.assertRaises(TypeError, getargs_es_hash, None, 'latin1')
630+
self.assertEqual(getargs_es_hash('nul:\0', 'latin1'), b'nul:\0')
631+
632+
buf = bytearray(b'x'*8)
633+
self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
634+
self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
635+
buf = bytearray(b'x'*5)
636+
self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
637+
self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
638+
buf = bytearray(b'x'*4)
639+
self.assertRaises(TypeError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
640+
self.assertEqual(buf, bytearray(b'x'*4))
641+
buf = bytearray()
642+
self.assertRaises(TypeError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
643+
644+
def test_et_hash(self):
645+
from _testcapi import getargs_et_hash
646+
self.assertEqual(getargs_et_hash('abc\xe9'), b'abc\xc3\xa9')
647+
self.assertEqual(getargs_et_hash('abc\xe9', 'latin1'), b'abc\xe9')
648+
self.assertRaises(UnicodeEncodeError, getargs_et_hash, 'abc\xe9', 'ascii')
649+
self.assertRaises(LookupError, getargs_et_hash, 'abc\xe9', 'spam')
650+
self.assertEqual(getargs_et_hash(b'bytes', 'latin1'), b'bytes')
651+
self.assertEqual(getargs_et_hash(bytearray(b'bytearray'), 'latin1'), b'bytearray')
652+
self.assertRaises(TypeError, getargs_et_hash, memoryview(b'memoryview'), 'latin1')
653+
self.assertRaises(TypeError, getargs_et_hash, None, 'latin1')
654+
self.assertEqual(getargs_et_hash('nul:\0', 'latin1'), b'nul:\0')
655+
self.assertEqual(getargs_et_hash(b'nul:\0', 'latin1'), b'nul:\0')
656+
self.assertEqual(getargs_et_hash(bytearray(b'nul:\0'), 'latin1'), b'nul:\0')
657+
658+
buf = bytearray(b'x'*8)
659+
self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
660+
self.assertEqual(buf, bytearray(b'abc\xe9\x00xxx'))
661+
buf = bytearray(b'x'*5)
662+
self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
663+
self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
664+
buf = bytearray(b'x'*4)
665+
self.assertRaises(TypeError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
666+
self.assertEqual(buf, bytearray(b'x'*4))
667+
buf = bytearray()
668+
self.assertRaises(TypeError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
575669

576-
class Unicode_TestCase(unittest.TestCase):
577670
def test_u(self):
578671
from _testcapi import getargs_u
579672
self.assertEqual(getargs_u('abc\xe9'), 'abc\xe9')

Modules/_testcapimodule.c

Lines changed: 93 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,16 @@ getargs_c(PyObject *self, PyObject *args)
10881088
char c;
10891089
if (!PyArg_ParseTuple(args, "c", &c))
10901090
return NULL;
1091-
return PyBytes_FromStringAndSize(&c, 1);
1091+
return PyLong_FromLong((unsigned char)c);
1092+
}
1093+
1094+
static PyObject *
1095+
getargs_C(PyObject *self, PyObject *args)
1096+
{
1097+
int c;
1098+
if (!PyArg_ParseTuple(args, "C", &c))
1099+
return NULL;
1100+
return PyLong_FromLong(c);
10921101
}
10931102

10941103
static PyObject *
@@ -1243,6 +1252,84 @@ getargs_Z_hash(PyObject *self, PyObject *args)
12431252
Py_RETURN_NONE;
12441253
}
12451254

1255+
static PyObject *
1256+
getargs_es(PyObject *self, PyObject *args)
1257+
{
1258+
PyObject *arg, *result;
1259+
const char *encoding = NULL;
1260+
char *str;
1261+
1262+
if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1263+
return NULL;
1264+
if (!PyArg_Parse(arg, "es", encoding, &str))
1265+
return NULL;
1266+
result = PyBytes_FromString(str);
1267+
PyMem_Free(str);
1268+
return result;
1269+
}
1270+
1271+
static PyObject *
1272+
getargs_et(PyObject *self, PyObject *args)
1273+
{
1274+
PyObject *arg, *result;
1275+
const char *encoding = NULL;
1276+
char *str;
1277+
1278+
if (!PyArg_ParseTuple(args, "O|s", &arg, &encoding))
1279+
return NULL;
1280+
if (!PyArg_Parse(arg, "et", encoding, &str))
1281+
return NULL;
1282+
result = PyBytes_FromString(str);
1283+
PyMem_Free(str);
1284+
return result;
1285+
}
1286+
1287+
static PyObject *
1288+
getargs_es_hash(PyObject *self, PyObject *args)
1289+
{
1290+
PyObject *arg, *result;
1291+
const char *encoding = NULL;
1292+
PyByteArrayObject *buffer = NULL;
1293+
char *str = NULL;
1294+
Py_ssize_t size;
1295+
1296+
if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1297+
return NULL;
1298+
if (buffer != NULL) {
1299+
str = PyByteArray_AS_STRING(buffer);
1300+
size = PyByteArray_GET_SIZE(buffer);
1301+
}
1302+
if (!PyArg_Parse(arg, "es#", encoding, &str, &size))
1303+
return NULL;
1304+
result = PyBytes_FromStringAndSize(str, size);
1305+
if (buffer == NULL)
1306+
PyMem_Free(str);
1307+
return result;
1308+
}
1309+
1310+
static PyObject *
1311+
getargs_et_hash(PyObject *self, PyObject *args)
1312+
{
1313+
PyObject *arg, *result;
1314+
const char *encoding = NULL;
1315+
PyByteArrayObject *buffer = NULL;
1316+
char *str = NULL;
1317+
Py_ssize_t size;
1318+
1319+
if (!PyArg_ParseTuple(args, "O|sY", &arg, &encoding, &buffer))
1320+
return NULL;
1321+
if (buffer != NULL) {
1322+
str = PyByteArray_AS_STRING(buffer);
1323+
size = PyByteArray_GET_SIZE(buffer);
1324+
}
1325+
if (!PyArg_Parse(arg, "et#", encoding, &str, &size))
1326+
return NULL;
1327+
result = PyBytes_FromStringAndSize(str, size);
1328+
if (buffer == NULL)
1329+
PyMem_Free(str);
1330+
return result;
1331+
}
1332+
12461333
/* Test the s and z codes for PyArg_ParseTuple.
12471334
*/
12481335
static PyObject *
@@ -3588,6 +3675,7 @@ static PyMethodDef TestMethods[] = {
35883675
{"test_L_code", (PyCFunction)test_L_code, METH_NOARGS},
35893676
#endif
35903677
{"getargs_c", getargs_c, METH_VARARGS},
3678+
{"getargs_C", getargs_C, METH_VARARGS},
35913679
{"getargs_s", getargs_s, METH_VARARGS},
35923680
{"getargs_s_star", getargs_s_star, METH_VARARGS},
35933681
{"getargs_s_hash", getargs_s_hash, METH_VARARGS},
@@ -3602,6 +3690,10 @@ static PyMethodDef TestMethods[] = {
36023690
{"getargs_Z", getargs_Z, METH_VARARGS},
36033691
{"getargs_Z_hash", getargs_Z_hash, METH_VARARGS},
36043692
{"getargs_w_star", getargs_w_star, METH_VARARGS},
3693+
{"getargs_es", getargs_es, METH_VARARGS},
3694+
{"getargs_et", getargs_et, METH_VARARGS},
3695+
{"getargs_es_hash", getargs_es_hash, METH_VARARGS},
3696+
{"getargs_et_hash", getargs_et_hash, METH_VARARGS},
36053697
{"codec_incrementalencoder",
36063698
(PyCFunction)codec_incrementalencoder, METH_VARARGS},
36073699
{"codec_incrementaldecoder",

0 commit comments

Comments
 (0)