
    Vh:                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
mZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ  G d d	e      Z G d
 dej.                        Z G d dej.                        Z G d de      Z G d dee      Z G d de      Z G d dej:                        Z G d de      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z#d3d Z$ ej                  e"e$        G d! d"      Z% G d# d$      Z&d4d%Z' G d& d'e      Z( G d( d)e      Z) G d* d+      Z* G d, d-      Z+e
ed.e,f      Z- G d/ d0e      Z. G d1 d2e      Z/eee(gZ0y)5    )annotationsN)AnyCallableListTuple)NoReturn)aotcrefutilstyles)unittest)TestCasec                  ,    e Zd ZddZddZddZddZy)VersionTestsc                     G d d      a t        j                  t                     } G d dt        j                        a t        j
                  |      }t        j                          |j                  sJ d       y )Nc                      e Zd ZddZy)NullVersionedc                    d| _         y )Nr   okselfs    K/home/dcms/DCMS/lib/python3.12/site-packages/twisted/test/test_persisted.py__init__zNullVersioned.__init__   	        NreturnNone__name__
__module____qualname__r    r   r   r   r      s    r   r   c                      e Zd ZdZddZy)r      c                    d| _         y Nr%   r   r   s    r   upgradeToVersion1zNullVersioned.upgradeToVersion1"   r   r   Nr   )r    r!   r"   persistenceVersionr(   r#   r   r   r   r      s    !"r   zinitial upgrade not run!)r   pickledumpsr   	Versionedloads	doUpgrader   )r   pkclmnvs      r   test_nullVersionUpgradez$VersionTests.test_nullVersionUpgrade   s^    	 	 ||MO,	F,, 	 ll4 vv111vr   c                :    G d dt         j                        at               }|j                  s|j                  rJ d       t        j                  |      }dt        _        t        j                  |      }t        j                          |j                  sJ d       |j                  sJ d       t        j                  |      }t        j                  |      }t        j                          |j                  dk(  sJ d       |j                  dk(  sJ d       y )	Nc                  6    e Zd ZdZdgZdZdZddZddZddZ	y)	MyVersioned   garbagedatar   c                "    d| _         d | _        y )Nxxxc                     y)Nzcant persistr#   )qs    r   <lambda>z&MyVersioned.__init__.<locals>.<lambda>5   s    r   )somedatar6   r   s    r   r   zMyVersioned.__init__3   s     %#; r   c                .    | xj                   dz  c_         y r'   )v3r   s    r   upgradeToVersion3zMyVersioned.upgradeToVersion37       1r   c                .    | xj                   dz  c_         y r'   )v4r   s    r   upgradeToVersion4zMyVersioned.upgradeToVersion4:   r@   r   Nr   )
r    r!   r"   r)   persistenceForgetsr>   rB   r   r?   rC   r#   r   r   r4   r4   ,   s)    !""/BB<r   r4   zhasn't been upgraded yet   zdidn't do version 3 upgradezdidn't do version 4 upgrader%   zupgraded unnecessarily)
r   r,   r4   r>   rB   r*   r+   r)   r-   r.   )r   mvpicklobjs       r   test_versionUpgradez VersionTests.test_versionUpgrade)   s    	&** 	" ]EERUU?%??#R )*&ll5!vv444vvv444vS!ll5!vv{444{vv{444{r   c                    G d dt         j                        at        dd      }t        dd      }t        j                  ||f      }~~dt        _        d t        _        t        j                  |      \  }}t        j                          | j                  |j                  d       | j                  |j                  d       | j                  |j                         | j                  |j                         y )Nc                      e Zd ZddZddZy)ClassWithCustomHashc                     || _         || _        y N)uniquehash)r   rO   rP   s      r   r   zClassWithCustomHash.__init__O   s    $ 	r   c                    | j                   S rN   )rP   r   s    r   __hash__zClassWithCustomHash.__hash__S   s    yy r   N)rO   strrP   intr   r   r   rT   )r    r!   r"   r   rR   r#   r   r   rL   rL   N   s    !!r   rL   v1r   v2r%   c                    t        | dd      S NupgradedTsetattrr   s    r   r;   z3VersionTests.test_nonIdentityHash.<locals>.<lambda>\   s    W*d>
 r   )r   r,   rL   r*   r+   r)   r(   r-   r.   assertEqualrO   
assertTruerZ   )r   rV   rW   pkls       r   test_nonIdentityHashz!VersionTests.test_nonIdentityHashK   s    	!&"2"2 	! !q) q)llB8$12.1
- c"BD)D)$$r   c                    G d dt         j                        a G d dt         j                        at               }t               }t	        j
                  |      t	        j
                  |      c}~~dt        _        dfd}|t        _        dt        _        d	d}|t        _        t	        j                  |      }t        j                          | j                  |j                  j                         y )
