diff Modules/_testmodule.c @ 16413:8819867f14ef legacy-trunk

Patch derived from Trent's 101162: a Python/C API testing framework. STILL NEEDS UNIX BUILD CHANGES.
author Tim Peters <tim.peters@gmail.com>
date Fri, 02 Feb 2001 05:57:15 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Modules/_testmodule.c	Fri Feb 02 05:57:15 2001 +0000
@@ -0,0 +1,68 @@
+/*
+ * C Extension module to test Python interpreter C APIs.
+ *
+ * The 'test_*' functions exported by this module are run as part of the
+ * standard Python regression test, via Lib/test/test_capi.py.
+ */
+
+#include "Python.h"
+
+static PyObject *TestError;	/* set to exception object in init */
+
+/* Test #defines from config.h (particularly the SIZEOF_* defines).
+
+   The ones derived from autoconf on the UNIX-like OSes can be relied
+   upon (in the absence of sloppy cross-compiling), but the Windows
+   platforms have these hardcoded.  Better safe than sorry.
+*/
+static PyObject*
+sizeof_error(const char* fatname, const char* typename,
+        int expected, int got)
+{
+	char buf[1024];
+	sprintf(buf, "%s #define == %d but sizeof(%s) == %d",
+		fatname, expected, typename, got);
+	PyErr_SetString(TestError, buf);
+	return (PyObject*)NULL;
+}
+
+static PyObject*
+test_config(PyObject *self, PyObject *args)
+{
+        if (!PyArg_ParseTuple(args, ":test_config"))
+                return NULL;
+
+#define CHECK_SIZEOF(FATNAME, TYPE) \
+	    if (FATNAME != sizeof(TYPE)) \
+    	    	return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE))
+
+	CHECK_SIZEOF(SIZEOF_INT, int);
+	CHECK_SIZEOF(SIZEOF_LONG, long);
+	CHECK_SIZEOF(SIZEOF_VOID_P, void*);
+	CHECK_SIZEOF(SIZEOF_TIME_T, time_t);
+#ifdef HAVE_LONG_LONG
+	CHECK_SIZEOF(SIZEOF_LONG_LONG, LONG_LONG);
+#endif
+
+#undef CHECK_SIZEOF
+
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+static PyMethodDef TestMethods[] = {
+	{"test_config", test_config, METH_VARARGS},
+	{NULL, NULL} /* sentinel */
+};
+
+DL_EXPORT(void)
+init_test(void)
+{
+	PyObject *m, *d;
+
+	m = Py_InitModule("_test", TestMethods);
+
+	TestError = PyErr_NewException("_test.error", NULL, NULL);
+	d = PyModule_GetDict(m);
+	PyDict_SetItemString(d, "error", TestError);
+}