o
    HXh:                     @   sB  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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 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 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                   @      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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  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 )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      dS )z8
        Check the object is sane (non-broken).
        Nr   selfr   r   r   check_sanityI       zNonGCSimpleBase.check_sanityc              
   C   f   z| j s| jt|  |   |   W dS W dS  ty2 } z| j| W Y d}~dS d}~ww )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   r'   )z6
        A side effect called on destruction.
        Nr   r(   r   r   r   r/   [   r+   zNonGCSimpleBase.side_effectN)r   r   r   __doc__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.   id_r(   r   r   r   __init__c      zSimpleBase.__init__c                 C   s   | j t| ks	J d S r   )r;   r.   r(   r   r   r   r*   f      zSimpleBase.check_sanityN)r   r   r   r<   r*   r   r   r   r   r:   a   s    r:   c                   @   s   e Zd ZdZdS )NonGCr   N)r   r   r   r5   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 zF
        Resurrect self by storing self in a class-wide list.
        Nr   r-   r(   r   r   r   r/   r      zNonGCResurrector.side_effectN)r   r   r   r5   r/   r   r   r   r   r@   n   s    r@   c                   @      e Zd ZdS )SimpleNr   r   r   r   r   r   r   rF   x       rF   c                   @   r   )SimpleResurrectorc                 C   rA   rB   rC   r(   r   r   r   r/   ~   rD   zSimpleResurrector.side_effectNr   r   r   r/   r   r   r   r   rI   |       rI   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   rM   r    r(   r   r   r   tearDown   s   
zTestBase.tearDownc                 C      |  ttjt| d S r   )rO   sortedr:   r!   r)   idsr   r   r   assert_del_calls      zTestBase.assert_del_callsc                 C   rQ   r   )rO   rR   r:   r"   rS   r   r   r   assert_tp_del_calls   rV   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>)rO   rR   r:   r   rS   r   r   r   assert_survivors      $zTestBase.assert_survivorsc                 C   rX   )Nc                 s   rY   r   rZ   r[   r   r   r   r^      r_   z*TestBase.assert_garbage.<locals>.<genexpr>)rO   rR   r   r   rS   r   r   r   assert_garbage   ra   zTestBase.assert_garbagec                 C   s   t j  d S r   )r:   r   r   r(   r   r   r   clear_survivors   r=   zTestBase.clear_survivorsN)
r   r   r   rN   rP   rU   rW   r`   rb   rc   r   r   r   r   rL      s    rL   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      t  : t }t|g}t|}~t  | | | 	g  | 
| d  t  | | | 	g  W d    d S 1 sAw   Y  d S r   )r:   r&   rF   r.   weakrefrefr   r    rU   r`   assertIsr)   srT   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   )r:   r&   rI   r.   rf   rg   r   r    rU   r`   assertIsNotrc   rh   ri   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   )
r:   r&   r?   assertFalser   
is_trackedr.   r    rU   r`   r)   rj   rT   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   )r:   r&   r@   rp   r   rq   r.   r    rU   r`   rc   rr   r   r   r   test_non_gc_resurrect   s   



"z,SimpleFinalizationTest.test_non_gc_resurrectN)
r   r   r   r4   rl   ro   r   cpython_onlyrs   rv   r   r   r   r   rd      s    
rd   c                       s(   e Zd Z fddZ fddZ  ZS )SelfCycleBasec                    s   t    | | _d S r   )superr<   rg   r(   	__class__r   r   r<      s   

zSelfCycleBase.__init__c                    s   t    | j| u sJ d S r   )ry   r*   rg   r(   rz   r   r   r*      s   
zSelfCycleBase.check_sanity)r   r   r   r<   r*   __classcell__r   r   rz   r   rx      s    rx   c                   @   rE   )SimpleSelfCycleNrG   r   r   r   r   r}      rH   r}   c                   @   rE   )SelfCycleResurrectorNrG   r   r   r   r   r~      rH   r~   c                   @   r   )SuicidalSelfCyclec                 C   s
   d| _ dS )7
        Explicitly break the reference cycle.
        N)rg   r(   r   r   r   r/      s   
zSuicidalSelfCycle.side_effectNrJ   r   r   r   r   r      rK   r   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   re   r   )r:   r&   r}   r.   rf   rg   r   r    rU   r`   rh   ri   r   r   r   rl     rm   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   )r:   r&   r~   r.   rf   rg   r   r    rU   r`   rh   rc   ri   r   r   r   ro     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   )r:   r&   r   r.   rf   rg   r   r    rU   r`   rh   ri   r   r   r   test_simple_suicide%  s   