Nc                      e Zd Zy)	ToyClassANr    r!   r"   r#   r   r   rc   rc   i       r   rc   c                      e Zd Zy)	ToyClassBNrd   r#   r   r   rg   rg   l   re   r   rg   r%   c                b    t        j                        | _        t        j                          y rN   )r*   r-   yr   r.   )r   pklBs    r   r(   zWVersionTests.test_upgradeDeserializesObjectsRequiringUpgrade.<locals>.upgradeToVersion1u   s    \\$'DFr   c                    t        | dd       y rY   r[   r   s    r   setUpgradedzQVersionTests.test_upgradeDeserializesObjectsRequiringUpgrade.<locals>.setUpgraded|   s    D*d+r   )r   r   r   r   )r   objectr   r   )r   r,   rc   rg   r*   r+   r)   r(   r-   r.   r^   ri   rZ   )r   xri   pklAr(   rl   rj   s         @r   /test_upgradeDeserializesObjectsRequiringUpgradez<VersionTests.test_upgradeDeserializesObjectsRequiringUpgradef   s    	(( 		(( 	 KK\\!_fll1o
dq'(	$	 '8	#'(	$	, '2	#LL%r   Nr   )r    r!   r"   r1   rI   r`   rp   r#   r   r   r   r      s    2& 5D%6&r   r   c                      e Zd Zy)VersionedSubClassNrd   r#   r   r   rr   rr          r   rr   c                      e Zd Zy)SecondVersionedSubClassNrd   r#   r   r   ru   ru      rs   r   ru   c                      e Zd Zy)VersionedSubSubClassNrd   r#   r   r   rw   rw      rs   r   rw   c                      e Zd Zy)VersionedDiamondSubClassNrd   r#   r   r   ry   ry      rs   r   ry   c                  0    e Zd ZdZddZddZddZddZy)AybabtuTestsz
    L{styles._aybabtu} gets all of classes in the inheritance hierarchy of its
    argument that are strictly between L{Versioned} and the class itself.
    c                j    | j                  t        j                  t        j                        g        y)zM
        L{styles._aybabtu} of L{Versioned} itself is an empty list.
        N)r]   r   _aybabtur,   r   s    r   test_aybabtuStrictEmptyz$AybabtuTests.test_aybabtuStrictEmpty   s#     	)9)9:B?r   c                V    | j                  t        j                  t              g        y)z
        There are no classes I{between} L{VersionedSubClass} and L{Versioned},
        so L{styles._aybabtu} returns an empty list.
        N)r]   r   r}   rr   r   s    r   test_aybabtuStrictSubclassz'AybabtuTests.test_aybabtuStrictSubclass   s    
 	):;R@r   c                `    | j                  t        j                  t              t        g       y)z
        With a sub-sub-class of L{Versioned}, L{styles._aybabtu} returns a list
        containing the intervening subclass.
        N)r]   r   r}   rw   rr   r   s    r   test_aybabtuSubsubclassz$AybabtuTests.test_aybabtuSubsubclass   s"    
 	)=>AR@STr   c                t    | j                  t        j                  t              t        t
        t        g       y)z
        For a diamond-shaped inheritance graph, L{styles._aybabtu} returns a
        list containing I{both} intermediate subclasses.
        N)r]   r   r}   ry   rw   rr   ru   r   s    r   test_aybabtuStrictzAybabtuTests.test_aybabtuStrict   s+    
 	OO45!#46MN	
r   Nr   )r    r!   r"   __doc__r~   r   r   r   r#   r   r   r{   r{      s    
@AU
r   r{   c                      e Zd ZddZy)MyEphemeralc                    || _         y rN   rn   r   rn   s     r   r   zMyEphemeral.__init__   	    r   Nrn   rT   r   r   r   r#   r   r   r   r      s    r   r   c                      e Zd ZddZy)EphemeralTestsc                p   t        d      }| j                  |j                  t                | j                  |j                  d       t	        j
                  |      }t	        j                  |      }| j                  |j                  t        j                         | j                  t        |d             y )N   rn   )r   r]   	__class__rn   r*   r+   r-   r   	EphemeralassertFalsehasattr)r   orG   s      r   test_ephemeralzEphemeralTests.test_ephemeral   s|    Nk2a QLLf&6&67C)r   Nr   )r    r!   r"   r   r#   r   r   r   r      s    	*r   r   c                      e Zd ZddZddZy)
Pickleablec                    || _         y rN   r   r   s     r   r   zPickleable.__init__   r   r   c                    | j                   S rN   r   r   s    r   getXzPickleable.getX   s    vvr   Nr   rU   )r    r!   r"   r   r   r#   r   r   r   r      s    r   r   c                      e Zd ZdZddZy)NotPickleablez)
    A class that is not pickleable.
    c                    t        d      )z9
        Raise an exception instead of pickling.
        zNot serializable.)	TypeErrorr   s    r   
__reduce__zNotPickleable.__reduce__   s     +,,r   Nr   r   )r    r!   r"   r   r   r#   r   r   r   r      s    -r   r   c                      e Zd ZdZddZy)CopyRegisteredzb
    A class that is pickleable only because it is registered with the
    C{copyreg} module.
    c                "    t               | _        y)zE
        Ensure that this object is normally not pickleable.
        N)r   notPickleabler   s    r   r   zCopyRegistered.__init__   s     +_r   Nr   )r    r!   r"   r   r   r#   r   r   r   r      s    
-r   r   c                      e Zd ZdZy)CopyRegisteredLoadedz2
    L{CopyRegistered} after unserialization.
    N)r    r!   r"   r   r#   r   r   r   r      s    r   r   c                    t         dfS )z
    Externally implement C{__reduce__} for L{CopyRegistered}.

    @param cr: The L{CopyRegistered} instance.

    @return: a 2-tuple of callable and argument list, in this case
        L{CopyRegisteredLoaded} and no arguments.
    r#   )r   )crs    r   reduceCopyRegisteredr      s      ##r   c                  $    e Zd ZU dZded<   ddZy)A
    dummy class
    zCallable[[], None]bmethodc                     y rN   r#   r   s    r   amethodz	A.amethod
      r   Nr   )r    r!   r"   r   __annotations__r   r#   r   r   r   r     s      r   r   c                  $    e Zd ZU dZded<   ddZy)Br   r   ac                     y rN   r#   r   s    r   r   z	B.bmethod  r   r   Nr   )r    r!   r"   r   r   r   r#   r   r   r   r     s     	Dr   r   c                      y rN   r#   r#   r   r   funktionr     s    r   c                       e Zd ZdZddZddZy)PicklingTestsz$Test pickling of extra object types.c                    t        j                  t              }t        j                  |      }| j	                  |t               y rN   )r*   r+   r   r-   r]   )r   rG   r   s      r   test_modulezPicklingTests.test_module   s.    V$LLF#r   c                   t        d      }t        j                  |j                        }t        j                  |      }| j                   |       d       | j                  t        |      t        |j                               y )NrE   )r   r*   r+   r   r-   r]   type)r   rH   rG   r   s       r   test_instanceMethodz!PicklingTests.test_instanceMethod%  sY    mSXX&LLa a$sxx.1r   Nr   )r    r!   r"   r   r   r   r#   r   r   r   r     s    .$
2r   r   c                      e Zd ZdZddZy)StringIOTransitionTestsz
    When pickling a cStringIO in Python 2, it should unpickle as a BytesIO or a
    StringIO in Python 3, depending on the type of its contents.
    c                    d}t        j                  |      }| j                  |t        j                         | j                  |j                         d       y)zg
        A cStringIO pickled with bytes in it will yield an L{io.BytesIO} on
        python 3.
        sE   ctwisted.persisted.styles
unpickleStringI
p0
(S'test'
p1
I0
tp2
Rp3
.testN)r*   r-   assertIsInstanceioStringIOr]   getvalue)r   pickledStringIWithTextloadeds      r   test_unpickleBytesIOz,StringIOTransitionTests.test_unpickleBytesIO3  sH    - 	 45fbkk2*F3r   Nr   )r    r!   r"   r   r   r#   r   r   r   r   -  s    
4r   r   c                  4    e Zd ZU d ed<   d ed<   ded<   ddZy)EvilSourcerorr   brm   cc                j    | | _         | | j                   _        || j                   j                  _        y rN   )r   r   r   r   s     r   r   zEvilSourceror.__init__F  s#    
r   N)rn   rm   r   r   )r    r!   r"   r   r   r#   r   r   r   r   A  s    Ir   r   c                  (    e Zd ZU ded<   ddZddZy)NonDictStaterS   statec                    | j                   S rN   r   r   s    r   __getstate__zNonDictState.__getstate__O  s    zzr   c                    || _         y rN   r   )r   r   s     r   __setstate__zNonDictState.__setstate__R  s	    
r   N)r   rS   )r   rS   r   r   )r    r!   r"   r   r   r   r#   r   r   r   r   L  s    Jr   r   _CircularTupleTypec                  \    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y)AOTTestsc           
         ddddt        ddd      ddt        j                  dz   d t        f
}t	        j
                  t	        j                  |            }| j                  ||       y )	Nr%   g       @y              @Tr5   r   helloworld)slicesysmaxsizeEllipsisr	   unjellyFromSourcejellyToSourcer]   )r   rH   rtObjs      r   test_simpleTypeszAOTTests.test_simpleTypesZ  sd    !QNKK!O
 %%c&7&7&<=e$r   c                X   t               }t               }|j                  |_        ||_        t	        j
                  t	        j                  |            j                  j                  }| j                  t	        j                  |      j                  t	        j                  |             y rN   )r   r   r   r   r	   r   r   r]   _selfOfMethodr   _classOfMethod)r   r   r   im_s       r   test_methodSelfIdentityz AOTTests.test_methodSelfIdentityj  su    CCII	##C$5$5a$89;;CC**3/993;M;Mc;RSr   c                0   t               }t               }|j                  |_        ||_        t        j                  }t        `	 | j	                  t
        t        j                  t        j                  |             |t        _        y# |t        _        w xY w)z
        If a class change after an instance has been created,
        L{aot.unjellyFromSource} shoud raise a C{TypeError} when trying to
        unjelly the instance.
        N)	r   r   r   r   assertRaisesr   r	   r   r   )r   r   r   savedbmethods       r   test_methodNotSelfIdentityz#AOTTests.test_methodNotSelfIdentityr  sj     CCII	yyI	%i)>)>@Q@QRS@TU$AIAIs   8B Bc                l     G d d      }| j                  t        t        j                   |              y)z
        L{aot.jellyToSource} should raise a C{TypeError} when trying to jelly
        an unknown type without a C{__dict__} property or C{__getstate__}
        method.
        c                  0    e Zd Zedd       Zedd       Zy)2AOTTests.test_unsupportedType.<locals>.UnknownTypec                    t               rN   AttributeErrorr   s    r   __dict__z;AOTTests.test_unsupportedType.<locals>.UnknownType.__dict__      $&&r   c                    t               rN   r   r   s    r   r   z?AOTTests.test_unsupportedType.<locals>.UnknownType.__getstate__  r   r   Nr   )r    r!   r"   propertyr   r   r#   r   r   UnknownTyper     s(    ' ' ' 'r   r   N)r   r   r	   r   )r   r   s     r   test_unsupportedTypezAOTTests.test_unsupportedType  s(    	' 	' 	)S%6%6Fr   c                   t        j                         j                  }d|d}dddddddd	d	z  t        t         j                  |t        g}t        |      }|j                  |       |j                  |       |j                  |       t        j                  t        j                  ||g            }|d
   |d   u sJ |d   d
