o
    &hN                     @   s  d Z ddlZddlZddlZddlZddl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 ddlZdZejd Zze W n eyL   eZY nw ze W n ey\   e ZY nw ze! W n eyl   eZ!Y nw ze" W n ey|   e#Z"Y nw dd Z$ej%dd	 Z&g fd
dZ'dd Z(dd Z)dd Z*dd Z+dd Z,da-dd Z.dd Z/dd Z0dd Z1dd Z2d d! Z3d"d# Z4d$d% Z5d&d' Z6d(d) Z7e8d*Z9e:d+d, e;d-D Z<i Z=ej>e=ej?< ej@e=ejA< eB aCG d.d/ d/ejDZDejEZEejFZFejGZGejHZHd0d1 ZId2d3 ZJdS )4zu
Helper code for implementing unittests.

This module is unsupported and is primairily used in the PyObjC
testsuite.
    N)get_config_varFZPYOBJC_NO_AUTORELEASEc                 C   s(   | d u rd S |  dd dd ddS )Ns   _NSRects   CGRects   _NSPoints   CGPoints   _NSSizes   CGSize)replacetp r   n/Users/merlin/projects/employee-monitoring-system/venv/lib/python3.10/site-packages/PyObjCTools/TestSupport.py_typemap4   s   
r   c                  k   sz    i }z*| D ]}t tj|||< ttj|| |  qd V  W |D ]}ttj|||  q d S |D ]}ttj|||  q0w N)getattrobjcoptionssetattr)kwdsorigkr   r   r   pyobjc_options>   s   r   c                 C   s   | sZt d}td|}|du r| d dS |d}|dkr2tttt 	d}| | |S t
j|}|dd }|d	rI|dd
 }ttt|	d}| | |S | d S )zd
    Return the SDK version used to compile Python itself,
    or None if no framework was used
    CFLAGSz-isysroot\s+([^ ]*)(\s|$)N   /.   ur   )_get_config_var_researchappendgrouptuplemapint
os_releasesplit_ospathbasenameendswith)_cachecflagsmr%   resultZbnversionr   r   r   sdkForPythonM   s&   




r-   c                 C   s   t d| d S )zJ
    Decode four-character-code integer definition

    (e.g. 'abcd')
    z>ir   )_structunpack)vr   r   r   fourcck   s   r1   c                 C   (   | d@ } | d@ r|  d d@ } |  S | S )zx
    Cast value to 32bit integer

    Usage:
        cast_int(1 << 31) == -1

    (where as: 1 << 31 == 2147483648)
        l        r   r   valuer   r   r   cast_intt   s
   	r6   c                 C   r2   )zV
    Cast value to 64bit integer

    Usage:
        cast_longlong(1 << 63) == -1
        l            r   r   r4   r   r   r   cast_longlong   s
   r8   c                 C      | d@ } | S )zZ
    Cast value to 32bit integer

    Usage:
        cast_int(1 << 31) == 2147483648

    r3   r   r4   r   r   r   	cast_uint   s   r:   c                 C   r9   )z%
    Cast value to 64bit integer
    r7   r   r4   r   r   r   cast_ulonglong   s   r;   c                   C   s&   t durt S tddg  a t S )z<
    Returns the release of macOS (for example 10.5.1).
    NZsw_versz-productVersion)_os_release_subprocesscheck_outputdecodestripr   r   r   r   r"      s
   r"   c                    s    fdd}|S )z
    Usage::
        class Tests (unittest.TestCase):

            @arch_only("arm64")
            def testArm64(self):
                pass

    The test runs only when the specified architecture matches
    c                    s   t tj k  d| S )Nz only)	_unittest
skipUnlessr   archfunctionrC   r   r   	decorator   s   zarch_only.<locals>.decoratorr   )rC   rG   r   rF   r   	arch_only   s   rH   c                 C   s6   t tt| d}ttjdd |kd|  dS )z
    Usage::

        class Tests (unittest.TestCase):

            @min_python_release('3.2')
            def test_python_3_2(self):
                pass
    r   N   zRequires Python 	 or later)r   r    r!   r#   rA   rB   _sysversion_infor,   partsr   r   r   min_python_release   s   
