o
    f                     @   sR   d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ G dd	 d	ejZ	dS )
z
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()
    N)	libcython)	libpython   )test_libcython_in_gdb)inferior_python_versionc                       sv   e Zd ZdZ fddZdd ZdddZd	d
 ZdddZdddZ	dd Z
dd Zdd Zdd Zdd Z  ZS )TestPrettyPrintersa  
    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.
    c                    s   t t|   | d d S )Nzb = c = d = 0)superr   setUpbreak_and_run)self	__class__ g/var/www/html/mig_web/myenv/lib/python3.10/site-packages/Cython/Debugger/Tests/test_libpython_in_gdb.pyr	      s   zTestPrettyPrinters.setUpc                 C   s    t |}t|dksJ |S )Nr   )gdbparse_and_evalr   pointervalue)r   codevaluer   r   r   get_pyobject"   s   
zTestPrettyPrinters.get_pyobjectNc                 C   s:   |d ur||d}t d|  d| }tj| |S )N)varnamer   zset $%(varname)s = %(code)s$)r   executer   PyObjectPtrfrom_pyobject_ptrr   )r   r   gdbvardr   r   r   pyobject_fromcode'   s
   
z$TestPrettyPrinters.pyobject_fromcodec                 C   s   | tjS N)get_truncated_reprr   MAX_OUTPUT_LEN)r   pyobjectr   r   r   get_repr/   s   zTestPrettyPrinters.get_reprc                 C   sD   t dk rd}nd}d|vsJ d||dt|f }| j||dS )N   r   PyString_FromStringAndSizePyBytes_FromStringAndSize   "z(PyObject *) %s("%s", %d)	iso8859-1r   )r   decodelenr   )r   stringr   funcnamer   r   r   r   alloc_bytestring2   s   z#TestPrettyPrinters.alloc_bytestringc                 C   sN   t  }d|f }|dd}| jd||ddddt|f |d	S )
NzPyUnicode%s_DecodeUnicodeEscapeunicode_escaper(   z#(PyObject *) %s("%s", %d, "strict")"z\"\z\\r)   )r   get_inferior_unicode_postfixencoder*   r   replacer+   )r   r,   r   postfixr-   datar   r   r   alloc_unicodestring>   s   
z&TestPrettyPrinters.alloc_unicodestringc                 C   sR   |  d}tdk rtj}td}ntj}d}| t|| | | || d S )Ns   spamr#   zb'spam')	r.   r   r   PyStringObjectPtrreprPyBytesObjectPtrassertEqualtyper"   )r   
bytestringbytestring_classexpectedr   r   r   test_bytestringH   s   

z"TestPrettyPrinters.test_bytestringc                 C   sF   |  d}d}tdk rd| }| t|tj | | || d S )Nu   spam ἄλφαu   'spam ἄλφα'r#   u)r7   r   r;   r<   r   PyUnicodeObjectPtrr"   )r   unicode_stringr?   r   r   r   test_unicodeU   s   
zTestPrettyPrinters.test_unicodec                 C   s>   t dk r| d}| t|tj | | |d d S d S )Nr#   zPyInt_FromLong(100)100)r   r   r;   r<   r   PyIntObjectPtrr"   )r   intvalr   r   r   test_int_   s
   
zTestPrettyPrinters.test_intc                 C   sD   | j ddd}tdsJ | t|tj | | |d d S )NzPyLong_FromLong(200)longvalr)   z!$longval->ob_type == &PyLong_Type200)r   r   r   r;   r<   r   PyLongObjectPtrr"   )r   rI   r   r   r   	test_longe   s   zTestPrettyPrinters.test_longc                 C   s    |  d}| t|tj d S )NzPyEval_GetFrame())r   r;   r<   r   PyFrameObjectPtr)r   framer   r   r   test_frame_typem   s   
z"TestPrettyPrinters.test_frame_typer   )__name__
__module____qualname____doc__r	   r   r   r"   r.   r7   r@   rD   rH   rL   rO   __classcell__r   r   r   r   r      s    




r   )
rS   r   Cython.Debuggerr   r    r   r   DebugTestCaser   r   r   r   r   <module>   s   