B
    u9aZ                 @   s   d dl Z d dlZd dlmZ d dlmZ d dlZd dlZd dlZd dl	Z	d dl
Z
G dd deZdd ZG dd	 d	ZG d
d dejeZG dd dejeZdd Zedkre  dS )    N)DocTestSuite)supportc               @   s   e Zd ZdS )WeakN)__name__
__module____qualname__ r   r   */usr/lib/python3.7/test_threading_local.pyr      s   r   c             C   s    t  }|| _|t| d S )N)r   weakappendweakrefref)localweaklistr
   r   r   r	   target   s    r   c               @   sl   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )BaseLocalTestc             C   s"   |  d |  d |  d d S )N   2   d   )_local_refs)selfr   r   r	   test_local_refs   s    

zBaseLocalTest.test_local_refsc             C   s   |   }g }x2t|D ]&}tjt||fd}|  |  qW ~t  | 	t
|| dd |D }| t
||d |f d |_t  dd |D }| t
||d |f|t
|f d S )N)r   argsc             S   s   g | ]}| d kr|qS )Nr   ).0r
   r   r   r	   
<listcomp>+   s    z-BaseLocalTest._local_refs.<locals>.<listcomp>   c             S   s   g | ]}| d kr|qS )Nr   )r   r
   r   r   r	   r   1   s    )_localrange	threadingThreadr   startjoingccollectassertEquallenZassertInZsomeothervar)r   nr   r   itZdeadlistr   r   r	   r      s    zBaseLocalTest._local_refsc          	      s^   dd l G fdddj}| fdd t fddtdD  W d Q R X d S )	Nr   c                   s   e Zd Z fddZdS )z)BaseLocalTest.test_derived.<locals>.Localc                s     d d S )Ng{Gz?)Zsleep)r   )timer   r	   __init__;   s    z2BaseLocalTest.test_derived.<locals>.Local.__init__N)r   r   r   r*   r   )r)   r   r	   Local:   s   r+   c                s   |  _  j |  d S )N)xr$   )r'   )r   r   r   r	   f?   s    z%BaseLocalTest.test_derived.<locals>.fc             3   s   | ]}t j |fd V  qdS ))r   r   N)r   r   )r   r'   )r-   r   r	   	<genexpr>D   s   z-BaseLocalTest.test_derived.<locals>.<genexpr>
   )r)   r   r   Zstart_threadsr   )r   r+   r   )r-   r   r   r)   r	   test_derived4   s    zBaseLocalTest.test_derivedc                s   G dd d| j  d dt t  fdd}tj|d}|     fddtd	D   |  | 	 d S )
Nc               @   s   e Zd ZdS )z7BaseLocalTest.test_derived_cycle_dealloc.<locals>.LocalN)r   r   r   r   r   r   r	   r+   J   s   r+   Fc                 sL     g} |  |  d| d _~ t      tdd D d S )Nbarr   c             s   s   | ]}t |d  V  qdS )fooN)hasattr)r   r   r   r   r	   r.   `   s    zFBaseLocalTest.test_derived_cycle_dealloc.<locals>.f.<locals>.<genexpr>)r   r2   r"   r#   setwaitall)cycle)r+   e1e2localspassedr   r	   r-   Q   s    

z3BaseLocalTest.test_derived_cycle_dealloc.<locals>.f)r   c                s   g | ]
}  qS r   r   )r   r'   )r+   r   r	   r   i   s    z<BaseLocalTest.test_derived_cycle_dealloc.<locals>.<listcomp>r/   )
r   r   Eventr   r    r5   r   r4   r!   Z
assertTrue)r   r-   r(   r   )r+   r8   r9   r:   r;   r	   test_derived_cycle_deallocH   s    z(BaseLocalTest.test_derived_cycle_deallocc             C   sJ   G dd d| j }|dd |d | jt| j dd | t| j d d S )Nc               @   s   e Zd Zdd ZdS )z-BaseLocalTest.test_arguments.<locals>.MyLocalc             _   s   d S )Nr   )r   r   kwargsr   r   r	   r*   r   s    z6BaseLocalTest.test_arguments.<locals>.MyLocal.__init__N)r   r   r   r*   r   r   r   r	   MyLocalq   s   r?   r   )a)r   assertRaises	TypeError)r   r?   r   r   r	   test_argumentso   s
    
zBaseLocalTest.test_argumentsc                s   d_   t t fdd} fdd}tj|d}|    tj|d}|  |    |  j j  d S )Nz No error message set or cleared.c                  s$   d_ d_`     d S )Nr2   r1   )r,   yr4   r5   r   )r8   r9   objr   r	   f1   s
    z)BaseLocalTest._test_one_class.<locals>.f1c                 sF   y
