o
    fF                     @   s.  d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddl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 dge_dd ZG dd deZeeG dd de	jZG dd deZG dd de	jZG dd deZG dd deZ G dd de Z!G dd de Z"G dd deZ#G d d! d!eZ$G d"d# d#eZ%G d$d% d%eZ&d&Z'd'Z(G d(d) d)eZ)G d*d+ d+eZ*G d,d- d-eZ+G d.d/ d/eZ,G d0d1 d1eZ-G d2d3 d3eZ.ej/0d4Z1e1re2d5d6Z3d7d8 Z4d9d: Z5d;d< Z6d@d>d?Z7dS )Az
Tests that run inside GDB.

Note: debug information is already imported by the file generated by
Cython.Debugger.Cygdb.make_command_file()
    )absolute_importN   )	libcython)	libpython   )TestLibCython   )add_metaclassgdbc                    s   t   fdd}|S )Nc                    sJ   t t| j j z | g|R i |W S  ty$   t dt   w )NzAn exception occurred:)_debugtype__name__	Exception	traceback
format_exc)selfargskwargsfunc g/var/www/html/mig_web/myenv/lib/python3.10/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.pywrapper$   s   z(print_on_call_decorator.<locals>.wrapper)	functoolswraps)r   r   r   r   r   print_on_call_decorator#   s   	r   c                   @      e Zd Zdd ZdS )TraceMethodCallMetac                 C   s0   |  D ]\}}t|rt| |t| qd S N)itemsinspect
isfunctionsetattrr   )r   namebasesdict	func_namer   r   r   r   __init__2   s
   
zTraceMethodCallMeta.__init__N)r   
__module____qualname__r'   r   r   r   r   r   0       r   c                       sL   e Zd ZdZ fddZdddZdd Zdd	d
Zdd Zdd Z	  Z
S )DebugTestCasezf
    Base class for test cases. On teardown it kills the inferior and unsets
    all breakpoints.
    c                    sZ   t t| | tj| _tjjd | _tjjd \| _| _	tjj
d | _tjj
d | _d S )Ncodefilespamzcodefile.hamzcodefile.eggs)superr+   r'   r   cycython_namespacemodulefunctions_by_name	spam_func	spam_methfunctions_by_qualified_nameham_func	eggs_func)r   r#   	__class__r   r   r'   ?   s   
zDebugTestCase.__init__Nc                 C   s   t d| }|r||}|S )Nz$cy_cvalue("%s"))r
   parse_and_eval)r   varnamecast_toresultr   r   r   read_varI   s   zDebugTestCase.read_varc                 C   s   t jdddS )Nzinfo localsT	to_stringr
   executer   r   r   r   
local_infoP   s   zDebugTestCase.local_infoc                 C   s2   |d ur	t j| }t }| tj|| d S r   )test_libcythonsource_to_linenor
   selected_frameassertEqualr   cython_infolineno)r   source_linerJ   framer   r   r   lineno_equalsS   s   
zDebugTestCase.lineno_equalsc                 C   s.   t j| }tjd| dd tjddd d S )Nzcy break codefile:%dTr?   run)rE   rF   r
   rB   )r   rK   break_linenor   r   r   break_and_runY   s   
zDebugTestCase.break_and_runc                 C   sB   t jddd z	t jddd W n	 ty   Y nw t d d S )Nzdelete breakpointsTr?   zkill inferior 1zset args -c "import codefile")r
   rB   RuntimeErrorrC   r   r   r   tearDown^   s   zDebugTestCase.tearDownr   NN)r   r(   r)   __doc__r'   r>   rD   rM   rP   rR   __classcell__r   r   r8   r   r+   8   s    


r+   c                   @   $   e Zd Zdd Zdd Zdd ZdS )TestDebugInformationClassesc                 C   s.   |  | jjd d}t|| jjsJ dS )zDtest that debug information was parsed properly into data structuresr,   )c_var
python_varr   __builtins__rT   __file__N)rH   r1   r#   setissubsetglobals)r   global_varsr   r   r   test_CythonModulej   s   z-TestDebugInformationClasses.test_CythonModulec                 C   sJ   | j j}|d }|d }| |jtj | |jtj | |jd d S )NrX   rY   zcodefile.c_var)r1   r^   rH   r   r   CObjectPythonObjectqualified_name)r   module_globalsrX   rY   r   r   r   test_CythonVariableq   s   z/TestDebugInformationClasses.test_CythonVariablec                 C   s   |  | jjd |  | jjd |  | jj| j | jjs&J | j| jjf| jjr,J | jjr2J | jjr8J |  | jjt	j
 |  | jjt	j
 |  | jjdg |  | jjddh tjd }|  | jj| |  t| jjtd d S )Nzcodefile.spamzcodefile.SomeClass.spamaputssome_c_functiondef spam(a=0):abcd)rH   r3   rc   r4   r1   r7   pf_cnamer6   r   r   ra   	argumentsstep_into_functionsrE   rF   rJ   sortedlocalslist)r   expected_linenor   r   r   test_CythonFunctiony   s$   


