a
    ze:                     @   s>  d Z 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yN   dd ZY n0 zddlmZ W n eyz   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 d0d1 d1eZeG d2d3 d3eZ eG d4d5 d5eeZ!e
j"G d6d7 d7eejZ#e$d8kr:e%  dS )9zB
Tests for object finalization semantics, as outlined in PEP 442.
    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                   @   s^   e Zd 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 )NonGCSimpleBasezd
    The base class for all the objects under test, equipped with various
    testing features.
    Fr	   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 )zI
        A context manager to use around all finalization tests.
        FNr   T)	r   Z
disable_gcr   r   r   r   	_cleaningr   r    r   r	   r	   r
   test7   s    



zNonGCSimpleBase.testc                 C   s   dS )z8
        Check the object is sane (non-broken).
        Nr	   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 )z
        PEP 442 finalizer.  Record that this was called, check the
        object is in a sane state, and invoke a side effect.
        N)r!   r   appendidr%   side_effect	Exceptionr   r$   er	   r	   r
   __del__N   s    zNonGCSimpleBase.__del__c                 C   s   dS )z6
        A side effect called on destruction.
        Nr	   r#   r	   r	   r
   r(   [   s    zNonGCSimpleBase.side_effectN)r   r   r   __doc__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'   id_r#   r	   r	   r
   __init__c   s    zSimpleBase.__init__c                 C   s   | j t| ksJ d S r   )r3   r'   r#   r	   r	   r
   r%   f   s    zSimpleBase.check_sanityN)r   r   r   r4   r%   r	   r	   r	   r
   r2   a   s   r2   c                   @   s   e Zd ZdZdS )NonGCr	   N)r   r   r   r.   r	   r	   r	   r
   r5   j   s   r5   c                   @   s   e Zd ZdZdd ZdS )NonGCResurrectorr	   c                 C   s   | j |  dS zF
        Resurrect self by storing self in a class-wide list.
        Nr   r&   r#   r	   r	   r
   r(   r   s    zNonGCResurrector.side_effectN)r   r   r   r.   r(   r	   r	   r	   r
   r6   n   s   r6   c                   @   s   e Zd ZdS )SimpleNr   r   r   r	   r	   r	   r
   r9   x   s   r9   c                   @   s   e Zd Zdd ZdS )SimpleResurrectorc                 C   s   | j |  dS r7   r8   r#   r	   r	   r
   r(   ~   s    zSimpleResurrector.side_effectNr   r   r   r(   r	   r	   r	   r
   r;   |   s   r;   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@   sortedr2   r   r$   idsr	   r	   r
   assert_del_calls   s    zTestBase.assert_del_callsc                 C   s   |  ttjt| d S r   )r@   rB   r2   r   rC   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@   rB   r2   r   rC   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   rG   rH   r	   r	   r
   rK      rL   z*TestBase.assert_garbage.<locals>.<genexpr>)r@   rB   r   r   rC   r	   r	   r
   assert_garbage   s    zTestBase.assert_garbagec                 C   s   t j  d S r   )r2   r   r   r#   r	   r	   r
   clear_survivors   s    zTestBase.clear_survivorsN)
r   r   r   r?   rA   rE   rF   rM   rN   rO   r	   r	   r	   r
   r=      s   r=   c                   @   s<   e Zd ZdZdd Zdd Zejdd Zejdd	 Z	d
S )SimpleFinalizationTestz.
    Test finalization without refcycles.
    c                 C   s   t  r t }t|g}t|}~t  | | | 	g  | 
| d  t  | | | 	g  W d    n1 s0    Y  d S r   )r2   r"   r9   r'   weakrefrefr   r   rE   rM   assertIsr$   srD   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   )r2   r"   r;   r'   rQ   rR   r   r   rE   rM   assertIsNotrO   rS   rT   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   )
r2   r"   r5   assertFalser   
is_trackedr'   r   rE   rM   r$   rU   rD   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   )r2   r"   r6   rZ   r   r[   r'   r   rE   rM   rO   r\   r	   r	   r
   test_non_gc_resurrect   s    



