a
    va#                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ z(d dlmZ d dlm	Z	 d dlm
Z
 W n ey   d Z Z	Z
Y n0 e edudG d	d
 d
e jZe edudG dd de jZdS )    N)partial)greenlet)
getcurrent)Context)
ContextVar)copy_contextzContextVar not supportedc                   @   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d Z
dd Zdd Zdd ZdS )ContextVarsTestsc                 O   s   t  j|i |S N)r   run)selfargskwargs r   >lib/python3.9/site-packages/greenlet/tests/test_contextvars.py_new_ctx_run   s    zContextVarsTests._new_ctx_runc                 C   s^   |d u r|  |  n| | | || tdD ]}||   d7  < |  q:d S )N      )assertIsNonegetassertEqualsetrange)r   greenlet_idctx_varcallbackcountsexpect_r   r   r   
_increment   s    
zContextVarsTests._incrementc              	      sV  t dd dd t j tdd tdD  fddtd	dD }|D ](}d
krnt |_qXdkrXt j|_qXtdD ]*}   d	7  < |D ]}|  qqdkrt	|D ]}|  qn|D ]}|  q|D ]&}
|j |jd u dk qdkr8d	d	d	d	dd nt tdg d S )Niddefaultr   c                 s   s   | ]}|d fV  qdS )r   Nr   .0ir   r   r   	<genexpr>'       z1ContextVarsTests._test_context.<locals>.<genexpr>   c                    sZ   g | ]R}t td kr$tt jjnj| dkr@|d ndv rLdnddqS )r
   sharer   )r   r
   r   N)r   r   r   r   r   )r   r   r   r
   r   r"   r   r   id_varpropagate_byr   r   r   
<listcomp>)   s   z2ContextVarsTests._test_context.<locals>.<listcomp>r   r   r(   r   r
      )r   r   r         )r   r   r   switchdictr   r   
gr_contextr   reversedZ
assertTrueZdeadr   values)r   r+   ZletsZletr$   r   r)   r   _test_context"   s6    



zContextVarsTests._test_contextc                 C   s   |  | jd d S )Nr
   r   r5   r   r   r   r   &test_context_propagated_by_context_run\   s    z7ContextVarsTests.test_context_propagated_by_context_runc                 C   s   |  | jd d S )Nr   r6   r7   r   r   r   ,test_context_propagated_by_setting_attribute_   s    z=ContextVarsTests.test_context_propagated_by_setting_attributec                 C   s   |  | jd  d S r	   r6   r7   r   r   r   test_context_not_propagatedb   s    z,ContextVarsTests.test_context_not_propagatedc                 C   s   |  | jd d S )Nr(   r6   r7   r   r   r   test_context_sharede   s    z$ContextVarsTests.test_context_sharedc                 C   s@   t t j}t t j}|t j |t j |  d S r	   )r   r   r
   r0   r   r   let1Zlet2r   r   r   test_break_ctxvarsh   s
    z#ContextVarsTests.test_break_ctxvarsc                 C   sL   t t j}t t j}t |_t |_|  |  |  |  d S r	   )r   r   r0   r   r2   r<   r   r   r   9test_not_broken_if_using_attribute_instead_of_context_runr   s    zJContextVarsTests.test_not_broken_if_using_attribute_instead_of_context_runc                    s4  t dd d fdd}t| td  `W d    n1 sJ0    Y   j   \}}| j | d | d |	j
d | _    j| d  _    j| d  _    j d  t  t|d t|d d S )Nr   r    c                     sX       j d  jt  d  j d  j} d  _     j d  jt  d  j d  j}t j	| |f  d | _ d t j	       j |  _ d t j	       j d S Nr   r   )
r   r   r2   r   ZassertIsInstancer   r   r   parentr0   )old_contextnew_contextgrr*   r   r   r   target   s6    

zFContextVarsTests.test_context_assignment_while_running.<locals>.targetzcan't delete attrr   r   )r   r   assertRaisesRegexAttributeErrorr2   r   r0   assertIsr   r
   r   gcZcollectsysgetrefcount)r   rF   rB   rC   r   rD   r   %test_context_assignment_while_running|   s0    )"z6ContextVarsTests.test_context_assignment_while_runningc                    sl  dd l }t  tdd d| | | | g fdd fdd}|j|dd	}|    d }| td
 t	|d W d    n1 s0    Y  | td
 d |_
W d    n1 s0    Y      | |j
  | |j
 d d |_
  |  | |d g | |j
  |_
| |j
  d S )Nr   varr    c                      sB    d       d t j     d S r@   )r   waitr   rA   r0   appendr   r   )holder
is_runningshould_suspendrN   r   r   greenlet_in_thread_fn   s    

zXContextVarsTests.test_context_assignment_different_thread.<locals>.greenlet_in_thread_fnc                     s<   t }  | _|  |       |   d S r	   )r   r2   rP   r0   r   rO   )rE   )ctxdid_suspendrT   rQ   should_exitr   r   	thread_fn   s    
zLContextVarsTests.test_context_assignment_different_thread.<locals>.thread_fnT)rF   Zdaemonzrunning in a differentr2   r   )	threadingr   r   ZEventZThreadstartrO   rG   
ValueErrorgetattrr2   r   rI   r   joinr   )r   rY   rX   threadrE   r   )rU   rV   rT   rQ   rR   rW   rS   rN   r   (test_context_assignment_different_thread   s:    	($z9ContextVarsTests.test_context_assignment_different_threadN)__name__
__module____qualname__r   r   r5   r8   r9   r:   r;   r>   r?   rM   r_   r   r   r   r   r      s   
:

Gr   zContextVar supportedc                   @   s   e Zd Zdd ZdS )NoContextVarsTestsc                 C   s   t t j}| t|d | t t|d W d    n1 sF0    Y  | t d |_W d    n1 sv0    Y  |  | t t|d W d    n1 s0    Y  | t d |_W d    n1 s0    Y  d S )Nr2   )	r   r   r0   ZassertFalsehasattrZassertRaisesrH   r\   r2   )r   r=   r   r   r   test_contextvars_errors   s    ($(z*NoContextVarsTests.test_contextvars_errorsN)r`   ra   rb   re   r   r   r   r   rc      s   rc   )ZunittestrJ   rK   	functoolsr   r   r   Zcontextvarsr   r   r   ImportErrorZ
skipUnlessZTestCaser   ZskipIfrc   r   r   r   r   <module>   s     j