o
    g%                    @   s  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
Z
d dlmZ d dlmZmZ dadZG dd dZG dd dZd	d
 Zdd ZG dd dZG dd dZG dd dejZejd*ddZG dd deZG dd deZG dd dejZG dd deZd dlm Z  G dd  d e j!Z"G d!d" d"e j!Z#G d#d$ d$ejZ$d%Z%d&e%iZ&d'd( Z'e(d)kre'  dS dS )+    N)support)script_helper	ALWAYS_EQZfoobarc                   @      e Zd Zdd ZdS )Cc                 C      d S N selfr	   r	   G/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/test/test_weakref.pymethod      zC.methodN)__name__
__module____qualname__r   r	   r	   r	   r   r          r   c                   @      e Zd ZdZdd ZdS )CallableNc                 C   
   || _ d S r   bar)r   xr	   r	   r   __call__      
zCallable.__call__)r   r   r   r   r   r	   r	   r	   r   r      s    r   c                  C   s   dd } | S )Nc                   S   r   r   r	   r	   r	   r	   r   f$       zcreate_function.<locals>.fr	   r   r	   r	   r   create_function#   s   r   c                   C   s   t  jS r   )r   r   r	   r	   r	   r   create_bound_method'      r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )Objectc                 C   r   r   arg)r   r#   r	   r	   r   __init__,   r   zObject.__init__c                 C   s
   d| j  S )Nz<Object %r>r"   r
   r	   r	   r   __repr__.   r   zObject.__repr__c                 C   s   t |tr| j|jkS tS r   
isinstancer!   r#   NotImplementedr   otherr	   r	   r   __eq__0      
zObject.__eq__c                 C   s   t |tr| j|jk S tS r   r&   r)   r	   r	   r   __lt__4   r,   zObject.__lt__c                 C   
   t | jS r   )hashr#   r
   r	   r	   r   __hash__8   r   zObject.__hash__c                 C      dS )N   r	   r
   r	   r	   r   some_method:   r   zObject.some_methodc                 C   r1   )N   r	   r
   r	   r	   r   other_method<   r   zObject.other_methodN)
r   r   r   r$   r%   r+   r-   r0   r3   r5   r	   r	   r	   r   r!   +   s    r!   c                   @   r   )RefCyclec                 C   s
   | | _ d S r   )cycler
   r	   r	   r   r$   A   r   zRefCycle.__init__Nr   r   r   r$   r	   r	   r	   r   r6   @   r   r6   c                   @      e Zd Zdd Zdd ZdS )TestBasec                 C   s
   d| _ d S Nr   cbcalledr
   r	   r	   r   setUpG   r   zTestBase.setUpc                 C   s   |  j d7  _ d S N   r<   )r   refr	   r	   r   callbackJ      zTestBase.callbackN)r   r   r   r>   rB   r	   r	   r	   r   r:   E   s    r:   -C6?c              	   #   s|    d fdd}t  & tj|d}|  zdV  W d|  nd|  w W d   dS 1 s7w   Y  dS )zR
    Ensure GC collections happen in a different thread, at a high frequency.
    Fc                      s"   st   t  rd S d S r   )timesleepgccollectr	   periodZplease_stopr	   r   rH   U   s   
z"collect_in_thread.<locals>.collect)targetNT)r   Z
disable_gc	threadingThreadstartjoin)rJ   rH   tr	   rI   r   collect_in_threadN   s   

"rQ   c                   @   s  e Zd Zdd Zdd Zej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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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z d9d: Z!d;d< Z"d=d> Z#d?d@ Z$dAdB Z%dCdD Z&dEdF Z'dGdH Z(dIdJ Z)dKdL Z*dMdN Z+dOdP Z,dQdR Z-dSdT Z.dUdV Z/dWdX Z0dYdZ Z1d[d\ Z2d]d^ Z3d_d` Z4dadb Z5dcdd Z6dedf Z7dgdh Z8didj Z9dkS )lReferencesTestCasec                 C   sD   |  t |  t |  t t }t|}t| ~t| d S r   )check_basic_refr   r   r   weakrefrA   repr)r   owrr	   r	   r   test_basic_reff   s   



z!ReferencesTestCase.test_basic_refc                 C   s"   |  t |  t |  t d S r   )check_basic_callbackr   r   r   r
   r	   r	   r   test_basic_callbackt   s   

z&ReferencesTestCase.test_basic_callbackc                 C   sR   dd l }|j}| }t|}| | | ~| |  | | | | d S r;   )	_testcapicreate_cfunctionrT   rA   assertIsassertIsNonerS   rY   )r   r[   r\   r   rW   r	   r	   r   test_cfunctiony   s   

z!ReferencesTestCase.test_cfunctionc                 C   sT   t  }t|| j}t|| j}~| | d | | d | | jdd d S )Nz$expected reference to be invalidated   z-callback not called the right number of times)r   rT   rA   rB   r^   assertEqualr=   r   rV   ref1ref2r	   r	   r   test_multiple_callbacks   s   
z*ReferencesTestCase.test_multiple_callbacksc                 C   s2   | fdd}t  }t||| _t||}~d S )Nc                 S   s   |   d S r   rA   )objectr   r	   r	   r   rB         zDReferencesTestCase.test_multiple_selfref_callbacks.<locals>.callback)r   rT   rA   )r   rB   crc   r	   r	   r   test_multiple_selfref_callbacks   s
   z2ReferencesTestCase.test_multiple_selfref_callbacksc                 C   s   t  }| jttj|d d d S )N)rB   )r   assertRaises	TypeErrorrT   rA   )r   ri   r	   r	   r   test_constructor_kwargs   s   z*ReferencesTestCase.test_constructor_kwargsc                 C   sv   t  }d|_t|| j}t|| j}~dd }| t|| | t|| | tttt   | | j	d d S )Nr@   c                 S   
   | j  d S r   r   )proxyr	   r	   r   check   r   z0ReferencesTestCase.test_proxy_ref.<locals>.checkr`   )
r   r   rT   ro   rB   rk   ReferenceErrorboolra   r=   )r   rV   rc   rd   rp   r	   r	   r   test_proxy_ref   s   z!ReferencesTestCase.test_proxy_refc                 C   s6   | }t |}| | d | }| ||d d S )Nz,weak reference to live object should be livez-<ref>() should return original object if live)rT   rA   assertIsNotNoner]   )r   factoryrV   rA   o2r	   r	   r   rS      s   
z"ReferencesTestCase.check_basic_refc                 C   s>   d| _ | }t|| j}~| | j dd | | d d S )Nr   r@   z(callback did not properly set 'cbcalled'z3ref2 should be dead after deleting object reference)r=   rT   rA   rB   ra   r^   )r   ru   rV   rA   r	   r	   r   rY      s   
z'ReferencesTestCase.check_basic_callbackc                 C   s   t  }t|}t|}t|}| ||d t  }t|}t|}t|}| ||d | t|dd ~| t|dd d S )Nz1reference object w/out callback should be re-usedr`   zwrong weak ref count for objectr@   z4wrong weak ref count for object after deleting proxy)r   rT   rA   ro   r]   ra   getweakrefcount)r   rV   rc   ro   rd   r	   r	   r   test_ref_reuse   s*   





z!ReferencesTestCase.test_ref_reusec                 C   s6   t  }t|}t|}t|}| ||d d S )Nz4proxy object w/out callback should have been re-used)r   rT   ro   rA   r]   )r   rV   proxy1rA   proxy2r	   r	   r   test_proxy_reuse   s   


