
    Ae=                        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 Z G d de      Z ee       G d de	j6                               Z G d de      Z G d de	j6                        Z G d de      Z G d de      Z  G d de      Z! G d de!      Z" G d de!      Z# G d d e      Z$ G d! d"e      Z% G d# d$e      Z& G d% d&e      Z' G d' d(e      Z( G d) d*e      Z) G d+ d,e      Z* G d- d.e      Z+ G d/ d0e      Z,ejZ                  j]                  d1      Z/e/r	 e0d2d3      Z1d4 Z2d5 Z3d6 Z4d8d7Z5y)9z
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                 B     t        j                          fd       }|S )Nc                     t        t        |       j                  j                         	  | g|i |S # t        $ r  t        dt	        j
                                 w xY w)NzAn exception occurred:)_debugtype__name__	Exception	traceback
format_exc)selfargskwargsfuncs      Klib/python3.12/site-packages/Cython/Debugger/Tests/test_libcython_in_gdb.pywrapperz(print_on_call_decorator.<locals>.wrapper$   s[    tDz""DMM2	.t.v.. 	+Y-A-A-CD	s	   8 )A!)	functoolswraps)r   r   s   ` r   print_on_call_decoratorr   #   s%    __T  N    c                       e Zd Zd Zy)TraceMethodCallMetac                     |j                         D ]1  \  }}t        j                  |      st        | |t	        |             3 y N)itemsinspect
isfunctionsetattrr   )r   namebasesdict	func_namer   s         r   __init__zTraceMethodCallMeta.__init__2   s=    #zz| 	HOIt!!$'i)@)FG	Hr   N)r   
__module____qualname__r*    r   r   r   r   0   s    Hr   r   c                   D     e Zd ZdZ fdZddZd Zd	dZd Zd Z	 xZ
S )
DebugTestCasezf
    Base class for test cases. On teardown it kills the inferior and unsets
    all breakpoints.
    c                 v   t         t        |   |       t        j                  | _        t        j                  j
                  d   | _        t        j                  j                  d   \  | _        | _	        t        j                  j                  d   | _        t        j                  j                  d   | _        y )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__s     r   r*   zDebugTestCase.__init__?   s    mT+D1,,ll33J?)2)G)G)O&!@@"AAr   c                 J    t        j                  d|z        }|r ||      }|S )Nz$cy_cvalue("%s"))r   parse_and_eval)r   varnamecast_toresults       r   read_varzDebugTestCase.read_varI   s)    ##$6$@AV_Fr   c                 0    t        j                  dd      S )Nzinfo localsT	to_stringr   executer   s    r   
local_infozDebugTestCase.local_infoP   s    {{=D99r   c                     |t         j                  |   }t        j                         }| j	                  t
        j                  j                  |      |       y r!   )test_libcythonsource_to_linenor   selected_frameassertEqualr   cython_infolineno)r   source_linerQ   frames       r   lineno_equalszDebugTestCase.lineno_equalsS   sG    "#44[AF""$..55e<fEr   c                     t         j                  |   }t        j                  d|z  d       t        j                  dd       y )Nzcy break codefile:%dTrE   run)rL   rM   r   rH   )r   rR   break_linenos      r   break_and_runzDebugTestCase.break_and_runY   s4    %66{C*\9TJET*r   c                     t        j                  dd       	 t        j                  dd       t        j                  d       y # t        $ r Y !w xY w)Nzdelete breakpointsTrE   zkill inferior 1zset args -c "import codefile")r   rH   RuntimeErrorrI   s    r   tearDownzDebugTestCase.tearDown^   sH    (D9	KK)T: 	34  		s   A 	AAr!   NN)r   r+   r,   __doc__r*   rC   rJ   rT   rX   r[   __classcell__r=   s   @r   r/   r/   8   s'    
:F+
5r   r/   c                       e Zd Zd Zd Zd Zy)TestDebugInformationClassesc                     | j                  | j                  j                  d       d}t        |      j	                  | j                  j
                        sJ y)zDtest that debug information was parsed properly into data structuresr1   )c_var
python_varr   __builtins__r]   __file__N)rO   r6   r&   setissubsetglobals)r   global_varss     r   test_CythonModulez-TestDebugInformationClasses.test_CythonModulej   sF    )):6>;(()<)<===r   c                 $   | j                   j                  }|d   }|d   }| j                  |j                  t        j
                         | j                  |j                  t        j                         | j                  |j                  d       y )Nrc   rd   zcodefile.c_var)r6   ri   rO   r   r   CObjectPythonObjectqualified_name)r   module_globalsrc   rd   s       r   test_CythonVariablez/TestDebugInformationClasses.test_CythonVariableq   sp    ,,w'#L1
Y%6%67)*@*@A--/?@r   c                 h   | j                  | j                  j                  d       | j                  | j                  j                  d       | j                  | j                  j                  | j                         | j
                  j                  s'J | j
                  | j
                  j                  f       | j                  j                  rJ | j                  j                  rJ | j                  j                  rJ | j                  | j                  j                  t        j                         | j                  | j                  j                  t        j                         | j                  | j                  j                  dg       | j                  | j                  j                  t        ddg             t        j                  d   }| j                  | j                  j                   |       | j                  t#        | j                  j$                        t'        d             y )Nzcodefile.spamzcodefile.SomeClass.spamaputssome_c_functiondef spam(a=0):abcd)rO   r8   ro   r9   r6   r<   pf_cnamer;   r   r   rm   	argumentsstep_into_functionsrg   rL   rM   rQ   sortedlocalslist)r   expected_linenos     r   test_CythonFunctionz/TestDebugInformationClasses.test_CythonFunctiony   s   66H662	4..<~~&&Q9P9P(QQ==)))>>***>>***,,i.?.?@++Y->->?11C59;;f&789	; )99:JK..@ 5 56VEr   N)r   r+   r,   rk   rq   r   r-   r   r   ra   ra   h   s    >AFr   ra   c                       e Zd Zd Zy)TestParametersc                     t        j                  d       t        j                  j                  sJ t        j                  d       t        j                  j                  rJ y )Nzset cy_colorize_code onzset cy_colorize_code off)r   rH   r   
parameterscolorize_coderI   s    r   test_parameterszTestParameters.test_parameters   sC    -.##111./''5555r   N)r   r+   r,   r   r-   r   r   r   r      s    6r   r   c                       e Zd Zd Zd Zd Zy)	TestBreakc                    t        t        j                         xs d      }t        j                  d       | j	                  t        t        j                               |dz          t        j                         d   }| j	                  |j
                  t        j                         | j                  j                  |j                  v sJ |j                  sJ y )Nr-   cy break codefile.spamr   )lenr   breakpointsrH   rO   r   BP_BREAKPOINTr8   cnamelocationenabled)r   breakpoint_amountbps      r   
test_breakzTestBreak.test_break   s     1 7R8,-S__./1BQ1FG__r"#"3"34~~##r{{22zzzr   c                 d    t        j                  d       dt        j                  dd      v sJ y )Nzcy break -p joinz	def join(cy runTrE   rG   rI   s    r   test_python_breakzTestBreak.test_python_break   s(    &'ckk(dCCCCr   c                     d}d}| j                  |       | j                  |       t        j                  dd      }| j                  |       |j	                         j                  |      sJ y )Nz	import oszcdef int c_var = 12cy stepTrE   )rX   rT   r   rH   rstripendswith)r   	beginlinenextlinestep_results       r   test_break_linenozTestBreak.test_break_lineno   sc    	(9%9%kk)t<8$!!#,,X666r   N)r   r+   r,   r   r   r   r-   r   r   r   r      s    D7r   r   c                       e Zd Zd Zy)
TestKilledc                     t        j                  d       t        j                  dd      }d|j                         v sJ y )Nz#set args -c 'import os; os.abort()'r   TrE   abort)r   rH   lower)r   outputs     r   
test_abortzTestKilled.test_abort   s3    9:X6&,,.(((r   N)r   r+   r,   r   r-   r   r   r   r      s    )r   r   c                       e Zd ZddZy)DebugStepperTestCaseNc                     t        j                  | j                         |D ]5  \  }}| j                  | j	                  |      || j                                7 | j                  ||       y r!   )r   rH   commandrO   rC   rJ   rT   )r   varnames_and_valuesrR   rQ   r@   values         r   stepzDebugStepperTestCase.step   s[    DLL!1 	ONGUT]]73UDOO<MN	O 	;/r   r\   )r   r+   r,   r   r-   r   r   r   r      s    0r   r   c                   "    e Zd ZdZd Zd Zd Zy)TestStepzb
    Test stepping. Stepping happens in the code found in
    Cython/Debugger/Tests/codefile.
    c                 f   t        j                  d       t        j                  dd       | j                  d       t        j                  dd       | j                  d       d| _        | j	                  dgd	
       | j	                  ddgd
       | j	                  dgd
       | j	                  g d
       t        j                  dd       | j                  t        t        j                               d       | j                  t        j                         d   j                  d       y )Nr   rV   TrE   rv   r   zb = c = d = 0)br   zb = 1)rR   )r   r   )cr   c = 2)r   r   int(10)puts("spam")contr   r   )	r   rH   rT   r   r   rO   r   	inferiorspidrI   s    r   test_cython_stepzTestStep.test_cython_step   s    ,-ET*+,I.?+ 		8*'	2		8X&G	<		8*)	4		".	1Fd+S]]_-q1+//3r   c                     | j                  d       t        j                  dd       | j                  t        j                         j                         d       y )Nsome_c_function()r   TrE   ru   )rX   r   rH   rO   rN   r&   rI   s    r   test_c_stepzTestStep.test_c_step   sB    ./I.++-2246GHr   c                    | j                  d       t        j                  dd      }t        j                         }| j	                  |j                         d       t        j                  |      j                         }|j                  j                  t                     }| j	                  |d       t        j                  d|      sJ |       y )Nos.path.join("foo", "bar")r   TrE   PyEval_EvalFrameExjoinz\d+    def join\()rX   r   rH   rN   rO   r&   r   Frameget_pyopco_nameproxyvalrg   rematch)r   rB   curframepyframe
frame_names        r   test_python_stepzTestStep.test_python_step   s    78Y$7%%'*>?//(+446 __--ce4
V,xx,f5=v=5r   N)r   r+   r,   r]   r   r   r   r-   r   r   r   r      s    
4&I
>r   r   c                       e Zd Zd Zy)TestNextc                     | j                  d       d}|D ](  }t        j                  d       | j                  |       * y )Nr   )r   r   r   r   zcy next)rX   r   rH   rT   )r   lineslines      r   test_cython_nextzTestNext.test_cython_next   sB    7#
  	%DKK	"t$	%r   N)r   r+   r,   r   r-   r   r   r   r      s    %r   r   c                       e Zd Zd Zd Zy)TestLocalsGlobalsc                     | j                  d       t        j                  dd      }	 	 d|v sJ t        |             y )Nr   	cy localsTrE   zc = (int) 2rX   r   rH   reprr   rB   s     r   test_localszTestLocalsGlobals.test_locals  s=    9%[D9&4V4&r   c                    | j                  d       t        j                  dd      }d|v sJ t        |             d|v sJ t        |             d|v sJ t        |             d|v sJ t        |             d	|v sJ t        |             y )
Nr   z
cy globalsTrE   z	__name__ z__doc__ zos zc_var zpython_var r   r   s     r   test_globalszTestLocalsGlobals.test_globals  s    9%\T:f$2d6l2V#1T&\1,V,6!/4</&4V4&r   N)r   r+   r,   r   r   r-   r   r   r   r     s    55r   r   c                       e Zd Zd Zy)TestBacktracec                     dt         j                  j                  _        | j	                  d       d }t        j                  dd      } ||       t        j                  dd      } ||       y )NFr   c                 T    t        j                  d|       sJ |        d| v sJ |        y )Nz-\#\d+ *0x.* in spam\(\) at .*codefile\.pyx:22r   )r   search)rB   s    r   match_backtrace_outputz<TestBacktrace.test_backtrace.<locals>.match_backtrace_output!  s4    99M#% -&,-/69A6A9r   zcy btTrE   zcy bt -a)r   r   r   r   rX   r   rH   )r   r   rB   s      r   test_backtracezTestBacktrace.test_backtrace  s]    38	**078	B
 W5v&Z48v&r   N)r   r+   r,   r   r-   r   r   r   r     s    'r   r   c                       e Zd Zd Zy)TestFunctionsc                 H   | j                  d       t        j                  dd      }t        j                  d|      sJ |       t        j                  dd      }t
        j                  d   }t        |      |v s	J ||f       t        j                  dd      }d|v sJ y )	Nr   zprint $cy_cname("b")TrE   z	__pyx_.*bzprint $cy_lineno()zprint $cy_cvalue("b")z= 1)rX   r   rH   r   r   rL   rM   str)r   rB   supposed_linenos      r   test_functionszTestFunctions.test_functions2  s    7#3tDyyf-5v51TB(99'B?#v-H/HH4Er   N)r   r+   r,   r   r-   r   r   r   r   0  s    
r   r   c                       e Zd Zd Zy)	TestPrintc                 x    | j                  d       t        j                  dd      }| j                  d|       y )Nr   z
cy print bTrE   zb = (int) 1
)rX   r   rH   rO   r   s     r   
test_printzTestPrint.test_printA  s0    7#\T:&1r   N)r   r+   r,   r   r-   r   r   r   r   ?  s    2r   r   c                       e Zd Zd Zy)
TestUpDownc                     | j                  d       t        j                  d       | j                  t        t        j                  d       t        j                  dd      }d|v sJ d|v sJ y )Nr   r   zcy downzcy upTrE   zspam())rX   r   rH   assertRaisesrZ   r   s     r   test_updownzTestUpDown.test_updownI  s\    78I,Y?W56!!+v555r   N)r   r+   r,   r   r-   r   r   r   r   G  s    6r   r   c                   :     e Zd Z fdZ fdZd Zd Zd Z xZS )TestExecc                     t         t        |           t        j                         \  | _        | _        t        j                  | j
                  d      | _	        y )Nzr+)
r3   r   setUptempfilemkstempfdtmpfilenameosfdopentmpfiler   r=   s    r   r   zTestExec.setUpU  s>    h#%$,$4$4$6!!yy$/r   c                     t         t        |           	 | j                  j	                          t        j                  | j                         y # t        j                  | j                         w xY wr!   )r3   r   r[   r   closer   remover   r   s    r   r[   zTestExec.tearDownZ  sJ    h&(	(LL IId&&'BIId&&'s   A !A0c                     t        j                  d| j                  d|d       | j                  j	                         j                         S )Nzcy exec open(z, "w").write(str(z)))r   rH   r   r   readstrip)r   r   s     r   eval_commandzTestExec.eval_commandb  s<    151A1A7L 	M||  "((**r   c                 ,   | j                  d       | j                  d| j                  d             t        j                  t        j                  d            }| j                  j                         j                         }| j                  d|       y )Nr   z[0]z[a]zX            cy exec
            pass

            "nothing"
            end
             )
rX   rO   r  r   rH   textwrapdedentr   r   r   r   s     r   test_cython_execzTestExec.test_cython_execg  s{    78 	 1 1% 89 X__ .   ""$++-V$r   c                     | j                  d       t        j                  d       t        j                  d       | j                  d| j	                  d             y )Nr   r   zcy exec some_random_var = 1414some_random_var)rX   r   rH   rO   r  rI   s    r   test_python_execzTestExec.test_python_execx  sF    78I23t001BCDr   )	r   r+   r,   r   r[   r  r  r  r^   r_   s   @r   r   r   S  s    0
(+
%"Er   r   c                       e Zd Zd Zy)CySetc                     | j                  d       t        j                  d       | j                  dt              }| j                  |d       y )Nr   z!cy set a = $cy_eval("{None: []}")rs   )rA   z
{None: []})rX   r   rH   rC   r   rO   )r   stringvalues     r   
test_cysetzCySet.test_cyset  s@    7878mmCm5l3r   N)r   r+   r,   r  r-   r   r   r  r    s    4r   r  c                       e Zd ZdZd Zy)
TestCyEvalz!Test the $cy_eval() gdb function.c                     | j                  d       t        j                  dd      }t        j                  d|      sJ |       t        j                  dd      }t        j                  d|      sJ |       y )Nr   zprint $cy_eval("None")TrE   z\$\d+ = None\nzprint $cy_eval("[a]")z\$\d+ = \[0\])rX   r   rH   r   r   r   s     r   test_cy_evalzTestCyEval.test_cy_eval  sf     	785Fxx)62:F:4Exx(&19691r   N)r   r+   r,   r]   r  r-   r   r   r  r    s
    '	:r   r  c                       e Zd Zd Zd Zd Zy)TestClosurec                 ^    t        j                  d|z          t        j                  d       y )Nz	cy break r   rG   )r   funcnames     r   break_and_run_funczTestClosure.break_and_run_func  s    K(*+Hr   c                 `   | j                  d       | j                  dt        j                  dd             t        j                  d       | j                  t	        | j                  d            d       t        j                  d	d      j                         }| j                  |d
       y )Ninnerr  r   TrE   r   rs   z'an object'
