o
    HXh:                     @   s@  	 d dl Z d dlZd dlZd dlZzd dlmZ W n ey&   dd ZY nw zd dlmZ W n ey<   dd ZY nw d dlm	Z	 G d	d
 d
Z
G dd de
ZeG dd de
ZeG dd de
ZG dd deZG dd deZG dd dZG dd deejZG dd dZG dd deeZG dd deeZG dd  d eeZG d!d" d"eejZG d#d$ d$ZG d%d& d&eeZG d'd( d(eeZG d)d* d*eeZG d+d, d,eejZG d-d. d.eZeG d/d0 d0eZeG d1d2 d2eZeG d3d4 d4eeZ e	j!G d5d6 d6eejZ"e#d7kre$  dS dS )8    N)with_tp_delc                 C   s   G dd dt }|S )Nc                   @      e Zd Zdd ZdS )zwith_tp_del.<locals>.Cc                 _      t d)Nzrequires _testcapi.with_tp_del	TypeErrorclsargskwargs r   @/opt/python-3.10.19/usr/lib/python3.10/test/test_finalization.py__new__      zwith_tp_del.<locals>.C.__new__N__name__
__module____qualname__r   r   r   r   r   C       r   )objectr   r   r   r   r   r      s   r   )
without_gcc                 C   s   G dd d}|S )Nc                   @   r   )zwithout_gc.<locals>.Cc                 _   r   )Nzrequires _testcapi.without_gcr   r   r   r   r   r      r   zwithout_gc.<locals>.C.__new__Nr   r   r   r   r   r      r   r   r   r   r   r   r   r      s   r   )supportc                   @   s\   e Zd Z	 g Zg Zg Zg ZdZdZe	dd Z
e	ejdd Zdd Zd	d
 Zdd ZdS )NonGCSimpleBaseFr   c                 C   s>   | j   | j  tj  t  | j  | j  d S N)	survivorsclearerrorsgcgarbagecollect	del_callstp_del_callsr   r   r   r   _cleanup.   s   



zNonGCSimpleBase._cleanupc              	   c   s    	 t  3 | j  | j  dt_zd V  | jr | jd W dt_|   ndt_|   w W d    d S 1 s<w   Y  d S )NFr   T)	r   Z
disable_gcr!   r   r"   r   	_cleaningr   r$   r#   r   r   r   test7   s    




"zNonGCSimpleBase.testc                 C      d S r   r   selfr   r   r   check_sanityI      zNonGCSimpleBase.check_sanityc              
   C   h   	 z| j s| jt|  |   |   W d S W d S  ty3 } z| j| W Y d }~d S d }~ww r   )r%   r!   appendidr*   side_effect	Exceptionr   r)   er   r   r   __del__N   s   zNonGCSimpleBase.__del__c                 C   r'   r   r   r(   r   r   r   r/   [   r+   zNonGCSimpleBase.side_effectN)r   r   r   r   r!   r"   r   r%   	__slots__classmethodr$   