z#ReferencesTestCase.test_proxy_reusec                 C   sn  t  }| |t| t }t|}| |d |d | t	|d | 
|d ddg|d d < | t	|d | t	|d | d|d d|d< | |d d | |d d t|}t|}| || ttd	}t|}| |d d  |d d   | |dd  |dd   | |d d |d d  | |dd |dd  d S )
Nz(proxy for empty UserList should be false   r@   z+proxy for non-empty UserList should be truer`      z,proxy didn't support __contains__() properlyr4   
   )r   check_proxyrT   ro   collectionsUserListassertFalseappendra   len
assertTrueassertInrange)r   rV   LpZL2p2ZL3Zp3r	   r	   r   test_basic_proxy   s0   




 z#ReferencesTestCase.test_basic_proxyc                 C   sF   G dd dt }| }| dtt| | tt|d d S )Nc                   @   r9   )z0ReferencesTestCase.test_proxy_unicode.<locals>.Cc                 S   r1   )Nstringr	   r
   r	   r	   r   __str__  r   z8ReferencesTestCase.test_proxy_unicode.<locals>.C.__str__c                 S   r1   )N   bytesr	   r
   r	   r	   r   	__bytes__  r   z:ReferencesTestCase.test_proxy_unicode.<locals>.C.__bytes__N)r   r   r   r   r   r	   r	   r	   r   r         r   r   r   )rg   r   dirrT   ro   ra   bytes)r   r   instancer	   r	   r   test_proxy_unicode  s   z%ReferencesTestCase.test_proxy_unicodec                 C   s4   G dd d}| }t |}| t|d d S )Nc                   @   r   )z.ReferencesTestCase.test_proxy_index.<locals>.Cc                 S   r1   )Nr~   r	   r
   r	   r	   r   	__index__  r   z8ReferencesTestCase.test_proxy_index.<locals>.C.__index__N)r   r   r   r   r	   r	   r	   r   r     r   r   r~   )rT   ro   ra   operatorindexr   r   rV   r   r	   r	   r   test_proxy_index  s   
z#ReferencesTestCase.test_proxy_indexc                 C   sF   G dd d}| }t |}| |d d |d }| |d d S )Nc                   @   r9   )z,ReferencesTestCase.test_proxy_div.<locals>.Cc                 S   r1   N*   r	   r)   r	   r	   r   __floordiv__  r   z9ReferencesTestCase.test_proxy_div.<locals>.C.__floordiv__c                 S   r1   )N   r	   r)   r	   r	   r   __ifloordiv__  r   z:ReferencesTestCase.test_proxy_div.<locals>.C.__ifloordiv__N)r   r   r   r   r   r	   r	   r	   r   r     r   r   r4   r   r   rT   ro   ra   r   r	   r	   r   test_proxy_div  s   
z!ReferencesTestCase.test_proxy_divc                 C   sV   G dd d}| }t |}| |d d | d| d |d }| |d d S )Nc                   @   s$   e Zd Zdd Zdd Zdd ZdS )z/ReferencesTestCase.test_proxy_matmul.<locals>.Cc                 S   r1   )N  r	   r)   r	   r	   r   
__matmul__"  r   z:ReferencesTestCase.test_proxy_matmul.<locals>.C.__matmul__c                 S   r1   )N]r	   r)   r	   r	   r   __rmatmul__$  r   z;ReferencesTestCase.test_proxy_matmul.<locals>.C.__rmatmul__c                 S   r1   )N1  r	   r)   r	   r	   r   __imatmul__&  r   z;ReferencesTestCase.test_proxy_matmul.<locals>.C.__imatmul__N)r   r   r   r   r   r   r	   r	   r	   r   r   !  s    r   r4   r   r   r   r   r   r	   r	   r   test_proxy_matmul   s   
z$ReferencesTestCase.test_proxy_matmulc                 C      |  tj d S r   )check_shared_without_callbackrT   rA   r
   r	   r	   r    test_shared_ref_without_callback7     z3ReferencesTestCase.test_shared_ref_without_callbackc                 C   r   r   )r   rT   ro   r
   r	   r	   r   "test_shared_proxy_without_callback:  r   z5ReferencesTestCase.test_shared_proxy_without_callbackc                 C   s   t d}||d }||d }| ||d ~~||}||d }| ||d ~~||}||}| ||d ~~||d }||}| ||d d S )Nr@   z%both callbacks were None in the C APIz&callbacks were NULL, None in the C APIz%both callbacks were NULL in the C APIz&callbacks were None, NULL in the C API)r!   r]   )r   makerefrV   Zp1r   r	   r	   r   r   =  s    



z0ReferencesTestCase.check_shared_without_callbackc                 C   s   t  }t|}| || | t|tjd |d | |jdd |dd | |jdd | 	t
| | 	t
|ddd d S )	Nzproxy is not of callable typez	twinkies!z1call through proxy not passed through to originalzSplat.)r   r@   r`   r}   )r   rT   ro   r   r]   typeCallableProxyTypera   r   rk   rl   )r   rV   rc   r	   r	   r   test_callable_proxyO  s    



z&ReferencesTestCase.test_callable_proxyc                 C   s   d|_ | |j dd d|_ | |j dd |` | t|dd d|_ | |j dd d|_ | |j dd |` | t|dd	 d S )
Nr@   z)proxy does not reflect attribute additionr`   z-proxy does not reflect attribute modificationfooz(proxy does not reflect attribute removalz4object does not reflect attribute addition via proxyz8object does not reflect attribute modification via proxyz3object does not reflect attribute removal via proxy)r   ra   r   hasattr)r   rV   ro   r	   r	   r   r   d  s0   



zReferencesTestCase.check_proxyc                 C   s6   G dd d}| }t |}|d= | |jd d S )Nc                   @   r   )z3ReferencesTestCase.test_proxy_deletion.<locals>.FooNc                 S   r   r   )result)r   Zaccessorr	   r	   r   __delitem__}  r   z?ReferencesTestCase.test_proxy_deletion.<locals>.Foo.__delitem__)r   r   r   r   r   r	   r	   r	   r   Foo{  s    r   r   )rT   ro   ra   r   )r   r   gr   r	   r	   r   test_proxy_deletiony  s
   
z&ReferencesTestCase.test_proxy_deletionc                 C   s4   G dd dt }| }| tt|t| d S )Nc                   @      e Zd ZdS )z0ReferencesTestCase.test_proxy_bool.<locals>.ListNr   r   r   r	   r	   r	   r   List  s    r   )listra   rr   rT   ro   )r   r   Zlystr	   r	   r   test_proxy_bool  s   z"ReferencesTestCase.test_proxy_boolc                    s^   d  G  fddd}|  t  }| t d|v  W d    d S 1 s(w   Y  d S )Nc                          e Zd Z fddZdS )z1ReferencesTestCase.test_proxy_iter.<locals>.MyObjc                    s    t S r   )r(   r
   objr	   r   __iter__  s   z:ReferencesTestCase.test_proxy_iter.<locals>.MyObj.__iter__Nr   r   r   r   r	   r   r	   r   MyObj      r   Zblech)rT   ro   rk   rl   )r   r   r   r	   r   r   test_proxy_iter  s   

"z"ReferencesTestCase.test_proxy_iterc                    sJ   g d  fdd}| G fddd}| }|  t|g d d S )N)r2   r4      c                   3   s     E d H  d S r   r	   r	   )arrr	   r   iterator_func  s   z9ReferencesTestCase.test_proxy_next.<locals>.iterator_funcc                       r   )z:ReferencesTestCase.test_proxy_next.<locals>.IteratesWeaklyc                    
   t  S r   rT   ro   r
   itr	   r   r     r   zCReferencesTestCase.test_proxy_next.<locals>.IteratesWeakly.__iter__Nr   r	   r   r	   r   IteratesWeakly  r   r   )ra   r   )r   r   r   Zweak_itr	   )r   r   r   test_proxy_next  s   z"ReferencesTestCase.test_proxy_nextc                    s^   dd  G  fddd}| }d}|  t| t| W d    d S 1 s(w   Y  d S )Nc                   S   r1   r;   r	   r	   r	   r	   r   <lambda>  r   z8ReferencesTestCase.test_proxy_bad_next.<locals>.<lambda>c                       r   )z1ReferencesTestCase.test_proxy_bad_next.<locals>.Ac                    r   r   r   r
   Znot_an_iteratorr	   r   r     r   z:ReferencesTestCase.test_proxy_bad_next.<locals>.A.__iter__Nr   r	   r   r	   r   A  r   r   z'Weakref proxy referenced a non-iterator)ZassertRaisesRegexrl   r   )r   r   amsgr	   r   r   test_proxy_bad_next  s   
"z&ReferencesTestCase.test_proxy_bad_nextc                 C   s4   G dd d}| }|  dtt|d d S )Nc                   @   r9   )z5ReferencesTestCase.test_proxy_reversed.<locals>.MyObjc                 S   r1   )Nr}   r	   r
   r	   r	   r   __len__  r   z=ReferencesTestCase.test_proxy_reversed.<locals>.MyObj.__len__c                 S   s   t dS )Ncba)iterr
   r	   r	   r   __reversed__  r    zBReferencesTestCase.test_proxy_reversed.<locals>.MyObj.__reversed__N)r   r   r   r   r   r	   r	   r	   r   r     r   r    r   )ra   rO   reversedrT   ro   r   r   r   r	   r	   r   test_proxy_reversed  s    z&ReferencesTestCase.test_proxy_reversedc                 C   s   G dd d}| }|  t tt| W d    n1 s!w   Y  G dd d}| }|  t tt| W d    d S 1 sHw   Y  d S )Nc                   @   r   )1ReferencesTestCase.test_proxy_hash.<locals>.MyObjc                 S   r1   r   r	   r
   r	   r	   r   r0     r   z:ReferencesTestCase.test_proxy_hash.<locals>.MyObj.__hash__Nr   r   r   r0   r	   r	   r	   r   r     r   r   c                   @   s   e Zd ZdZdS )r   Nr   r	   r	   r	   r   r     s    )rk   rl   r/   rT   ro   r   r	   r	   r   test_proxy_hash  s   "z"ReferencesTestCase.test_proxy_hashc                 C   s   t  }t|}t|| j}| t|dd t|}t|| j}| t|dd ~~~~| t|dd | tddd d S )Nr`   z*got wrong number of weak reference objectsr2   r   zAweak reference objects not unlinked from referent when discarded.r@   z2got wrong number of weak reference objects for int)r   rT   rA   rB   ra   rw   ro   )r   rV   rc   rd   ry   rz   r	   r	   r   test_getweakrefcount  s$   