cy print aa = 'an object')r  rO   r   rH   r   rC   r  r   print_results     r   
test_innerzTestClosure.test_inner  s    (S[[EF 	IT]]3/0-@{{<4@FFH'89r   c                    | j                  d       | j                  dt        j                  dd             t        j                  d       | j                  dt        j                  dd             t        j                  d       t        j                  dd      j	                         }| j                  |d       y )	Nouterr  r   TrE   r   r  r  )r  rO   r   rH   r  r  s     r   
test_outerzTestClosure.test_outer  s    (S[[EF 	IS[[EF 	I{{<4@FFH'89r   N)r   r+   r,   r  r   r#  r-   r   r   r  r    s    	::r   r  	GDB_DEBUGz/dev/ttywc                      t         rnt        j                  t        j                  d      j
                  j                  dg|       } t        j                  dj                  d | D              dz          y y )Nr   : c              3   2   K   | ]  }t        |        y wr!   )r   ).0msgs     r   	<genexpr>z_debug.<locals>.<genexpr>  s     "@3s8"@s   
)
	_do_debug	itertoolschainsys	_getframef_coder   _debug_filewriter   )messagess    r   r   r     sY    ??CMM!$4$;$;$C$CS#I#+-#(("@x"@@4GH r   c           	         	 t        j                  d       t        | dg      }t        j                  |t        j
                        }t        j                         }t        j                  |D cg c]  \  }}|j                  |       c}}      }t        j                  d      j                  |      }|j                         S c c}}w # t        $ r/ d}t        j                  |       t!        j"                  d       Y y w xY w)NPyModuleObjectr  )fromlistr   )	verbosityzUnable 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   lookup_type
