[Python-checkins] r76968 - python/trunk/Modules/_testcapimodule.c

mark.dickinson python-checkins at python.org
Mon Dec 21 13:15:49 CET 2009


Author: mark.dickinson
Date: Mon Dec 21 13:15:48 2009
New Revision: 76968

Log:
Additional edge-case tests for test_long_and_overflow.

Modified:
   python/trunk/Modules/_testcapimodule.c

Modified: python/trunk/Modules/_testcapimodule.c
==============================================================================
--- python/trunk/Modules/_testcapimodule.c	(original)
+++ python/trunk/Modules/_testcapimodule.c	Mon Dec 21 13:15:48 2009
@@ -366,68 +366,158 @@
 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 @@
 	{"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},


More information about the Python-checkins mailing list