U
    g2                     @  s  d dl mZ d dlmZ d dlZd dlZd dlmZmZ ddlm	Z	m
Z
 ddd	d
ZdddddZddddZddddZddddZddddZddddZddddZddddZddddZdddd Zddd!d"Zddd#d$ZdS )%    )annotations)UnionN)EndOfChannelopen_memory_channel   )assert_checkpointswait_all_tasks_blockedNonereturnc               	     s<  t t td W 5 Q R X t jtdd td W 5 Q R X ttttd f  d\} }t|  t| | 	d t
  | dI d H  W 5 Q R X t tj | 	d  W 5 Q R X t
  | I d H dkstW 5 Q R X | dkstt tj |  W 5 Q R X | 	d |  I d H  t tj | dI d H  W 5 Q R X t tj | 	d W 5 Q R X t tj |   W 5 Q R X |  I d H  | dkstt t | I d H  W 5 Q R X | I d H  t tj | I d H  W 5 Q R X t tj |  W 5 Q R X | I d H  d S )	Ng      ?z^max_buffer_size must be >= 0$)matchr      lastztoo late)pytestraises	TypeErrorr   
ValueErrorr   intstrreprsend_nowaitr   sendtrio
WouldBlockreceiveAssertionErrorreceive_nowaitacloseClosedResourceErrorcloner   )sr r#   </tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_channel.pytest_channel   sF    
 
r%   ztrio.abc.Clock)autojump_clockr   c              	     sR   t t d\}}td}| I d H  W 5 Q R X |js>t|dI d H  d S )Nr   
   zTest for PR #553)r   r   r   Zmove_on_afterr   Zcancelled_caughtr   r   )r&   r!   r"   Ztimeout_scoper#   r#   r$   test_5538   s
    
r(   c                    s   dddddd} t t d\}}t 4 I d H t}|4 I d H & tdD ]}|| | | qJW 5 Q I d H R X d	d
 |2 I d H }|  |ttdkst	W 5 Q I d H R X d S )Ntrio.MemorySendChannel[int]r   r	   )send_channelir   c              
     sN   | 4 I d H 2 t d| d|d  D ]}| |I d H  q$W 5 Q I d H R X d S )N   r   )ranger   )r*   r+   jr#   r#   r$   producerA   s    z1test_channel_multiple_producers.<locals>.producerr   r'   c                   s   g | z3 d H W }|q6 S Nr#   ).0valuer#   r#   r$   
<listcomp>O   s     z3test_channel_multiple_producers.<locals>.<listcomp>   )
r   r   r   open_nurseryr-   
start_soonr    sortlistr   )r/   r*   receive_channelnurseryr+   gotr#   r#   r$   test_channel_multiple_producers@   s    $r<   c                    s   t  g  dddd fdd} t 4 I d H |}tjt d\}}|4 I d H L tdD ]}|| || q\t I d H  td	D ]}||I d H  qW 5 Q I d H R X W 5 Q I d H R X t tdkst	t
 d	kst	t  t td	kst	d S )
Ntrio.MemoryReceiveChannel[int]r   r	   )r9   r+   r   c                   s,   | 2 z 3 d H W } |  | q6 d S r0   )addappend)r9   r+   r2   ZreceivedZsuccessful_receiversr#   r$   consumerY   s    
z1test_channel_multiple_consumers.<locals>.consumerr      r'   )setr   r5   r   r   r-   r6   r   r   r   len)rA   r:   r*   r9   r+   r#   r@   r$   test_channel_multiple_consumersU   s    2rE   c               
     sR  dddddd} t d  d\}}t 4 I d H 0}|| |tj t I d H  | I d H  W 5 Q I d H R X ttj |	d  W 5 Q R X ttj |
d I d H  W 5 Q R X tt |  W 5 Q R X tt | I d H  W 5 Q R X t d  d\}}t 4 I d H 0}|| |tj t I d H  | I d H  W 5 Q I d H R X ttj |	d  W 5 Q R X ttj |
d I d H  W 5 Q R X ddd	d
d}t t d\}}t 4 I d H ,}||| t I d H  | I d H  W 5 Q I d H R X ttj |  W 5 Q R X ttj | I d H  W 5 Q R X d S )Ntrio.MemorySendChannel[None]type[BaseException]r	   r!   expectr   c              	     s*   t | | d I d H  W 5 Q R X d S r0   r   r   r   r!   rI   r#   r#   r$   
send_blockm   s    z%test_close_basics.<locals>.send_blockr   r=   r"   r   c              	     s*   t tj |  I d H  W 5 Q R X d S r0   r   r   r   r   r   r"   r#   r#   r$   receive_block   s    z(test_close_basics.<locals>.receive_block)r   r   r5   r6   r   r   r   r   r   r   r   r   r   r   BrokenResourceErrorr   )rL   r!   r"   r:   rP   s2r2r#   r#   r$   test_close_basicsl   sB    rT   c               
     s@  dddddd} t d  d\}}t 4 I d H *}|| |tj t I d H  |  W 5 Q I d H R X ttj |	d  W 5 Q R X ttj |
