| Index: third_party/cython/src/Cython/Debugger/Tests/test_libpython_in_gdb.py
|
| diff --git a/third_party/cython/src/Cython/Debugger/Tests/test_libpython_in_gdb.py b/third_party/cython/src/Cython/Debugger/Tests/test_libpython_in_gdb.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f6dc659b61849c434b2216c87ffb75625b657c42
|
| --- /dev/null
|
| +++ b/third_party/cython/src/Cython/Debugger/Tests/test_libpython_in_gdb.py
|
| @@ -0,0 +1,115 @@
|
| +# -*- 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_FromStringAndSize'
|
| + else:
|
| + funcname = 'PyBytes_FromStringAndSize'
|
| +
|
| + assert '"' not in string
|
| +
|
| + # ensure double quotes
|
| + code = '(PyObject *) %s("%s", %d)' % (funcname, string, len(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)
|
|
|