z'ReferencesTestCase.test_getweakrefcountc                 C   s   t  }t|| j}t|| j}~| t||gd t  }t|| j}t|| j}~| t||gd ~| t|g d | tdg d d S )Nzlist of refs does not matchzlist of refs not clearedr@   z#list of refs does not match for int)r   rT   rA   rB   ra   getweakrefsrb   r	   r	   r   test_getweakrefs  s*   z#ReferencesTestCase.test_getweakrefsc                 C   sF   G dd dt }|d}t|}| |d d | d| d d S )Nc                   @   r   )z6ReferencesTestCase.test_newstyle_number_ops.<locals>.FNr   r	   r	   r	   r   F      r   g       @g      ?g      @)floatrT   ro   ra   )r   r   r   r   r	   r	   r   test_newstyle_number_ops  s
   
z+ReferencesTestCase.test_newstyle_number_opsc                    s   G dd dt  i fdd fdd}z|  W n	  y&   Y nw | d z|  W n
  y;   Y d S w | d d S )Nc                   @   r   )z?ReferencesTestCase.test_callbacks_protected.<locals>.BogusErrorNr   r	   r	   r	   r   
BogusError  r   r   c                    s
    | = d S r   r	   k)datar	   r   remove  r   z;ReferencesTestCase.test_callbacks_protected.<locals>.removec                     s   dd } d t | <  )Nc                   S   r1   )Nr	   r	   r	   r	   r	   r   r     r   zRReferencesTestCase.test_callbacks_protected.<locals>.encapsulate.<locals>.<lambda>)rT   rA   r   r   r   r   r	   r   encapsulate  s   z@ReferencesTestCase.test_callbacks_protected.<locals>.encapsulatezexception not properly restored)	ExceptionZfail)r   r   r	   r   r   test_callbacks_protected
  s    


z+ReferencesTestCase.test_callbacks_protectedc                    sn   dd l  G dd dt}| }t| fdd}~~| }| |_t|j fdd}| }||_~~d S )Nr   c                   @   r   )z0ReferencesTestCase.test_sf_bug_840829.<locals>.CNr   r	   r	   r	   r   r   0  r   r   c                          S r   rH   ignorerG   r	   r   r   4      z7ReferencesTestCase.test_sf_bug_840829.<locals>.<lambda>c                    r   r   r   r   r   r	   r   r   <  r   )rG   rg   rT   rA   ic1)r   r   ri   rW   r   c2r	   r   r   test_sf_bug_840829#  s   	z%ReferencesTestCase.test_sf_bug_840829c                 C   sV   dd l }G dd dt}G dd dt}| }||_t||j|_~~~|  d S )Nr   c                   @   r   )z6ReferencesTestCase.test_callback_in_cycle_1.<locals>.JNr   r	   r	   r	   r   JN  r   r   c                   @   r   )z7ReferencesTestCase.test_callback_in_cycle_1.<locals>.IIc                 S   rn   r   r   r   r   r	   r	   r   	acallbackR  r   zAReferencesTestCase.test_callback_in_cycle_1.<locals>.II.acallbackNr   r   r   r   r	   r	   r	   r   IIQ  r   r   rG   rg   r   rT   rA   r   rW   rH   r   rG   r   r   Ir	   r	   r   test_callback_in_cycle_1K  s   z+ReferencesTestCase.test_callback_in_cycle_1c                 C   sT   dd l }G dd dt}G dd d}| }||_t||j|_~~~|  d S )Nr   c                   @   r   )z6ReferencesTestCase.test_callback_in_cycle_2.<locals>.JNr   r	   r	   r	   r   r     r   r   c                   @   r   )z7ReferencesTestCase.test_callback_in_cycle_2.<locals>.IIc                 S   rn   r   r   r   r	   r	   r   r     r   zAReferencesTestCase.test_callback_in_cycle_2.<locals>.II.acallbackNr   r	   r	   r	   r   r     r   r   r   r   r	   r	   r   test_callback_in_cycle_2s  s   z+ReferencesTestCase.test_callback_in_cycle_2c                 C   sP   dd l }G dd d}| | }}||_||_t||j|_~~|  d S )Nr   c                   @   r   )z6ReferencesTestCase.test_callback_in_cycle_3.<locals>.Cc                 S      | j  | j | j d S r   mer   rW   r   r	   r	   r   cb     
z9ReferencesTestCase.test_callback_in_cycle_3.<locals>.C.cbNr   r   r   r  r	   r	   r	   r   r     r   r   )rG   r  r   rT   rA   r  rW   rH   )r   rG   r   r   r   r	   r	   r   test_callback_in_cycle_3  s   z+ReferencesTestCase.test_callback_in_cycle_3c                 C   sd   dd l }G dd dt}G dd d}| | }}||_||_t||j|_~~~~|  d S )Nr   c                   @   r   )z6ReferencesTestCase.test_callback_in_cycle_4.<locals>.Cc                 S   r  r   r  r   r	   r	   r   r    r  z9ReferencesTestCase.test_callback_in_cycle_4.<locals>.C.cbNr	  r	   r	   r	   r   r     r   r   c                   @   r   )z6ReferencesTestCase.test_callback_in_cycle_4.<locals>.DNr   r	   r	   r	   r   D  r   r  )	rG   rg   r  r   rT   rA   r  rW   rH   )r   rG   r   r  r   r   r	   r	   r   test_callback_in_cycle_4  s   	z+ReferencesTestCase.test_callback_in_cycle_4c                    s   dd l }g  G  fdddt}|d|d}}||_||_t||j|_t||j|_ fdd}t||}~~~|  g  |  |  dg | | d   d d = |  |  g  d S )	Nr   c                       s    e Zd Zdd Z fddZdS )zAReferencesTestCase.test_callback_in_cycle_resurrection.<locals>.Cc                 S   r   r   )Z	attribute)r   valuer	   r	   r   r$     r   zJReferencesTestCase.test_callback_in_cycle_resurrection.<locals>.C.__init__c                    s     | j d S r   )r   ri   r   Zalistr	   r   r     r   zKReferencesTestCase.test_callback_in_cycle_resurrection.<locals>.C.acallbackN)r   r   r   r$   r   r	   r  r	   r   r     s    r   r@   r`   c                         d d S )NC went awayr   r   r  r	   r   C_went_away     zKReferencesTestCase.test_callback_in_cycle_resurrection.<locals>.C_went_awayr  )	rG   rg   ri   rT   rA   r   rW   ra   rH   )r   rG   r   r   r   r  rW   r	   r  r   #test_callback_in_cycle_resurrection  s$   
z6ReferencesTestCase.test_callback_in_cycle_resurrectionc                    s   dd l }g   fdd}G  fdddt}| | }}||_||_|j}t|||_t||j|_t||}| | | ~~~~|  g  |	  |  dg | | d   d d = |	  |  g  d S )Nr   c                    r  )Nsafe_callback calledr  r   r  r	   r   safe_callback  r  zDReferencesTestCase.test_callbacks_on_callback.<locals>.safe_callbackc                       r   )z8ReferencesTestCase.test_callbacks_on_callback.<locals>.Cc                    r  )Nz	cb calledr  r   r  r	   r   r    r  z;ReferencesTestCase.test_callbacks_on_callback.<locals>.C.cbNr	  r	   r  r	   r   r     r   r   r  )
rG   rg   r*   r  rT   rA   rW   r]   ra   rH   )r   rG   r  r   ri   drB   Zexternal_wrr	   r  r   test_callbacks_on_callback  s(   	
z-ReferencesTestCase.test_callbacks_on_callbackc                 C   r   r   )check_gc_during_creationrT   rA   r
   r	   r	   r   test_gc_during_ref_creation  r   z.ReferencesTestCase.test_gc_during_ref_creationc                 C   r   r   )r  rT   ro   r
   r	   r	   r   test_gc_during_proxy_creation  r   z0ReferencesTestCase.test_gc_during_proxy_creationc                 C   s   t  }t ddd t   G dd d}dd }| }| }||_|||_z| }t|| W t j|  d S t j|  w )Nr@   c                   @   r   )z6ReferencesTestCase.check_gc_during_creation.<locals>.ANr   r	   r	   r	   r   r   "  r   r   c                  W   r   r   r	   )argsr	   r	   r   rB   %  r   z=ReferencesTestCase.check_gc_during_creation.<locals>.callback)rG   get_thresholdset_thresholdrH   r   rW   rT   rA   )r   r   Z
thresholdsr   rB   Z
referencedr   r	   r	   r   r    s   
z+ReferencesTestCase.check_gc_during_creationc                 C   s   G dd dt }| }d S )Nc                   @   r   )z>ReferencesTestCase.test_ref_created_during_del.<locals>.Targetc                 S   s   t | ad S r   )rT   rA   ref_from_delr
   r	   r	   r   __del__=  s   zFReferencesTestCase.test_ref_created_during_del.<locals>.Target.__del__Nr   r   r   r   r	   r	   r	   r   Target<  r   r"  )rg   )r   r"  wr	   r	   r   test_ref_created_during_del7  s   
z.ReferencesTestCase.test_ref_created_during_delc              	   C   s.   t t}| t|jddddd t  d S r;   )rT   rA   r   rk   rl   r$   rG   rH   )r   rr	   r	   r   	test_initC  s   
zReferencesTestCase.test_initc                 C   sX   G dd dt }g }tt t||j}d }t  | | d  | ||g d S )Nc                   @   r   )z*ReferencesTestCase.test_classes.<locals>.ANr   r	   r	   r	   r   r   M  r   r   )rg   rT   rA   intr   rG   rH   ra   )r   r   lr   r	   r	   r   test_classesK  s   
zReferencesTestCase.test_classesc           	      C   s\  t d}t d}t d}t|}t|}t|}t|}| ||k | ||k | ||k | ||k | ||k | ||k | ||k | ||k | |tk | |tk ~~~t  |||fD ]	}| | d  qr| ||k | ||k | ||k | ||k | 	||k||u  | 	||k||u d S )Nr@   r`   )
r!   rT   rA   r   r   r   rG   rH   r]   ra   )	r   r   yzr   bri   r  r%  r	   r	   r   test_equalityW  s6   



