o
    NiJ                     @   s2  d 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Zddl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G dd de	jedZG dd de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./d4Z0e0re1d5d6Z2d7d8 Z3d9d: Z4d;d< Z5d@d>d?Z6dS )Az
Tests that run inside GDB.

Note: debug information is already imported by the file generated by
Cython.Debugger.Cygdb.make_command_file()
    N   )	libcython)	libpython   )TestLibCython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 _/home/ubuntu/.local/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                    sV   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   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_varH   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_infoO   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_linerG   framer   r   r   lineno_equalsR   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)rB   rC   r   r?   )r   rH   break_linenor   r   r   break_and_runX   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   r?   RuntimeErrorr@   r   r   r   tearDown]   s   zDebugTestCase.tearDownr   NN)r
   r%   r&   __doc__r$   r;   rA   rJ   rM   rO   __classcell__r   r   r5   r   r(   8   s    


r(   )	metaclassc                   @   $   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__rQ   __file__N)rE   r.   r    setissubsetglobals)r   global_varsr   r   r   test_CythonModulei   s   z-TestDebugInformationClasses.test_CythonModulec                 C   sJ   | j j}|d }|d }| |jtj | |jtj | |jd d S )NrV   rW   zcodefile.c_var)r.   r\   rE   r	   r   CObjectPythonObjectqualified_name)r   module_globalsrV   rW   r   r   r   test_CythonVariablep   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)rE   r0   ra   r1   r.   r4   pf_cnamer3   r	   r   r_   	argumentsstep_into_functionsrB   rC   rG   sortedlocalslist)r   expected_linenor   r   r   test_CythonFunctionx   s$   


z/TestDebugInformationClasses.test_CythonFunctionN)r
   r%   r&   r^   rc   rp   r   r   r   r   rU   g   s    rU   c                   @      e Zd Zdd Zdd ZdS )TestReprMethodsc                    sj   t j}tt|j}td  fddt|D }|| }t	dt
| }| t|t| d S )Nr   c                 3   s    | ]}  d V  qdS )   N)	randbytes).0_lorem_ipsumr   r   	<genexpr>   s    z3TestReprMethods.test_simple_repr.<locals>.<genexpr>z
libcython.)r   CythonModulelenr   	signature
parametersrandomRandomrangeevalreprrE   pickledumps)r   
test_classnum_argsfiller_argsinstance	recreatedr   rw   r   test_simple_repr   s   
z TestReprMethods.test_simple_reprc                 C   s2   d}|  | t }| t|t| d S )N	import os)rM   r   rD   rE   r   
frame_repr)r   	beginlinerI   r   r   r   test_frame_repr   s   
zTestReprMethods.test_frame_reprN)r
   r%   r&   r   r   r   r   r   r   rr      s    	rr   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   r?   r   r}   colorize_coder@   r   r   r   test_parameters   s   

zTestParameters.test_parametersN)r
   r%   r&   r   r   r   r   r   r      r'   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	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   )r{   r   breakpointsr?   rE   r	   BP_BREAKPOINTr0   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<   r>   r@   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 )Nr   zcdef int c_var = 12cy stepTr<   )rM   rJ   r   r?   rstripendswith)r   r   nextlinestep_resultr   r   r   test_break_lineno   s   


zTestBreak.test_break_linenoc                 C   sD   t jjj}| d|dd | d|dd  | d|dd  d S )Nr*   zcodefile.SomeClass.sszcodefile.SomeClass.pamz
codefile.s)r   r,   break_completeassertIn)r   	completerr   r   r   test_break_completion   s   
zTestBreak.test_break_completionN)r
   r%   r&   r   r   r   r   r   r   r   r   r      s
    