z,SimpleFinalizationTest.test_non_gc_resurrectN)
r   r   r   r-   rW   rY   r   cpython_onlyr]   r`   r	   r	   r	   r
   rP      s   
rP   c                       s(   e Zd Z fddZ fddZ  ZS )SelfCycleBasec                    s   t    | | _d S r   )superr4   rR   r#   	__class__r	   r
   r4      s    
zSelfCycleBase.__init__c                    s   t    | j| u sJ d S r   )rc   r%   rR   r#   rd   r	   r
   r%      s    
zSelfCycleBase.check_sanity)r   r   r   r4   r%   __classcell__r	   r	   rd   r
   rb      s   rb   c                   @   s   e Zd ZdS )SimpleSelfCycleNr:   r	   r	   r	   r
   rg      s   rg   c                   @   s   e Zd ZdS )SelfCycleResurrectorNr:   r	   r	   r	   r
   rh      s   rh   c                   @   s   e Zd Zdd ZdS )SuicidalSelfCyclec                 C   s
   d| _ dS )7
        Explicitly break the reference cycle.
        N)rR   r#   r	   r	   r
   r(      s    zSuicidalSelfCycle.side_effectNr<   r	   r	   r	   r
   ri      s   ri   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	SelfCycleFinalizationTestzX
    Test finalization of an object having a single cyclic reference to
    itself.
    c                 C   s   t  r t }t|g}t|}~t  | | | 	g  | 
| d  t  | | | 	g  W d    n1 s0    Y  d S r   )r2   r"   rg   r'   rQ   rR   r   r   rE   rM   rS   rT   r	   r	   r
   rW     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   )r2   r"   rh   r'   rQ   rR   r   r   rE   rM   rS   rO   rT   r	   r	   r
   rY     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   )r2   r"   ri   r'   rQ   rR   r   r   rE   rM   rS   rT   r	   r	   r
   test_simple_suicide%  s    






z-SelfCycleFinalizationTest.test_simple_suicideN)r   r   r   r-   rW   rY   rl   r	   r	   r	   r
   rk      s   rk   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$   rp   r	   r	   r
   chain9  s    zChainedBase.chainc                    s   t    | jr.| jd u sJ | jd u sJ nT| j}|jrJ|jd u sXJ n|j| u sXJ | j}|jrt|jd u sJ n|j| u sJ d S r   )rc   r%   ro   rp   rq   )r$   rp   rq   rd   r	   r
   r%   >  s    
zChainedBase.check_sanity)r   r   r   rr   r%   rf   r	   r	   rd   r
   rm   7  s   rm   c                   @   s   e Zd ZdS )SimpleChainedNr:   r	   r	   r	   r
   rs   O  s   rs   c                   @   s   e Zd ZdS )ChainedResurrectorNr:   r	   r	   r	   r
   rt   R  s   rt   c                   @   s   e Zd Zdd ZdS )SuicidalChainedc                 C   s   d| _ d| _d| _dS )rj   TNrn   r#   r	   r	   r
   r(   W  s    zSuicidalChained.side_effectNr<   r	   r	   r	   r
   ru   U  s   ru   c                   @   sh   e Zd 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 )CycleChainFinalizationTestz
    Test finalization of a cyclic chain.  These tests are similar in
    spirit to the self-cycle tests above, but the collectable object
    graph isn't trivial anymore.
    c                 C   s:   dd |D }t t|D ]}|| ||d   q|S )Nc                 S   s   g | ]
}| qS r	   r	   )rI   r   r	   r	   r
   
<listcomp>h  rL   z:CycleChainFinalizationTest.build_chain.<locals>.<listcomp>   )rangelenrr   )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	   rG   rI   rU   r	   r	   r
   rw   q  rL   zKCycleChainFinalizationTest.check_non_resurrecting_chain.<locals>.<listcomp>c                 S   s   g | ]}t |qS r	   rQ   rR   r   r	   r	   r
   rw   r  rL   c                 S   s   g | ]
}| qS r	   r	   rI   rV   r	   r	   r
   rw   w  rL   )	rz   r2   r"   r~   r   r   rE   rM   r@   )r$   r{   Nr|   rD   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	   rG   r   r	   r	   r
   rw     rL   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>c                 S   s   g | ]}t |trt|qS r	   )
isinstancer;   r'   r   r	   r	   r
   rw     rL   c                 S   s   g | ]}t |qS r	   r   r   r	   r	   r
   rw     rL   c                 S   s   g | ]
}| qS r	   r	   r   r	   r	   r
   rw     rL   )
rz   r2   r"   r~   r   r   rE   rM   r@   rO   )r$   r{   r   r|   rD   Zsurvivor_idsr   r	   r	   r
   check_resurrecting_chain{  s     




z3CycleChainFinalizationTest.check_resurrecting_chainc                 C   s   |  tgd  d S N   )r   rs   r#   r	   r	   r
   test_homogenous  s    z*CycleChainFinalizationTest.test_homogenousc                 C   s   |  tgd  d S r   )r   rt   r#   r	   r	   r
   test_homogenous_resurrect  s    z4CycleChainFinalizationTest.test_homogenous_resurrectc                 C   s   |  tgd  d S r   )r   ru   r#   r	   r	   r
   test_homogenous_suicidal  s    z3CycleChainFinalizationTest.test_homogenous_suicidalc                 C   s   |  ttgd  d S r^   r   ru   rs   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   rt   rs   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   rt   rs   ru   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   r-   r~   r   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   rv   `  s   rv   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 )zJ
        Legacy (pre-PEP 442) finalizer, mapped to a tp_del slot.
        N)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 )LegacyNr:   r	   r	   r	   r
   r     s   r   c                   @   s   e Zd Zdd ZdS )LegacyResurrectorc                 C   s   | j |  dS r7   r8   r#   r	   r	   r
   r(     s    zLegacyResurrector.side_effectNr<   r	   r	   r	   r
   r     s   r   c                   @   s   e Zd ZdS )LegacySelfCycleNr:   r	   r	   r	   r
   r     s   r   c                       s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
LegacyFinalizationTestz5
    Test finalization of objects with a tp_del.
    c                    s    t j  t   t   d S r   )r   r   r   r   rc   rA   r#   rd   r	   r
   rA     s    
zLegacyFinalizationTest.tearDownc                 C   s   t  | t }t|g}t|}~t  | | | 	| | 
g  | | d  t  | | | 	| W d    n1 s0    Y  d S r   )r2   r"   r   r'   rQ   rR   r   r   rE   rF   rM   rS   rT   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^   )r2   r"   r   r'   rQ   rR   r   r   rE   rF   rM   rS   rO   rT   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   )r2   r"   r   r'   rQ   rR   r   r   rE   rF   rM   rN   rX   r   rS   rT   r	   r	   r
   test_legacy_self_cycle  s    






*
z-LegacyFinalizationTest.test_legacy_self_cycle)	r   r   r   r-   rA   r   r   r   rf   r	   r	   rd   r
   r     s
   r   __main__)&r-   r0   r   ZunittestrQ   Z	_testcapir   ImportErrorr   r"   r   r   r2   r5   r6   r9   r;   r=   ZTestCaserP   rb   rg   rh   ri   rk   rm   rs   rt   ru   rv   r   r   r   r   ra   r   r   mainr	   r	   r	   r
   <module>   sX   B			A
	:MA