__import__r#   
getmembersisclassunittest
TestLoader	TestSuiteloadTestsFromTestCaseTextTestRunnerrV   wasSuccessfulrZ   warningswarnr   _exit)	
modulenamemteststest_loaderr&   clssuiterB   r+  s	            r   run_unittest_in_modulerN    s    &() zRD1""1goo6 ))+""EJK	c[..s3KM ((1599%@##%% L  K 	c
s   C 1C	
5DDc                      ddl m}  t        t              }t        | j                        }|r|st	        j
                  d       yy)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.TestsrP  rN  r   r1  exit)rP  success_libcythonsuccess_libpythons      r   runtestsrU    s:    
 <.x8./D/M/MN$5 %6r   c                     | a |r[t        j                  ddt        j                  t        j
                  t        j                  g      }|j                  t               y t                y )NFT)counttraceoutfile
ignoredirs)	inferior_python_versionrX  Tracer1  stderrprefixexec_prefixrunfuncrU  )version
trace_codetracers      r   mainrd    sG     &5cjj(+

COO'DFx 
r   )F)6r]   
__future__r   r   r   r1  rX  r#   rE  r?  r  r   r   r   r/  r   r  r   r   r   rL   Utilsr
   argvr   r   r   TestCaser/   ra   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  environgetr.  openr4  r   rN  rU  rd  r-   r   r   <module>rl     s   ' 	 	 
             - " 7H$ H "#,5H%% ,5 $,5^%F- %FP6X&& 67 76) )0= 0+># +>\%# %"5 5*'M ',M 2 2	6 	6*E} *EZ4M 4: ::- :> JJNN;'	z3'KI&,
r   