a
    ze;)                    @   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 dl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 ),    N)support)script_helper	ALWAYS_EQ)
gc_collectZfoobarc                   @   s   e Zd Zdd ZdS )Cc                 C   s   d S N selfr   r   '/usr/lib/python3.9/test/test_weakref.pymethod   s    zC.methodN)__name__
__module____qualname__r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdd ZdS )CallableNc                 C   s
   || _ d S r   bar)r
   xr   r   r   __call__    s    zCallable.__call__)r   r   r   r   r   r   r   r   r   r      s   r   c                  C   s   dd } | S )Nc                   S   s   d S 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(   s    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   s
   || _ d S r   arg)r
   r   r   r   r   __init__-   s    zObject.__init__c                 C   s
   d| j  S )Nz<Object %r>r   r	   r   r   r   __repr__/   s    zObject.__repr__c                 C   s   t |tr| j|jkS tS r   
isinstancer   r   NotImplementedr
   otherr   r   r   __eq__1   s    
zObject.__eq__c                 C   s   t |tr| j|jk S tS r   r   r"   r   r   r   __lt__5   s    
zObject.__lt__c                 C   s
   t | jS r   )hashr   r	   r   r   r   __hash__9   s    zObject.__hash__c                 C   s   dS )N   r   r	   r   r   r   some_method;   s    zObject.some_methodc                 C   s   dS )N   r   r	   r   r   r   other_method=   s    zObject.other_methodN)
r   r   r   r   r   r$   r%   r'   r)   r+   r   r   r   r   r   ,   s   r   c                   @   s   e Zd Zdd ZdS )RefCyclec                 C   s
   | | _ d S r   )cycler	   r   r   r   r   B   s    zRefCycle.__init__Nr   r   r   r   r   r   r   r   r,   A   s   r,   c                   @   s   e Zd Zdd Zdd ZdS )TestBasec                 C   s
   d| _ d S Nr   cbcalledr	   r   r   r   setUpH   s    zTestBase.setUpc                 C   s   |  j d7  _ d S N   r1   )r
   refr   r   r   callbackK   s    zTestBase.callbackN)r   r   r   r3   r7   r   r   r   r   r/   F   s   r/   -C6?c              	   #   sx   d fdd}t  J tj|d}|  zdV  W d|  nd|  0 W d   n1 sj0    Y  dS )zR
    Ensure GC collections happen in a different thread, at a high frequency.
    Fc                      s   st   t  q d S r   )timesleepgccollectr   periodZplease_stopr   r   r<   V   s    
z"collect_in_thread.<locals>.collect)targetNT)r   Z
disable_gc	threadingThreadstartjoin)r>   r<   tr   r=   r   collect_in_threadO   s    

rE   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   weakrefr6   repr)r
   owrr   r   r   test_basic_refg   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_callbacku   s    

z&ReferencesTestCase.test_basic_callbackc                 C   sR   dd l }|j}| }t|}| | | ~| |  | | | | d S r0   )	_testcapicreate_cfunctionrH   r6   assertIsassertIsNonerG   rM   )r
   rO   rP   r   rK   r   r   r   test_cfunctionz   s    

z!ReferencesTestCase.test_cfunctionc                 C   sZ   t  }t|| j}t|| j}~t  | | d | | d | | jdd d S )Nz$expected reference to be invalidated   z-callback not called the right number of times)r   rH   r6   r7   r   rR   assertEqualr2   r
   rJ   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   r6   )objectr
   r   r   r   r7      s    zDReferencesTestCase.test_multiple_selfref_callbacks.<locals>.callback)r   rH   r6   )r
   r7   crW   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)r7   )r   assertRaises	TypeErrorrH   r6   )r
   r\   r   r   r   test_constructor_kwargs   s    z*ReferencesTestCase.test_constructor_kwargsc                 C   s   t  }d|_t|| j}t|| j}~t  dd }| t|| | t|| tt  }t  | tt| | 	| j
d d S )Nr5   c                 S   s
   | j  d S r   r   )proxyr   r   r   check   s    z0ReferencesTestCase.test_proxy_ref.<locals>.checkrT   )r   r   rH   ra   r7   r   r^   ReferenceErrorboolrU   r2   )r
   rJ   rW   rX   rb   Zref3r   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)rH   r6   assertIsNotNonerQ   )r
   factoryrJ   r6   o2r   r   r   rG      s    
z"ReferencesTestCase.check_basic_refc                 C   sD   d| _ | }t|| j}~t  | | j dd | | d d S )Nr   r5   z(callback did not properly set 'cbcalled'z3ref2 should be dead after deleting object reference)r2   rH   r6   r7   r   rU   rR   )r
   rg   rJ   r6   r   r   r   rM      s    
z'ReferencesTestCase.check_basic_callbackc                 C   s   t  }t|}t|}t|}| ||d t  }t|}t|}t|}| ||d | t|dd ~t  | t|dd d S )Nz1reference object w/out callback should be re-usedrT   zwrong weak ref count for objectr5   z4wrong weak ref count for object after deleting proxy)r   rH   r6   ra   rQ   rU   getweakrefcountr   )r
   rJ   rW   ra   rX   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   rH   ra   r6   rQ   )r
   rJ   proxy1r6   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   r5   z+proxy for non-empty UserList should be truerT      z,proxy didn't support __contains__() properlyr*   
   )r   check_proxyrH   ra   collectionsUserListassertFalseappendrU   len
