a
    ze:                     @   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yJ   dd ZY n0 zd dlmZ W n eyv   dd ZY n0 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r6e$  dS )8    N)with_tp_delc                 C   s   G dd dt }|S )Nc                   @   s   e Zd Zdd ZdS )zwith_tp_del.<locals>.Cc                 _   s   t dd S )Nzrequires _testcapi.with_tp_del	TypeErrorclsargskwargs r	   ,/usr/lib/python3.9/test/test_finalization.py__new__   s    zwith_tp_del.<locals>.C.__new__N__name__
__module____qualname__r   r	   r	   r	   r
   C   s   r   )objectr   r   r	   r	   r
   r      s    r   )
without_gcc                 C   s   G dd d}|S )Nc                   @   s   e Zd Zdd ZdS )zwithout_gc.<locals>.Cc                 _   s   t dd S )Nzrequires _testcapi.without_gcr   r   r	   r	   r
   r      s    zwithout_gc.<locals>.C.__new__Nr   r	   r	   r	   r
   r      s   r   r	   r   r	   r	   r
   r      s    r   )supportc                   @   sZ   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  d | j  | j  dt_z(d V  | jr<| jd W dt_|   ndt_|   0 W d    n1 sr0    Y  d S )NFr   T)	r   Z
disable_gcr   r   r   r   	_cleaningr   r    r   r	   r	   r
   test7   s    