rO   c                 C   sL   |  d}t|dkr|d t|dkrtd| tdd |D S )Nr   rI   0   zInvalid version: c                 s   s    | ]}t |V  qd S r	   )r!   .0xr   r   r   	<genexpr>       z_sort_key.<locals>.<genexpr>)r#   lenr   
ValueErrorr   rM   r   r   r   	_sort_key   s   

rY   c                 C   s   t | S )zD
    Return an object that can be used to compare two releases.
    )rY   releaser   r   r   os_level_key   s   r\   c                 C   s2   t jd t jd df}t|t| kd|  dS )z
    Usage::

        class Tests (unittest.TestCase):
            @min_sdk_level('10.6')
            def testSnowLeopardSDK(self):
                pass
    d   r   Requires build with SDK rJ   r   ZPyObjC_BUILD_RELEASErA   rB   r\   r[   r0   r   r   r   min_sdk_level      	ra   c                 C   s2   t jd t jd df}t|t| kd|  dS )z
    Usage::

        class Tests (unittest.TestCase):
            @max_sdk_level('10.5')
            def testUntilLeopardSDK(self):
                pass
    r]   r   r^   rJ   r_   r`   r   r   r   max_sdk_level   rb   rc   c                 C   s"   t tt t| kd|  dS )z
    Usage::

        class Tests (unittest.TestCase):

            @min_os_level('10.6')
            def testSnowLeopardCode(self):
                pass
    Requires macOS rJ   rA   rB   r\   r"   rZ   r   r   r   min_os_level  s   

rf   c                 C   s    t tt t| kd|  S )z
    Usage::

        class Tests (unittest.TestCase):

            @max_os_level('10.5')
            def testUntilLeopard(self):
                pass
    zRequires macOS up to re   rZ   r   r   r   max_os_level  s   
rg   c                 C   s:   t t| tt   kot|kn  d|  d| S )z
    Usage::

        class Tests (unittest.TestCase):

            @os_level_between('10.5', '10.8')
            def testUntilLeopard(self):
                pass
    rd   z up to re   )Zmin_releaseZmax_releaser   r   r   os_level_between,  s   
rh   ZNSAutoreleasePoolc                 c   s    | ]
}d |j v r|V  qdS )NSCFTypeN)__name__rS   clsr   r   r   rU   A  s    rU   r   c                       sP  e Zd ZdZdd Zdd Zd|ddZd	d
 Zdd Zd|ddZ	d|ddZ
d|ddZd|ddZd|ddZd|ddZd|ddZd|ddZd|ddZd|dd Zd|d!d"Zd|d#d$Zd|d%d&Zd|d'd(Zd|d)d*Zd|d+d,Zd|d-d.Zd|d/d0Zd|d1d2Zd|d3d4Zd|d5d6Zd|d7d8Zd|d9d:Zd|d;d<Z d|d=d>Z!d|d?d@Z"d|dAdBZ#d|dCdDZ$d|dEdFZ%d|dGdHZ&d|dIdJZ'd|dKdLZ(d|dMdNZ)d|dOdPZ*d|dQdRZ+d|dSdTZ,d|dUdVZ-d|dWdXZ.d|dYdZZ/d|d[d\Z0d|d]d^Z1d|d_d`Z2d|dadbZ3d|dcddZ4dedf Z5dgdh Z6didj Z7dkdl Z8	md}dndoZ9dpdq Z:drdsdtdudvZ;d~ fdxdy	Z<dzd{ Z=  Z>S )TestCasez
    A version of TestCase that wraps every test into its own
    autorelease pool.

    This also adds a number of useful assertion methods
    c                 C   s.   |  |tj | |j| | |j| d S r	   )assertIsInstance_typesGenericAliasZassertIs
__origin__assertEqual__args__)selfaliasZ	base_typeargsr   r   r   assertIsGenericAliasY  s   zTestCase.assertIsGenericAliasc                 C   s"   t |dr| | d d S d S )N__metadata__z has automatic bindingshasattrfail)rt   funcr   r   r   assertManualBinding^  s   
zTestCase.assertManualBindingNc                    s~   t  tjs| |p d t fddtD r%| |p# d  jD ]
}d|jv r2 d S q(| |p; d d S )Nz is not a CFTypeRef typec                 3   s    | ]}| u V  qd S r	   r   rR   r   r   r   rU   f  rV   z*TestCase.assertIsCFType.<locals>.<genexpr>z is not a unique CFTypeRef typeri   )
isinstancer   
objc_classr{   any	_nscftype	__bases__rj   )rt   r   messagerl   r   r   r   assertIsCFTypeb  s   

