
    /hh:                     h   S r SSKrSSKrSSKrSSKr SSKJr   SSKJr  SSK	J
r
   " S S	5      r " S
 S\5      r\ " S S\5      5       r\ " S S\5      5       r " S S\5      r " S S\5      r " S S5      r " S S\\R$                  5      r " S S5      r " S S\\5      r " S S\\5      r " S S\\5      r " S  S!\\R$                  5      r " S" S#5      r " S$ S%\\5      r " S& S'\\5      r " S( S)\\5      r " S* S+\\R$                  5      r " S, S-\5      r\ " S. S/\5      5       r\ " S0 S1\5      5       r \ " S2 S3\\5      5       r!\
RD                   " S4 S5\\R$                  5      5       r#\$S6:X  a  \RJ                  " 5         gg! \ a    S r GNf = f! \ a    S r GNf = f)7zB
Tests for object finalization semantics, as outlined in PEP 442.
    N)with_tp_delc                 $     " S S[         5      nU$ )Nc                       \ rS rSrS rSrg)with_tp_del.<locals>.C   c                 .    [         R                  " S5      e)Nzrequires _testcapi.with_tp_delunittestSkipTestclsargskwargss      ?/opt/python-3.13.8/usr/lib/python3.13/test/test_finalization.py__new__with_tp_del.<locals>.C.__new__   s    ''(HII     N__name__
__module____qualname____firstlineno__r   __static_attributes__r   r   r   Cr      s    Jr   r   )objectr   r   s     r   r   r      s    	J 	J r   )
without_gcc                      " S S5      nU$ )Nc                       \ rS rSrS rSrg)without_gc.<locals>.C   c                 .    [         R                  " S5      e)Nzrequires _testcapi.without_gcr	   r   s      r   r   without_gc.<locals>.C.__new__   s    ''(GHHr   r   Nr   r   r   r   r   r!      s    Ir   r   r   r   s     r   r   r      s    	I 	I r   )supportc                       \ rS rSrSr/ r/ r/ r/ rSr	Sr
\S 5       r\\R                  S 5       5       rS rS rS	 rSrg
)NonGCSimpleBase   zX
The base class for all the objects under test, equipped with various
testing features.
Fr   c                 :   U R                   R                  5         U R                  R                  5         [        R                  R                  5         [        R
                  " 5         U R                  R                  5         U R                  R                  5         g N)	survivorsclearerrorsgcgarbagecollect	del_callstp_del_callsr   s    r   _cleanupNonGCSimpleBase._cleanup.   s]    







 r   c              #     #    [         R                  " 5          U R                  R                  5         U R                  R                  5         S[
        l         Sv   U R                  (       a  U R                  S   e S[
        l        U R                  5          SSS5        g! S[
        l        U R                  5         f = f! , (       d  f       g= f7f)z9
A context manager to use around all finalization tests.
FNr   T)	r%   
disable_gcr1   r,   r2   r'   	_cleaningr-   r4   r3   s    r   testNonGCSimpleBase.test7   s      !MM!""$(-O%::**Q-'  -1) "! -1) "!s5   CA C$B#>C	C#C  C
CCc                     g)z(
Check the object is sane (non-broken).
Nr   selfs    r   check_sanityNonGCSimpleBase.check_sanityI       r   c                     U R                   (       dE  U R                  R                  [        U 5      5        U R	                  5         U R                  5         gg! [         a%  nU R                  R                  U5         SnAgSnAff = f)zq
PEP 442 finalizer.  Record that this was called, check the
object is in a sane state, and invoke a side effect.
N)r8   r1   appendidr>   side_effect	Exceptionr-   r=   es     r   __del__NonGCSimpleBase.__del__N   sh    
	">>%%bh/!!#  " "  	"KKq!!	"   AA 
B#BBc                     g)z&
A side effect called on destruction.
Nr   r<   s    r   rD   NonGCSimpleBase.side_effect[   r@   r   N)r   r   r   r   __doc__r+   r1   r2   r-   r8   	__slots__classmethodr4   
contextlibcontextmanagerr9   r>   rH   rD   r   r   r   r   r'   r'      sj    
 IILFII! !    
"r   r'   c                        \ rS rSrS rS rSrg)
SimpleBasea   c                 $    [        U 5      U l        g r*   )rC   id_r<   s    r   __init__SimpleBase.__init__c   s    d8r   c                 :    U R                   [        U 5      :X  d   eg r*   )rV   rC   r<   s    r   r>   SimpleBase.check_sanityf   s    xx2d8###r   )rV   N)r   r   r   r   rW   r>   r   r   r   r   rS   rS   a   s    $r   rS   c                       \ rS rSrSrSrg)NonGCj   r   N)r   r   r   r   rN   r   r   r   r   r\   r\   j   s    Ir   r\   c                       \ rS rSrSrS rSrg)NonGCResurrectorn   r   c                 :    U R                   R                  U 5        gz6
Resurrect self by storing self in a class-wide list.
Nr+   rB   r<   s    r   rD   NonGCResurrector.side_effectr        	d#r   N)r   r   r   r   rN   rD   r   r   r   r   r_   r_   n   s    I$r   r_   c                       \ rS rSrSrg)Simplex   r   Nr   r   r   r   r   r   r   r   rg   rg   x       r   rg   c                       \ rS rSrS rSrg)SimpleResurrector|   c                 :    U R                   R                  U 5        grb   rc   r<   s    r   rD   SimpleResurrector.side_effect~   re   r   r   Nr   r   r   r   rD   r   r   r   r   rl   rl   |   s    $r   rl   c                   >    \ rS rSrS rS rS rS rS rS r	S r
S	rg
)TestBase   c                 Z    [         R                  S S  U l        / [         R                  S S & g r*   )r.   r/   old_garbager<   s    r   setUpTestBase.setUp   s    ::a=

1r   c                      U R                  [        R                  / 5        U ?[        R                  " 5         g ! U ?[        R                  " 5         f = fr*   )assertEqualr.   r/   ru   r0   r<   s    r   tearDownTestBase.tearDown   s=    	RZZ, JJL  JJLs	    : Ac                 h    U R                  [        [        R                  5      [        U5      5        g r*   )ry   sortedrS   r1   r=   idss     r   assert_del_callsTestBase.assert_del_calls   s!    
 4 45vc{Cr   c                 h    U R                  [        [        R                  5      [        U5      5        g r*   )ry   r}   rS   r2   r~   s     r   assert_tp_del_callsTestBase.assert_tp_del_calls   s!    
 7 78&+Fr   c                 v    U R                  [        S [        R                   5       5      [        U5      5        g )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr*   rC   .0xs     r   	<genexpr>,TestBase.assert_survivors.<locals>.<genexpr>   s     D/C!1/C   )ry   r}   rS   r+   r~   s     r   assert_survivorsTestBase.assert_survivors   s'    Dz/C/CDDfSkRr   c                 v    U R                  [        S [        R                   5       5      [        U5      5        g )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr*   r   r   s     r   r   *TestBase.assert_garbage.<locals>.<genexpr>   s     :z!1zr   )ry   r}   r.   r/   r~   s     r   assert_garbageTestBase.assert_garbage   s%    :rzz::F3KHr   c                 @    [         R                  R                  5         g r*   )rS   r+   r,   r<   s    r   clear_survivorsTestBase.clear_survivors   s    ""$r   )ru   N)r   r   r   r   rv   rz   r   r   r   r   r   r   r   r   r   rr   rr      s)    DGSI%r   rr   c                   l    \ rS rSrSrS rS r\R                  S 5       r	\R                  S 5       r
Srg)	SimpleFinalizationTest   z&
Test finalization without refcycles.
c                    [         R                  5          [        5       n[        U5      /n[        R
                  " U5      nA[        R                  " 5         U R                  U5        U R                  / 5        U R                  U" 5       S 5        [        R                  " 5         U R                  U5        U R                  / 5        S S S 5        g ! , (       d  f       g = fr*   )rS   r9   rg   rC   weakrefrefr.   r0   r   r   assertIsr=   sr   wrs       r   test_simple"SimpleFinalizationTest.test_simple   s    __Aa5'CQBJJL!!#&!!"%MM"$%JJL!!#&!!"%    B3C
Cc                    [         R                  5          [        5       n[        U5      /n[        R
                  " U5      nA[        R                  " 5         U R                  U5        U R                  U5        U R                  U" 5       S 5        U R                  5         [        R                  " 5         U R                  U5        U R                  / 5        S S S 5        U R                  W" 5       S 5        g ! , (       d  f       N&= fr*   )rS   r9   rl   rC   r   r   r.   r0   r   r   assertIsNotr   r   r   s       r   test_simple_resurrect,SimpleFinalizationTest.test_simple_resurrect   s    __!#Aa5'CQBJJL!!#&!!#&RT4(  "JJL!!#&!!"%  	bdD! s   CC88
Dc                    [         R                  5          [        5       nU R                  [        R
                  " U5      5        [        U5      /nA[        R                  " 5         U R                  U5        U R                  / 5        [        R                  " 5         U R                  U5        U R                  / 5        S S S 5        g ! , (       d  f       g = fr*   )
rS   r9   r\   assertFalser.   
is_trackedrC   r0   r   r   r=   r   r   s      r   test_non_gc"SimpleFinalizationTest.test_non_gc   s    __AR]]1-.a5'CJJL!!#&!!"%JJL!!#&!!"% s   B+C		
Cc                    [         R                  5          [        5       nU R                  [        R
                  " U5      5        [        U5      /nA[        R                  " 5         U R                  U5        U R                  U5        U R                  5         [        R                  " 5         U R                  US-  5        U R                  U5        S S S 5        g ! , (       d  f       g = fN   )rS   r9   r_   r   r.   r   rC   r0   r   r   r   r   s      r   test_non_gc_resurrect,SimpleFinalizationTest.test_non_gc_resurrect   s    __ "AR]]1-.a5'CJJL!!#&!!#&  "JJL!!#'*!!#& s   B>C
C*r   N)r   r   r   r   rM   r   r   r%   cpython_onlyr   r   r   r   r   r   r   r      sE    &"  & & ' 'r   r   c                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )SelfCycleBase   c                 .   > [         TU ]  5         X l        g r*   )superrW   r   r=   	__class__s    r   rW   SelfCycleBase.__init__   s    r   c                 D   > [         TU ]  5         U R                  U L d   eg r*   )r   r>   r   r   s    r   r>   SelfCycleBase.check_sanity   s     xx4r   r   )r   r   r   r   rW   r>   r   __classcell__r   s   @r   r   r      s       r   r   c                       \ rS rSrSrg)SimpleSelfCycle   r   Nri   r   r   r   r   r      rj   r   r   c                       \ rS rSrSrg)SelfCycleResurrector   r   Nri   r   r   r   r   r      rj   r   r   c                       \ rS rSrS rSrg)SuicidalSelfCycle   c                     SU l         g)'
Explicitly break the reference cycle.
Nr   r<   s    r   rD   SuicidalSelfCycle.side_effect   s     r   r   Nrp   r   r   r   r   r      s    r   r   c                   *    \ rS rSrSrS rS rS rSrg)SelfCycleFinalizationTest   zL
Test finalization of an object having a single cyclic reference to
itself.
c                    [         R                  5          [        5       n[        U5      /n[        R
                  " U5      nA[        R                  " 5         U R                  U5        U R                  / 5        U R                  U" 5       S 5        [        R                  " 5         U R                  U5        U R                  / 5        S S S 5        g ! , (       d  f       g = fr*   )rS   r9   r   rC   r   r   r.   r0   r   r   r   r   s       r   r   %SelfCycleFinalizationTest.test_simple  s    __!Aa5'CQBJJL!!#&!!"%MM"$%JJL!!#&!!"% r   c                    [         R                  5          [        5       n[        U5      /n[        R
                  " U5      nA[        R                  " 5         U R                  U5        U R                  U5        U R                  U" 5       S 5        U R                  5         [        R                  " 5         U R                  U5        U R                  / 5        U R                  U" 5       S 5        S S S 5        g ! , (       d  f       g = fr*   )rS   r9   r   rC   r   r   r.   r0   r   r   r   r   r   s       r   r   /SelfCycleFinalizationTest.test_simple_resurrect  s    __$&Aa5'CQBJJL!!#&!!#&MM"$%   "JJL!!#&!!"%MM"$%! s   CC88
Dc                    [         R                  5          [        5       n[        U5      /n[        R
                  " U5      nA[        R                  " 5         U R                  U5        U R                  / 5        U R                  U" 5       S 5        [        R                  " 5         U R                  U5        U R                  / 5        U R                  U" 5       S 5        S S S 5        g ! , (       d  f       g = fr*   )rS   r9   r   rC   r   r   r.   r0   r   r   r   r   s       r   test_simple_suicide-SelfCycleFinalizationTest.test_simple_suicide%  s     __!#Aa5'CQBJJL!!#&!!"%MM"$%JJL!!#&!!"%MM"$% s   C
C((
C6r   N)	r   r   r   r   rM   r   r   r   r   r   r   r   r   r      s    
&&(&r   r   c                   .   ^  \ rS rSrS rU 4S jrSrU =r$ )ChainedBasei7  c                 *    SU l         Xl        Xl        g )NFsuicidedleftright)r=   r   s     r   chainChainedBase.chain9  s    	
r   c                 z  > [         TU ]  5         U R                  (       a  U R                  b   eU R                  b   eg U R                  nUR                  (       a  UR                  b   eOUR                  U L d   eU R                  nUR                  (       a  UR                  b   eg UR                  U L d   eg r*   )r   r>   r   r   r   )r=   r   r   r   s      r   r>   ChainedBase.check_sanity>  s    ==99$$$::%%%99D}}zz)))zzT)))JJE~~zz)))zzT)))r   )r   r   )r   r   r   r   r   r>   r   r   r   s   @r   r   r   7  s    
* *r   r   c                       \ rS rSrSrg)SimpleChainediO  r   Nri   r   r   r   r   r   O  rj   r   r   c                       \ rS rSrSrg)ChainedResurrectoriR  r   Nri   r   r   r   r   r   R  rj   r   r   c                       \ rS rSrS rSrg)SuicidalChainediU  c                 .    SU l         SU l        SU l        g)r   TNr   r<   s    r   rD   SuicidalChained.side_effectW  s     	
r   )r   r   r   Nrp   r   r   r   r   r   U  s    r   r   c                   Z    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)CycleChainFinalizationTesti`  z
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                     U Vs/ s H	  o"" 5       PM     nn[        [        U5      5       H  nX4   R                  X4S-
     5        M     U$ s  snf )N   )rangelenr   )r=   classesr   nodesis        r   build_chain&CycleChainFinalizationTest.build_chaing  sI    ")*'3'*s5z"AHNN51:& # +s   Ac                 J   [        U5      n[        R                  5          U R                  U5      nU Vs/ s H  n[	        U5      PM     nnU Vs/ s H  n[
        R                  " U5      PM     nnA[        R                  " 5         U R                  U5        U R                  / 5        U R                  U Vs/ s H	  ow" 5       PM     snS /U-  5        [        R                  " 5         U R                  U5        S S S 5        g s  snf s  snf s  snf ! , (       d  f       g = fr*   )r   rS   r9   r   rC   r   r   r.   r0   r   r   ry   )r=   r   Nr   r   r   wrsr   s           r   check_non_resurrecting_chain7CycleChainFinalizationTest.check_non_resurrecting_chainm  s    L__$$W-E"'(%Q2a5%C(+015a7;;q>5C1JJL!!#&!!"%S1SrbdS1D6A:>JJL!!#& (1
 2 s5   DDD D
1A	D:D

2DD
D"c                    [        U5      n[        R                  5          U R                  U5      n[        U5      nU Vs/ s H  n[	        U5      PM     nnU Vs/ s H%  n[        U[        5      (       d  M  [	        U5      PM'     nnU Vs/ s H  n[        R                  " U5      PM     nnA[        R                  " 5         U R                  U5        U R                  U5        U R                  U Vs/ s H	  o" 5       PM     snS /U-  5        U R                  5         [        R                  " 5         U R                  U5        U R                  / 5        S S S 5        g s  snf s  snf s  snf s  snf ! , (       d  f       g = fr*   )r   rS   r9   r   rC   
isinstancerl   r   r   r.   r0   r   r   ry   r   )	r=   r   r   r   r   r   survivor_idsr   r   s	            r   check_resurrecting_chain3CycleChainFinalizationTest.check_resurrecting_chain{  s'   L__$$W-EE
A"'(%Q2a5%C(+0U5aJqBS4TEBqE5LU+015a7;;q>5C1JJL!!#&!!,/S1SrbdS1D6A:>  "JJL!!#&!!"%  )U1 2 sI   !E7E#E7E(9E(E7 E-.A	E77E2
AE7#E77
Fc                 6    U R                  [        /S-  5        g N   )r   r   r<   s    r   test_homogenous*CycleChainFinalizationTest.test_homogenous  s    ))=/A*=>r   c                 6    U R                  [        /S-  5        g r  )r   r   r<   s    r   test_homogenous_resurrect4CycleChainFinalizationTest.test_homogenous_resurrect  s    %%'9&:Q&>?r   c                 6    U R                  [        /S-  5        g r  )r   r   r<   s    r   test_homogenous_suicidal3CycleChainFinalizationTest.test_homogenous_suicidal  s    ))?*;a*?@r   c                 @    U R                  [        [        /S-  5        g r   r   r   r   r<   s    r   test_heterogenous_suicidal_one9CycleChainFinalizationTest.test_heterogenous_suicidal_one  s    ))?M*JQ*NOr   c                 L    U R                  [        /S-  [        /S-  -   5        g r   r  r<   s    r   test_heterogenous_suicidal_two9CycleChainFinalizationTest.test_heterogenous_suicidal_two  s'    ))!]Oa$77	9r   c                 @    U R                  [        [        /S-  5        g r   )r   r   r   r<   s    r   test_heterogenous_resurrect_one:CycleChainFinalizationTest.test_heterogenous_resurrect_one  s    %%'9=&IA&MNr   c                 J    U R                  [        [        [        /S-  5        g r   r   r   r   r   r<   s    r   test_heterogenous_resurrect_two:CycleChainFinalizationTest.test_heterogenous_resurrect_two  s     %%@1D	Fr   c                 b    U R                  [        /S-  [        /S-  -   [        /S-  -   5        g r   r  r<   s    r   !test_heterogenous_resurrect_three<CycleChainFinalizationTest.test_heterogenous_resurrect_three  s6    %% 1$'::o=NQR=RR	Tr   r   N)r   r   r   r   rM   r   r   r   r  r  r	  r  r  r  r  r  r   r   r   r   r   r   `  sD    '&&?@AP9OFTr   r   c                        \ rS rSrS rS rSrg)
LegacyBasei  c                      U R                   (       d5  U R                  R                  [        U 5      5        U R	                  5         g g ! [
         a%  nU R                  R                  U5         S nAg S nAff = fr*   )r8   r1   rB   rC   r>   rE   r-   rF   s     r   rH   LegacyBase.__del__  s^    	" >>%%bh/!!# "  	"KKq!!	"s   AA	 	
A8A33A8c                     U R                   (       dE  U R                  R                  [        U 5      5        U R	                  5         U R                  5         gg! [         a%  nU R                  R                  U5         SnAgSnAff = f)z:
Legacy (pre-PEP 442) finalizer, mapped to a tp_del slot.
N)r8   r2   rB   rC   r>   rD   rE   r-   rF   s     r   
__tp_del__LegacyBase.__tp_del__  sj    	">>!!((D2!!#  " "  	"KKq!!	"rJ   r   N)r   r   r   r   rH   r!  r   r   r   r   r  r    s    "
"r   r  c                       \ rS rSrSrg)Legacyi  r   Nri   r   r   r   r$  r$        r   r$  c                       \ rS rSrS rSrg)LegacyResurrectori  c                 :    U R                   R                  U 5        grb   rc   r<   s    r   rD   LegacyResurrector.side_effect  re   r   r   Nrp   r   r   r   r'  r'    s    $r   r'  c                       \ rS rSrSrg)LegacySelfCyclei  r   Nri   r   r   r   r+  r+    r%  r   r+  c                   >   ^  \ rS rSrSrU 4S jrS rS rS rSr	U =r
$ )LegacyFinalizationTesti  z-
Test finalization of objects with a tp_del.
c                    > [         R                  R                  5         [         R                  " 5         [        TU ]  5         g r*   )r.   r/   r,   r0   r   rz   r   s    r   rz   LegacyFinalizationTest.tearDown  s)     	




r   c                    [         R                  5          [        5       n[        U5      /n[        R
                  " U5      nA[        R                  " 5         U R                  U5        U R                  U5        U R                  / 5        U R                  U" 5       S 5        [        R                  " 5         U R                  U5        U R                  U5        S S S 5        g ! , (       d  f       g = fr*   )rS   r9   r$  rC   r   r   r.   r0   r   r   r   r   r   s       r   test_legacy"LegacyFinalizationTest.test_legacy  s    __Aa5'CQBJJL!!#&$$S)!!"%MM"$%JJL!!#&$$S) s   CC""
C0c                 \   [         R                  5          [        5       n[        U5      /n[        R
                  " U5      nA[        R                  " 5         U R                  U5        U R                  U5        U R                  U5        U R                  U" 5       S 5        U R                  5         [        R                  " 5         U R                  U5        U R                  US-  5        U R                  U5        S S S 5        U R                  W" 5       S 5        g ! , (       d  f       N&= fr   )rS   r9   r'  rC   r   r   r.   r0   r   r   r   r   r   r   s       r   test_legacy_resurrect,LegacyFinalizationTest.test_legacy_resurrect  s    __!#Aa5'CQBJJL!!#&$$S)!!#&MM"$%  "JJL!!#&$$S1W-!!#&   	bdD!! s   C(D
D+c                    [         R                  5          [        5       n[        U5      /n[        R
                  " U5      nA[        R                  " 5         U R                  / 5        U R                  / 5        U R                  / 5        U R                  U5        U R                  U" 5       S 5        S [        R                  S   l        S S S 5        U R                  / 5        U R                  W" 5       S 5        g ! , (       d  f       N7= f)Nr   )rS   r9   r+  rC   r   r   r.   r0   r   r   r   r   r   r/   r   r   s       r   test_legacy_self_cycle-LegacyFinalizationTest.test_legacy_self_cycle  s    __!Aa5'CQBJJL!!"%$$R(!!"%$RT4( $BJJqM  	BbdD! s   B6C<<
D
r   )r   r   r   r   rM   rz   r1  r4  r7  r   r   r   s   @r   r-  r-    s!    *"&" "r   r-  __main__)&rM   rP   r.   r
   r   	_testcapir   ImportErrorr   r9   r%   r'   rS   r\   r_   rg   rl   rr   TestCaser   r   r   r   r   r   r   r   r   r   r   r  r$  r'  r+  r   r-  r   mainr   r   r   <module>r>     s    	  %$ ? ?D$ $ O   $ $ $	Z 	$
 $% %<>'Xx'8'8 >'B   	mV 		=*; 	v 7&(*;*; 7&t* *0	K 		&7 	k6 GT8+<+< GTZ" "0 	Z 	 	 $
 $ $ 	mZ 	 	 	>"Xx'8'8 >" >"B zMMO [    s"   F F$ 	F! F!$	F10F1