assertTrueassertInrange)r
   rJ   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                   @   s   e Zd Zdd Zdd ZdS )z0ReferencesTestCase.test_proxy_unicode.<locals>.Cc                 S   s   dS )Nstringr   r	   r   r   r   __str__  s    z8ReferencesTestCase.test_proxy_unicode.<locals>.C.__str__c                 S   s   dS )N   bytesr   r	   r   r   r   	__bytes__  s    z:ReferencesTestCase.test_proxy_unicode.<locals>.C.__bytes__N)r   r   r   r   r   r   r   r   r   r   
  s   r   r   r   )r[   rx   dirrH   ra   rU   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                   @   s   e Zd Zdd ZdS )z.ReferencesTestCase.test_proxy_index.<locals>.Cc                 S   s   dS )Nrp   r   r	   r   r   r   	__index__  s    z8ReferencesTestCase.test_proxy_index.<locals>.C.__index__N)r   r   r   r   r   r   r   r   r     s   r   rp   )rH   ra   rU   operatorindexr
   r   rJ   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                   @   s   e Zd Zdd Zdd ZdS )z,ReferencesTestCase.test_proxy_div.<locals>.Cc                 S   s   dS N*   r   r"   r   r   r   __floordiv__  s    z9ReferencesTestCase.test_proxy_div.<locals>.C.__floordiv__c                 S   s   dS )N   r   r"   r   r   r   __ifloordiv__  s    z:ReferencesTestCase.test_proxy_div.<locals>.C.__ifloordiv__N)r   r   r   r   r   r   r   r   r   r     s   r   r*   r   r   rH   ra   rU   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   s   dS )N  r   r"   r   r   r   
__matmul__)  s    z:ReferencesTestCase.test_proxy_matmul.<locals>.C.__matmul__c                 S   s   dS )N]r   r"   r   r   r   __rmatmul__+  s    z;ReferencesTestCase.test_proxy_matmul.<locals>.C.__rmatmul__c                 S   s   dS )N1  r   r"   r   r   r   __imatmul__-  s    z;ReferencesTestCase.test_proxy_matmul.<locals>.C.__imatmul__N)r   r   r   r   r   r   r   r   r   r   r   (  s   r   r*   r   r   r   r   r   r   r   r   test_proxy_matmul'  s    
z$ReferencesTestCase.test_proxy_matmulc                 C   s   |  tj d S r   )check_shared_without_callbackrH   r6   r	   r   r   r    test_shared_ref_without_callback>  s    z3ReferencesTestCase.test_shared_ref_without_callbackc                 C   s   |  tj d S r   )r   rH   ra   r	   r   r   r   "test_shared_proxy_without_callbackA  s    z5ReferencesTestCase.test_shared_proxy_without_callbackc                 C   s   t d}||d }||d }| ||d ~~||}||d }| ||d ~~||}||}| ||d ~~||d }||}| ||d d S )Nr5   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   rQ   )r
   makerefrJ   Zp1r|   r   r   r   r   D  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   r5   rT   ro   )r   rH   ra   rq   rQ   typeCallableProxyTyperU   r   r^   r_   )r
   rJ   rW   r   r   r   test_callable_proxyV  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 )
Nr5   z)proxy does not reflect attribute additionrT   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   rU   rt   hasattr)r
   rJ   ra   r   r   r   rq   k  s0    



zReferencesTestCase.check_proxyc                 C   s6   G dd d}| }t |}|d= | |jd d S )Nc                   @   s   e Zd ZdZdd ZdS )z3ReferencesTestCase.test_proxy_deletion.<locals>.FooNc                 S   s
   || _ d S r   )result)r
   accessorr   r   r   __delitem__  s    z?ReferencesTestCase.test_proxy_deletion.<locals>.Foo.__delitem__)r   r   r   r   r   r   r   r   r   Foo  s   r   r   )rH   ra   rU   r   )r
   r   gr   r   r   r   test_proxy_deletion  s
    
z&ReferencesTestCase.test_proxy_deletionc                 C   s4   G dd dt }| }| tt|t| d S )Nc                   @   s   e Zd ZdS )z0ReferencesTestCase.test_proxy_bool.<locals>.ListNr   r   r   r   r   r   r   List  r   r   )listrU   rd   rH   ra   )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    n1 sN0    Y  d S )Nc                       s   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  s   r   Zblech)rH   ra   r^   r_   )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)r(   r*      c                   3   s    E d H  d S r   r   r   )arrr   r   iterator_func  s    z9ReferencesTestCase.test_proxy_next.<locals>.iterator_funcc                       s   e Zd Z fddZdS )z:ReferencesTestCase.test_proxy_next.<locals>.IteratesWeaklyc                    s
   t  S r   rH   ra   r	   itr   r   r     s    zCReferencesTestCase.test_proxy_next.<locals>.IteratesWeakly.__iter__Nr   r   r   r   r   IteratesWeakly  s   r   )rU   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    n1 sN0    Y  d S )Nc                   S   s   dS r0   r   r   r   r   r   <lambda>  r   z8ReferencesTestCase.test_proxy_bad_next.<locals>.<lambda>c                       s   e Zd Z fddZdS )z1ReferencesTestCase.test_proxy_bad_next.<locals>.Ac                    s
   t  S r   r   r	   Znot_an_iteratorr   r   r     s    z:ReferencesTestCase.test_proxy_bad_next.<locals>.A.__iter__Nr   r   r   r   r   A  s   r   z'Weakref proxy referenced a non-iterator)ZassertRaisesRegexr_   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                   @   s   e Zd Zdd Zdd ZdS )z5ReferencesTestCase.test_proxy_reversed.<locals>.MyObjc                 S   s   dS )Nro   r   r	   r   r   r   __len__  s    z=ReferencesTestCase.test_proxy_reversed.<locals>.MyObj.__len__c                 S   s   t dS )Ncba)iterr	   r   r   r   __reversed__  s    zBReferencesTestCase.test_proxy_reversed.<locals>.MyObj.__reversed__N)r   r   r   r   r   r   r   r   r   r     s   r    r   )rU   rC   reversedrH   ra   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 sB0    Y  G dd d}| }|  t tt| W d    n1 s0    Y  d S )Nc                   @   s   e Zd Zdd ZdS )1ReferencesTestCase.test_proxy_hash.<locals>.MyObjc                 S   s   dS r   r   r	   r   r   r   r'     s    z:ReferencesTestCase.test_proxy_hash.<locals>.MyObj.__hash__Nr   r   r   r'   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )r   Nr   r   r   r   r   r     s   )r^   r_   r&   rH   ra   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  | t|dd | tddd d S )NrT   z*got wrong number of weak reference objectsr(   r   zAweak reference objects not unlinked from referent when discarded.r5   z2got wrong number of weak reference objects for int)r   rH   r6   r7   rU   ri   ra   r   )r
   rJ   rW   rX   rk   rl   r   r   r   test_getweakrefcount  s&    