zTestCase.assertIsCFTypec                 C   s<   t |ds| |d |jtkr| |d d S d S )N__supertype__ is not a typing.NewTypez' is not a typing.NewType based on 'int')rz   r{   r   r!   )rt   r   r   r   r   assertIsEnumTypey  s
   

zTestCase.assertIsEnumTypec                 C   sB   t |ds| |d |j|kr| |d|j d S d S )Nr   r   z" is not a typing.NewType based on )rz   r{   r   rj   )rt   r   baser   r   r   assertIsTypedEnum  s
   

zTestCase.assertIsTypedEnumc                 C   sD   t |ds| |p|d t |ds | |p|d d S d S )NZ__pointer__z is not an opaque-pointerZ__typestr__ry   )rt   r   r   r   r   r   assertIsOpaquePointer  s
   

zTestCase.assertIsOpaquePointerc                 C   s8   |  }|di ds| |pd|d d S d S )Nretvalc_array_delimited_by_null
result of z is not a null-terminated arrayrx   getr{   rt   methodr   infor   r   r   assertResultIsNullTerminated  s   z%TestCase.assertResultIsNullTerminatedc                 C   s8   |  }|dr|ds| |pd|f  d S d S )Nr   variadiczF%s is not a variadic function with a null-terminated list of argumentsr   r   r   r   r   assertIsNullTerminated  s   zTestCase.assertIsNullTerminatedc                 C   sx  t |tjr	d}nd}| }|d ||  d}|dv r d S |tv r&d S |dr5|dd  tv r5d S |drD|dd  tv rDd S |d	rS|dd  tv rSd S |d
rb|dd  tv rbd S tt }t|a|tv rrd S |dr|dd  tv rd S |dr|dd  tv rd S |d	r|dd  tv rd S |d
r|dd  tv rd S | 	|pd|||f  d S )NrI   r   	argumentstype      @s   N^@s   o^@s   n^@s   ^@   ^r      o^   n^   N^z$argument %d of %r is not IDLike (%r))
r~   r   selectorrx   r   _idlike_cache
startswithset_idSignaturesr{   )rt   r   argnor   offsetr   r   tmpr   r   r   assertArgIsIDLike  s@   zTestCase.assertArgIsIDLikec                 C   s^  |  }|d d}|dv rd S |tv rd S |dr&|dd  tv r&d S |dr5|dd  tv r5d S |drD|dd  tv rDd S |d	rS|dd  tv rSd S tt }t|a|tv rcd S |drr|dd  tv rrd S |dr|dd  tv rd S |dr|dd  tv rd S |d	r|dd  tv rd S | |pd
|d|d d S )Nr   r   r   r   r   r   rI   r   r   r   z is not IDLike ())rx   r   r   r   r   r   r   r{   )rt   r   r   r   r   r   r   r   r   assertResultIsIDLike  s6    zTestCase.assertResultIsIDLikec              	   C      t |tjr	d}nd}| }z|d ||  ds)| |p$d||f  W d S W d S  ttfyB   | |p=d||f  Y d S w )NrI   r   r   r   z0argument %d of %r is not a null-terminated arrayr~   r   r   rx   r   r{   KeyError
IndexErrorrt   r   r   r   r   r   r   r   r   assertArgIsNullTerminated  &   


z"TestCase.assertArgIsNullTerminatedc              	   C   r   )NrI   r   r   c_array_of_variable_lengthz/argument %d of %r is not a variable sized arrayr   r   r   r   r   assertArgIsVariableSize  r   z TestCase.assertArgIsVariableSizec                 C   :   |  }|di dds| |pd|d d S d S )Nr   r   Fr   z is not a variable sized arrayr   r   r   r   r   assertResultIsVariableSize     z#TestCase.assertResultIsVariableSizec              	   C   r   )NrI   r   r   Zc_array_length_in_resultz.argument %d of %r does not have size in resultr   r   r   r   r   assertArgSizeInResult  r   zTestCase.assertArgSizeInResultc              	   C   s   t |tjr	d}nd}| }|ds| |p|d z|d ||  ds8| |p3d||f  W d S W d S  ttfyQ   | |pLd||f  Y d S w )NrI   r   r   z is not a variadic functionr   Zprintf_formatz,%r argument %d is not a printf format stringr   r   r   r   r   assertArgIsPrintf0  s&   




zTestCase.assertArgIsPrintfc              
   C      t |tjr	d}nd}| }z|d ||  d s+| |p&d| d|d W d S W d S  ttfyG   | |pBd| d|d Y d S w )NrI   r   r   already_cfretained	Argument  of  is not cfretainedr~   r   r   rx   r{   r   r   r   r   r   r   assertArgIsCFRetainedE  s   
"zTestCase.assertArgIsCFRetainedc              	   C   t   t |tjr	d}nd}| }z|d ||  d r+| |p&d| d|d W d S W d S  ttfy9   Y d S w )NrI   r   r   r   r   r    is cfretainedr   r   r   r   r   assertArgIsNotCFRetainedT     "z!TestCase.assertArgIsNotCFRetainedc                 C   s8   |  }|di dds| |p|d d S d S )Nr   r   Fr   r   r   r   r   r   assertResultIsCFRetained`  s   z!TestCase.assertResultIsCFRetainedc                 C   s8   |  }|di ddr| |p|d d S d S )Nr   r   Fr   r   r   r   r   r   assertResultIsNotCFRetainedf  s   z$TestCase.assertResultIsNotCFRetainedc              
   C   r   )NrI   r   r   already_retainedr   r    is not retainedr   r   r   r   r   assertArgIsRetainedk  s   ""zTestCase.assertArgIsRetainedc                 C   @   t |tjsd S | }|dds| |p|d d S d S )NinitializerFz is not an initializerr~   r   r   rx   r   r{   r   r   r   r   assertIsInitializerx     zTestCase.assertIsInitializerc                 C   @   t |tjsd S | }|ddr| |p|d d S d S )Nr   Fz is an initializerr   r   r   r   r   assertIsNotInitializer  r   zTestCase.assertIsNotInitializerc                 C   r   )Nfree_resultFz$ does not call free(3) on the resultr   r   r   r   r   assertDoesFreeResult  r   zTestCase.assertDoesFreeResultc                 C   r   )Nr   Fz calls free(3) on the resultr   r   r   r   r   assertDoesNotFreeResult  r   z TestCase.assertDoesNotFreeResultc              	   C   r   )NrI   r   r   r   r   r    is retainedr   r   r   r   r   assertArgIsNotRetained  r   zTestCase.assertArgIsNotRetainedc                 C   r   )Nr   r   F
Result of r   r   r   r   r   r   assertResultIsRetained  r   zTestCase.assertResultIsRetainedc                 C   s:   |  }|di ddr| |pd|d d S d S )Nr   r   Fr   r   r   r   r   r   r   assertResultIsNotRetained  r   z"TestCase.assertResultIsNotRetainedc                 C   sz   |  }|ddd}||kr7t|t|kr9t||t||kr;| |p3d|d|d| d S d S d S d S )Nr   r      vr   z is not of type z, but )rx   r   r   
_typealiasr{   )rt   r   r   r   r   typestrr   r   r   assertResultHasType  s   zTestCase.assertResultHasTypec           	   	   C   s   t |tjr	d}nd}| }z
|d ||  }W n ttfy/   | |p+d||f  Y nw |dd}||kr]t|t|kr_t	||t	||kra| |pYd||||f  d S d S d S d S )NrI   r   r   /arg %d of %s has no metadata (or doesn't exist)r   r   z&arg %d of %s is not of type %r, but %r)
r~   r   r   rx   r   r   r{   r   r   r   )	rt   r   r   r   r   r   r   ir   r   r   r   assertArgHasType  s2   

zTestCase.assertArgHasTypec              	   C   sr  t |tjr	d}nd}| }z
|d ||  }W n ttfy/   | |p+d||f  Y nw |dd}	|	dkrE| |pCd||f  |d	}
|
d u rY| |pWd||f  z|
d
 d }|
d D ]}||d 7 }qdW n ty   | |p~d||f  Y nw ||kr| |pd||||f  |d ||  dd}
t|
t|kr| |pd|||
|f  d S d S )NrI   r   r   r   r   r      ^?z,arg %d of %s is not of type function_pointercallabler   zCarg %d of %s is a function pointer with incomplete type informationz;arg %d of %s is not a function_pointer with type %r, but %rZcallable_retainedFz(arg %d of %s; retained: %r, expected: %r)	r~   r   r   rx   r   r   r{   r   bool)rt   r   r   sel_typeZretainedr   r   r   r   r   stifacear   r   r   assertArgIsFunction  sj   





zTestCase.assertArgIsFunctionc           
   	   C   s  |  }z|d }W n ttfy    | |pd| d Y nw |dd}|dkr6| |p4d| d |d}|d u rJ| |pHd| d z|d d }|d	 D ]}	||	d 7 }qUW n tyr   | |pnd
|f  Y nw ||kr| |pd|||f  d S d S )Nr   r   # has no metadata (or doesn't exist)r   r   r   z  is not of type function_pointerr   r   zCresult of %s is a function pointer with incomplete type informationz;result of %s is not a function_pointer with type %r, but %r)rx   r   r   r{   r   )
rt   r   r   r   r   r   r   r   r   r   r   r   r   assertResultIsFunction  sF   
zTestCase.assertResultIsFunctionc              	   C   sp  t |tjr	d}nd}| }z|d ||  d }W n ttfy/   | d||f  Y nw |dkr@| |p>d|||f  |d ||  d}|d u rZ| |pXd	||f  z5|d
 d }	|d d d dkr}| |p{d|||d d d f  |d dd  D ]}
|	|
d 7 }	qW n ty   | |pd|f  Y nw |	|kr| |pd||||	f  d S d S )NrI   r   r   r   zarg %d of %s does not exist   @?z%arg %d of %s is not of type block: %sr   z;arg %d of %s: no callable specified for the block signaturer      ^vz=arg %d of %s has an invalid block signature %r for argument 0r   @result of %s is a block pointer with incomplete type informationz0arg %d of %s is not a block with type %r, but %r)r~   r   r   rx   r   r   r{   r   )rt   r   r   r   r   r   r   r   r   r   r   r   r   r   assertArgIsBlock7  sd   
zTestCase.assertArgIsBlockc           	   	   C   sD  |  }z|d d }|dkr| |pd| d|  W n ty1   | |p-d|d Y nw |d d}|d u rF| |pDd	|  z4|d d }|d
 d d dkrh| |pfd||d
 d d f  |d
 dd  D ]}||d 7 }qpW n ty   | |pd|f  Y nw ||kr| |pd|||f  d S d S )Nr   r   r   r   z is not of type block: z%result of {} is not of type block: {}r   r   z;result of %s: no callable specified for the block signaturer   r   r   z:result %s has an invalid block signature %r for argument 0r   r   z0result of %s is not a block with type %r, but %r)rx   r{   r   formatr   )	rt   r   r   r   r   r   r   r   r   r   r   r   assertResultIsBlockh  sb   zTestCase.assertResultIsBlockc              	   C   s   |  }z|d }W n ttfy    | |pd| d Y nw |dd}|tjkr7| |p5d| d |d}||krVt|t|krX| |pRd|||f  d S d S d S )	Nr   r   r   r   r   z is not of type SELsel_of_typez,result of %s doesn't have sel_type %r but %r)rx   r   r   r{   r   r   _C_SELr   )rt   r   r   r   r   r   r   r   r   r   r   assertResultIsSEL  s(   

zTestCase.assertResultIsSELc           
   	   C   s   t |tjr	d}nd}| }z
|d ||  }W n ttfy/   | |p+d||f  Y nw |dd}|tjkrF| |pDd||f  |d}	|	|krft	|	t	|krh| |pbd	||||	f  d S d S d S )
NrI   r   r   r   r   r   zarg %d of %s is not of type SELr   z,arg %d of %s doesn't have sel_type %r but %r)
r~   r   r   rx   r   r   r{   r   r   r   )
rt   r   r   r   r   r   r   r   r   r   r   r   r   assertArgIsSEL  s0   



zTestCase.assertArgIsSELc                 C   sF   |  }|d d }|tjtjfvr!| |pd| d| d S d S )Nr   r   r   z is not of type BOOL, but )rx   r   	_C_NSBOOL_C_BOOLr{   )rt   r   r   r   r   r   r   r   assertResultIsBOOL  s   zTestCase.assertResultIsBOOLc                 C   sb   t |tjr	d}nd}| }|d ||  d }|tjtjfvr/| |p+d|||f  d S d S )NrI   r   r   r   z(arg %d of %s is not of type BOOL, but %r)r~   r   r   rx   r   r   r{   rt   r   r   r   r   r   r   r   r   r   assertArgIsBOOL  s   zTestCase.assertArgIsBOOLc              	   C   s   t |tjr	d}nd}| }z |d ||  d }||kr-| |p(d|||f  W d S W d S  ttfyG   | |pBd|||f  Y d S w )NrI   r   r   c_array_of_fixed_lengthz*arg %d of %s is not a C-array of length %dr   )rt   r   r   countr   r   r   cntr   r   r   assertArgIsFixedSize  s(   

zTestCase.assertArgIsFixedSizec              	   C   sn   |  }z|d d }||kr| |pd||f  W d S W d S  ttfy6   | |p1d||f  Y d S w )Nr   r   z*result of %s is not a C-array of length %d)rx   r{   r   r   )rt   r   r   r   r   r   r   r   r   assertResultIsFixedSize  s   



z TestCase.assertResultIsFixedSizec              	      s   t |tjr	d nd | }z|d |   d }W n ttfy2   | |p.d|||f  Y nw t |ttfrFt fdd|D }n|  }||kr\| |pXd|||f  d S d S )NrI   r   r   c_array_length_in_argz6arg %d of %s is not a C-array of with length in arg %sc                 3   s    | ]}|  V  qd S r	   r   rR   r   r   r   rU     rV   z.TestCase.assertArgSizeInArg.<locals>.<genexpr>)	r~   r   r   rx   r   r   r{   listr   )rt   r   r   r   r   r   r   Zcount2r   r   r   assertArgSizeInArg  s2   zTestCase.assertArgSizeInArgc                 C   sT   t |tjr	d}nd}| }|d d }||| kr(| |p$d||f  d S d S )NrI   r   r   r   z3result %s is not a C-array of with length in arg %d)r~   r   r   rx   r{   )rt   r   r   r   r   r   r   r   r   r   assertResultSizeInArg  s   zTestCase.assertResultSizeInArgc                 C   h   t |tjr	d}nd}| }|d ||  d }|ds0|ds2| |p,d||f  d S d S d S )NrI   r   r   r   r   s   o*z%arg %d of %s is not an 'out' argumentr~   r   r   rx   r   r{   r   r   r   r   assertArgIsOut%     zTestCase.assertArgIsOutc                 C   r   )NrI   r   r   r   r   s   N*z'arg %d of %s is not an 'inout' argumentr  r   r   r   r   assertArgIsInOut1  r  zTestCase.assertArgIsInOutc                 C   r   )NrI   r   r   r   r   s   n*z$arg %d of %s is not an 'in' argumentr  r   r   r   r   assertArgIsIn=  r  zTestCase.assertArgIsInc                 C   s*   | |s| |p|d| d S d S )Nz does not start with )r   r{   )rt   r5   testr   r   r   r   assertStartswithI     
zTestCase.assertStartswithc                 C   s*   t ||s| |p| d| d S d S )Nz is not an attribute of ry   rt   r5   keyr   r   r   r   assertHasAttrM  r  zTestCase.assertHasAttrc                 C   s*   t ||r| |p| d| d S d S )Nz is an attribute of ry   r	  r   r   r   assertNotHasAttrQ  r  zTestCase.assertNotHasAttrc                 C   s*   t ||s| |p| d| d S d S )Nz is not a subclass of 
issubclassr{   rt   r5   typesr   r   r   r   assertIsSubclassU  r  zTestCase.assertIsSubclassc                 C   s*   t ||r| |p| d| d S d S )Nz is a subclass of r  r  r   r   r   assertIsNotSubclassY  r  zTestCase.assertIsNotSubclassc                 C   s>   t |tjs| | d d S |js| | d d S d S )Nz is not an Objective-C classz is not a final class)r~   r   r   r{   Z__objc_final__)rt   rl   r   r   r   assertClassIsFinal]  s
   zTestCase.assertClassIsFinalc                 C   sp   d}zt |}W n t jy   d}Y nw |s!| d|d t|t js6| d|dt|  d S d S )NTFz	Protocol z does not existz is not a protocol, but )r   ZprotocolNamedProtocolErrorr{   r~   Zformal_protocolr   )rt   nameokprotor   r   r   assertProtocolExistsc  s   zTestCase.assertProtocolExistsc                 C   s\   zt |}t |}W n ty   | | d Y nw | || | |t| d S )Nz cannot be pickled)_pickledumpsloads	Exceptionr{   rr   rn   r   )rt   r5   bufcloner   r   r   assertPickleRoundTripsr  s   
zTestCase.assertPickleRoundTripsc                 C   s8   t dsdS dtjv rtjd rdS | t d dS )z
        Assert that the process is running in free-threaded mode when
        the interpreter was configured as such.
        ZPy_GIL_DISABLEDNZgilzGIL is enabled)r   rK   	_xoptionsZassertFalseZ_is_gil_enabled)rt   r   r   r   assertFreeThreadedIfConfigured|  s
   z'TestCase.assertFreeThreadedIfConfiguredFc              
      sB  	 | }t|d }d|d fgtt	|d  D ]\}  
ddr6 
ddr6| | d| d  d tjtj sI d tjro 
d	dr^| | d| d
|pZd  |so| | d| d|pkd   
dd }t |trd|  kr|k sn | | d| d| d|pd  nCt |tr|\}	}
d|	  kr|k sn | | d| d|	 d|pd  d|
  kr|k sn | | d| d|
 d|pd   d tfddtjtjtjfD rBdd  }|tjs|tjs| | d| d d|pd  |dd  }|tjrBt|\}}|sB| | d| d d|p>d  t |tjstjrdvrdkrdkrdd  tjrytdd  \}}|syq|dkrt fdddD rq| | d| dd|pd  qd S )NFr   r   r   r   z: z.: both already_retained and already_cfretainedr   r   z6: null-delimited 'char*', use _C_CHAR_AS_TEXT instead  z
: 'char*' c_array_size_in_argr   z#: c_array_size_in_arg out of range  c                 3   s    | ]}  |V  qd S r	   )r   )rS   pfxr   r   r   rU     s    

z5TestCase._validateCallableMetadata.<locals>.<genexpr>r   z": byref specifier on non-pointer: z*: byref to empty struct (handle/CFType?): )r   r   s)   ^{AudioBufferList=I[1{AudioBuffer=II^v}]}s   ^{_CFArrayCallBacks=q^?^?^?^?}c                 3   s    | ]}| v V  qd S r	   r   rR   )metar   r   rU     s
    
>   r   r#  r   Zderef_result_pointerr   z-: pointer argument, but no by-ref annotation:)r~   r   r   	signatureZ_C_PTRZ
_C_CHARPTRrx   rW   r   	enumerater   r{   r'   Z_C_CHRr!   r   r   Z_C_INZ_C_OUTZ_C_INOUTr   Z_C_STRUCT_BZsplitStructSignature)rt   r5   
class_nameskip_simple_charptr_checkr'  Zcallable_metaZargcountidxr0   berestr  fieldsr   )r&  r   r   _validateCallableMetadata  s   	










z"TestCase._validateCallableMetadatac                 C   s2   t |dr| |d | |j |j d S d S )N
__bundle____framework_identifier__)rz   r  rr   r1  ZbundleIdentifierr2  )rt   moduler   r   r   _validateBundleIdentifier  s   
z"TestCase._validateBundleIdentifierTr   )exclude_cocoaexclude_attrsc             
   C   s  |  d | | W d    n1 sw   Y  |r:zdd l}tt|}|dh8 }W n ty9   t }Y nw t }h d}t|}|d |d |d |d |d	 |d
 |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d t|tj	r	 ttt|}t|D ]\}
}||v rq||v rqzt||}W n	 ty   Y qw t|tjr|jd"krq|jj D ]E\}}||v rq||f|v rq|d#r$q| j ||d$ t|tjr<| j||| d% W d    n	1 sGw   Y  q|jj D ]L\}}||v r_qT||f|v rhqT|d#rpqT| j ||d$ t|j|d }t|tjr| j||| d% W d    n	1 sw   Y  qTqt|tjr| j |d& | | W d    n	1 sw   Y  qq|   d S )'Nzvalidate framework identifierr   NSObject>   >copyRenderedTextureForCGLContext_pixelFormat_bounds_isFlipped_)newTaggedNSStringWithASCIIBytes__length__utf8ValueSafe_utf8ValueSafeisKeyExcludedFromWebScript_ZFBSMutableSceneClientSettingsZFBSSceneClientSettings)ZNSColor'scn_C3DColorIgnoringColorSpace_success_)ZAVKitPlatformColorClassr=  )ZPDFKitPlatformColorr=  )ZSCNColorr=  )ZSKColorr=  )r7  r8  )r7  r9  )r7  r;  )r7  r:  )r7  r<  ZABCDContact_ABCDContact_ZABCDGroup_ABCDGroup_ZAudioHardwareClaimAudioDeviceIDZAudioHardwareClaimAudioStreamIDZ"AudioHardwareDevicePropertyChangedZAudioHardwareDevicesCreatedZAudioHardwareDevicesDiedZ"AudioHardwareStreamPropertyChangedZAudioHardwareStreamsCreatedZAudioHardwareStreamsDiedZAudioObjectCreateZAudioObjectPropertiesChangedZAudioObjectsPublishedAndDiedFc                 s   s,    | ]}|j d sd|j vr|j V  qdS )_r   N)rj   r   rk   r   r   r   rU   c  s    

z8TestCase.assertCallableMetadataIsSane.<locals>.<genexpr>r   ZObjectr>  )	classnameZinstance_method)r*  rD   ) ZsubTestr4  Cocoar   dirImportErroraddr~   r   ZObjCLazyModuleextendgetClassListZ_ObjCLazyModule__funcmap__dict__keysr   Z_ObjCLazyModule__parentspopsortedr(  r
   AttributeErrorr   rj   Zpyobjc_instanceMethodsitemsr   r   r0  Zpyobjc_classMethodsrE   r!  )rt   r3  r5  r6  r@  Zexclude_namesZexclude_method_namesZmodule_namestodoparentZ_idxnmr5   Z	attr_nameattrr   r   r   assertCallableMetadataIsSane  s   






	













z%TestCase.assertCallableMetadataIsSanerunTestc                    s6   t  | t| |}t|ddrd| _d S d| _d S )N_no_autorelease_poolFT)super__init__r
   _skip_usepool)rt   
methodNameZ
testMethod	__class__r   r   rT    s
   


zTestCase.__init__c                 O   s   zt d}W n
 t jy   Y nw |  tr"| js"t  }nd}zt	j
j| g|R i | W t  ~t  dS t  ~t  w )z{
        Run the test, same as unittest.TestCase.run, but every test is
        run with a fresh autorelease pool.
        ZNSApplicationr   N)r   lookUpClasserrorZsharedApplication_usepoolrU  
_poolclassZallocinitrA   rm   run_gcZcollect)rt   rv   r   rl   pr   r   r   r^    s"   

zTestCase.runr	   )NF)rQ  )?rj   
__module____qualname____doc__rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r!  r0  r4  rP  rT  r^  __classcell__r   r   rW  r   rm   K  s~    
	
	


	
,
&



















9
&
1
.
















f	 8
rm   c                 C   s   | rt S dd S )Nc                 S   s   | S r	   r   r|   r   r   r   <lambda>  s    z#expectedFailureIf.<locals>.<lambda>)expectedFailure)	conditionr   r   r   expectedFailureIf  s   ri  c                 C   s
   d| _ | S )NT)rR  re  r   r   r   no_autorelease_pool  s   rj  )Krc  
contextlibgcr_  osr$   rer   structr.   sysrK   ZunittestrA   
subprocessr=   pickler  r  ro   	sysconfigr   r   r   Z
__unittestenvironr   r[  unicode	NameErrorstrlongr!   
basestringunichrchrr   contextmanagerr   r-   r1   r6   r8   r:   r;   r<   r"   rH   rO   rY   r\   ra   rc   rf   rg   rh   rY  r\  r   rE  r   r   Z_C_LNGZ
_C_LNG_LNGZ_C_ULNGZ_C_ULNG_LNGr   r   rm   mainrg  rB   ZSkipTestri  rj  r   r   r   r   <module>   s    

	
         