zNonGCSimpleBase.testc                 C   s   d S r   r	   selfr	   r	   r
   check_sanityI   s    zNonGCSimpleBase.check_sanityc              
   C   s`   z*| j s(| jt|  |   |   W n0 tyZ } z| j| W Y d }~n
d }~0 0 d S r   )r!   r   appendidr%   side_effect	Exceptionr   r$   er	   r	   r
   __del__N   s    zNonGCSimpleBase.__del__c                 C   s   d S r   r	   r#   r	   r	   r
   r(   [   s    zNonGCSimpleBase.side_effectN)r   r   r   r   r   r   r   r!   	__slots__classmethodr    
contextlibcontextmanagerr"   r%   r,   r(   r	   r	   r	   r
   r      s   
r   c                   @   s   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   s    zSimpleBase.__init__c                 C   s   d S r   r	   r#   r	   r	   r
   r%   f   s    zSimpleBase.check_sanityN)r   r   r   r2   r%   r	   r	   r	   r
   r1   a   s   r1   c                   @   s   e Zd ZdZdS )NonGCr	   N)r   r   r   r-   r	   r	   r	   r
   r3   j   s   r3   c                   @   s   e Zd ZdZdd ZdS )NonGCResurrectorr	   c                 C   s   | j |  d S r   r   r&   r#   r	   r	   r
   r(   r   s    zNonGCResurrector.side_effectN)r   r   r   r-   r(   r	   r	   r	   r
   r4   n   s   r4   c                   @   s   e Zd ZdS )SimpleNr   r   r   r	   r	   r	   r
   r6   x   s   r6   c                   @   s   e Zd Zdd ZdS )SimpleResurrectorc                 C   s   | j |  d S r   r5   r#   r	   r	   r
   r(   ~   s    zSimpleResurrector.side_effectNr   r   r   r(   r	   r	   r	   r
   r8   |   s   r8   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   s2   z|  tjg  W | `t  n| `t  0 d S r   )assertEqualr   r   r;   r   r#   r	   r	   r
   tearDown   s    
zTestBase.tearDownc                 C   s   |  ttjt| d S r   )r=   sortedr1   r   r$   idsr	   r	   r
   assert_del_calls   s    zTestBase.assert_del_callsc                 C   s   |  ttjt| d S r   )r=   r?   r1   r   r@   r	   r	   r
   assert_tp_del_calls   s    zTestBase.assert_tp_del_callsc                 C   s$   |  tdd tjD t| d S )Nc                 s   s   | ]}t |V  qd S r   r'   .0xr	   r	   r
   	<genexpr>       z,TestBase.assert_survivors.<locals>.<genexpr>)r=   r?   r1   r   r@   r	   r	   r
   assert_survivors   s    zTestBase.assert_survivorsc                 C   s$   |  tdd tjD t| d S )Nc                 s   s   | ]}t |V  qd S r   rD   rE   r	   r	   r
   rH      rI   z*TestBase.assert_garbage.<locals>.<genexpr>)r=   r?   r   r   r@   r	   r	   r
   assert_garbage   s    zTestBase.assert_garbagec                 C   s   t j  d S r   )r1   r   r   r#   r	   r	   r
   clear_survivors   s    zTestBase.clear_survivorsN)
r   r   r   r<   r>   rB   rC   rJ   rK   rL   r	   r	   r	   r
   r:      s   r:   c                   @   s8   e Zd Zdd Zdd Zejdd Zejdd Zd	S )
SimpleFinalizationTestc                 C   s   t  r t }t|g}t|}~t  | | | 	g  | 
| d  t  | | | 	g  W d    n1 s0    Y  d S r   )r1   r"   r6   r'   weakrefrefr   r   rB   rJ   assertIsr$   srA   wrr	   r	   r
   test_simple   s    





z"SimpleFinalizationTest.test_simplec                 C   s   t  z t }t|g}t|}~t  | | | 	| | 
| d  |   t  | | | 	g  W d    n1 s0    Y  | | d  d S r   )r1   r"   r8   r'   rN   rO   r   r   rB   rJ   assertIsNotrL   rP   rQ   r	   r	   r
   test_simple_resurrect   s    





(z,SimpleFinalizationTest.test_simple_resurrectc                 C   s   t  j t }| t| t|g}~t  | | | 	g  t  | | | 	g  W d    n1 sx0    Y  d S r   )
r1   r"   r3   assertFalser   
is_trackedr'   r   rB   rJ   r$   rR   rA   r	   r	   r
   test_non_gc   s    




z"SimpleFinalizationTest.test_non_gcc                 C   s   t  v t }| t| t|g}~t  | | | 	| | 
  t  | |d  | 	| W d    n1 s0    Y  d S N   )r1   r"   r4   rW   r   rX   r'   r   rB   rJ   rL   rY   r	   r	   r
   test_non_gc_resurrect   s    



z,SimpleFinalizationTest.test_non_gc_resurrectN)	r   r   r   rT   rV   r   cpython_onlyrZ   r]   r	   r	   r	   r
   rM      s   
rM   c                       s(   e Zd Z fddZ fddZ  ZS )SelfCycleBasec                    s   t    | | _d S r   )superr2   rO   r#   	__class__r	   r
   r2      s    
zSelfCycleBase.__init__c                    s   t    d S r   )r`   r%   r#   ra   r	   r
   r%      s    
zSelfCycleBase.check_sanity)r   r   r   r2   r%   __classcell__r	   r	   ra   r
   r_      s   r_   c                   @   s   e Zd ZdS )SimpleSelfCycleNr7   r	   r	   r	   r
   rd      s   rd   c                   @   s   e Zd ZdS )SelfCycleResurrectorNr7   r	   r	   r	   r
   re      s   re   c                   @   s   e Zd Zdd ZdS )SuicidalSelfCyclec                 C   s
   d | _ d S r   )rO   r#   r	   r	   r
   r(      s    zSuicidalSelfCycle.side_effectNr9   r	   r	   r	   r
   rf      s   rf   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )SelfCycleFinalizationTestc                 C   s   t  r t }t|g}t|}~t  | | | 	g  | 
| d  t  | | | 	g  W d    n1 s0    Y  d S r   )r1   r"   rd   r'   rN   rO   r   r   rB   rJ   rP   rQ   r	   r	   r
   rT     s    





z%SelfCycleFinalizationTest.test_simplec                 C   s   t   t }t|g}t|}~t  | | | 	| | 
| d  |   t  | | | 	g  | 
| d  W d    n1 s0    Y  d S r   )r1   r"   re   r'   rN   rO   r   r   rB   rJ   rP   rL   rQ   r	   r	   r
   rV     s    