z ReferencesTestCase.test_equalityc                 C   s|   t jt jt jt jg}td}td}t|}t|}|D ]
}| t	||| q~~t
  |D ]
}| t	||| q1d S r?   )r   ltgtleger!   rT   rA   rk   rl   rG   rH   )r   opsr   r*  r   r,  opr	   r	   r   test_ordering|  s   

z ReferencesTestCase.test_orderingc                 C   sj   t d}t d}t|}t|}| t|td ~~t  | t|td | tt| d S r   )	r!   rT   rA   ra   r/   rG   rH   rk   rl   )r   r   r*  r   r,  r	   r	   r   test_hashing  s   

zReferencesTestCase.test_hashingc                 C   sN   G dd d}t  }|d  }}tdD ]
}|| ||< }q~t  d S )Nc                   @   r   )z1ReferencesTestCase.test_trashcan_16602.<locals>.Cc                    s0   |sd S t |   fdd}t ||| _d S )Nc                    s
     }d S r   r	   )wparentrV   Zwselfr	   r   r    r   zFReferencesTestCase.test_trashcan_16602.<locals>.C.__init__.<locals>.cb)rT   rA   r6  )r   parentr  r	   r7  r   r$     s
   
z:ReferencesTestCase.test_trashcan_16602.<locals>.C.__init__Nr8   r	   r	   r	   r   r     r   r   d   )rT   WeakKeyDictionaryr   rG   rH   )r   r   r  rootri   nr	   r	   r   test_trashcan_16602  s   	z&ReferencesTestCase.test_trashcan_16602c                 C   sD   t d}dd }t||}| |j| t|}| |j d S )Nr@   c                 S   r   r   r	   rf   r	   r	   r   r     r   z<ReferencesTestCase.test_callback_attribute.<locals>.<lambda>)r!   rT   rA   r]   __callback__r^   )r   r   rB   rc   rd   r	   r	   r   test_callback_attribute  s   
z*ReferencesTestCase.test_callback_attributec                 C   s<   t d}t|| j}| |j ~t  | |j d S r?   )	r!   rT   rA   rB   rt   r>  r   
gc_collectr^   )r   r   rA   r	   r	   r   &test_callback_attribute_after_deletion  s   z9ReferencesTestCase.test_callback_attribute_after_deletionc                 C   sV   t d}dd }t||}| t dd |_W d    d S 1 s$w   Y  d S )Nr@   c                 S   r   r   r	   rf   r	   r	   r   r     r   z@ReferencesTestCase.test_set_callback_attribute.<locals>.<lambda>c                 S   r   r   r	   rf   r	   r	   r   r     r   )r!   rT   rA   rk   AttributeErrorr>  )r   r   rB   rc   r	   r	   r   test_set_callback_attribute  s   "z.ReferencesTestCase.test_set_callback_attributec                 C   s6   G dd dt }|d}t|dd }~t  d S )Nc                   @   r   )z;ReferencesTestCase.test_callback_gcs.<locals>.ObjectWithDelc                 S   r   r   r	   r
   r	   r	   r   r     r   zCReferencesTestCase.test_callback_gcs.<locals>.ObjectWithDel.__del__Nr!  r	   r	   r	   r   ObjectWithDel  r   rD  r@   c                 S   s   t  S r   )r   r@  rf   r	   r	   r   r     r   z6ReferencesTestCase.test_callback_gcs.<locals>.<lambda>)r!   rT   rA   r   r@  )r   rD  r   rc   r	   r	   r   test_callback_gcs  s
   z$ReferencesTestCase.test_callback_gcsN):r   r   r   rX   rZ   r   cpython_onlyr_   re   rj   rm   rs   rS   rY   rx   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-  r4  r5  r=  r?  rA  rC  rE  r	   r	   r	   r   rR   d   sn    

	

((.&%	rR   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )SubclassableWeakrefTestCasec                 C   sl   G dd dt j}td}||dd}| | | | |j | |jd ~| |  | |j d S )Nc                       s*   e Zd Zd fdd	Z fddZ  ZS )z=SubclassableWeakrefTestCase.test_subclass_refs.<locals>.MyRefNr   c                    s   || _ t || d S r   )r  superr$   )r   obrB   r  	__class__r	   r   r$     s   zFSubclassableWeakrefTestCase.test_subclass_refs.<locals>.MyRef.__init__c                    s   d| _ t  S NT)calledrH  r   r
   rJ  r	   r   r        
zFSubclassableWeakrefTestCase.test_subclass_refs.<locals>.MyRef.__call__r   )r   r   r   r$   r   __classcell__r	   r	   rJ  r   MyRef  s    rP  r      r  )	rT   rA   r!   r]   r   rM  ra   r  r^   )r   rP  rV   Zmrr	   r	   r   test_subclass_refs  s   z.SubclassableWeakrefTestCase.test_subclass_refsc                 C   s   G dd dt j}td}||}t |}| || | t |||g | t |d ||}| t |d t |}| t|d | ||d  | 	||dd   | 	||dd   d S )Nc                   @   r   )zXSubclassableWeakrefTestCase.test_subclass_refs_dont_replace_standard_refs.<locals>.MyRefNr   r	   r	   r	   r   rP    r   rP  r   r`   r}   r   r@   )
rT   rA   r!   assertIsNotra   r   rw   r   r]   r   )r   rP  rV   r1r2Zr3refsr	   r	   r   -test_subclass_refs_dont_replace_standard_refs  s   

zISubclassableWeakrefTestCase.test_subclass_refs_dont_replace_standard_refsc                 C   s`   G dd dt j}td}||t}||t}| || t |}| || | || d S )Nc                   @   r   )zUSubclassableWeakrefTestCase.test_subclass_refs_dont_conflate_callbacks.<locals>.MyRefNr   r	   r	   r	   r   rP    r   rP  r   )rT   rA   r!   idstrrT  r   r   )r   rP  rV   rU  rV  rW  r	   r	   r   *test_subclass_refs_dont_conflate_callbacks  s   