contextlibcontextmanagerr&   r*   r3   r/   r   r   r   r   r      s     
r   c                   @      e Zd Zdd Zdd ZdS )
SimpleBasec                 C   s   t | | _d S r   )r.   Zid_r(   r   r   r   __init__c      zSimpleBase.__init__c                 C   r'   r   r   r(   r   r   r   r*   f   s    zSimpleBase.check_sanityN)r   r   r   r:   r*   r   r   r   r   r9   a   s    r9   c                   @   s   e Zd ZdZdS )NonGCr   N)r   r   r   r4   r   r   r   r   r<   j   s    r<   c                   @   s   e Zd ZdZdd ZdS )NonGCResurrectorr   c                 C      	 | j |  d S r   r   r-   r(   r   r   r   r/   r      zNonGCResurrector.side_effectN)r   r   r   r4   r/   r   r   r   r   r=   n   s    r=   c                   @      e Zd ZdS )SimpleNr   r   r   r   r   r   r   rB   x       rB   c                   @   r   )SimpleResurrectorc                 C   r>   r   r?   r(   r   r   r   r/   ~   r@   zSimpleResurrector.side_effectNr   r   r   r/   r   r   r   r   rE   |       rE   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )TestBasec                 C   s"   t jd d  | _g t jd d < d S r   )r   r   old_garbager(   r   r   r   setUp   s   zTestBase.setUpc                 C   s0   z|  tjg  W | `t  d S | `t  w r   )assertEqualr   r   rI   r    r(   r   r   r   tearDown   s   
zTestBase.tearDownc                 C      |  ttjt| d S r   )rK   sortedr9   r!   r)   idsr   r   r   assert_del_calls      zTestBase.assert_del_callsc                 C   rM   r   )rK   rN   r9   r"   rO   r   r   r   assert_tp_del_calls   rR   zTestBase.assert_tp_del_callsc                 C   $   |  tdd tjD t| d S )Nc                 s       | ]}t |V  qd S r   r.   .0xr   r   r   	<genexpr>       z,TestBase.assert_survivors.<locals>.<genexpr>)rK   rN   r9   r   rO   r   r   r   assert_survivors      $zTestBase.assert_survivorsc                 C   rT   )Nc                 s   rU   r   rV   rW   r   r   r   rZ      r[   z*TestBase.assert_garbage.<locals>.<genexpr>)rK   rN   r   r   rO   r   r   r   assert_garbage   r]   zTestBase.assert_garbagec                 C   s   t j  d S r   )r9   r   r   r(   r   r   r   clear_survivors   r;   zTestBase.clear_survivorsN)
r   r   r   rJ   rL   rQ   rS   r\   r^   r_   r   r   r   r   rH      s    rH   c                   @   s:   e Zd Z	 dd Zdd Zejdd Zejdd Zd	S )
SimpleFinalizationTestc                 C      t  : t }t|g}t|}~t  | | | 	g  | 
| d  t  | | | 	g  W d    d S 1 sAw   Y  d S r   )r9   r&   rB   r.   weakrefrefr   r    rQ   r\   assertIsr)   srP   wrr   r   r   test_simple      





"z"SimpleFinalizationTest.test_simplec                 C   s   t  = t }t|g}t|}~t  | | | 	| | 
| d  |   t  | | | 	g  W d    n1 sDw   Y  | | d  d S r   )r9   r&   rE   r.   rb   rc   r   r    rQ   r\   assertIsNotr_   rd   re   r   r   r   test_simple_resurrect   s   





z,SimpleFinalizationTest.test_simple_resurrectc                 C   s   t  6 t }| t| t|g}~t  | | | 	g  t  | | | 	g  W d    d S 1 s=w   Y  d S r   )
r9   r&   r<   assertFalser   
is_trackedr.   r    rQ   r\   r)   rf   rP   r   r   r   test_non_gc   s   




"z"SimpleFinalizationTest.test_non_gcc                 C   s   t  < t }| t| t|g}~t  | | | 	| | 
  t  | |d  | 	| W d    d S 1 sCw   Y  d S N   )r9   r&   r=   rl   r   rm   r.   r    rQ   r\   r_   rn   r   r   r   test_non_gc_resurrect   s   