z'ReferencesTestCase.test_getweakrefcountc                 C   s   t  }t|| j}t|| j}~t  | t||gd t  }t|| j}t|| j}~t  | t||gd ~t  | t|g d | tdg d d S )Nzlist of refs does not matchzlist of refs not clearedr5   z#list of refs does not match for int)r   rH   r6   r7   r   rU   getweakrefsrV   r   r   r   test_getweakrefs  s0    z#ReferencesTestCase.test_getweakrefsc                 C   sF   G dd dt }|d}t|}| |d d | d| d d S )Nc                   @   s   e Zd ZdS )z6ReferencesTestCase.test_newstyle_number_ops.<locals>.FNr   r   r   r   r   F  s   r   g       @g      ?g      @)floatrH   ra   rU   )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  yL   Y n0 | d z
|  W n  yt   Y n0 | d d S )Nc                   @   s   e Zd ZdS )z?ReferencesTestCase.test_callbacks_protected.<locals>.BogusErrorNr   r   r   r   r   
BogusError  s   r   c                    s
    | = d S r   r   k)datar   r   remove  s    z;ReferencesTestCase.test_callbacks_protected.<locals>.removec                     s    dd } d t | <  d S )Nc                   S   s   dS )Nr   r   r   r   r   r   r     r   zRReferencesTestCase.test_callbacks_protected.<locals>.encapsulate.<locals>.<lambda>)rH   r6   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                   @   s   e Zd ZdS )z0ReferencesTestCase.test_sf_bug_840829.<locals>.CNr   r   r   r   r   r   ;  s   r   c                    s      S r   r<   ignorer;   r   r   r   ?  r   z7ReferencesTestCase.test_sf_bug_840829.<locals>.<lambda>c                    s      S r   r   r   r   r   r   r   G  r   )r;   r[   rH   r6   ic1)r
   r   r\   rK   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                   @   s   e Zd ZdS )z6ReferencesTestCase.test_callback_in_cycle_1.<locals>.JNr   r   r   r   r   JY  s   r   c                   @   s   e Zd Zdd ZdS )z7ReferencesTestCase.test_callback_in_cycle_1.<locals>.IIc                 S   s
   | j  d S r   r   r
   r   r   r   r   	acallback]  s    zAReferencesTestCase.test_callback_in_cycle_1.<locals>.II.acallbackNr   r   r   r   r   r   r   r   II\  s   r   r;   r[   r   rH   r6   r   rK   r<   r
   r;   r   r   Ir   r   r   test_callback_in_cycle_1V  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                   @   s   e Zd ZdS )z6ReferencesTestCase.test_callback_in_cycle_2.<locals>.JNr   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )z7ReferencesTestCase.test_callback_in_cycle_2.<locals>.IIc                 S   s
   | j  d S r   r   r   r   r   r   r     s    zAReferencesTestCase.test_callback_in_cycle_2.<locals>.II.acallbackNr   r   r   r   r   r     s   r   r   r   r   r   r   test_callback_in_cycle_2~  s    z+ReferencesTestCase.test_callback_in_cycle_2c                 C   sP   dd l }G dd d}| |  }}||_||_t||j|_~~|  d S )Nr   c                   @   s   e Zd Zdd ZdS )z6ReferencesTestCase.test_callback_in_cycle_3.<locals>.Cc                 S   s   | j  | j | j d S r   mer   rK   r   r   r   r   cb  s    z9ReferencesTestCase.test_callback_in_cycle_3.<locals>.C.cbNr   r   r   r   r   r   r   r   r     s   r   )r;   r   r   rH   r6   r   rK   r<   )r
   r;   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                   @   s   e Zd Zdd ZdS )z6ReferencesTestCase.test_callback_in_cycle_4.<locals>.Cc                 S   s   | j  | j | j d S r   r   r   r   r   r   r     s    z9ReferencesTestCase.test_callback_in_cycle_4.<locals>.C.cbNr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )z6ReferencesTestCase.test_callback_in_cycle_4.<locals>.DNr   r   r   r   r   D  s   r   )	r;   r[   r   r   rH   r6   r   rK   r<   )r
   r;   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   s
   || _ d S r   )Z	attribute)r
   valuer   r   r   r     s    zJReferencesTestCase.test_callback_in_cycle_resurrection.<locals>.C.__init__c                    s     | j d S r   )ru   r\   r   Zalistr   r   r     s    zKReferencesTestCase.test_callback_in_cycle_resurrection.<locals>.C.acallbackN)r   r   r   r   r   r   r   r   r   r     s   r   r5   rT   c                    s     d d S )NC went awayru   r   r   r   r   C_went_away  s    zKReferencesTestCase.test_callback_in_cycle_resurrection.<locals>.C_went_awayr   )	r;   r[   r\   rH   r6   r   rK   rU   r<   )r
   r;   r   r   r   r   rK   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                    s     d d S )Nsafe_callback calledr   r   r   r   r   safe_callback  s    zDReferencesTestCase.test_callbacks_on_callback.<locals>.safe_callbackc                       s   e Zd Z fddZdS )z8ReferencesTestCase.test_callbacks_on_callback.<locals>.Cc                    s     d d S )Nz	cb calledr   r   r   r   r   r     s    z;ReferencesTestCase.test_callbacks_on_callback.<locals>.C.cbNr   r   r   r   r   r     s   r   r   )