zFSubclassableWeakrefTestCase.test_subclass_refs_dont_conflate_callbacksc                 C   sh   G dd dt j}td}||d dd}| |jd | |jd | | d | t|d d S )Nc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	zHSubclassableWeakrefTestCase.test_subclass_refs_with_slots.<locals>.MyRefslot1slot2c                 S   s   t j| ||S r   )rT   rA   __new__)r   rI  rB   r]  r^  r	   r	   r   r_    r   zPSubclassableWeakrefTestCase.test_subclass_refs_with_slots.<locals>.MyRef.__new__c                 S   s   || _ || _d S r   r\  )r   rI  rB   r]  r^  r	   r	   r   r$     rN  zQSubclassableWeakrefTestCase.test_subclass_refs_with_slots.<locals>.MyRef.__init__c                 S   s   | j | j S r   r\  r
   r	   r	   r   meth  rh   zMSubclassableWeakrefTestCase.test_subclass_refs_with_slots.<locals>.MyRef.methN)r   r   r   	__slots__r_  r$   r`  r	   r	   r	   r   rP     s
    rP  r   abcdefZabcdef__dict__)	rT   rA   r!   ra   r]  r^  r`  r   r   )r   rP  rV   r%  r	   r	   r   test_subclass_refs_with_slots  s   	z9SubclassableWeakrefTestCase.test_subclass_refs_with_slotsc                    s   G dd dt j} fdd}t }|||}||_~~  jd t }|||}|||}||_||_~~~  jd dS )z3Confirm https://bugs.python.org/issue3100 is fixed.c                   @   r   )zHSubclassableWeakrefTestCase.test_subclass_refs_with_cycle.<locals>.MyRefNr   r	   r	   r	   r   rP    r   rP  c                    s     j d7  _ d S r?   r<   )r#  r
   r	   r   rB     rC   zKSubclassableWeakrefTestCase.test_subclass_refs_with_cycle.<locals>.callbackr   N)rT   rA   r   rV   ra   r=   r%  )r   rP  rB   rV   rU  rV  r	   r
   r   test_subclass_refs_with_cycle  s"   


z9SubclassableWeakrefTestCase.test_subclass_refs_with_cycleN)r   r   r   rS  rX  r[  re  rf  r	   r	   r	   r   rG    s    rG  c                   @   sZ   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Ze	j
dd Zdd Zdd ZdS )WeakMethodTestCasec                 C   s   G dd dt }|S )z3Return an Object subclass overriding `some_method`.c                   @   r   )z'WeakMethodTestCase._subclass.<locals>.Cc                 S   r1   )Nr   r	   r
   r	   r	   r   r3   <  r   z3WeakMethodTestCase._subclass.<locals>.C.some_methodN)r   r   r   r3   r	   r	   r	   r   r   ;  r   r   N)r!   )r   r   r	   r	   r   	_subclass9  s   zWeakMethodTestCase._subclassc                 C   sn   t d}t|j}| |tj | | t|j | | j| | | j	|jj	 | 
|  d d S )Nr@   r2   )r!   rT   
WeakMethodr3   ZassertIsInstanceReferenceTyper   r]   __self____func__ra   r   rV   r%  r	   r	   r   
test_alive@  s   zWeakMethodTestCase.test_alivec                 C   s0   t d}t|j}~t  | | d  d S r?   )r!   rT   ri  r3   rG   rH   r]   rm  r	   r	   r   test_object_deadI  s
   z#WeakMethodTestCase.test_object_deadc                 C   s:   |   }|d}t|j}|`t  | | d  d S r?   )rh  rT   ri  r3   rG   rH   r]   )r   r   rV   r%  r	   r	   r   test_method_deadP  s   z#WeakMethodTestCase.test_method_deadc                    sh   |   }g   fdd}|d}t|j|}~t  |  |g tj|_t  |  |g d S )Nc                         |  d S r   r  r"   Zcallsr	   r   r  \  r  z=WeakMethodTestCase.test_callback_when_object_dead.<locals>.cbr@   )rh  rT   ri  r3   rG   rH   ra   r!   r   r   r  rV   r%  r	   rr  r   test_callback_when_object_deadX  s   z1WeakMethodTestCase.test_callback_when_object_deadc                    sd   |   }g   fdd}|d}t|j|}|`t  |  |g ~t  |  |g d S )Nc                    rq  r   r  r"   rr  r	   r   r  l  r  z=WeakMethodTestCase.test_callback_when_method_dead.<locals>.cbr@   )rh  rT   ri  r3   rG   rH   ra   rs  r	   rr  r   test_callback_when_method_deadh  s   z1WeakMethodTestCase.test_callback_when_method_deadc                 C   s<   t d}dd }t|j|}t|}~| | d  d S )Nr@   c                 S   r   r   r	   )_r	   r	   r   r  |  r   z-WeakMethodTestCase.test_no_cycles.<locals>.cb)r!   rT   ri  r3   rA   r]   )r   rV   r  r%  rW   r	   r	   r   test_no_cyclesx  s   
z!WeakMethodTestCase.test_no_cyclesc                    sP   fdd} fdd}t d}t d}t|j}t|j}t|j}t|j}||| ||| ||| ||| ||| ||| t d}	t|	j}
t|	j}|||
 ||| |||
 ||| |||j ||t ~~~	t  |||||
|f}|D ]}|D ]} ||k||u   ||k||u qqd S )Nc                    s      | |k  | |k d S r   r   r   r   r,  r
   r	   r   _eq     z-WeakMethodTestCase.test_equality.<locals>._eqc                    s      | |k  | |k d S r   rx  ry  r
   r	   r   _ne  r{  z-WeakMethodTestCase.test_equality.<locals>._ner@   r`   )	r!   rT   ri  r3   r5   r   rG   rH   ra   )r   rz  r|  r   r*  r   r,  ri   r  r+  er   rW  qr%  r	   r
   r   r-    s@   










z WeakMethodTestCase.test_equalityc                 C   s   t d}t d}t|j}t|j}t|j}| t|t| t|}~~t  | t|| | t|| | 	t
t| d S r?   )r!   rT   ri  r3   r5   ra   r/   rG   rH   rk   rl   )r   r   r*  r   r,  ri   Zhar	   r	   r   r5    s   zWeakMethodTestCase.test_hashingN)r   r   r   rh  rn  ro  rp  rt  ru  r   rF  rw  r-  r5  r	   r	   r	   r   rg  7  s    	

)rg  c                   @   s  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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d0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+dRdS Z,dTdU Z-dVdW Z.dXdY Z/dZd[ Z0d\d] Z1d^d_ Z2d`da Z3e4j5dbdc Z6ddS )eMappingTestCaser~   c           	         s   d}dd t |D }| fdd|D }| }zt| W n	 ty)   Y nw ~t  t|}~t  t|}| |d | |d d S )N   c                 S      g | ]}t  qS r	   r6   .0r   r	   r	   r   
<listcomp>      z4MappingTestCase.check_len_cycles.<locals>.<listcomp>c                 3       | ]} |V  qd S r   r	   r  rV   consr	   r   	<genexpr>      z3MappingTestCase.check_len_cycles.<locals>.<genexpr>)r   r@   r   )	r   itemsnextStopIterationrG   rH   r   r   ra   )	r   	dict_typer  Nr  dctr   n1n2r	   r  r   check_len_cycles  s"   z MappingTestCase.check_len_cyclesc                 C      |  tjdd  d S )Nc                 S      | dfS r?   r	   r   r	   r	   r   r     r   z<MappingTestCase.test_weak_keyed_len_cycles.<locals>.<lambda>)r  rT   r:  r
   r	   r	   r   test_weak_keyed_len_cycles     z*MappingTestCase.test_weak_keyed_len_cyclesc                 C   r  )Nc                 S      d| fS r?   r	   r   r	   r	   r   r     r   z=MappingTestCase.test_weak_valued_len_cycles.<locals>.<lambda>)r  rT   WeakValueDictionaryr
   r	   r	   r   test_weak_valued_len_cycles  r  z+MappingTestCase.test_weak_valued_len_cyclesc           
   	      s   | j tjgt R   tddD ]Z}d}td t||| dd t|D }| fdd|D }~| }zt| W n	 tyI   Y nw t	|}~t	|}	| 
|d | || | 
|	d | |	| qd S )	Nr@   r9  r  r   c                 S   r  r	   r  r  r	   r	   r   r    r  z2MappingTestCase.check_len_race.<locals>.<listcomp>c                 3   r  r   r	   r  r  r	   r   r    r  z1MappingTestCase.check_len_race.<locals>.<genexpr>)Z
addCleanuprG   r  r  r   rH   r  r  r  r   ZassertGreaterEqualZassertLessEqual)
r   r  r  Zthr  r  r  r   r  r  r	   r  r   check_len_race  s,   
zMappingTestCase.check_len_racec                 C   r  )Nc                 S   r  r?   r	   r   r	   r	   r   r     r   z:MappingTestCase.test_weak_keyed_len_race.<locals>.<lambda>)r  rT   r:  r
   r	   r	   r   test_weak_keyed_len_race  r  z(MappingTestCase.test_weak_keyed_len_racec                 C   r  )Nc                 S   r  r?   r	   r   r	   r	   r   r     r   z;MappingTestCase.test_weak_valued_len_race.<locals>.<lambda>)r  rT   r  r
   r	   r	   r   test_weak_valued_len_race  r  z)MappingTestCase.test_weak_valued_len_racec                 C   s   |   \}}|D ]}| t|d | |||j d qt| }t|  }|	  |	  | ||d ~~| t
