From 8394007361c31433c5250266a4c32eac7224f6db Mon Sep 17 00:00:00 2001 From: Mark Florisson Date: Thu, 9 Dec 2010 21:29:00 +0100 Subject: [PATCH] Drop Python 2.5 support + unicode UCS4 builds support + add more tests --- .../Debugger/Tests/test_libpython_in_gdb.py | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 Cython/Debugger/Tests/test_libpython_in_gdb.py diff --git a/Cython/Debugger/Tests/test_libpython_in_gdb.py b/Cython/Debugger/Tests/test_libpython_in_gdb.py new file mode 100644 index 00000000..f18a8eb2 --- /dev/null +++ b/Cython/Debugger/Tests/test_libpython_in_gdb.py @@ -0,0 +1,117 @@ +# -*- coding: UTF-8 -*- + +""" +Test libpython.py. This is already partly tested by test_libcython_in_gdb and +Lib/test/test_gdb.py in the Python source. These tests are run in gdb and +called from test_libcython_in_gdb.main() +""" + +import os +import sys + +import gdb + +from Cython.Debugger import libcython +from Cython.Debugger import libpython + +import test_libcython_in_gdb +from test_libcython_in_gdb import _debug, inferior_python_version + + +class TestPrettyPrinters(test_libcython_in_gdb.DebugTestCase): + """ + Test whether types of Python objects are correctly inferred and that + the right libpython.PySomeTypeObjectPtr classes are instantiated. + + Also test whether values are appropriately formatted (don't be too + laborious as Lib/test/test_gdb.py already covers this extensively). + + Don't take care of decreffing newly allocated objects as a new + interpreter is started for every test anyway. + """ + + def setUp(self): + super(TestPrettyPrinters, self).setUp() + self.break_and_run('b = c = d = 0') + + def get_pyobject(self, code): + value = gdb.parse_and_eval(code) + assert libpython.pointervalue(value) != 0 + return value + + def pyobject_fromcode(self, code, gdbvar=None): + if gdbvar is not None: + d = {'varname':gdbvar, 'code':code} + gdb.execute('set $%(varname)s = %(code)s' % d) + code = '$' + gdbvar + + return libpython.PyObjectPtr.from_pyobject_ptr(self.get_pyobject(code)) + + def get_repr(self, pyobject): + return pyobject.get_truncated_repr(libpython.MAX_OUTPUT_LEN) + + def alloc_bytestring(self, string, gdbvar=None): + if inferior_python_version < (3, 0): + funcname = 'PyString_FromString' + else: + funcname = 'PyBytes_FromString' + + assert '"' not in string + + # ensure double quotes + code = '(PyObject *) %s("%s")' % (funcname, string) + return self.pyobject_fromcode(code, gdbvar=gdbvar) + + def alloc_unicodestring(self, string, gdbvar=None): + self.alloc_bytestring(string.encode('UTF-8'), gdbvar='_temp') + + postfix = libpython.get_inferior_unicode_postfix() + funcname = 'PyUnicode%s_FromEncodedObject' % (postfix,) + + return self.pyobject_fromcode( + '(PyObject *) %s($_temp, "UTF-8", "strict")' % funcname, + gdbvar=gdbvar) + + def test_bytestring(self): + bytestring = self.alloc_bytestring("spam") + + if inferior_python_version < (3, 0): + bytestring_class = libpython.PyStringObjectPtr + expected = repr("spam") + else: + bytestring_class = libpython.PyBytesObjectPtr + expected = "b'spam'" + + self.assertEqual(type(bytestring), bytestring_class) + self.assertEqual(self.get_repr(bytestring), expected) + + def test_unicode(self): + unicode_string = self.alloc_unicodestring(u"spam ἄλφα") + + expected = "'spam ἄλφα'" + if inferior_python_version < (3, 0): + expected = 'u' + expected + + self.assertEqual(type(unicode_string), libpython.PyUnicodeObjectPtr) + self.assertEqual(self.get_repr(unicode_string), expected) + + def test_int(self): + if inferior_python_version < (3, 0): + intval = self.pyobject_fromcode('PyInt_FromLong(100)') + self.assertEqual(type(intval), libpython.PyIntObjectPtr) + self.assertEqual(self.get_repr(intval), '100') + + def test_long(self): + longval = self.pyobject_fromcode('PyLong_FromLong(200)', + gdbvar='longval') + assert gdb.parse_and_eval('$longval->ob_type == &PyLong_Type') + + self.assertEqual(type(longval), libpython.PyLongObjectPtr) + self.assertEqual(self.get_repr(longval), '200') + + def test_frame_type(self): + frame = self.pyobject_fromcode('PyEval_GetFrame()') + + self.assertEqual(type(frame), libpython.PyFrameObjectPtr) + + \ No newline at end of file -- 2.26.2