z/SelfCycleFinalizationTest.test_simple_resurrectc                 C   s   t   t }t|g}t|}~t  | | | 	g  | 
| d  t  | | | 	g  | 
| d  W d    n1 s0    Y  d S r   )r1   r"   rf   r'   rN   rO   r   r   rB   rJ   rP   rQ   r	   r	   r
   test_simple_suicide%  s    






z-SelfCycleFinalizationTest.test_simple_suicideN)r   r   r   rT   rV   rh   r	   r	   r	   r
   rg      s   rg   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$   rl   r	   r	   r
   chain9  s    zChainedBase.chainc                    s2   t    | jrn| j}|jr n | j}|jr.n d S r   )r`   r%   rk   rl   rm   )r$   rl   rm   ra   r	   r
   r%   >  s    
zChainedBase.check_sanity)r   r   r   rn   r%   rc   r	   r	   ra   r
   ri   7  s   ri   c                   @   s   e Zd ZdS )SimpleChainedNr7   r	   r	   r	   r
   ro   O  s   ro   c                   @   s   e Zd ZdS )ChainedResurrectorNr7   r	   r	   r	   r
   rp   R  s   rp   c                   @   s   e Zd Zdd ZdS )SuicidalChainedc                 C   s   d| _ d | _d | _d S )NTrj   r#   r	   r	   r
   r(   W  s    zSuicidalChained.side_effectNr9   r	   r	   r	   r
   rq   U  s   rq   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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   s   g | ]
}| qS r	   r	   )rF   r   r	   r	   r
   
<listcomp>h  rI   z:CycleChainFinalizationTest.build_chain.<locals>.<listcomp>   )rangelenrn   )r$   classesnodesir	   r	   r
   build_chaing  s    z&CycleChainFinalizationTest.build_chainc                 C   s   t |}t  | |}dd |D }dd |D }~t  | | | g  | dd |D d g|  t  | | W d    n1 s0    Y  d S )Nc                 S   s   g | ]}t |qS r	   rD   rF   rR   r	   r	   r
   rs   q  rI   zKCycleChainFinalizationTest.check_non_resurrecting_chain.<locals>.<listcomp>c                 S   s   g | ]}t |qS r	   rN   rO   r{   r	   r	   r
   rs   r  rI   c                 S   s   g | ]
}| qS r	   r	   rF   rS   r	   r	   r
   rs   w  rI   )	rv   r1   r"   rz   r   r   rB   rJ   r=   )r$   rw   Nrx   rA   wrsr	   r	   r
   check_non_resurrecting_chainm  s    



z7CycleChainFinalizationTest.check_non_resurrecting_chainc                 C   s   t |}t  | |}t |}dd |D }dd |D }dd |D }~t  | | | | | dd |D d g|  | 	  t  | | | g  W d    n1 s0    Y  d S )Nc                 S   s   g | ]}t |qS r	   rD   r{   r	   r	   r
   rs     rI   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>c                 S   s   g | ]}t |trt|qS r	   )
isinstancer8   r'   r{   r	   r	   r
   rs     rI   c                 S   s   g | ]}t |qS r	   r|   r{   r	   r	   r
   rs     rI   c                 S   s   g | ]
}| qS r	   r	   r}   r	   r	   r
   rs     rI   )
rv   r1   r"   rz   r   r   rB   rJ   r=   rL   )r$   rw   r~   rx   rA   Zsurvivor_idsr   r	   r	   r
   check_resurrecting_chain{  s     




z3CycleChainFinalizationTest.check_resurrecting_chainc                 C   s   |  tgd  d S N   )r   ro   r#   r	   r	   r
   test_homogenous  s    z*CycleChainFinalizationTest.test_homogenousc                 C   s   |  tgd  d S r   )r   rp   r#   r	   r	   r
   test_homogenous_resurrect  s    z4CycleChainFinalizationTest.test_homogenous_resurrectc                 C   s   |  tgd  d S r   )r   rq   r#   r	   r	   r
   test_homogenous_suicidal  s    z3CycleChainFinalizationTest.test_homogenous_suicidalc                 C   s   |  ttgd  d S r[   r   rq   ro   r#   r	   r	   r
   test_heterogenous_suicidal_one  s    z9CycleChainFinalizationTest.test_heterogenous_suicidal_onec                 C   s   |  tgd tgd   d S r[   r   r#   r	   r	   r
   test_heterogenous_suicidal_two  s    z9CycleChainFinalizationTest.test_heterogenous_suicidal_twoc                 C   s   |  ttgd  d S r[   )r   rp   ro   r#   r	   r	   r
   test_heterogenous_resurrect_one  s    z:CycleChainFinalizationTest.test_heterogenous_resurrect_onec                 C   s   |  tttgd  d S r[   r   rp   ro   rq   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 r[   r   r#   r	   r	   r
   !test_heterogenous_resurrect_three  s    z<CycleChainFinalizationTest.test_heterogenous_resurrect_threeN)r   r   r   rz   r   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   rr   `  s   rr   c                   @   s   e Zd Zdd Zdd ZdS )