|| j |d= | t
|| jd d ~~| t
|dd t }| t|jd t |d< | t|jd d S )Nr@   #wrong object returned by weak dict!z/cloning of weak-valued dictionary did not work!r   /deleting object did not cause dictionary updatez0deleting the values did not clear the dictionaryr`   )make_weak_valued_dictra   rT   rw   r]   r#   r   r  copysortr   COUNTr  rk   KeyError__getitem__r   r   dictobjectsrV   Zitems1Zitems2r	   r	   r   test_weak_values  s6   
z MappingTestCase.test_weak_valuesc                 C   s   |   \}}|D ]}| t|dd|  | |j|| d q| }|  }| t|t|d ~~| t	|| j
 |d= | t	|| j
d d ~~| t	|dd td}d	||< | || | d
| d S )Nr@   z&wrong number of weak references to %r!r  z.cloning of weak-keyed dictionary did not work!r   r  z.deleting the keys did not clear the dictionaryr   z$What is the meaning of the universe?"   )make_weak_keyed_dictra   rT   rw   r]   r#   r  r  setr   r  r!   r   assertNotInr  r	   r	   r   test_weak_keys  s6   zMappingTestCase.test_weak_keysc                 C   s  |   \}}| | | }| t|t| t|}|D ]}| }| || | || | |j||  || q| t|d t|}| tt| t| | D ]}| }| || | || | |j||  || q]| t|d d S r;   )	r  check_iterskeyrefsra   r   r   r   r#   r   r   r  r  rW  Zobjects2rW   rI  r	   r	   r   test_weak_keyed_iters5  s*   
z%MappingTestCase.test_weak_keyed_itersc                 C   s
  |   \}}| | | }| t|t| t|}|D ]}| }| |||j  | |j||j j || q| t|d t|}| tt| t| | D ]}| }| |||j  | |j||j j || q\| t|d d S r;   )	r  r  	valuerefsra   r   r   r#   r   itervaluerefsr  r	   r	   r   test_weak_valued_itersP  s&   
z&MappingTestCase.test_weak_valued_itersc                 C   s   t | }| D ]}|| q
| |d t | }|D ]}|| q | |d t | }| D ]}|| q8| |d t | }| D ]}|| qP| |d d S )Nzitems() did not touch all itemsz!__iter__() did not touch all keysz!iterkeys() did not touch all keysz%itervalues() did not touch all values)r   r  r   r   keysvalues)r   r  r  itemr  r   r  vr	   r	   r   r  i  s$   zMappingTestCase.check_itersc                 C   sl   t |}tt|| }t| |d= t  | t t|t |t |d g ~| t ||d  d S )Nr@   )	r   r   getattrr  rG   rH   r   r   ra   )r   r  r  Z	iter_namer<  r   r	   r	   r   "check_weak_destroy_while_iterating  s   $z2MappingTestCase.check_weak_destroy_while_iteratingc                 C   s  | \}}|  || W d    n1 sw   Y  | \}}| t|j| W d    n1 s3w   Y  |  || | \}}| t|j| W d    n1 sVw   Y  |  || | \}}|||< W d    n1 suw   Y  | || | t|}| \}}|| W d    n1 sw   Y  | || | \}}|  W d    n1 sw   Y  | t	|d d S r;   )
r  rk   r  r   popra   r  updateclearr   )r   r  testcontextr   r  Zddictr	   r	   r   -check_weak_destroy_and_mutate_while_iterating  s0   


z=MappingTestCase.check_weak_destroy_and_mutate_while_iteratingc                 C   s  t d}| + t|}|t|  | t||d  |||< | t|| W d    n1 s5w   Y  |   | t||d  |  | t||d  W d    n1 s`w   Y  | # | t||d  |t| = | t||d  W d    n1 sw   Y  |   | t||d  |  | t||d  W d    n1 sw   Y  |  |  | t|d W d    n1 sw   Y  | t|d d S )	Ni@ r@   r`   r}   r2   r4   r   r   )r!   r   r  r  r  ra   popitemr  )r   r  r  rV   r<  r	   r	   r   &check_weak_del_and_len_while_iterating  s8   z6MappingTestCase.check_weak_del_and_len_while_iteratingc                    s   |   \ |  d |  d |  d |  d |   \ tj fdd}|  | |   \ |  | d S )Nr  r  r  r  c                  3   sX    z#t   } t|   j}t  t||fV  W d } t  d S d } t  w r   r   r  r  r  r#   rG   rH   r!   )r   r  r  r  r	   r   r       

zKMappingTestCase.test_weak_keys_destroy_while_iterating.<locals>.testcontext)r  r  
contextlibcontextmanagerr  r  r   r  r	   r  r   &test_weak_keys_destroy_while_iterating  s   z6MappingTestCase.test_weak_keys_destroy_while_iteratingc                    s   |   \ |  d |  d |  d |  d |  d |   \ tj fdd}|  | |   \ |  | d S )Nr  r  r  r  r  c                  3   sX    z#t   } t|   j}t  |t|fV  W d } t  d S d } t  w r   r  )r   r   r  r	   r   r    r  zMMappingTestCase.test_weak_values_destroy_while_iterating.<locals>.testcontext)r  r  r  r  r  r  r  r	   r  r   (test_weak_values_destroy_while_iterating  s   z8MappingTestCase.test_weak_values_destroy_while_iteratingc                 C   s*   t d}t|di}| || d d S Nr}   il  r!   rT   r:  ra   r   rV   r  r	   r	   r   #test_make_weak_keyed_dict_from_dict     z3MappingTestCase.test_make_weak_keyed_dict_from_dictc                 C   s4   t d}t|di}t|}| || d d S r  r  r   rV   r  Zdict2r	   r	   r   .test_make_weak_keyed_dict_from_weak_keyed_dict     
z>MappingTestCase.test_make_weak_keyed_dict_from_weak_keyed_dictc                 C   s8   t  }tttt| j}|D ]}|j||< q||fS r   )rT   r:  r   mapr!   r   r  r#   r   r  r  rV   r	   r	   r   r    
   z$MappingTestCase.make_weak_keyed_dictc                 C   s*   t d}td|i}| |d | d S r  r!   rT   r  ra   r  r	   r	   r   $test_make_weak_valued_dict_from_dict  r  z4MappingTestCase.test_make_weak_valued_dict_from_dictc                 C   s4   t d}td|i}t|}| |d | d S r  r  r  r	   r	   r   0test_make_weak_valued_dict_from_weak_valued_dict  r  z@MappingTestCase.test_make_weak_valued_dict_from_weak_valued_dictc                 C   s   |  ttjj |  ttji i  |  ttjdd td}dD ]}tjdi ||i}| t| |g | || | q d S )Nr	   r}   r   r  r*   iterable)	rk   rl   rT   r  r$   r!   ra   r   r  )r   rV   kwr  r	   r	   r   test_make_weak_valued_dict_misc  s   z/MappingTestCase.test_make_weak_valued_dict_miscc                 C   s8   t  }tttt| j}|D ]}|||j< q||fS r   )rT   r  r   r  r!   r   r  r#   r  r	   r	   r   r  &  r  z%MappingTestCase.make_weak_valued_dictc           	      C   s   | }|||< |||< |  t|d | \}}|  t|d ||u r,| || n| || | \}}|  t|d ||u rL| || d S | || d S )Nr`   r@   r   )ra   r   r  r]   )	r   klasskey1value1key2value2weakdictr   r  r	   r	   r   check_popitem-  s   zMappingTestCase.check_popitemc                 C   s   |  tjdt dt  d S )Nr  r  )r  rT   r  r   r
   r	   r	   r   test_weak_valued_dict_popitem?     z-MappingTestCase.test_weak_valued_dict_popitemc                 C   s   |  tjt dt d d S Nzvalue 1zvalue 2)r  rT   r:  r   r
   r	   r	   r   test_weak_keyed_dict_popitemC  r  z,MappingTestCase.test_weak_keyed_dict_popitemc                 C   s   |  ||d | }|||}| || | || | ||| | || | |||}| || | || | ||| | || | d S )Nz9invalid test -- value parameters must be distinct objects)rT  
setdefaultr]   r   get)r   r  keyr  r  r  rV   r	   r	   r   check_setdefaultG  s   z MappingTestCase.check_setdefaultc                 C   s   |  tjdt t  d S )Nr  )r  rT   r  r   r
   r	   r	   r    test_weak_valued_dict_setdefaultX  s   