j } W n tk
r$   d_Y nX d|  f _tjj d S )N z'Incorrectly got value %r from class %r
)r,   AttributeError_failedsysstderrwrite)r2   )crE   r   r   r	   f2   s    
z)BaseLocalTest._test_one_class.<locals>.f2)r   )	rI   r   r<   r   r    r5   r!   r4   ZassertFalse)r   rM   rF   rN   Zt1Zt2r   )rM   r8   r9   rE   r   r	   _test_one_classz   s    zBaseLocalTest._test_one_classc             C   s   |  | j d S )N)rO   r   )r   r   r   r	   test_threading_local   s    z"BaseLocalTest.test_threading_localc             C   s    G dd d| j }| | d S )Nc               @   s   e Zd ZdS )zBBaseLocalTest.test_threading_local_subclass.<locals>.LocalSubclassN)r   r   r   r   r   r   r	   LocalSubclass   s   rQ   )r   rO   )r   rQ   r   r   r	   test_threading_local_subclass   s    z+BaseLocalTest.test_threading_local_subclassc          	   C   sX   | }d|_ | |jddi | t i |_W d Q R X | t
 |`W d Q R X d S )N   r,   )r,   r$   __dict__rA   rH   )r   clsrE   r   r   r	   _test_dict_attribute   s    z"BaseLocalTest._test_dict_attributec             C   s   |  | j d S )N)rV   r   )r   r   r   r	   test_dict_attribute   s    z!BaseLocalTest.test_dict_attributec             C   s    G dd d| j }| | d S )Nc               @   s   e Zd ZdS )zABaseLocalTest.test_dict_attribute_subclass.<locals>.LocalSubclassN)r   r   r   r   r   r   r	   rQ      s   rQ   )r   rV   )r   rQ   r   r   r	   test_dict_attribute_subclass   s    z*BaseLocalTest.test_dict_attribute_subclassc             C   sJ   G dd d}| }|   |_||j_t|}~t  | |  d S )Nc               @   s   e Zd ZdS )z.BaseLocalTest.test_cycle_collection.<locals>.XN)r   r   r   r   r   r   r	   X   s   rY   )r   r   r,   r   r   r"   r#   ZassertIsNone)r   rY   r,   Zwrr   r   r	   test_cycle_collection   s    

z#BaseLocalTest.test_cycle_collectionN)r   r   r   r   r   r0   r=   rC   rO   rP   rR   rV   rW   rX   rZ   r   r   r   r	   r      s   '$	r   c               @   s   e Zd ZejZdS )ThreadLocalTestN)r   r   r   _threadr   r   r   r   r	   r[      s   r[   c               @   s   e Zd ZejZdS )PyThreadingLocalTestN)r   r   r   _threading_localr   r   r   r   r   r	   r]      s   r]   c                 sr   t  } | td | t t | t t tj dd } fdd}| td||d t	
|  d S )Nr^   c             S   s   t jt_d S )N)r\   r   r^   r   )testr   r   r	   setUp   s    ztest_main.<locals>.setUpc                s
    t _d S )N)r^   r   )r_   )
local_origr   r	   tearDown   s    ztest_main.<locals>.tearDown)r`   rb   )unittestZ	TestSuiteZaddTestr   Z	makeSuiter[   r]   r^   r   r   Zrun_unittest)Zsuiter`   rb   r   )ra   r	   	test_main   s    rd   __main__)rJ   rc   Zdoctestr   r_   r   r   r"   r\   r   r^   objectr   r   r   ZTestCaser[   r]   rd   r   r   r   r   r	   <module>   s"    .