"z,SimpleFinalizationTest.test_non_gc_resurrectN)	r   r   r   rh   rk   r   cpython_onlyro   rr   r   r   r   r   r`      s    
r`   c                       s(   e Zd Z fddZ fddZ  ZS )SelfCycleBasec                    s   t    | | _d S r   )superr:   rc   r(   	__class__r   r   r:      s   

zSelfCycleBase.__init__c                    s   t    d S r   )ru   r*   r(   rv   r   r   r*      r;   zSelfCycleBase.check_sanity)r   r   r   r:   r*   __classcell__r   r   rv   r   rt      s    rt   c                   @   rA   )SimpleSelfCycleNrC   r   r   r   r   ry      rD   ry   c                   @   rA   )SelfCycleResurrectorNrC   r   r   r   r   rz      rD   rz   c                   @   r   )SuicidalSelfCyclec                 C   s   	 d | _ d S r   )rc   r(   r   r   r   r/      s   
zSuicidalSelfCycle.side_effectNrF   r   r   r   r   r{      rG   r{   c                   @   s&   e Zd Z	 dd Zdd Zdd ZdS )SelfCycleFinalizationTestc                 C   ra   r   )r9   r&   ry   r.   rb   rc   r   r    rQ   r\   rd   re   r   r   r   rh     ri   z%SelfCycleFinalizationTest.test_simplec                 C   s   t  E t }t|g}t|}~t  | | | 	| | 
| d  |   t  | | | 	g  | 
| d  W d    d S 1 sLw   Y  d S r   )r9   r&   rz   r.   rb   rc   r   r    rQ   r\   rd   r_   re   r   r   r   rk     s   






"z/SelfCycleFinalizationTest.test_simple_resurrectc                 C   s   t  A t }t|g}t|}~t  | | | 	g  | 
| d  t  | | | 	g  | 
| d  W d    d S 1 sHw   Y  d S r   )r9   r&   r{   r.   rb   rc   r   r    rQ   r\   rd   re   r   r   r   test_simple_suicide%  s   






"z-SelfCycleFinalizationTest.test_simple_suicideN)r   r   r   rh   rk   r}   r   r   r   r   r|      s
    r|   c                       s$   e Zd Zdd Z fddZ  ZS )ChainedBasec                 C   s   d| _ || _| |_d S )NFsuicidedleftright)r)   r   r   r   r   chain9  s   
zChainedBase.chainc                    s4   t    | jr
d S | j}|jr| j}|jrd S d S r   )ru   r*   r   r   r   )r)   r   r   rv   r   r   r*   >  s   

zChainedBase.check_sanity)r   r   r   r   r*   rx   r   r   rv   r   r~   7  s    r~   c                   @   rA   )SimpleChainedNrC   r   r   r   r   r   O  rD   r   c                   @   rA   )ChainedResurrectorNrC   r   r   r   r   r   R  rD   r   c                   @   r   )SuicidalChainedc                 C   s   	 d| _ d | _d | _d S )NTr   r(   r   r   r   r/   W  s   
zSuicidalChained.side_effectNrF   r   r   r   r   r   U  rG   r   c                   @   sf   e Zd Z	 dd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )CycleChainFinalizationTestc                 C   s:   dd |D }t t|D ]}|| ||d   q|S )Nc                 S      g | ]}| qS r   r   )rX   r   r   r   r   
<listcomp>h      z:CycleChainFinalizationTest.build_chain.<locals>.<listcomp>   )rangelenr   )r)   classesnodesir   r   r   build_chaing  s   z&CycleChainFinalizationTest.build_chainc                 C   s   t |}t B | |}dd |D }dd |D }~t  | | | g  | dd |D d g|  t  | | W d    d S 1 sMw   Y  d S )Nc                 S      g | ]}t |qS r   rV   rX   rf   r   r   r   r   q      zKCycleChainFinalizationTest.check_non_resurrecting_chain.<locals>.<listcomp>c                 S      g | ]}t |qS r   rb   rc   r   r   r   r   r   r      c                 S   r   r   r   rX   rg   r   r   r   r   w  r   )	r   r9   r&   r   r   r    rQ   r\   rK   )r)   r   Nr   rP   wrsr   r   r   check_non_resurrecting_chainm  s   



"z7CycleChainFinalizationTest.check_non_resurrecting_chainc                 C   s   t |}t V | |}t |}dd |D }dd |D }dd |D }~t  | | | | | dd |D d g|  | 	  t  | | | g  W d    d S 1 saw   Y  d S )Nc                 S   r   r   rV   r   r   r   r   r     r   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>c                 S   s   g | ]}t |trt|qS r   )
isinstancerE   r.   r   r   r   r   r     s    c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   )
r   r9   r&   r   r   r    rQ   r\   rK   r_   )r)   r   r   r   rP   Zsurvivor_idsr   r   r   r   check_resurrecting_chain{  s"   




"z3CycleChainFinalizationTest.check_resurrecting_chainc                 C      |  tgd  d S N   )r   r   r(   r   r   r   test_homogenous     z*CycleChainFinalizationTest.test_homogenousc                 C   r   r   )r   r   r(   r   r   r   test_homogenous_resurrect  r   z4CycleChainFinalizationTest.test_homogenous_resurrectc                 C   r   r   )r   r   r(   r   r   r   test_homogenous_suicidal  r   z3CycleChainFinalizationTest.test_homogenous_suicidalc                 C      |  ttgd  d S rp   r   r   r   r(   r   r   r   test_heterogenous_suicidal_one     z9CycleChainFinalizationTest.test_heterogenous_suicidal_onec                 C   s   |  tgd tgd   d S rp   r   r(   r   r   r   test_heterogenous_suicidal_two  s   z9CycleChainFinalizationTest.test_heterogenous_suicidal_twoc                 C   r   rp   )r   r   r   r(   r   r   r   test_heterogenous_resurrect_one  r   z:CycleChainFinalizationTest.test_heterogenous_resurrect_onec                 C   s   |  tttgd  d S rp   r   r   r   r   r(   r   r   r   test_heterogenous_resurrect_two  s   z:CycleChainFinalizationTest.test_heterogenous_resurrect_twoc                 C   s(   |  tgd tgd  tgd   d S rp   r   r(   r   r   r   !test_heterogenous_resurrect_three  s   z<CycleChainFinalizationTest.test_heterogenous_resurrect_threeN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   `  s    r   c                   @   r8   )
LegacyBasec              
   C   s^   z| j s| jt|  |   W d S W d S  ty. } z| j| W Y d }~d S d }~ww r   )r%   r!   r-   r.   r*   r0   r   r1   r   r   r   r3     s   zLegacyBase.__del__c              
   C   r,   r   )r%   r"   r-   r.   r*   r/   r0   r   r1   r   r   r   