z0MappingTestCase.test_weak_valued_dict_setdefaultc                 C   s   |  tjt dd d S r  )r  rT   r:  r   r
   r	   r	   r   test_weak_keyed_dict_setdefault\  s   z/MappingTestCase.test_weak_keyed_dict_setdefaultc                 C   s   | }| | | t|t| | D ]}| ||d ||}| |||  | ||| q| D ]}| ||d || }| |||  | ||| q:d S )Nz(mysterious new key appeared in weak dictz%original key disappeared in weak dict)r  ra   r   r  r   r  r]   )r   r  r  r  r   r  r	   r	   r   check_update`  s   

zMappingTestCase.check_updatec              	   C   s   |  tjdt dt t t i | ttjj t }| t|ji i  | t|jdd | t|	 g  t
d}dD ]#}t }|jdi ||i | t|	 |g | || | q?d S )Nr@   r   r	   r}   r  )r  rT   r  r   rk   rl   r  ra   r   r  r!   )r   r  rV   r  r	   r	   r   test_weak_valued_dict_updates  s   z,MappingTestCase.test_weak_valued_dict_updatec                 C   s  t  }t  }t  }td|i}t||d}| }||d}d|fd|fg}||B }	| t|	t|t|B  | t|	tj ||O }| ||	 ||B }
| t|
t||B  | t|
tj ||O }| ||
 | }||O }| t|t|t|B  | t|tj ||B }| t||t|B  | t|tj ~| d|	 | d|
 | d| | d| d S )Nr@   r@   r`   )r@   r}   r4   r   r`   )	r   rT   r  r  ra   r  r]   r   r  )r   r   r,  ri   Zwvd1Zwvd2Zwvd3d1pairstmp1tmp2tmp3tmp4r	   r	   r    test_weak_valued_union_operators  s<   
z0MappingTestCase.test_weak_valued_union_operatorsc              	   C   s$   |  tjt dt dt di d S )Nr@   r`   r}   )r  rT   r:  r   r
   r	   r	   r   test_weak_keyed_dict_update  s   z+MappingTestCase.test_weak_keyed_dict_updatec                 C   sh   t  }td}td}d||< d||< | t|d ||= | t|d | t| |g d S )N12	somethingr`   r@   )rT   r:  r!   ra   r   r   r  r   r  o1rv   r	   r	   r   test_weak_keyed_delitem  s   z'MappingTestCase.test_weak_keyed_delitemc                 C   s  t  }t  }t  }t|d|di}t|d|di}| }|d|di}|df|dfg}||B }	| t|	t|t|B  | t|	tj ||O }| ||	 ||B }
| t|
t||B  | t|
tj ||O }| ||
 | }||O }| t|t|t|B  | t|tj ||B }| t||t|B  | t|tj ~| d|		  | d|
	  | d|	  | d|	  d S )	Nr@   r`   r}   r2   56      )
r   rT   r:  r  ra   r  r]   r   r  r  )r   r   rv   Zo3Zwkd1Zwkd2Zwkd3r  r  r  r  r  r  r	   r	   r   test_weak_keyed_union_operators  s<   z/MappingTestCase.test_weak_keyed_union_operatorsc                 C   sl   t  }td}td}||d< ||d< | t|d |d= | t|d | t| d|fg d S )Nr  r  r  zsomething elser`   r@   )rT   r  r!   ra   r   r   r  r  r	   r	   r   test_weak_valued_delitem  s   z(MappingTestCase.test_weak_valued_delitemc                 C   sf   t  }td}| t|j| | t|j| | t|jd | t|jd | t|jdd d S )Nr     )	rT   r:  r!   rk   r  r   r  rl   __setitem__)r   r  rV   r	   r	   r   test_weak_keyed_bad_delitem  s   z+MappingTestCase.test_weak_keyed_bad_delitemc                    s   t  }dG fdddt  fddtdD D ]}|j||< q~t|   dd}D ]	}|d	7 }||= q7| t	|d | |d
 d S )NFc                       s*   e Zd Zdd Zdd Z fddZdS )z<MappingTestCase.test_weak_keyed_cascading_deletes.<locals>.Cc                 S   r   r   rR  )r   r   r	   r	   r   r$     r   zEMappingTestCase.test_weak_keyed_cascading_deletes.<locals>.C.__init__c                 S   r.   r   )r/   r  r
   r	   r	   r   r0     r   zEMappingTestCase.test_weak_keyed_cascading_deletes.<locals>.C.__hash__c                    s    rd= | j |j kS )Nr  rR  r)   mutateobjsr	   r   r+     s   zCMappingTestCase.test_weak_keyed_cascading_deletes.<locals>.C.__eq__N)r   r   r   r$   r0   r+   r	   r  r	   r   r     s    r   c                    s   g | ]} |qS r	   r	   r  )r   r	   r   r  
  s    zEMappingTestCase.test_weak_keyed_cascading_deletes.<locals>.<listcomp>r2   Tr   r@   r`   )
rT   r:  rg   r   r  r   r  reversera   r   )r   r  rV   countr	   )r   r  r  r   !test_weak_keyed_cascading_deletes  s    	z1MappingTestCase.test_weak_keyed_cascading_deletesc                 C      t  }| t|d d S )Nz<WeakValueDictionary at 0x.*>)rT   r  assertRegexrU   r   r  r	   r	   r   test_make_weak_valued_dict_repr#     z/MappingTestCase.test_make_weak_valued_dict_reprc                 C   r  )Nz<WeakKeyDictionary at 0x.*>)rT   r:  r  rU   r  r	   r	   r   test_make_weak_keyed_dict_repr'  r  z.MappingTestCase.test_make_weak_keyed_dict_reprc                 C   s^   t  }t  tdD ]}|dt }| |d  ~qW d    d S 1 s(w   Y  d S Ni r~   )rT   r  rQ   r   r  r6   rT  r   r  r   r   r	   r	   r   $test_threaded_weak_valued_setdefault+  s   "z4MappingTestCase.test_threaded_weak_valued_setdefaultc                 C   sd   t  }t ! tdD ]}t |d< |dd}| |d  qW d    d S 1 s+w   Y  d S r  )rT   r  rQ   r   r6   r  rT  r  r	   r	   r   test_threaded_weak_valued_pop3  s   
"z-MappingTestCase.test_threaded_weak_valued_popc                 C   sd   t  }t ! tdD ]}t }||d< | t|d d }qW d    d S 1 s+w   Y  d S )Ni@ r~   r@   )rT   r  rQ   r   r6   ra   r   )r   r  r   rV   r	   r	   r   %test_threaded_weak_valued_consistency;  s   "z5MappingTestCase.test_threaded_weak_valued_consistencyc                    s  g }G dd d}G dd d} fdd}dd }|  |tjtjf | }g }	g }
td	D ]}||||}}|	| |
| |||< ~~q/tj|||fd
}|tju rbtj||	fd
}ntj||
fd
}|  |  |	  |	  |r|d d S )Nc                   @   r   )z?MappingTestCase.check_threaded_weak_dict_copy.<locals>.DummyKeyc                 S   r   r   ctrr   r  r	   r	   r   r$   M  r   zHMappingTestCase.check_threaded_weak_dict_copy.<locals>.DummyKey.__init__Nr8   r	   r	   r	   r   DummyKeyL  r   r  c                   @   r   )zAMappingTestCase.check_threaded_weak_dict_copy.<locals>.DummyValuec                 S   r   r   r  r  r	   r	   r   r$   Q  r   zJMappingTestCase.check_threaded_weak_dict_copy.<locals>.DummyValue.__init__Nr8   r	   r	   r	   r   
DummyValueP  r   r   c              
      sX   z du rt | }W d S |   }W d S  ty+ } z|| W Y d }~d S d }~ww rL  )r  deepcopyr   r   )r  excrv  exr!  r	   r   	dict_copyT  s   z@MappingTestCase.check_threaded_weak_dict_copy.<locals>.dict_copyc                 S   sN   d}| r%t dt| d }|d7 }| | |d dkr!t  | sd S d S )Nr   r@   i'  )randomrandintr   r  rG   rH   )ZlstZgc_ctrr   r	   r	   r   pop_and_collect]  s   
zFMappingTestCase.check_threaded_weak_dict_copy.<locals>.pop_and_collectip )rK   r  r   )
r   rT   r:  r  r   r   rL   rM   rN   rO   )r   Ztype_r!  r"  r  r   r%  r(  r  r  r  r   r   r  Zt_copyZ	t_collectr	   r$  r   check_threaded_weak_dict_copyG  s6   		