d I d H  W 5 Q R X tt |  W 5 Q R X tt | I d H  W 5 Q R X t d  d\}}t 4 I d H *}|| |tj t I d H  |  W 5 Q I d H R X ttj |	d  W 5 Q R X ttj |
d I d H  W 5 Q R X ddd	d
d}t d  d\}}t 4 I d H &}||| t I d H  |  W 5 Q I d H R X ttj |  W 5 Q R X ttj | I d H  W 5 Q R X d S )NrF   rG   r	   rH   c              	     s*   t | | d I d H  W 5 Q R X d S r0   rJ   rK   r#   r#   r$   rL      s    z#test_close_sync.<locals>.send_blockr   ztrio.MemoryReceiveChannel[None]rM   c              	     s*   t tj |  I d H  W 5 Q R X d S r0   rN   rO   r#   r#   r$   rP      s    z&test_close_sync.<locals>.receive_block)r   r   r5   r6   r   r   closer   r   r   r   r   r   r   rQ   )rL   r!   r"   r:   rP   r#   r#   r$   test_close_sync   sB    rV   c               	     s   t d  d\} }| }| }| d  | I d H  | W 5 Q R X ttj |  W 5 Q R X ttj |  W 5 Q R X | d  | I d H  ttj | d  W 5 Q R X d S )Nr'   )	r   r    r   r   r   r   r   r   rQ   )r!   r"   rS   Zr3r#   r#   r$   $test_receive_channel_clone_and_close   s    


rW   c               
     s   t t d\ }   dd fdd}ddfdd}t 4 I d H J}|| || t I d H    I d H  |  I d H dkst	W 5 Q I d H R X d S )	Nr   r	   r
   c                	     s,   t tj  dI d H  W 5 Q R X d S )NZnope)r   r   r   r   r   r#   )s1r#   r$   send_will_close  s    z9test_close_multiple_send_handles.<locals>.send_will_closec                     s     dI d H  d S Nok)r   r#   )rR   r#   r$   send_will_succeed  s    z;test_close_multiple_send_handles.<locals>.send_will_succeedr[   )
r   r   r    r   r5   r6   r   r   r   r   )r"   rY   r\   r:   r#   )rX   rR   r$    test_close_multiple_send_handles   s    

r]   c               
     s   t t d\}    dd fdd}ddfdd}t 4 I d H D}|| || t I d H    I d H  | dI d H  W 5 Q I d H R X d S )	Nr   r	   r
   c                	     s*   t tj   I d H  W 5 Q R X d S r0   rN   r#   )r1r#   r$   receive_will_close  s    z?test_close_multiple_receive_handles.<locals>.receive_will_closec                     s      I d H dkstd S rZ   )r   r   r#   )rS   r#   r$   receive_will_succeed  s    zAtest_close_multiple_receive_handles.<locals>.receive_will_succeedr[   )	r   r   r    r   r5   r6   r   r   r   )r!   r_   r`   r:   r#   )r^   rS   r$   #test_close_multiple_receive_handles  s    

ra   c               	     sh   t t td\} }|  tdD ]}| | q"W 5 Q R X dd |2 I d H }|ttdksdtd S )Ninfr'   c                   s   g | z3 d H W }|q6 S r0   r#   )r1   r+   r#   r#   r$   r3   -  s     z%test_inf_capacity.<locals>.<listcomp>)r   r   floatr-   r   r8   r   )r   r   r+   r;   r#   r#   r$   test_inf_capacity%  s    rd   c               
     sF  t d  d\} }|  | ks$t|  }|jdks:t|jdksHt|jdksVt|jdksdt|jdksrt|jdkst| 	d  |  jdkst| 
 }|  jdkst|  I d H  | jdkst|
 }| jdkst| I d H  | jdkstt 4 I d H j}|	d  |  jdksBt||jd  ||jd  t I d H  |  jdks~t|j  W 5 Q I d H R X |  jdkstz|  qW n tjk
r   Y nX t 4 I d H <}||j t I d H  |  jdkst|j  W 5 Q I d H R X |  jdksBtd S )Nr   r   r   )r   Z
statisticsr   Zcurrent_buffer_usedmax_buffer_sizeZopen_send_channelsZopen_receive_channelsZtasks_waiting_sendZtasks_waiting_receiver   r    r   r   r5   r6   r   r   Zcancel_scopecancelr   r   r   )r!   r"   statsrR   rS   r:   r#   r#   r$   test_statistics1  sL    

rh   c               
     s  t ttd f  d\} }| d | dks2t| d | dksLtd  ddd fdd}t 4 I d H H}||| t	 I d H  | d t
tj |  W 5 Q R X W 5 Q I d H R X  dkstt ttd f  d\} }| d t
tj | d  W 5 Q R X t 4 I d H l}|| jd t	 I d H  | dksVtt
tj | d W 5 Q R X | I d H dkstW 5 Q I d H R X d S )	Nr   r   z%trio.MemoryReceiveChannel[int | None]r	   rM   c                   s   |   I d H  d S r0   )r   rO   resultr#   r$   
do_receiveq  s    z)test_channel_fairness.<locals>.do_receiver,   )r   r   r   r   r   r   r   r5   r6   r   r   r   r   r   r   )r!   r"   rk   r:   r#   ri   r$   test_channel_fairnessc  s2    


"
rl   c               
     s   t t d\} }ttj |  W 5 Q R X ttj | d W 5 Q R X dddddd}t 4 I d H <}|	|| d t
  | I d H dkstW 5 Q R X W 5 Q I d H R X ttj |  W 5 Q R X d S )	Nr   r   r)   r   r	   )r!   vr   c              	     s&   t   | |I d H  W 5 Q R X d S r0   )r   r   )r!   rm   r#   r#   r$   do_send  s    z test_unbuffered.<locals>.do_send)r   r   r   r   r   r   r   r   r5   r6   r   r   r   )r!   r"   rn   r:   r#   r#   r$   test_unbuffered  s    0ro   )
__future__r   typingr   r   r   r   r   Ztestingr   r   r%   r(   r<   rE   rT   rV   rW   r]   ra   rd   rh   rl   ro   r#   r#   r#   r$   <module>   s$   +::2*