[Python-checkins] r87749 - in python/branches/py3k: Lib/test/test_unicode.py Modules/_testcapimodule.c

victor.stinner python-checkins at python.org
Wed Jan 5 01:19:28 CET 2011


Author: victor.stinner
Date: Wed Jan  5 01:19:28 2011
New Revision: 87749

Log:
test_unicode: use ctypes to test PyUnicode_FromFormat()

Instead of _testcapi.format_unicode() because it has a limited API: it requires
exactly one argument of type unicode.

Modified:
   python/branches/py3k/Lib/test/test_unicode.py
   python/branches/py3k/Modules/_testcapimodule.c

Modified: python/branches/py3k/Lib/test/test_unicode.py
==============================================================================
--- python/branches/py3k/Lib/test/test_unicode.py	(original)
+++ python/branches/py3k/Lib/test/test_unicode.py	Wed Jan  5 01:19:28 2011
@@ -1423,22 +1423,36 @@
         self.assertEqual("%s" % s, '__str__ overridden')
         self.assertEqual("{}".format(s), '__str__ overridden')
 
+    # Test PyUnicode_FromFormat()
     def test_from_format(self):
-        from _testcapi import format_unicode
+        support.import_module('ctypes')
+        from ctypes import pythonapi, py_object
+        if sys.maxunicode == 65535:
+            name = "PyUnicodeUCS2_FromFormat"
+        else:
+            name = "PyUnicodeUCS4_FromFormat"
+        _PyUnicode_FromFormat = getattr(pythonapi, name)
+        _PyUnicode_FromFormat.restype = py_object
+
+        def PyUnicode_FromFormat(format, *args):
+            cargs = tuple(
+                py_object(arg) if isinstance(arg, str) else arg
+                for arg in args)
+            return _PyUnicode_FromFormat(format, *cargs)
 
         # ascii format, non-ascii argument
-        text = format_unicode(b'ascii\x7f=%U', 'unicode\xe9')
+        text = PyUnicode_FromFormat(b'ascii\x7f=%U', 'unicode\xe9')
         self.assertEqual(text, 'ascii\x7f=unicode\xe9')
 
-        # non-ascii format, ascii argument: ensure that PyUnicode_FromFormat()
-        # raises an error for a non-ascii format string.
+        # non-ascii format, ascii argument: ensure that PyUnicode_FromFormatV()
+        # raises an error
         self.assertRaisesRegex(ValueError,
             '^PyUnicode_FromFormatV\(\) expects an ASCII-encoded format '
             'string, got a non-ASCII byte: 0xe9$',
-            format_unicode, b'unicode\xe9=%s', 'ascii')
+            PyUnicode_FromFormat, b'unicode\xe9=%s', 'ascii')
 
         # other tests
-        text = format_unicode(b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
+        text = PyUnicode_FromFormat(b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
         self.assertEqual(text, r"%A:'abc\xe9\uabcd\U0010ffff'")
 
     # Test PyUnicode_AsWideChar()

Modified: python/branches/py3k/Modules/_testcapimodule.c
==============================================================================
--- python/branches/py3k/Modules/_testcapimodule.c	(original)
+++ python/branches/py3k/Modules/_testcapimodule.c	Wed Jan  5 01:19:28 2011
@@ -2246,17 +2246,6 @@
     return NULL;
 }
 
-static PyObject *
-format_unicode(PyObject *self, PyObject *args)
-{
-    const char *format;
-    PyObject *arg;
-    if (!PyArg_ParseTuple(args, "yU", &format, &arg))
-        return NULL;
-    return PyUnicode_FromFormat(format, arg);
-
-}
-
 static PyMethodDef TestMethods[] = {
     {"raise_exception",         raise_exception,                 METH_VARARGS},
     {"raise_memoryerror",   (PyCFunction)raise_memoryerror,  METH_NOARGS},
@@ -2338,7 +2327,6 @@
     {"make_exception_with_doc", (PyCFunction)make_exception_with_doc,
      METH_VARARGS | METH_KEYWORDS},
     {"crash_no_current_thread", (PyCFunction)crash_no_current_thread, METH_NOARGS},
-    {"format_unicode",          format_unicode,                 METH_VARARGS},
     {NULL, NULL} /* sentinel */
 };
 


More information about the Python-checkins mailing list