"z-SelfCycleFinalizationTest.test_simple_suicideN)r   r   r   r4   rl   ro   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                    s   t    | jr| jd u sJ | jd u sJ d S | j}|jr&|jd u s%J n|j| u s-J | j}|jr<|jd u s:J d S |j| u sCJ d S r   )ry   r*   r   r   r   )r)   r   r   rz   r   r   r*   >  s   
zChainedBase.check_sanity)r   r   r   r   r*   r|   r   r   rz   r   r   7  s    r   c                   @   rE   )SimpleChainedNrG   r   r   r   r   r   O  rH   r   c                   @   rE   )ChainedResurrectorNrG   r   r   r   r   r   R  rH   r   c                   @   r   )SuicidalChainedc                 C   s   d| _ d| _d| _dS )r   TNr   r(   r   r   r   r/   W  s   
zSuicidalChained.side_effectNrJ   r   r   r   r   r   U  rK   r   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      g | ]}| qS r   r   )r\   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   rZ   r\   rj   r   r   r   r   q      zKCycleChainFinalizationTest.check_non_resurrecting_chain.<locals>.<listcomp>c                 S      g | ]}t |qS r   rf   rg   r   r   r   r   r   r      c                 S   r   r   r   r\   rk   r   r   r   r   w  r   )	r   r:   r&   r   r   r    rU   r`   rO   )r)   r   Nr   rT   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   rZ   r   r   r   r   r     r   zGCycleChainFinalizationTest.check_resurrecting_chain.<locals>.<listcomp>c                 S   s   g | ]}t |trt|qS r   )
isinstancerI   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   r:   r&   r   r   r    rU   r`   rO   rc   )r)   r   r   r   rT   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 rt   r   r   r   r(   r   r   r   test_heterogenous_suicidal_one  r>   z9CycleChainFinalizationTest.test_heterogenous_suicidal_onec                 C   s   |  tgd tgd   d S rt   r   r(   r   r   r   test_heterogenous_suicidal_two  s   z9CycleChainFinalizationTest.test_heterogenous_suicidal_twoc                 C   r   rt   )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 rt   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 rt   r   r(   r   r   r   !test_heterogenous_resurrect_three  s   z<CycleChainFinalizationTest.test_heterogenous_resurrect_threeN)r   r   r   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   `  s    r   c                   @   r9   )
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,   )zJ
        Legacy (pre-PEP 442) finalizer, mapped to a tp_del slot.
        N)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                   @   rE   )LegacyNrG   r   r   r   r   r         r   c                   @   r   )LegacyResurrectorc                 C   rA   rB   rC   r(   r   r   r   r/     rD   zLegacyResurrector.side_effectNrJ   r   r   r   r   r     s    r   c                   @   rE   )LegacySelfCycleNrG   r   r   r   r   r     r   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    ry   rP   r(   rz   r   r   rP     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   )r:   r&   r   r.   rf   rg   r   r    rU   rW   r`   rh   ri   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 rt   )r:   r&   r   r.   rf   rg   r   r    rU   rW   r`   rh   rc   ri   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   )r:   r&   r   r.   rf   rg   r   r    rU   rW   r`   rb   rn   r   rh   ri   r   r   r   test_legacy_self_cycle  s   







z-LegacyFinalizationTest.test_legacy_self_cycle)	r   r   r   r4   rP   r   r   r   r|   r   r   rz   r   r     s    r   __main__)&r4   r7   r   Zunittestrf   Z	_testcapir   ImportErrorr   r&   r   r   r:   r?   r@   rF   rI   rL   ZTestCaserd   rx   r}   r~   r   r   r   r   r   r   r   r   r   r   r   rw   r   r   mainr   r   r   r   <module>   s`    B			A
	:M
A