LegacyBasec              
   C   sX   z"| j s | jt|  |   W n0 tyR } z| j| W Y d }~n
d }~0 0 d S r   )r!   r   r&   r'   r%   r)   r   r*   r	   r	   r
   r,     s    zLegacyBase.__del__c              
   C   s`   z*| j s(| jt|  |   |   W n0 tyZ } z| j| W Y d }~n
d }~0 0 d S r   )r!   r   r&   r'   r%   r(   r)   r   r*   r	   r	   r
   
__tp_del__  s    zLegacyBase.__tp_del__N)r   r   r   r,   r   r	   r	   r	   r
   r     s   
r   c                   @   s   e Zd ZdS )LegacyNr7   r	   r	   r	   r
   r     s   r   c                   @   s   e Zd Zdd ZdS )LegacyResurrectorc                 C   s   | j |  d S r   r5   r#   r	   r	   r
   r(     s    zLegacyResurrector.side_effectNr9   r	   r	   r	   r
   r     s   r   c                   @   s   e Zd ZdS )LegacySelfCycleNr7   r	   r	   r	   r
   r     s   r   c                       s4   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   r`   r>   r#   ra   r	   r
   r>     s    
zLegacyFinalizationTest.tearDownc                 C   s   t  | t }t|g}t|}~t  | | | 	| | 
g  | | d  t  | | | 	| W d    n1 s0    Y  d S r   )r1   r"   r   r'   rN   rO   r   r   rB   rC   rJ   rP   rQ   r	   r	   r
   test_legacy  s    






z"LegacyFinalizationTest.test_legacyc                 C   s   t   t }t|g}t|}~t  | | | 	| | 
| | | d  |   t  | | | 	|d  | 
| W d    n1 s0    Y  | | d  d S r[   )r1   r"   r   r'   rN   rO   r   r   rB   rC   rJ   rP   rL   rQ   r	   r	   r
   test_legacy_resurrect  s     






(z,LegacyFinalizationTest.test_legacy_resurrectc                 C   s   t  v t }t|g}t|}~t  | g  | 	g  | 
g  | | | | d  d tjd _W d    n1 s0    Y  | g  | | d  d S )Nr   )r1   r"   r   r'   rN   rO   r   r   rB   rC   rJ   rK   rU   r   rP   rQ   r	   r	   r
   test_legacy_self_cycle  s    






*
z-LegacyFinalizationTest.test_legacy_self_cycle)r   r   r   r>   r   r   r   rc   r	   r	   ra   r
   r     s   r   __main__)%r/   r   ZunittestrN   Z	_testcapir   ImportErrorr   r"   r   r   r1   r3   r4   r6   r8   r:   ZTestCaserM   r_   rd   re   rf   rg   ri   ro   rp   rq   rr   r   r   r   r   r^   r   r   mainr	   r	   r	   r
   <module>   sV   B			A
	:MA