d |d
d k(  sJ y )Nr   )r   methodr%   r5   r   zhe	llo

"x world!u   goodbye 
	တ world!g      ?d   r      )	r	   
AOTJellier	jellyToAOr   r   tupleappendr   r   )r   ajdltujs         r   test_basicIdentityzAOTTests.test_basicIdentity  s     ^^'',"'HNN
 !H			""3#4#4aV#<=!u1~~!uQqzQqV###r   c                    t               }d|_        t        j                  t        j                  |            j                  |j                  k(  sJ y )Nz	meringue!)r   r   r	   r   r   )r   r   s     r   test_nonDictStatezAOTTests.test_nonDictState  s>    N$$S%6%6q%9:@@AGGKKKr   c                    t        j                  t        j                  t                           }| j	                  |t
               y)z
        L{aot.jellyToSource} and L{aot.unjellyFromSource} honor functions
        registered in the pickle copy registry.
        N)r	   r   r   r   r   r   )r   r  s     r   test_copyRegzAOTTests.test_copyReg  s3    
 ""3#4#4^5E#FGb"67r   c                0   t        t        g             }t        j                  |      }t        j                  |      }|j                  |u sJ |j                  j
                  |j
                  u sJ |j                  |j                  j                  usJ y rN   )r   r	   
jellyToAOTunjellyFromAOTr   r   r   )r   r   j1ojs       r   test_funkyReferenceszAOTTests.test_funkyReferences  sq    -+,^^A#ttrzzttvv~~tt24466!!!r   c                   g }|df}|j                  |       t        j                  |      }t        j                  |      }| j	                  |d   t
               | j                  |d   d   |       | j                  |d   d   d       y)zS
        L{aot.jellyToAOT} can persist circular references through tuples.
        i  r   r%   N)r  r	   r  r  r   r  assertIsr]   )r   r  r  r  r  s        r   test_circularTuplezAOTTests.test_circularTuple  s}     !#I	^^A#beU+beAh#Aq4(r   c                |    | j                  t        j                  ddg ii      t        j                  d             y)z:
        The generated serialization is indented.
        r   r   z|                app={
                  'hello':{
                    'world':[],
                    },
                  }N)r]   r	   r   textwrapdedentr   s    r   testIndentifyzAOTTests.testIndentify  s:     	w"67OO
	
