]> granicus.if.org Git - python/commitdiff
Additional edge-case tests for test_long_and_overflow.
authorMark Dickinson <dickinsm@gmail.com>
Mon, 21 Dec 2009 12:15:48 +0000 (12:15 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Mon, 21 Dec 2009 12:15:48 +0000 (12:15 +0000)
Modules/_testcapimodule.c

index bc03940ce94996691e400f13b45e5e6738e236f8..c8f208739039c430cf42679747a5e1b8901e0acc 100644 (file)
@@ -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");
-
-       Py_DECREF(num);
+                       "overflow was not set to 1");
 
-       /* 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},