a
    ze                     @   sv   d dl Z d dlZd dlZd dlZd dlmZ G dd dejZG dd dejZG dd dejZ	e
d	krre  dS )
    N)supportc                   @   sX   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
ejdd ZdS )	ClearTestz"
    Tests for frame.clear().
       c                 K   s   dd  d S N   r    )selfxkwargsr   r   %/usr/lib/python3.9/test/test_frame.pyinner   s    zClearTest.innerc              
   K   sB   z| j f i | W n( ty< } z|}W Y d }~n
d }~0 0 |S N)r   ZeroDivisionError)r   r
   eexcr   r   r   outer   s
    zClearTest.outerc                 C   s   |dur|j   |j}q dS )z2
        Clear all frames in a traceback.
        N)tb_framecleartb_next)r   tbr   r   r   clear_traceback_frames   s    
z ClearTest.clear_traceback_framesc                 C   sh   G dd d}| }t |}| j|d}~t  | d |  | |j t  | d |  d S )Nc                   @   s   e Zd ZdS )z&ClearTest.test_clear_locals.<locals>.CN__name__
__module____qualname__r   r   r   r   C!   s   r   c)	weakrefrefr   r   
gc_collectassertIsNotr   __traceback__assertIsr   r   r   wrr   r   r   r   test_clear_locals    s    
zClearTest.test_clear_localsc                    sB   d  fdd}| }t |   |j    d S )NFc                   3   s"   zd V     W d nd 0 d S )NT)r   r   Zendlyr   r   r   g1   s    
z)ClearTest.test_clear_generator.<locals>.g)nextassertFalsegi_framer   
assertTrue)r   r(   genr   r'   r   test_clear_generator/   s    

zClearTest.test_clear_generatorc              
   C   s   zdd  W n, t y8 } z|jj}W Y d }~n
d }~0 0 | t |  W d    n1 sb0    Y  | t |j  W d    n1 s0    Y  d S r   r   r"   r   assertRaisesRuntimeErrorr   f_back)r   r   fr   r   r   test_clear_executing?   s    &zClearTest.test_clear_executingc                    s@   d  fdd}| }t |}  |    d S )NFc                  3   s   zzdd  W n t y }  z| jj}t |  W d    n1 sN0    Y  t |j  W d    n1 s0    Y  |V  W Y d } ~ n
d } ~ 0 0 W d nd 0 d S )Nr   r   Tr/   )r   r3   r'   r   r   r(   M   s    &(z3ClearTest.test_clear_executing_generator.<locals>.g)r)   r*   r   r,   )r   r(   r-   r3   r   r'   r   test_clear_executing_generatorJ   s    
z(ClearTest.test_clear_executing_generatorc                 C   s   t  d G dd d}| }t|}| j|d}~| d |  | |j | d |  W d    n1 sr0    Y  d S )Nc                   @   s   e Zd ZdS )z)ClearTest.test_clear_refcycles.<locals>.CNr   r   r   r   r   r   e   s   r   r   )	r   Z
disable_gcr   r   r   r!   r   r"   r#   r$   r   r   r   test_clear_refcyclesa   s    

zClearTest.test_clear_refcyclesN)r   )r   r   r   __doc__r   r   r   r&   r.   r4   r5   r   Zcpython_onlyr6   r   r   r   r   r   	   s   
r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )FrameAttrsTestc              
   C   s^   dd }z
|  W nF t yX } z.|j}g }|rD||j |j}q,W Y d }~n
d }~0 0 |S )Nc                     s   d d}  fdd}| S )Nr      c                     s    d } dd  d}d S N   r   r   	   r   ztr	   r   r   r   v   s    z8FrameAttrsTest.make_frames.<locals>.outer.<locals>.innerr   yr   r   r@   r   r   s   s    z)FrameAttrsTest.make_frames.<locals>.outer)r   r"   appendr   r   )r   r   r   r   framesr   r   r   make_framesr   s    
zFrameAttrsTest.make_framesc                 C   sV   |   \}}}|j}| |dtj | |ddd |j}| |ddd d S )Nr   r   r9   )r	   rB      )r	   r>   )rE   f_localsZassertIsInstancepoptypesFunctionTypeassertEqual)r   r3   r   r   Zouter_localsZinner_localsr   r   r   test_locals   s    zFrameAttrsTest.test_localsc                 C   s>   |   \}}}|  |  | |ji  | |ji  d S r   )rE   r   rK   rG   r   r3   r   r   r   r   r   r&      s
    z FrameAttrsTest.test_clear_localsc                 C   sJ   |   \}}}|j |j |  |  | |ji  | |ji  d S r   )rE   rG   r   rK   rM   r   r   r   test_locals_clear_locals   s    z'FrameAttrsTest.test_locals_clear_localsc                 C   s@   |   \}}}| t |`W d    n1 s20    Y  d S r   )rE   r0   AttributeErrorf_lineno)r   r3   _r   r   r   test_f_lineno_del_segfault   s    z)FrameAttrsTest.test_f_lineno_del_segfaultN)r   r   r   rE   rL   r&   rN   rR   r   r   r   r   r8   p   s
   
r8   c                   @   s   e Zd ZdZdd ZdS )ReprTestz 
    Tests for repr(frame).
    c           
   
   C   s   dd }|j j}z
|  W nF ty` } z.|j}g }|rL||j |j}q4W Y d }~nd }~0 0 | d |\}}}t	t
t}	| t
|d|	|d f  | t
|d|	|d f  | t
|d|	|d	 f  d S )
Nc                     s   d d}  fdd}| S )Nr   r9   c                     s    d } dd  d}d S r:   r   r=   r@   r   r   r      s    z0ReprTest.test_repr.<locals>.outer.<locals>.innerr   rA   r   r@   r   r      s    z!ReprTest.test_repr.<locals>.outerzshould have raisedz=^<frame at 0x[0-9a-fA-F]+, file %s, line %d, code test_repr>$   z9^<frame at 0x[0-9a-fA-F]+, file %s, line %d, code outer>$rF   z9^<frame at 0x[0-9a-fA-F]+, file %s, line %d, code inner>$r   )__code__co_firstlinenor   r"   rC   r   r   Zfailreescaperepr__file__ZassertRegex)
r   r   offsetr   r   rD   Zf_thisZf_outerZf_innerZ	file_reprr   r   r   	test_repr   s8    	








zReprTest.test_reprN)r   r   r   r7   r\   r   r   r   r   rS      s   rS   __main__)rW   rI   Zunittestr   testr   ZTestCaser   r8   rS   r   mainr   r   r   r   <module>   s   g5(