Additional edge-case tests for test_long_and_overflow.
This commit is contained in:
parent
ed02b3f342
commit
bd335bfce7
|
@ -366,68 +366,158 @@ test_longlong_api(PyObject* self, PyObject *args)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
test_long_and_overflow(PyObject *self)
|
test_long_and_overflow(PyObject *self)
|
||||||
{
|
{
|
||||||
PyObject *num;
|
PyObject *num, *one, *temp;
|
||||||
long value;
|
long value;
|
||||||
int overflow;
|
int overflow;
|
||||||
|
|
||||||
/* a number larger than LONG_MAX even on 64-bit platforms */
|
/* Test that overflow is set properly for a large value. */
|
||||||
|
/* num is a number larger than LONG_MAX even on 64-bit platforms */
|
||||||
num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
|
num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
|
||||||
if (num == NULL)
|
if (num == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Test that overflow is set properly for a large value. */
|
|
||||||
overflow = 1234;
|
overflow = 1234;
|
||||||
value = PyLong_AsLongAndOverflow(num, &overflow);
|
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||||
|
Py_DECREF(num);
|
||||||
|
if (value == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (value != -1)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"return value was not set to -1");
|
||||||
if (overflow != 1)
|
if (overflow != 1)
|
||||||
return raiseTestError("test_long_and_overflow",
|
return raiseTestError("test_long_and_overflow",
|
||||||
"overflow was not set to 1");
|
"overflow was not set to 1");
|
||||||
|
|
||||||
|
/* Same again, with num = LONG_MAX + 1 */
|
||||||
|
num = PyLong_FromLong(LONG_MAX);
|
||||||
|
if (num == NULL)
|
||||||
|
return NULL;
|
||||||
|
one = PyLong_FromLong(1L);
|
||||||
|
if (one == NULL) {
|
||||||
|
Py_DECREF(num);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
temp = PyNumber_Add(num, one);
|
||||||
|
Py_DECREF(one);
|
||||||
|
Py_DECREF(num);
|
||||||
|
num = temp;
|
||||||
|
if (num == NULL)
|
||||||
|
return NULL;
|
||||||
overflow = 0;
|
overflow = 0;
|
||||||
value = PyLong_AsLongAndOverflow(num, &overflow);
|
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||||
|
Py_DECREF(num);
|
||||||
|
if (value == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (value != -1)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"return value was not set to -1");
|
||||||
if (overflow != 1)
|
if (overflow != 1)
|
||||||
return raiseTestError("test_long_and_overflow",
|
return raiseTestError("test_long_and_overflow",
|
||||||
"overflow was not set to 0");
|
"overflow was not set to 1");
|
||||||
|
|
||||||
Py_DECREF(num);
|
/* Test that overflow is set properly for a large negative value. */
|
||||||
|
/* num is a number smaller than LONG_MIN even on 64-bit platforms */
|
||||||
/* a number smaller than LONG_MIN even on 64-bit platforms */
|
|
||||||
num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
|
num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
|
||||||
if (num == NULL)
|
if (num == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Test that overflow is set properly for a large negative value. */
|
|
||||||
overflow = 1234;
|
overflow = 1234;
|
||||||
value = PyLong_AsLongAndOverflow(num, &overflow);
|
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||||
|
Py_DECREF(num);
|
||||||
|
if (value == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (value != -1)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"return value was not set to -1");
|
||||||
if (overflow != -1)
|
if (overflow != -1)
|
||||||
return raiseTestError("test_long_and_overflow",
|
return raiseTestError("test_long_and_overflow",
|
||||||
"overflow was not set to -1");
|
"overflow was not set to -1");
|
||||||
|
|
||||||
|
/* Same again, with num = LONG_MIN - 1 */
|
||||||
|
num = PyLong_FromLong(LONG_MIN);
|
||||||
|
if (num == NULL)
|
||||||
|
return NULL;
|
||||||
|
one = PyLong_FromLong(1L);
|
||||||
|
if (one == NULL) {
|
||||||
|
Py_DECREF(num);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
temp = PyNumber_Subtract(num, one);
|
||||||
|
Py_DECREF(one);
|
||||||
|
Py_DECREF(num);
|
||||||
|
num = temp;
|
||||||
|
if (num == NULL)
|
||||||
|
return NULL;
|
||||||
overflow = 0;
|
overflow = 0;
|
||||||
value = PyLong_AsLongAndOverflow(num, &overflow);
|
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||||
|
Py_DECREF(num);
|
||||||
|
if (value == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (value != -1)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"return value was not set to -1");
|
||||||
if (overflow != -1)
|
if (overflow != -1)
|
||||||
return raiseTestError("test_long_and_overflow",
|
return raiseTestError("test_long_and_overflow",
|
||||||
"overflow was not set to 0");
|
"overflow was not set to -1");
|
||||||
|
|
||||||
Py_DECREF(num);
|
|
||||||
|
|
||||||
|
/* Test that overflow is cleared properly for small values. */
|
||||||
num = PyLong_FromString("FF", NULL, 16);
|
num = PyLong_FromString("FF", NULL, 16);
|
||||||
if (num == NULL)
|
if (num == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Test that overflow is cleared properly for a small value. */
|
|
||||||
overflow = 1234;
|
overflow = 1234;
|
||||||
value = PyLong_AsLongAndOverflow(num, &overflow);
|
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||||
|
Py_DECREF(num);
|
||||||
|
if (value == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (value != 0xFF)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"expected return value 0xFF");
|
||||||
if (overflow != 0)
|
if (overflow != 0)
|
||||||
return raiseTestError("test_long_and_overflow",
|
return raiseTestError("test_long_and_overflow",
|
||||||
"overflow was not cleared");
|
"overflow was not cleared");
|
||||||
|
|
||||||
|
num = PyLong_FromString("-FF", NULL, 16);
|
||||||
|
if (num == NULL)
|
||||||
|
return NULL;
|
||||||
overflow = 0;
|
overflow = 0;
|
||||||
value = PyLong_AsLongAndOverflow(num, &overflow);
|
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||||
|
Py_DECREF(num);
|
||||||
|
if (value == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (value != -0xFF)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"expected return value 0xFF");
|
||||||
if (overflow != 0)
|
if (overflow != 0)
|
||||||
return raiseTestError("test_long_and_overflow",
|
return raiseTestError("test_long_and_overflow",
|
||||||
"overflow was set incorrectly");
|
"overflow was set incorrectly");
|
||||||
|
|
||||||
|
num = PyLong_FromLong(LONG_MAX);
|
||||||
|
if (num == NULL)
|
||||||
|
return NULL;
|
||||||
|
overflow = 1234;
|
||||||
|
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||||
Py_DECREF(num);
|
Py_DECREF(num);
|
||||||
|
if (value == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (value != LONG_MAX)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"expected return value LONG_MAX");
|
||||||
|
if (overflow != 0)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"overflow was not cleared");
|
||||||
|
|
||||||
|
num = PyLong_FromLong(LONG_MIN);
|
||||||
|
if (num == NULL)
|
||||||
|
return NULL;
|
||||||
|
overflow = 0;
|
||||||
|
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||||
|
Py_DECREF(num);
|
||||||
|
if (value == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (value != LONG_MIN)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"expected return value LONG_MIN");
|
||||||
|
if (overflow != 0)
|
||||||
|
return raiseTestError("test_long_and_overflow",
|
||||||
|
"overflow was not cleared");
|
||||||
|
|
||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
return Py_None;
|
return Py_None;
|
||||||
|
@ -1116,7 +1206,8 @@ static PyMethodDef TestMethods[] = {
|
||||||
{"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
|
{"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
|
||||||
{"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
|
{"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,METH_NOARGS},
|
||||||
{"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
|
{"test_long_api", (PyCFunction)test_long_api, METH_NOARGS},
|
||||||
{"test_long_and_overflow", (PyCFunction)test_long_and_overflow, METH_NOARGS},
|
{"test_long_and_overflow", (PyCFunction)test_long_and_overflow,
|
||||||
|
METH_NOARGS},
|
||||||
{"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
|
{"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS},
|
||||||
{"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
|
{"test_k_code", (PyCFunction)test_k_code, METH_NOARGS},
|
||||||
{"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
|
{"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
|
||||||
|
|
Loading…
Reference in New Issue