o
    jc#                     @   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yA   d Z Z	Z
Y nw 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   J/usr/local/lib/python3.10/dist-packages/greenlet/tests/test_contextvars.py_new_ctx_run      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r7t |_q,dkr@t j|_q,tdD ]}   d	7  < |D ]}|  qSqEdkrkt	|D ]}|  qcn	|D ]}|  qm|D ]}
|j |jd u dk qvdkrd	d	d	d	dd d S 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>'   s    z1ContextVarsTests._test_context.<locals>.<genexpr>   c                    sZ   g | ])}t td krtt jjnj| dkr |d ndv r&d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   reversed
assertTruedeadr   values)r   r+   letsletr%   r   r)   r   _test_context"   s<   





zContextVarsTests._test_contextc                 C      |  | jd d S )Nr
   r   r9   r   r   r   r   &test_context_propagated_by_context_run\   r   z7ContextVarsTests.test_context_propagated_by_context_runc                 C   r:   )Nr   r;   r<   r   r   r   ,test_context_propagated_by_setting_attribute_   r   z=ContextVarsTests.test_context_propagated_by_setting_attributec                 C   s   |  | jd  d S r	   r;   r<   r   r   r   test_context_not_propagatedb   r   z,ContextVarsTests.test_context_not_propagatedc                 C   r:   )Nr(   r;   r<   r   r   r   test_context_sharede   r   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   let1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   rA   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 s%w   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   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   gccollectsysgetrefcount)r   rM   rI   rJ   r   rK   r   %test_context_assignment_while_running|   s2   )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 s[w   Y  | td
 d |_
W d    n1 stw   Y      | |j
  | |j
 d d |_
  |  | |d g | |j
  |_
| |j
  d S )Nr   varr!   c                      sB    d       d t j     d S rF   )r   waitr   rH   r0   appendr   r   )holder
is_runningshould_suspendrV   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   rX   r0   r   rW   )rL   )ctxdid_suspendr\   rY   should_exitr   r   	thread_fn   s   
zLContextVarsTests.test_context_assignment_different_thread.<locals>.thread_fnT)rM   daemonzrunning in a differentr2   r   )	threadingr   r   EventThreadstartrW   rN   
ValueErrorgetattrr2   r   rP   r   joinr   )r   rb   r`   threadrL   r   )r]   r^   r\   rY   rZ   r_   r[   rV   r   (test_context_assignment_different_thread   s>   	z9ContextVarsTests.test_context_assignment_different_threadN)__name__
__module____qualname__r   r   r9   r=   r>   r?   r@   rD   rE   rU   rj   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 s#w   Y  | t d |_W d    n1 s;w   Y  |  | t t|d W d    n1 sYw   Y  | t d |_W d    d S 1 srw   Y  d S )Nr2   )	r   r   r0   assertFalsehasattrassertRaisesrO   rg   r2   )r   rB   r   r   r   test_contextvars_errors   s   "z*NoContextVarsTests.test_contextvars_errorsN)rk   rl   rm   rr   r   r   r   r   rn      s    rn   )unittestrQ   rS   	functoolsr   r   r   contextvarsr   r   r   ImportError
skipUnlessTestCaser   skipIfrn   r   r   r   r   <module>   s$     j