r   Nr   )r    r!   r"   r   r   r   r   r  r
  r  r  r  r  r#   r   r   r   r   Y  s7    % T%"G$$6L
8")
r   r   c                  8    e Zd ZdZddZddZddZddZddZy)	CrefUtilTestsz 
    Tests for L{crefutil}.
    c                r    t        j                  i       }| j                  t        |j                  dd       y)zO
        L{crefutil._DictKeyAndValue} only support keys C{0} and C{1}.
        r5   r   N)r
   _DictKeyAndValuer   RuntimeError__setitem__r   r  s     r   test_dictUnknownKeyz!CrefUtilTests.test_dictUnknownKey  s,     %%b),q!<r   c                z    t        j                         }d|d<   | j                  t        |j                  dd       y)zI
        L{crefutil._Defer} can be assigned a key only one time.
        r%   r   N)r
   _Deferr   r  r  r   s     r   test_deferSetMultipleTimesz(CrefUtilTests.test_deferSetMultipleTimes  s1     OO!,q!<r   c                    t        j                  g dt              }| j                  t        |j
                  i d       y)z
        A L{crefutil._Container} where all of its elements are known at
        construction time is nonsensical and will result in errors in any call
        to addDependant.
        )r%   r5   r   z	ignore-meN)r
   
_Containerlistr   AssertionErroraddDependant)r   	containers     r   &test_containerWhereAllElementsAreKnownz4CrefUtilTests.test_containerWhereAllElementsAreKnown  s0     ''	48	.)*@*@"kRr   c                |    | j                  t        t               j                  t	        j
                         d       y)z
        If a dictionary key contains a circular reference (which is probably a
        bad practice anyway) it will be resolved by a
        L{crefutil._DictKeyAndValue}, not by placing a L{crefutil.NotKnown}
        into a dictionary key.
        valueN)r   r(  dictr  r
   NotKnownr   s    r   .test_dontPutCircularReferencesInDictionaryKeysz<CrefUtilTests.test_dontPutCircularReferencesInDictionaryKeys  s,     	DF..0A0A0CW	
r   c                    | j                  t        t        j                  dt        j                         t
                     y)z
        L{crefutil._InstanceMethod} raises L{AssertionError} to indicate it
        should not be called.  This should not be possible with any of its API
        clients, but is provided for helping to debug.
        no_nameN)r   r(  r
   _InstanceMethodr/  r   r   s    r   *test_dontCallInstanceMethodsThatArentReadyz8CrefUtilTests.test_dontCallInstanceMethodsThatArentReady  s0     	$$Y0A0A0CTJ	
r   Nr   )	r    r!   r"   r   r!  r$  r+  r0  r4  r#   r   r   r  r    s!    ==S	
	
r   r  )r   rm   r   z,tuple[type[CopyRegisteredLoaded], tuple[()]]r   )1
__future__r   copyregr   r*   r   r  typingr   r   r   r   typing_extensionsr   twisted.persistedr	   r
   r   twisted.trialr   twisted.trial.unittestr   r   r,   rr   ru   rw   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rT   r   r   r  	testCasesr#   r   r   <module>r=     st   #  	  
  - - & 4 3 " +n&8 n&b	(( 		f.. 		, 		35L 	"
8 "
J&"" 

*X 
* 	- 	-
- 
- 	$ ~3 4  	2H 2 4h 4(   % 4c 9:; H
x H
V1
H 1
h >=9	r   