r;   r[   r#   r   rH   r6   rK   rQ   rU   r<   )r
   r;   r   r   r\   dr7   Zexternal_wrr   r   r   test_callbacks_on_callback  s(    	
z-ReferencesTestCase.test_callbacks_on_callbackc                 C   s   |  tj d S r   )check_gc_during_creationrH   r6   r	   r   r   r   test_gc_during_ref_creation#  s    z.ReferencesTestCase.test_gc_during_ref_creationc                 C   s   |  tj d S r   )r   rH   ra   r	   r   r   r   test_gc_during_proxy_creation&  s    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|  nt j|  0 d S )Nr5   c                   @   s   e Zd ZdS )z6ReferencesTestCase.check_gc_during_creation.<locals>.ANr   r   r   r   r   r   -  s   r   c                  W   s   d S r   r   )argsr   r   r   r7   0  s    z=ReferencesTestCase.check_gc_during_creation.<locals>.callback)r;   get_thresholdset_thresholdr<   r   rK   rH   r6   )r
   r   Z
thresholdsr   r7   Z
referencedr   r   r   r   r   )  s    
z+ReferencesTestCase.check_gc_during_creationc                 C   s   G dd dt }| }d S )Nc                   @   s   e Zd Zdd ZdS )z>ReferencesTestCase.test_ref_created_during_del.<locals>.Targetc                 S   s   t | ad S r   )rH   r6   ref_from_delr	   r   r   r   __del__H  s    zFReferencesTestCase.test_ref_created_during_del.<locals>.Target.__del__Nr   r   r   r  r   r   r   r   TargetG  s   r  )r[   )r
   r  wr   r   r   test_ref_created_during_delB  s    z.ReferencesTestCase.test_ref_created_during_delc              	   C   s.   t t}| t|jddddd t  d S r0   )rH   r6   r   r^   r_   r   r;   r<   )r
   rr   r   r   	test_initN  s    
zReferencesTestCase.test_initc                 C   sX   G dd dt }g }tt t||j}d }t  | | d  | ||g d S )Nc                   @   s   e Zd ZdS )z*ReferencesTestCase.test_classes.<locals>.ANr   r   r   r   r   r   X  s   r   )r[   rH   r6   intru   r;   r<   rU   )r
   r   lr   r   r   r   test_classesV  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  q| ||k | ||k | ||k | ||k | 	||k||u  | 	||k||u d S )Nr5   rT   )
r   rH   r6   rw   rt   r   r;   r<   rQ   rU   )	r
   r   yzr   br\   r   r
  r   r   r   test_equalityb  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	||| qbd S r4   )r   ltgtleger   rH   r6   r^   r_   r;   r<   )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   rH   r6   rU   r&   r;   r<   r^   r_   )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                   @   s   e Zd Zdd ZdS )z1ReferencesTestCase.test_trashcan_16602.<locals>.Cc                    s0   |sd S t |   fdd}t ||| _d S )Nc                    s
     }d S r   r   )wparentrJ   Zwselfr   r   r     s    zFReferencesTestCase.test_trashcan_16602.<locals>.C.__init__.<locals>.cb)rH   r6   r  )r
   parentr   r   r  r   r     s
    
z:ReferencesTestCase.test_trashcan_16602.<locals>.C.__init__Nr.   r   r   r   r   r     s   r   d   )rH   WeakKeyDictionaryry   r;   r<   )r
   r   r   rootr\   nr   r   r   test_trashcan_16602  s    	z&ReferencesTestCase.test_trashcan_16602c                 C   sD   t d}dd }t||}| |j| t|}| |j d S )Nr5   c                 S   s   d S r   r   rZ   r   r   r   r     r   z<ReferencesTestCase.test_callback_attribute.<locals>.<lambda>)r   rH   r6   rQ   __callback__rR   )r
   r   r7   rW   rX   r   r   r   test_callback_attribute  s    
