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 *
|
||||
test_long_and_overflow(PyObject *self)
|
||||
{
|
||||
PyObject *num;
|
||||
PyObject *num, *one, *temp;
|
||||
long value;
|
||||
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);
|
||||
if (num == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Test that overflow is set properly for a large value. */
|
||||
overflow = 1234;
|
||||
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)
|
||||
return raiseTestError("test_long_and_overflow",
|
||||
"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;
|
||||
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)
|
||||
return raiseTestError("test_long_and_overflow",
|
||||
"overflow was not set to 0");
|
||||
"overflow was not set to 1");
|
||||
|
||||
Py_DECREF(num);
|
||||
|
||||
/* a number smaller than LONG_MIN even on 64-bit platforms */
|
||||
/* Test that overflow is set properly for a large negative value. */
|
||||
/* num is a number smaller than LONG_MIN even on 64-bit platforms */
|
||||
num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16);
|
||||
if (num == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Test that overflow is set properly for a large negative value. */
|
||||
overflow = 1234;
|
||||
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)
|
||||
return raiseTestError("test_long_and_overflow",
|
||||
"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;
|
||||
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)
|
||||
return raiseTestError("test_long_and_overflow",
|
||||
"overflow was not set to 0");
|
||||
|
||||
Py_DECREF(num);
|
||||
"overflow was not set to -1");
|
||||
|
||||
/* Test that overflow is cleared properly for small values. */
|
||||
num = PyLong_FromString("FF", NULL, 16);
|
||||
if (num == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Test that overflow is cleared properly for a small value. */
|
||||
overflow = 1234;
|
||||
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)
|
||||
return raiseTestError("test_long_and_overflow",
|
||||
"overflow was not cleared");
|
||||
|
||||
num = PyLong_FromString("-FF", NULL, 16);
|
||||
if (num == NULL)
|
||||
return NULL;
|
||||
overflow = 0;
|
||||
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)
|
||||
return raiseTestError("test_long_and_overflow",
|
||||
"overflow was set incorrectly");
|
||||
|
||||
num = PyLong_FromLong(LONG_MAX);
|
||||
if (num == NULL)
|
||||
return NULL;
|
||||
overflow = 1234;
|
||||
value = PyLong_AsLongAndOverflow(num, &overflow);
|
||||
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);
|
||||
return Py_None;
|
||||
|
@ -1116,7 +1206,8 @@ static PyMethodDef TestMethods[] = {
|
|||
{"test_dict_iteration", (PyCFunction)test_dict_iteration,METH_NOARGS},
|
||||
{"test_lazy_hash_inheritance", (PyCFunction)test_lazy_hash_inheritance,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_k_code", (PyCFunction)test_k_code, METH_NOARGS},
|
||||
{"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS},
|
||||
|
|
Loading…
Reference in New Issue