r   c                   @   s   e Zd ZdddZdS )DebugStepperTestCaseNc                 C   sB   t | j |D ]\}}| | |||   q| || d S r   )r   r?   commandrE   r;   rA   rJ   )r   varnames_and_valuesrH   rG   r8   valuer   r   r   step   s   zDebugStepperTestCase.steprP   )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 )Nr   rK   Tr<   rg   r   zb = c = d = 0)br   zb = 1)rH   )r   r   )cr   c = 2)r   r   int(10)puts("spam")contr   r   )	r   r?   rJ   r   r   rE   r{   	inferiorspidr@   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<   rf   )rM   r   r?   rE   rD   r    r@   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\()rM   r   r?   rD   rE   r    r   Frameget_pyopco_nameproxyvalrZ   rematch)r   r:   curframepyframe
frame_namer   r   r   test_python_step   s   
zTestStep.test_python_stepN)r
   r%   r&   rQ   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)rM   r   r?   rJ   )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                   @   rq   )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rM   r   r?   r   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   r}   r   r   rM   r   r?   )r   r   r:   r   r   r   test_backtrace7  s   

zTestBacktrace.test_backtraceN)r
   r%   r&   r   r   r   r   r   r   5  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)rM   r   r?   r   r   rB   rC   str)r   r:   supposed_linenor   r   r   test_functionsM  s   

zTestFunctions.test_functionsN)r
   r%   r&   r   r   r   r   r   r   K  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
)rM   r   r?   rE   r   r   r   r   
test_print\  s   
zTestPrint.test_printN)r
   r%   r&   r   r   r   r   r   r   Z  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                   @   rT   )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    r   )$correct_result_test_list_inside_funcsplitr{   )r   correct_result_wrong_whitespacecorrect_resultr   r   r   r   #workaround_for_coding_style_checker  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   ru   r   r   r   r   
<listcomp>      z2TestList.test_list_inside_func.<locals>.<listcomp>)rM   r   r?   r   r   rE   r   r   r   r   r   test_list_inside_func     
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>)rM   r   r?   r   r   rE   %correct_result_test_list_outside_funcr   r   r   r   test_list_outside_func  r   zTestList.test_list_outside_funcN)r
   r%   r&   r   r   r   r   r   r   r   r     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())rM   r   r?   assertRaisesrN   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                    s.   t    t \| _| _t| jd| _d S )Nzr+)	r+   setUptempfilemkstempfdtmpfilenameosfdopentmpfiler@   r5   r   r   r     s   
zTestExec.setUpc              	      s6   t    z| j  W t| j d S t| j w r   )r+   rO   r   closer   remover   r@   r5   r   r   rO     s   
zTestExec.tearDownc                 C   s"   t d| j|f  | j  S )Nz$cy exec open(%r, "w").write(str(%s)))r   r?   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])
rM   rE   r  r   r?   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)rM   r   r?   rE   r  r@   r   r   r   test_python_exec  s   


zTestExec.test_python_exec)	r
   r%   r&   r   rO   r  r  r  rR   r   r   r5   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: []}")rd   )r9   z
{None: []})rM   r   r?   r;   r   rE   )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\])rM   r   r?   r   r   r   r   r   r   test_cy_eval  s
   
zTestCyEval.test_cy_evalN)r
   r%   r&   rQ   r  r   r   r   r   r    s    r  c                   @   rT   )TestClosurec                 C   s   t d|  t d d S )Nz	cy break r   r>   )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   rd   z'an object'
cy print aa = 'an object')r  rE   r   r?   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  rE   r   r?   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   )ru   msgr   r   r   ry     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   t t jdsd}t| td d S t| dgd}t	
|t	j}t  t fdd|D }tjdd|}| S )	Nsymbol_filezUnable 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)ru   r    clstest_loaderr   r   r   &  s    z*run_unittest_in_module.<locals>.<listcomp>)	verbosity)hasattrr   selected_inferior	progspacewarningswarnr   _exit
__import__r   
getmembersisclassunittest
TestLoader	TestSuiteTextTestRunnerrK   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.TestsrA  r@  r
   r!  exit)rA  success_libcythonsuccess_libpythonr   r   r   runtests+  s   
rF  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_versionrH  Tracer!  stderrprefixexec_prefixrunfuncrF  )version
trace_codetracerr   r   r   main8  s   

rT  )F)7rQ   r   r   r!  rH  r   r~   r   r1  r7  r  r   r   r   r  r   r   r   r   r   rB   argvr   r	   r   TestCaser(   rU   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	  r  r  environgetr  openr$  r   r@  rF  rT  r   r   r   r   <module>   sb    /(	*
..