z/TestDebugInformationClasses.test_CythonFunctionN)r   r(   r)   r`   re   rr   r   r   r   r   rW   h   s    rW   c                   @   r   )TestParametersc                 C   s0   t d tjjsJ t d tjjrJ d S )Nzset cy_colorize_code onzset cy_colorize_code off)r
   rB   r   
parameterscolorize_coderC   r   r   r   test_parameters   s   

zTestParameters.test_parametersN)r   r(   r)   rv   r   r   r   r   rs      r*   rs   c                   @   rV   )	TestBreakc                 C   sn   t t pd}td | t t |d  t d }| |jtj | jj|j	v s0J |j
s5J d S )Nr   cy break codefile.spamr   )lenr
   breakpointsrB   rH   r   BP_BREAKPOINTr3   cnamelocationenabled)r   breakpoint_amountbpr   r   r   
test_break   s   
zTestBreak.test_breakc                 C   s$   t d dt jdddv sJ d S )Nzcy break -p joinz	def join(cy runTr?   rA   rC   r   r   r   test_python_break   s   
zTestBreak.test_python_breakc                 C   sJ   d}d}|  | | | tjddd}| | | |s#J d S )Nz	import oszcdef int c_var = 12cy stepTr?   )rP   rM   r
   rB   rstripendswith)r   	beginlinenextlinestep_resultr   r   r   test_break_lineno   s   


zTestBreak.test_break_linenoN)r   r(   r)   r   r   r   r   r   r   r   rw      s    
rw   c                   @   s   e Zd ZdddZdS )DebugStepperTestCaseNc                 C   sB   t | j |D ]\}}| | |||   q| || d S r   )r
   rB   commandrH   r>   rD   rM   )r   varnames_and_valuesrK   rJ   r;   valuer   r   r   step   s   zDebugStepperTestCase.steprS   )r   r(   r)   r   r   r   r   r   r      s    r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TestStepzb
    Test stepping. Stepping happens in the code found in
    Cython/Debugger/Tests/codefile.
    c                 C   s   t d t jddd | d t jddd | d d| _| jdgd	d
 | jddgdd
 | jdgdd
 | jg dd
 t jddd | tt  d | t  d jd d S )Nrx   rN   Tr?   ri   r   zb = c = d = 0)br   zb = 1)rK   )r   r   )cr   c = 2)r   r   int(10)puts("spam")contr   r   )	r
   rB   rM   r   r   rH   rz   	inferiorspidrC   r   r   r   test_cython_step   s   


zTestStep.test_cython_stepc                 C   s0   |  d tjddd | t  d d S )Nsome_c_function()r   Tr?   rh   )rP   r
   rB   rH   rG   r#   rC   r   r   r   test_c_step   s   
zTestStep.test_c_stepc                 C   sp   |  d tjddd}t }| | d t| }|j	
t }| |d td|s6J |d S )Nos.path.join("foo", "bar")r   Tr?   PyEval_EvalFrameExjoinz\d+    def join\()rP   r
   rB   rG   rH   r#   r   Frameget_pyopco_nameproxyvalr\   rematch)r   r=   curframepyframe
frame_namer   r   r   test_python_step   s   
zTestStep.test_python_stepN)r   r(   r)   rT   r   r   r   r   r   r   r   r      s
    r   c                   @   r   )TestNextc                 C   s0   |  d d}|D ]}td | | q	d S )Nr   )r   r   r   r   zcy next)rP   r
   rB   rM   )r   linesliner   r   r   test_cython_next   s   

zTestNext.test_cython_nextN)r   r(   r)   r   r   r   r   r   r      r*   r   c                   @   s   e Zd Zdd Zdd ZdS )TestLocalsGlobalsc                 C   s4   |  d tjddd}	 	 d|v sJ t|d S )Nr   	cy localsTr?   za = 0zb = (int) 1zc = (int) 2rP   r
   rB   reprr   r=   r   r   r   test_locals  s
   
zTestLocalsGlobals.test_localsc                 C   s   |  d tjddd}d|v sJ t|d|v s J t|d|v s*J t|d|v s4J t|d	|v s>J t|d S )
Nr   z
cy globalsTr?   z	__name__ z__doc__ zos zc_var zpython_var r   r   r   r   r   test_globals  s   
zTestLocalsGlobals.test_globalsN)r   r(   r)   r   r   r   r   r   r   r     s    r   c                   @   r   )TestBacktracec                 C   sL   dt jj_| d dd }tjddd}|| tjddd}|| d S )	NFr   c                 S   s(   t d| s
J | d| v sJ | d S )Nz-\#\d+ *0x.* in spam\(\) at .*codefile\.pyx:22r   )r   search)r=   r   r   r   match_backtrace_output"  s   z<TestBacktrace.test_backtrace.<locals>.match_backtrace_outputzcy btTr?   zcy bt -a)r   rt   ru   r   rP   r
   rB   )r   r   r=   r   r   r   test_backtrace  s   

zTestBacktrace.test_backtraceN)r   r(   r)   r   r   r   r   r   r     r*   r   c                   @   r   )TestFunctionsc                 C   sz   |  d tjddd}td|sJ |tjddd}tjd }t||v s.J ||ftjddd}d|v s;J d S )	Nr   zprint $cy_cname("b")Tr?   z	__pyx_.*bzprint $cy_lineno()zprint $cy_cvalue("b")z= 1)rP   r
   rB   r   r   rE   rF   str)r   r=   supposed_linenor   r   r   test_functions3  s   

zTestFunctions.test_functionsN)r   r(   r)   r   r   r   r   r   r   1  r*   r   c                   @   r   )	TestPrintc                 C   s\   |  d tjddd}| d| tjddd}| d| tjddd}| d	| d S )
Nr   z
cy print bTr?   zb = (int) 1
zcy print python_varzpython_var = 13
zcy print c_varzc_var = (int) 12
)rP   r
   rB   rH   r   r   r   r   
test_printB  s   
zTestPrint.test_printN)r   r(   r)   r   r   r   r   r   r   @  r*   r   z    14            int b, c
    15
    16        b = c = d = 0
    17
    18        b = 1
>   19        c = 2
    20        int(10)
    21        puts("spam")
    22        os.path.join("foo", "bar")
    23        some_c_function()
z     5        void some_c_function()
     6
     7    import os
     8
     9    cdef int c_var = 12
>   10    python_var = 13
    11
    12    def spam(a=0):
    13        cdef:
    14            int b, c
c                   @   rV   )TestListc                 C   sP   d}t dD ]}t|dk rt|dkr|d7 }||d 7 }q|d d }d S )N 

   r   z    ry   )$correct_result_test_list_inside_funcsplitrz   )r   correct_result_wrong_whitespacecorrect_resultr   r   r   r   #workaround_for_coding_style_checkerf  s   z,TestList.workaround_for_coding_style_checkerc                 C   B   |  d tjddd}ddd |dD }| t| d S )Nr   cy listTr?   r   c                 S      g | ]}|  qS r   r   .0r   r   r   r   
<listcomp>s      z2TestList.test_list_inside_func.<locals>.<listcomp>)rP   r
   rB   r   r   rH   r   r   r   r   r   test_list_inside_funcn     
zTestList.test_list_inside_funcc                 C   r   )Nzpython_var = 13r   Tr?   r   c                 S   r   r   r   r   r   r   r   r   {  r   z3TestList.test_list_outside_func.<locals>.<listcomp>)rP   r
   rB   r   r   rH   %correct_result_test_list_outside_funcr   r   r   r   test_list_outside_funcv  r   zTestList.test_list_outside_funcN)r   r(   r)   r   r   r   r   r   r   r   r   e  s    r   c                   @   r   )
TestUpDownc                 C   sN   |  d td | ttjd tjddd}d|v sJ d|v s%J d S )Nr   r   zcy downzcy upTr?   zspam())rP   r
   rB   assertRaisesrQ   r   r   r   r   test_updown  s   

zTestUpDown.test_updownN)r   r(   r)   r   r   r   r   r   r     r*   r   c                       s@   e Zd Z fddZ fddZdd Zdd Zd	d
 Z  ZS )TestExecc                    s2   t t|   t \| _| _t| jd| _	d S )Nzr+)
r.   r   setUptempfilemkstempfdtmpfilenameosfdopentmpfilerC   r8   r   r   r     s   zTestExec.setUpc              	      s:   t t|   z| j  W t| j d S t| j w r   )r.   r   rR   r   closer   remover   rC   r8   r   r   rR     s   zTestExec.tearDownc                 C   s"   t d| j|f  | j  S )Nz$cy exec open(%r, "w").write(str(%s)))r
   rB   r   r   readstrip)r   r   r   r   r   eval_command  s   zTestExec.eval_commandc                 C   s    |  d | d| d d S )Nr   z[0]z[a])
rP   rH   r   r
   rB   textwrapdedentr   r   r   r   r   r   r   test_cython_exec  s   
zTestExec.test_cython_execc                 C   s4   |  d td td | d| d d S )Nr   r   zcy exec some_random_var = 1414some_random_var)rP   r
   rB   rH   r   rC   r   r   r   test_python_exec  s   


zTestExec.test_python_exec)	r   r(   r)   r   rR   r   r   r   rU   r   r   r8   r   r     s    r   c                   @   r   )CySetc                 C   s2   |  d td | jdtd}| |d d S )Nr   z!cy set a = $cy_eval("{None: []}")rf   )r<   z
{None: []})rP   r
   rB   r>   r   rH   )r   stringvaluer   r   r   
test_cyset  s   

zCySet.test_cysetN)r   r(   r)   r   r   r   r   r   r     r*   r   c                   @   s   e Zd ZdZdd ZdS )
TestCyEvalz!Test the $cy_eval() gdb function.c                 C   sR   |  d tjddd}td|sJ |tjddd}td|s'J |d S )Nr   zprint $cy_eval("None")Tr?   z\$\d+ = None\nzprint $cy_eval("[a]")z\$\d+ = \[0\])rP   r
   rB   r   r   r   r   r   r   test_cy_eval  s
   
zTestCyEval.test_cy_evalN)r   r(   r)   rT   r   r   r   r   r   r     s    r   c                   @   rV   )TestClosurec                 C   s   t d|  t d d S )Nz	cy break r   rA   )r   funcnamer   r   r   break_and_run_func  s   zTestClosure.break_and_run_funcc                 C   sb   |  d | dtjddd td | t| dd tjd	dd }| |d
 d S )Ninnerr   r   Tr?   r   rf   z'an object'
cy print aa = 'an object')r   rH   r
   rB   r   r>   r   r   print_resultr   r   r   
test_inner  s   

zTestClosure.test_innerc                 C   sl   |  d | dtjddd td | dtjddd td tjddd }| |d d S )	Nouterr   r   Tr?   r   r   r   )r   rH   r
   rB   r   r   r   r   r   
test_outer  s   


zTestClosure.test_outerN)r   r(   r)   r   r   r   r   r   r   r   r     s    r   	GDB_DEBUGz/dev/ttywc                  G   sD   t r ttdjjdg| } td	dd | D d  d S d S )Nr   : c                 s   s    | ]}t |V  qd S r   )r   )r   msgr   r   r   	<genexpr>  s    z_debug.<locals>.<genexpr>r   )
	_do_debug	itertoolschainsys	_getframef_coder   _debug_filewriter   )messagesr   r   r   r     s   "r   c                    s   zt d W n ty   d}t| td Y d S w t| dgd}t	|tj
}t  t fdd|D }tjdd|}| S )	NPyModuleObjectzUnable to run tests, Python was not compiled with debugging information. Either compile python with -g or get a debug build (configure with --with-pydebug).r   r   )fromlistc                    s   g | ]	\}}  |qS r   )loadTestsFromTestCase)r   r#   clstest_loaderr   r   r     s    z*run_unittest_in_module.<locals>.<listcomp>)	verbosity)r
   lookup_typerQ   warningswarnr   _exit
__import__r    
getmembersisclassunittest
TestLoader	TestSuiteTextTestRunnerrN   wasSuccessful)
modulenamer   mtestssuiter=   r   r  r   run_unittest_in_module  s   
r!  c                  C   s8   ddl m}  tt}t| j}|r|std dS dS )z~
    Run the libcython and libpython tests. Ensure that an appropriate status is
    returned to the parent test process.
    r   )test_libpython_in_gdbr   N)Cython.Debugger.Testsr"  r!  r   r  exit)r"  success_libcythonsuccess_libpythonr   r   r   runtests  s   
r'  Fc                 C   s<   | a |rtjddtjtjtjgd}|t d S t  d S )NFT)counttraceoutfile
ignoredirs)	inferior_python_versionr)  Tracer  stderrprefixexec_prefixrunfuncr'  )version
trace_codetracerr   r   r   main  s   

r5  )F)8rT   
__future__r   r   r   r  r)  r    r  r  r   r   r   r   r  r
   r   r   r   r   rE   Utilsr	   argvr   r   r   TestCaser+   rW   rs   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   environgetr  openr  r   r!  r'  r5  r   r   r   r   <module>   sb    /(	$
..