z*ReferencesTestCase.test_callback_attributec                 C   s<   t d}t|| j}| |j ~t  | |j d S r4   )	r   rH   r6   r7   rf   r#  r   r   rR   )r
   r   r6   r   r   r   &test_callback_attribute_after_deletion  s    z9ReferencesTestCase.test_callback_attribute_after_deletionc                 C   sT   t d}dd }t||}| t dd |_W d    n1 sF0    Y  d S )Nr5   c                 S   s   d S r   r   rZ   r   r   r   r     r   z@ReferencesTestCase.test_set_callback_attribute.<locals>.<lambda>c                 S   s   d S r   r   rZ   r   r   r   r     r   )r   rH   r6   r^   AttributeErrorr#  )r
   r   r7   rW   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                   @   s   e Zd Zdd ZdS )z;ReferencesTestCase.test_callback_gcs.<locals>.ObjectWithDelc                 S   s   d S r   r   r	   r   r   r   r    r   zCReferencesTestCase.test_callback_gcs.<locals>.ObjectWithDel.__del__Nr  r   r   r   r   ObjectWithDel  s   r(  r5   c                 S   s   t  S r   )r   r   rZ   r   r   r   r     r   z6ReferencesTestCase.test_callback_gcs.<locals>.<lambda>)r   rH   r6   r   r   )r
   r(  r   rW   r   r   r   test_callback_gcs  s
    z$ReferencesTestCase.test_callback_gcsN):r   r   r   rL   rN   r   cpython_onlyrS   rY   r]   r`   re   rG   rM   rj   rm   r}   r   r   r   r   r   r   r   r   rq   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   rF   e   sl   
	
((.&%	rF   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   sr   G dd dt j}td}||dd}| | | | |j | |jd ~t  | 	|  | |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
   obr7   r   	__class__r   r   r     s    zFSubclassableWeakrefTestCase.test_subclass_refs.<locals>.MyRef.__init__c                    s   d| _ t  S NT)calledr,  r   r	   r.  r   r   r     s    zFSubclassableWeakrefTestCase.test_subclass_refs.<locals>.MyRef.__call__)Nr   )r   r   r   r   r   __classcell__r   r   r.  r   MyRef  s   r3  r      r   )
rH   r6   r   rQ   rw   r1  rU   r   r   rR   )r
   r3  rJ   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                   @   s   e Zd ZdS )zXSubclassableWeakrefTestCase.test_subclass_refs_dont_replace_standard_refs.<locals>.MyRefNr   r   r   r   r   r3    s   r3  r   rT   ro   r   r5   )
rH   r6   r   assertIsNotrU   r   ri   rv   rQ   rx   )r
   r3  rJ   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                   @   s   e Zd ZdS )zUSubclassableWeakrefTestCase.test_subclass_refs_dont_conflate_callbacks.<locals>.MyRefNr   r   r   r   r   r3    s   r3  r   )rH   r6   r   idstrr8  r   rx   )r
   r3  rJ   r9  r:  r;  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   )rH   r6   __new__)r   r-  r7   rA  rB  r   r   r   rC    s    zPSubclassableWeakrefTestCase.test_subclass_refs_with_slots.<locals>.MyRef.__new__c                 S   s   || _ || _d S r   r@  )r
   r-  r7   rA  rB  r   r   r   r     s    zQSubclassableWeakrefTestCase.test_subclass_refs_with_slots.<locals>.MyRef.__init__c                 S   s   | j | j S r   r@  r	   r   r   r   meth  s    zMSubclassableWeakrefTestCase.test_subclass_refs_with_slots.<locals>.MyRef.methN)r   r   r   	__slots__rC  r   rD  r   r   r   r   r3    s   r3  r   abcdefZabcdef__dict__)	rH   r6   r   rU   rA  rB  rD  rt   r   )r
   r3  rJ   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                   @   s   e Zd ZdS )zHSubclassableWeakrefTestCase.test_subclass_refs_with_cycle.<locals>.MyRefNr   r   r   r   r   r3  #  s   r3  c                    s     j d7  _ d S r4   r1   )r  r	   r   r   r7   (  s    zKSubclassableWeakrefTestCase.test_subclass_refs_with_cycle.<locals>.callbackr   N)rH   r6   r   rJ   rU   r2   r
  )r
   r3  r7   rJ   r9  r:  r   r	   r   test_subclass_refs_with_cycle  s"    


z9SubclassableWeakrefTestCase.test_subclass_refs_with_cycleN)r   r   r   r7  r<  r?  rI  rJ  r   r   r   r   r+    s
   r+  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                   @   s   e Zd Zdd ZdS )z'WeakMethodTestCase._subclass.<locals>.Cc                 S   s   dS )Nr   r   r	   r   r   r   r)   H  s    z3WeakMethodTestCase._subclass.<locals>.C.some_methodN)r   r   r   r)   r   r   r   r   r   G  s   r   )r   )r
   r   r   r   r   	_subclassE  s    zWeakMethodTestCase._subclassc                 C   sn   t d}t|j}| |tj | | t|j | | j| | | j	|jj	 | 
|  d d S )Nr5   r(   )r   rH   
WeakMethodr)   ZassertIsInstanceReferenceTyper   rQ   __self____func__rU   r
   rJ   r
  r   r   r   
test_aliveL  s    zWeakMethodTestCase.test_alivec                 C   s0   t d}t|j}~t  | | d  d S r4   )r   rH   rM  r)   r;   r<   rQ   rQ  r   r   r   test_object_deadU  s
    z#WeakMethodTestCase.test_object_deadc                 C   s:   |   }|d}t|j}|`t  | | d  d S r4   )rL  rH   rM  r)   r;   r<   rQ   )r
   r   rJ   r
  r   r   r   test_method_dead\  s    z#WeakMethodTestCase.test_method_deadc                    sh   |   }g   fdd}|d}t|j|}~t  |  |g tj|_t  |  |g d S )Nc                    s     |  d S r   r   r   Zcallsr   r   r   h  s    z=WeakMethodTestCase.test_callback_when_object_dead.<locals>.cbr5   )rL  rH   rM  r)   r;   r<   rU   r   r
   r   r   rJ   r
  r   rU  r   test_callback_when_object_deadd  s    z1WeakMethodTestCase.test_callback_when_object_deadc                    sd   |   }g   fdd}|d}t|j|}|`t  |  |g ~t  |  |g d S )Nc                    s     |  d S r   r   r   rU  r   r   r   x  s    z=WeakMethodTestCase.test_callback_when_method_dead.<locals>.cbr5   )rL  rH   rM  r)   r;   r<   rU   rV  r   rU  r   test_callback_when_method_deadt  s    z1WeakMethodTestCase.test_callback_when_method_deadc                 C   s<   t d}dd }t|j|}t|}~| | d  d S )Nr5   c                 S   s   d S r   r   )_r   r   r   r     s    z-WeakMethodTestCase.test_no_cycles.<locals>.cb)r   rH   rM  r)   r6   rQ   )r
   rJ   r   r
  rK   r   r   r   test_no_cycles  s    
z!WeakMethodTestCase.test_no_cyclesc                    sT   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 qqd S )Nc                    s      | |k  | |k d S r   rw   rt   r   r  r	   r   r   _eq  s    z-WeakMethodTestCase.test_equality.<locals>._eqc                    s      | |k  | |k d S r   r[  r\  r	   r   r   _ne  s    z-WeakMethodTestCase.test_equality.<locals>._ner5   rT   )	r   rH   rM  r)   r+   r   r;   r<   rU   )r
   r]  r^  r   r  r   r  r\   r   r  er   r;  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 r4   )r   rH   rM  r)   r+   rU   r&   r;   r<   r^   r_   )r
   r   r  r   r  r\   Zhar   r   r   r    s    zWeakMethodTestCase.test_hashingN)r   r   r   rL  rR  rS  rT  rW  rX  r   r*  rZ  r  r  r   r   r   r   rK  C  s   	

)rK  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MappingTestCaserp   c           	         s   d}dd t |D }| fdd|D }| }zt| W n tyR   Y n0 ~t  t|}~t  t|}| |d | |d d S )N   c                 S   s   g | ]
}t  qS r   r,   .0r   r   r   r   
<listcomp>  r   z4MappingTestCase.check_len_cycles.<locals>.<listcomp>c                 3   s   | ]} |V  qd S r   r   re  rJ   consr   r   	<genexpr>  r   z3MappingTestCase.check_len_cycles.<locals>.<genexpr>)r   r5   r   )	ry   itemsnextStopIterationr;   r<   rv   rx   rU   )	r
   	dict_typeri  Nrk  dctr   n1n2r   rh  r   check_len_cycles  s     z MappingTestCase.check_len_cyclesc                 C   s   |  tjdd  d S )Nc                 S   s   | dfS r4   r   r   r   r   r   r     r   z<MappingTestCase.test_weak_keyed_len_cycles.<locals>.<lambda>)rs  rH   r  r	   r   r   r   test_weak_keyed_len_cycles  s    z*MappingTestCase.test_weak_keyed_len_cyclesc                 C   s   |  tjdd  d S )Nc                 S   s   d| fS r4   r   r   r   r   r   r     r   z=MappingTestCase.test_weak_valued_len_cycles.<locals>.<lambda>)rs  rH   WeakValueDictionaryr	   r   r   r   test_weak_valued_len_cycles  s    z+MappingTestCase.test_weak_valued_len_cyclesc           
   	      s   | j tjgt R   tddD ]}d}td t||| dd t|D }| fdd|D }~| }zt| W n ty   Y n0 t	|}~t	|}	| 
|d | || | 
|	d | |	| q"d S )	Nr5   r  rb  r   c                 S   s   g | ]
}t  qS r   rc  rd  r   r   r   rf    r   z2MappingTestCase.check_len_race.<locals>.<listcomp>c                 3   s   | ]} |V  qd S r   r   rg  rh  r   r   rj    r   z1MappingTestCase.check_len_race.<locals>.<genexpr>)Z
addCleanupr;   r  r  ry   r<   rk  rl  rm  rv   ZassertGreaterEqualZassertLessEqual)
r
   rn  ri  thro  rk  rp  r   rq  rr  r   rh  r   check_len_race  s(    
zMappingTestCase.check_len_racec                 C   s   |  tjdd  d S )Nc                 S   s   | dfS r4   r   r   r   r   r   r     r   z:MappingTestCase.test_weak_keyed_len_race.<locals>.<lambda>)rx  rH   r  r	   r   r   r   test_weak_keyed_len_race  s    z(MappingTestCase.test_weak_keyed_len_racec                 C   s   |  tjdd  d S )Nc                 S   s   d| fS r4   r   r   r   r   r   r     r   z;MappingTestCase.test_weak_valued_len_race.<locals>.<lambda>)rx  rH   ru  r	   r   r   r   test_weak_valued_len_race  s    z)MappingTestCase.test_weak_valued_len_racec                 C   s  |   \}}|D ]*}| t|d | |||j d qt| }t|  }|	  |	  | ||d ~~| t
|| j |d= t  | t
|| jd d ~~t  | t
|dd t }| t|jd t |d< t  | t|jd d S )Nr5   #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 dictionaryrT   )make_weak_valued_dictrU   rH   ri   rQ   r   r   rk  copysortrv   COUNTr   ru  r^   KeyError__getitem__r   r
   dictobjectsrJ   Zitems1Zitems2r   r   r   test_weak_values  s<    
z MappingTestCase.test_weak_valuesc                 C   s   |   \}}|D ]0}| t|dd|  | |j|| d q| }|  }| t|t|d ~~| t	|| j
 |d= t  | t	|| j
d d ~~t  | t	|dd td}d	||< | || | d
| d S )Nr5   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_dictrU   rH   ri   rQ   r   rk  r~  setrv   r  r   r   rx   assertNotInr  r   r   r   test_weak_keys(  s:    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 r0   )	r  check_iterskeyrefsrU   rv   r   rx   r   r   r
   r  r  r;  Zobjects2rK   r-  r   r   r   test_weak_keyed_itersF  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 r0   )	r}  r  	valuerefsrU   rv   r   r   r   itervaluerefsr  r   r   r   test_weak_valued_itersa  s&    
z&MappingTestCase.test_weak_valued_itersc                 C   s   t | }| D ]}|| q| |d t | }|D ]}|| q@| |d t | }| D ]}|| qp| |d t | }| D ]}|| q| |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   rk  r   rt   keysvalues)r
   r  rk  itemr  r   r  vr   r   r   r  z  s$    zMappingTestCase.check_itersc                 C   sl   t |}tt|| }t| |d= t  | t t|t |t |d g ~| t ||d  d S )Nr5   )	rv   r   getattrrl  r;   r<   rx   r   rU   )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,0    Y  | $\}}| t|j| W d    n1 sf0    Y  |  || | $\}}| t|j| W d    n1 s0    Y  |  || | \}}|||< W d    n1 s0    Y  | || | t|}| \}}|| W d    n1 s:0    Y  | || | \}}|  W d    n1 sz0    Y  | t	|d d S r0   )
r  r^   r  r   poprU   r~  updateclearrv   )r
   r  testcontextr   r  Zddictr   r   r   -check_weak_destroy_and_mutate_while_iterating  s$    *..&
*(z=MappingTestCase.check_weak_destroy_and_mutate_while_iteratingc                 C   s  t d}| V t|}|t|  | t||d  |||< | t|| W d    n1 sj0    Y  | @ | t||d  |  | t||d  W d    n1 s0    Y  | F | t||d  |t| = | t||d  W d    n1 s0    Y  | @ | t||d  |  | t||d  W d    n1 sv0    Y  | ( |  | t|d W d    n1 s0    Y  | t|d d S )	Ni@ r5   rT   ro   r(   r*   r   r   )r   rv   r  rl  r  rU   popitemr  )r
   r  r  rJ   r!  r   r   r   &check_weak_del_and_len_while_iterating  s.    .2440z6MappingTestCase.check_weak_del_and_len_while_iteratingc                    s   |   \ |  d |  d |  d |  d |   \ tj fdd}|  | |   \ |  | d S )Nr  rk  r  r  c                  3   sX   zDt   } t|   j}t  t||fV  W d } t  nd } t  0 d S r   r   rk  rl  r  r   r;   r<   r   )r   r  r  r  r   r   r    s    

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  rk  r  r  r  c                  3   sX   zDt   } t|   j}t  |t|fV  W d } t  nd } t  0 d S r   r  )r   r   r  r   r   r    s    

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 Nro   il  r   rH   r  rU   r
   rJ   r  r   r   r   #test_make_weak_keyed_dict_from_dict  s    z3MappingTestCase.test_make_weak_keyed_dict_from_dictc                 C   s4   t d}t|di}t|}| || d d S r  r  r
   rJ   r  Zdict2r   r   r   .test_make_weak_keyed_dict_from_weak_keyed_dict  s    
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   )rH   r  r   mapr   ry   r  r   r
   r  r  rJ   r   r   r   r    s
    z$MappingTestCase.make_weak_keyed_dictc                 C   s*   t d}td|i}| |d | d S r  r   rH   ru  rU   r  r   r   r   $test_make_weak_valued_dict_from_dict   s    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%  s    
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f i ||i}| t| |g | || | q@d S )Nr   ro   r
   r  r#   iterable)	r^   r_   rH   ru  r   r   rU   r   r  )r
   rJ   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   )rH   ru  r   r  r   ry   r  r   r  r   r   r   r}  7  s
    z%MappingTestCase.make_weak_valued_dictc           	      C   s   | }|||< |||< |  t|d | \}}|  t|d ||u rX| || n| || | \}}|  t|d ||u r| || n| || d S )NrT   r5   r   )rU   rv   r  rQ   )	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  rH   ru  r   r	   r   r   r   test_weak_valued_dict_popitemP  s    z-MappingTestCase.test_weak_valued_dict_popitemc                 C   s   |  tjt dt d d S Nzvalue 1zvalue 2)r  rH   r  r   r	   r   r   r   test_weak_keyed_dict_popitemT  s    z,MappingTestCase.test_weak_keyed_dict_popitemc                 C   s   |  ||d | }|||}| || | || | ||| | || | |||}| || | || | ||| | || | d S )Nz9invalid test -- value parameters must be distinct objects)r8  
setdefaultrQ   rx   get)r
   r  keyr  r  r  rJ   r   r   r   check_setdefaultX  s    z MappingTestCase.check_setdefaultc                 C   s   |  tjdt t  d S )Nr  )r  rH   ru  r   r	   r   r   r    test_weak_valued_dict_setdefaulti  s    
z0MappingTestCase.test_weak_valued_dict_setdefaultc                 C   s   |  tjt dd d S r  )r  rH   r  r   r	   r   r   r   test_weak_keyed_dict_setdefaultm  s    z/MappingTestCase.test_weak_keyed_dict_setdefaultc                 C   s   | }| | | t|t| | D ]>}| ||d ||}| |||  | ||| q,| D ]<}| ||d || }| |||  | ||| qtd S )Nz(mysterious new key appeared in weak dictz%original key disappeared in weak dict)r  rU   rv   r  rx   r  rQ   )r
   r  r  r  r   r  r   r   r   check_updateq  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 ]F}t }|jf i ||i | t|	 |g | || | q~d S )Nr5   r   r   ro   r  )r  rH   ru  r   r^   r_   r  rU   r   r  r   )r
   r   rJ   r  r   r   r   test_weak_valued_dict_update  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 )Nr5   r5   rT   )r5   ro   r*   r   rT   )	r   rH   ru  r~  rU   r  rQ   r   r  )r
   r   r  r\   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 )Nr5   rT   ro   )r  rH   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	somethingrT   r5   )rH   r  r   rU   rv   r   r  r
   r   o1rh   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 )	Nr5   rT   ro   r(   56      )
r   rH   r  r~  rU   r  rQ   r   r  r  )r
   r  rh   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 elserT   r5   )rH   ru  r   rU   rv   r   rk  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     )	rH   r  r   r^   r  r   r  r_   __setitem__)r
   r   rJ   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 }||= qnt  | 	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   s
   || _ d S r   r5  )r
   r   r   r   r   r     s    zEMappingTestCase.test_weak_keyed_cascading_deletes.<locals>.C.__init__c                 S   s
   t | jS r   )r&   r   r	   r   r   r   r'     s    zEMappingTestCase.test_weak_keyed_cascading_deletes.<locals>.C.__hash__c                    s    r
d= | j |j kS )Nr  r5  r"   mutateobjsr   r   r$     s    zCMappingTestCase.test_weak_keyed_cascading_deletes.<locals>.C.__eq__N)r   r   r   r   r'   r$   r   r  r   r   r     s   r   c                    s   g | ]} |qS r   r   rd  )r   r   r   rf    r   zEMappingTestCase.test_weak_keyed_cascading_deletes.<locals>.<listcomp>r(   Tr   r5   rT   )rH   r  r[   ry   r   r   r  reverser   rU   rv   )r
   r   rJ   countr   )r   r  r  r   !test_weak_keyed_cascading_deletes  s"    	z1MappingTestCase.test_weak_keyed_cascading_deletesc                 C   s   t  }| t|d d S )Nz<WeakValueDictionary at 0x.*>)rH   ru  assertRegexrI   r
   r  r   r   r   test_make_weak_valued_dict_repr5  s    z/MappingTestCase.test_make_weak_valued_dict_reprc                 C   s   t  }| t|d d S )Nz<WeakKeyDictionary at 0x.*>)rH   r  r  rI   r  r   r   r   test_make_weak_keyed_dict_repr9  s    z.MappingTestCase.test_make_weak_keyed_dict_reprc                 C   s\   t  }t : tdD ] }|dt }| |d  ~qW d    n1 sN0    Y  d S Ni rp   )rH   ru  rE   ry   r  r,   r8  r
   r   r   r   r   r   r   $test_threaded_weak_valued_setdefault=  s    z4MappingTestCase.test_threaded_weak_valued_setdefaultc                 C   sb   t  }t @ tdD ]&}t |d< |dd}| |d  qW d    n1 sT0    Y  d S r  )rH   ru  rE   ry   r,   r  r8  r  r   r   r   test_threaded_weak_valued_popE  s    
z-MappingTestCase.test_threaded_weak_valued_popc                 C   sb   t  }t @ tdD ]&}t }||d< | t|d d }qW d    n1 sT0    Y  d S )Ni@ rp   r5   )rH   ru  rE   ry   r,   rU   rv   )r
   r   r   rJ   r   r   r   %test_threaded_weak_valued_consistencyM  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 ]6}|||| }}|	| |
| |||< ~~q^tj|||fd
}|tju rtj||	fd
}ntj||
fd
}|  |  |	  |	  |r|d d S )Nc                   @   s   e Zd Zdd ZdS )z?MappingTestCase.check_threaded_weak_dict_copy.<locals>.DummyKeyc                 S   s
   || _ d S r   ctrr
   r  r   r   r   r   _  s    zHMappingTestCase.check_threaded_weak_dict_copy.<locals>.DummyKey.__init__Nr.   r   r   r   r   DummyKey^  s   r  c                   @   s   e Zd Zdd ZdS )zAMappingTestCase.check_threaded_weak_dict_copy.<locals>.DummyValuec                 S   s
   || _ d S r   r  r  r   r   r   r   c  s    zJMappingTestCase.check_threaded_weak_dict_copy.<locals>.DummyValue.__init__Nr.   r   r   r   r   
DummyValueb  s   r  c              
      sT   z  du rt | }n|   }W n. tyN } z|| W Y d }~n
d }~0 0 d S r0  )r~  deepcopyr   ru   )r   excrY  exr  r   r   	dict_copyf  s    z@MappingTestCase.check_threaded_weak_dict_copy.<locals>.dict_copyc                 S   sH   d}| rDt dt| d }|d7 }| | |d dkrt  qd S )Nr   r5   i'  )randomrandintrv   r  r;   r<   )ZlstZgc_ctrr   r   r   r   pop_and_collecto  s    
zFMappingTestCase.check_threaded_weak_dict_copy.<locals>.pop_and_collectip )r?   r  r   )
rx   rH   r  ru  ry   ru   r@   rA   rB   rC   )r
   type_r  r  r  r  r  r  r   r  r  r   r   r  Zt_copyZ	t_collectr   r  r   check_threaded_weak_dict_copyY  s4    		


z-MappingTestCase.check_threaded_weak_dict_copyc                 C   s   |  tjd d S NFr  rH   r  r	   r   r   r    test_threaded_weak_key_dict_copy  s    z0MappingTestCase.test_threaded_weak_key_dict_copyc                 C   s   |  tjd d S r0  r   r	   r   r   r   $test_threaded_weak_key_dict_deepcopy  s    z4MappingTestCase.test_threaded_weak_key_dict_deepcopyc                 C   s   |  tjd d S r  r  rH   ru  r	   r   r   r   "test_threaded_weak_value_dict_copy  s    z2MappingTestCase.test_threaded_weak_value_dict_copyc                 C   s   |  tjd d S r0  r  r	   r   r   r   &test_threaded_weak_value_dict_deepcopy  s    z6MappingTestCase.test_threaded_weak_value_dict_deepcopyc                 C   s   t  }| |jj d S r   )rH   ru  rR   _remove__closure__)r
   r   r   r   r   test_remove_closure  s    z#MappingTestCase.test_remove_closureN)7r   r   r   r  rs  rt  rv  rx  ry  rz  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   ra    sf    !%%.=ra  )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 protocolr5   rT   ro   )r  r  key3c                 C   s
   | j  S r   )!_WeakValueDictionaryTestCase__refr~  r	   r   r   r   
_reference  s    z&WeakValueDictionaryTestCase._referenceN)
r   r   r   __doc__r   r  rH   ru  	type2testr  r   r   r   r   r
    s   r
  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  r5   r  rT   r  ro   c                 C   s
   | j  S r   )_WeakKeyDictionaryTestCase__refr~  r	   r   r   r   r    s    z$WeakKeyDictionaryTestCase._referenceN)
r   r   r   r  r   r  rH   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                   @   s   e Zd ZdS )zFinalizeTestCase.ANr   r   r   r   r   r     s   r   c                 C   s   t jjdkrt  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)r  r  r     F)r  r  r  r  )r   rH   finalizerU   alivepeekdetachr  )r
   r  r   r   r   r  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 s0    Y  | t  tj||dd
 W d    n1 s0    Y  | ttj| | ttj d S )Nc                     s     | |f d S r   r   )r  kwargsr  r   r   fin  s    z-FinalizeTestCase.test_arg_errors.<locals>.finr5   rT   ro   r(   )funcr   r  )r&  r   )r   r&  r   )r   rH   r  rU   r!  r^   r_   )r
   r%  r   r   r   r  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   r*  r-  r   r+  r)  r(  r   )
r   rH   r  ru   rw   r   r"  rt   r  rU   )	r
   r   r  r(  r)  r*  r+  r,  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                   @   s   e Zd ZdS )z4FinalizeTestCase.test_all_freed.<locals>.MyFinalizerNr   r   r   r   r   MyFinalizer0  s   r/  c                      s     d d S )N{   r   r   r  r   r   r7   5  s    z1FinalizeTestCase.test_all_freed.<locals>.callbackr0  )rH   r  r   r6   rf   r  rR   rU   )r
   r/  r   r7   r   Zwr_callbackZwr_fr   r  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 errorr5   r   )rH   r  print)r2  clsr   r   errorI  s    z,FinalizeTestCase.run_in_child.<locals>.errorr(  r)  r+  F)rH   r  r4  _global_varatexit)r6  r7  r(  r)  r*  r+  r   r5  r   run_in_childG  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 foobarr3  r2  z	f1 foobars   ZeroDivisionError)r   Zassert_python_okdecode
splitlinesrU   rw   )r
   progrcouterrr   r   r   test_atexit[  s
    zFinalizeTestCase.test_atexitN)r   r   r   r   r  r#  r'  r.  r1  classmethodr:  rB  r   r   r   r   r    s   )'
r  a   Doctest for examples in the library reference: weakref.rst

>>> from test.support import gc_collect
>>> 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
>>> gc_collect()  # For PyPy or other GCs.
>>> 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
>>> gc_collect()  # For PyPy or other GCs.
>>> 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_unittestrF   rK  ra  r
  r  r+  r  Zrun_doctestr  modulesr   r   r   r   r   	test_main  s    	rF  __main__)r8   )*r;   r  Zunittestrr   rH   r   r  r~  r@   r9   r  testr   Ztest.supportr   r   r   r  r8  r   r   r   r   r   r,   ZTestCaser/   r  rE   rF   r+  rK  ra  r	  ZBasicTestMappingProtocolr
  r  r  rD  Z__test__rF  r   r   r   r   r   <module>   sd   	      |h 
     i $V
