Additional edge-case tests for test_long_and_overflow.

This commit is contained in:
Mark Dickinson 2009-12-21 12:15:48 +00:00
parent ed02b3f342
commit bd335bfce7
1 changed files with 107 additions and 16 deletions

View File

@ -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},