__tp_del__  s   zLegacyBase.__tp_del__N)r   r   r   r3   r   r   r   r   r   r     s    
r   c                   @   rA   )LegacyNrC   r   r   r   r   r         r   c                   @   r   )LegacyResurrectorc                 C   r>   r   r?   r(   r   r   r   r/     r@   zLegacyResurrector.side_effectNrF   r   r   r   r   r     s    r   c                   @   rA   )LegacySelfCycleNrC   r   r   r   r   r     r   r   c                       s6   e Zd Z	  fddZdd Zdd Zdd Z  ZS )	LegacyFinalizationTestc                    s    t j  t   t   d S r   )r   r   r   r    ru   rL   r(   rv   r   r   rL     s   
zLegacyFinalizationTest.tearDownc                 C   s   t  ? t }t|g}t|}~t  | | | 	| | 
g  | | d  t  | | | 	| W d    d S 1 sFw   Y  d S r   )r9   r&   r   r.   rb   rc   r   r    rQ   rS   r\   rd   re   r   r   r   test_legacy  s   






"z"LegacyFinalizationTest.test_legacyc                 C   s   t  I t }t|g}t|}~t  | | | 	| | 
| | | d  |   t  | | | 	|d  | 
| W d    n1 sPw   Y  | | d  d S rp   )r9   r&   r   r.   rb   rc   r   r    rQ   rS   r\   rd   r_   re   r   r   r   test_legacy_resurrect  s"   






z,LegacyFinalizationTest.test_legacy_resurrectc                 C   s   t  ; t }t|g}t|}~t  | g  | 	g  | 
g  | | | | d  d tjd _W d    n1 sBw   Y  | g  | | d  d S )Nr   )r9   r&   r   r.   rb   rc   r   r    rQ   rS   r\   r^   rj   r   rd   re   r   r   r   test_legacy_self_cycle  s   







z-LegacyFinalizationTest.test_legacy_self_cycle)r   r   r   rL   r   r   r   rx   r   r   rv   r   r     s    r   __main__)%r6   r   Zunittestrb   Z	_testcapir   ImportErrorr   r&   r   r   r9   r<   r=   rB   rE   rH   ZTestCaser`   rt   ry   rz   r{   r|   r~   r   r   r   r   r   r   r   r   rs   r   r   mainr   r   r   r   <module>   s`    B			A
	:M
A