z-MappingTestCase.check_threaded_weak_dict_copyc                 C      |  tjd d S NFr)  rT   r:  r
   r	   r	   r    test_threaded_weak_key_dict_copy     z0MappingTestCase.test_threaded_weak_key_dict_copyc                 C   r*  rL  r,  r
   r	   r	   r   $test_threaded_weak_key_dict_deepcopy  r.  z4MappingTestCase.test_threaded_weak_key_dict_deepcopyc                 C   r*  r+  r)  rT   r  r
   r	   r	   r   "test_threaded_weak_value_dict_copy  r.  z2MappingTestCase.test_threaded_weak_value_dict_copyc                 C   r*  rL  r0  r
   r	   r	   r   &test_threaded_weak_value_dict_deepcopy  r.  z6MappingTestCase.test_threaded_weak_value_dict_deepcopyc                 C   s   t  }| |jj d S r   )rT   r  r^   _remove__closure__)r   r  r	   r	   r   test_remove_closure  s   z#MappingTestCase.test_remove_closureN)7r   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/  r1  r2  r   rF  r5  r	   r	   r	   r   r    sh    !%%-=r  )mapping_testsc                   @   s6   e Zd ZdZedededdZejZdd Z	dS )	WeakValueDictionaryTestCasez?Check that WeakValueDictionary conforms to the mapping protocolr@   r`   r}   )r  r  key3c                 C   
   | j  S r   )!_WeakValueDictionaryTestCase__refr  r
   r	   r	   r   
_reference  r   z&WeakValueDictionaryTestCase._referenceN)
r   r   r   __doc__r!   r:  rT   r  	type2testr;  r	   r	   r	   r   r7    s
    r7  c                   @   s:   e Zd ZdZeddeddeddiZejZdd	 Z	d
S )WeakKeyDictionaryTestCasez=Check that WeakKeyDictionary conforms to the mapping protocolr  r@   r  r`   r8  r}   c                 C   r9  r   )_WeakKeyDictionaryTestCase__refr  r
   r	   r	   r   r;    r   z$WeakKeyDictionaryTestCase._referenceN)
r   r   r   r<  r!   r?  rT   r:  r=  r;  r	   r	   r	   r   r>    s
    r>  c                   @   sV   e Zd ZG dd dZdd Zdd Zdd Zd	d
 Zdd Ze	dd Z
dd ZdS )FinalizeTestCasec                   @   r   )zFinalizeTestCase.ANr   r	   r	   r	   r   r     r   r   c                 C   s   t jjdkrt  d S d S )NZcpython)sysimplementationnamer   r@  r
   r	   r	   r   _collect_if_necessary  s   z&FinalizeTestCase._collect_if_necessaryc                    s   fdd}|   }g  tj||dddd}| |jd | | ||dd	dif | | d
 | | d  | | d  | | d  | | d  | |jd |  d
g g  t||ddd}| | ||di f | | ||di f | | d  | | d  | | d  | | d  | |jd |  g  g  tj||dddd}~|   | | d  | | d  | | d  | | d  | |jd |  d
g d S )Nc                    s     | | |  | | | S r   r  r   r*  r+  resr	   r   add  s   z+FinalizeTestCase.test_finalize.<locals>.addC   +   Y   )r+  T)rI  rJ  r+     F)rI  rJ  rK  rE  )r   rT   finalizera   alivepeekdetachrD  )r   rH  r   r   r	   rF  r   test_finalize  sB   zFinalizeTestCase.test_finalizec              	      s    fdd}|   }g  tj||ddddd}| | ||ddddf |  |  ddddfg | t tj||dd	 W d    n1 sMw   Y  | t tj||dd
 W d    n1 sjw   Y  | ttj| | ttj d S )Nc                     s     | |f d S r   r  )r  kwargsrF  r	   r   fin  rC   z-FinalizeTestCase.test_arg_errors.<locals>.finr@   r`   r}   r2   )funcr   r  )rT  r#   )r   rT  r#   )r   rT   rM  ra   rO  rk   rl   )r   rS  r   r   r	   rF  r   test_arg_errors  s   z FinalizeTestCase.test_arg_errorsc           	      C   s  |   }g }t||jd}t||jd}t||jd}t||jd}t||jd}~~| |j | |j | |j | |  | |j |  |d |  | |j |d |  |d ~|   | |j |d	 |  g d
}| 	|| d S )Nf1f2f3f4f5r   Br   r  )r   rX  r[  r   rY  rW  rV  r  )
r   rT   rM  r   r   rN  rP  r   rD  ra   )	r   r   rG  rV  rW  rX  rY  rZ  Zexpectedr	   r	   r   
test_order  s6   



zFinalizeTestCase.test_orderc                    s   G dd dt j}|  }g   fdd}|||}t |}t |}~~| |  | |  ~|   | |  | |  |  dg d S )Nc                   @   r   )z4FinalizeTestCase.test_all_freed.<locals>.MyFinalizerNr   r	   r	   r	   r   MyFinalizer  r   r]  c                      r  )N{   r  r	   rF  r	   r   rB   #  r  z1FinalizeTestCase.test_all_freed.<locals>.callbackr^  )rT   rM  r   rA   rt   rD  r^   ra   )r   r]  r   rB   r   Zwr_callbackZwr_fr	   rF  r   test_all_freed  s   


zFinalizeTestCase.test_all_freedc                    sR    fdd}t  tdt}t  tdt}t  |}t  tdt}d|_d S )Nc                     s"   t  td} td dd  d S )Ng1f3 errorr@   r   )rT   rM  print)r`  clsr	   r   error7  s   z,FinalizeTestCase.run_in_child.<locals>.errorrV  rW  rY  F)rT   rM  rb  _global_varatexit)rd  re  rV  rW  rX  rY  r	   rc  r   run_in_child5  s   
zFinalizeTestCase.run_in_childc                 C   sF   d}t d|\}}}|d }| |g d | d|v  d S )NzNfrom test.test_weakref import FinalizeTestCase;FinalizeTestCase.run_in_child()z-cascii)z	f4 foobarra  r`  z	f1 foobars   ZeroDivisionError)r   Zassert_python_okdecode
splitlinesra   r   )r   progrcouterrr	   r	   r   test_atexitI  s
   zFinalizeTestCase.test_atexitN)r   r   r   r   rD  rQ  rU  r\  r_  classmethodrh  rp  r	   r	   r	   r   r@    s    )'
r@  a   Doctest for examples in the library reference: weakref.rst

>>> import weakref
>>> class Dict(dict):
...     pass
...
>>> obj = Dict(red=1, green=2, blue=3)   # this object is weak referencable
>>> r = weakref.ref(obj)
>>> print(r() is obj)
True

>>> import weakref
>>> class Object:
...     pass
...
>>> o = Object()
>>> r = weakref.ref(o)
>>> o2 = r()
>>> o is o2
True
>>> del o, o2
>>> print(r())
None

>>> import weakref
>>> class ExtendedRef(weakref.ref):
...     def __init__(self, ob, callback=None, **annotations):
...         super().__init__(ob, callback)
...         self.__counter = 0
...         for k, v in annotations.items():
...             setattr(self, k, v)
...     def __call__(self):
...         '''Return a pair containing the referent and the number of
...         times the reference has been called.
...         '''
...         ob = super().__call__()
...         if ob is not None:
...             self.__counter += 1
...             ob = (ob, self.__counter)
...         return ob
...
>>> class A:   # not in docs from here, just testing the ExtendedRef
...     pass
...
>>> a = A()
>>> r = ExtendedRef(a, foo=1, bar="baz")
>>> r.foo
1
>>> r.bar
'baz'
>>> r()[1]
1
>>> r()[1]
2
>>> r()[0] is a
True


>>> import weakref
>>> _id2obj_dict = weakref.WeakValueDictionary()
>>> def remember(obj):
...     oid = id(obj)
...     _id2obj_dict[oid] = obj
...     return oid
...
>>> def id2obj(oid):
...     return _id2obj_dict[oid]
...
>>> a = A()             # from here, just testing
>>> a_id = remember(a)
>>> id2obj(a_id) is a
True
>>> del a
>>> try:
...     id2obj(a_id)
... except KeyError:
...     print('OK')
... else:
...     print('WeakValueDictionary error')
OK


libreftestc                	   C   s*   t ttttttt t 	t
jt  d S r   )r   Zrun_unittestrR   rg  r  r7  r>  rG  r@  Zrun_doctestrA  modulesr   r	   r	   r	   r   	test_main  s   	rt  __main__)rD   ))rG   rA  Zunittestr   rT   r   r  r  rL   rE   r&  testr   Ztest.supportr   r   r  rf  r   r   r   r   r!   r6   ZTestCaser:   r  rQ   rR   rG  rg  r  r6  ZBasicTestMappingProtocolr7  r>  r@  rr  Z__test__rt  r   r	   r	   r	   r   <module>   sf    	      rg 
     c $S
