o
    Ye2                     @  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
Zd&ddZd%ddZd%ddZd%ddZd%ddZd%ddZd%ddZd%ddZd%ddZd%dd Zd%d!d"Zd%d#d$ZdS )'    )annotations)UnionN)EndOfChannelopen_memory_channel   )assert_checkpointswait_all_tasks_blockedreturnNonec                    s4  t t td W d    n1 sw   Y  t t td W d    n1 s.w   Y  ttttd f  d\} }t|  t| | 	d t
  | dI d H  W d    n1 scw   Y  t tj | 	d  W d    n1 s~w   Y  t
  | I d H dksJ W d    n1 sw   Y  | dksJ t tj |  W d    n1 sw   Y  | 	d |  I d H  t tj | dI d H  W d    n1 sw   Y  t tj | 	d W d    n	1 sw   Y  t tj |   W d    n	1 sw   Y  |  I d H  | dks4J t t | I d H  W d    n	1 sLw   Y  | I d H  t tj | I d H  W d    n	1 sqw   Y  t tj |  W d    n	1 sw   Y  | I d H  d S )Ng      ?r      lastztoo late)pytestraises	TypeErrorr   
ValueErrorr   intstrreprsend_nowaitr   sendtrio
WouldBlockreceivereceive_nowaitacloseClosedResourceErrorcloner   )sr r    <usr/lib/python3.10/site-packages/trio/_tests/test_channel.pytest_channel   s`   






r"   autojump_clocktrio.abc.Clockc                   sh   t t d\}}td}| I d H  W d    n1 s w   Y  |js*J |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   Ztimeout_scoper    r    r!   test_5538   s   
r&   c               
     s   ddd} t t d	\}}t 4 I d H W}|4 I d H  td
D ]}|| | | q"W d   I d H  n1 I d H s>w   Y  g }|2 z3 d H W }|| qG6 |  |t	tdksbJ W d   I d H  d S 1 I d H ssw   Y  d S )Nsend_channeltrio.MemorySendChannel[int]ir   r	   r
   c              	     sl   | 4 I d H " t d| d|d  D ]
}| |I d H  qW d   I d H  d S 1 I d H s/w   Y  d S )N   r   )ranger   )r'   r)   jr    r    r!   producerA   s   .z1test_channel_multiple_producers.<locals>.producerr   r%      )r'   r(   r)   r   r	   r
   )
r   r   r   open_nurseryr+   
start_soonr   appendsortlist)r-   r'   receive_channelnurseryr)   gotvaluer    r    r!   test_channel_multiple_producers@   s    
(.r8   c               
     s(  t  g  d fdd} t 4 I d H S}tjt d	\}}|4 I d H . td
D ]	}|| || q+t I d H  tdD ]
}||I d H  q?W d   I d H  n1 I d H sZw   Y  W d   I d H  n1 I d H sow   Y  t td
ks~J t	 dksJ t  t tdksJ d S )Nr4   trio.MemoryReceiveChannel[int]r)   r   r	   r
   c                   s.   | 2 z3 d H W } |  | q6 d S N)addr1   )r4   r)   r7   ZreceivedZsuccessful_receiversr    r!   consumer[   s
   
z1test_channel_multiple_consumers.<locals>.consumerr      r%   )r4   r9   r)   r   r	   r
   )
setr   r/   r   r   r+   r0   r   r   len)r=   r5   r'   r4   r)   r    r<   r!   test_channel_multiple_consumersW   s$   *(	rA   c               	     s@  ddd} t d  d	\}}t 4 I d H  }|| |tj t I d H  | I d H  W d   I d H  n1 I d H s<w   Y  ttj |	d  W d    n1 sWw   Y  ttj |
d I d H  W d    n1 suw   Y  tt |  W d    n1 sw   Y  tt | I d H  W d    n1 sw   Y  t d  d	\}}t 4 I d H  }|| |tj t I d H  | I d H  W d   I d H  n1 I d H sw   Y  ttj |	d  W d    n	1 sw   Y  ttj |
d I d H  W d    n	1 s w   Y  ddd}t d  d	\}}t 4 I d H }||| t I d H  | I d H  W d   I d H  n1 I d H s_w   Y  ttj |  W d    n	1 szw   Y  ttj | I d H  W d    d S 1 sw   Y  d S )Nr   trio.MemorySendChannel[None]expecttype[BaseException]r	   r
   c                   B   t | | d I d H  W d    d S 1 sw   Y  d S r:   r   r   r   r   rC   r    r    r!   
send_blocko      "z%test_close_basics.<locals>.send_blockr   r   r9   c                   B   t tj |  I d H  W d    d S 1 sw   Y  d S r:   r   r   r   r   r   r   r    r    r!   receive_block      "z(test_close_basics.<locals>.receive_blockr   rB   rC   rD   r	   r
   r   r9   r	   r
   )r   r   r/   r0   r   r   r   r   r   r   r   r   r   r   BrokenResourceErrorrH   r   r   r5   rM   r    r    r!   test_close_basicsn   sZ   
(
(
*
$rS   c               	     s,  ddd} t d  d	\}}t 4 I d H }|| |tj t I d H  |  W d   I d H  n1 I d H s9w   Y  ttj |	d  W d    n1 sTw   Y  ttj |
d I d H  W d    n1 srw   Y  tt |  W d    n1 sw   Y  tt | I d H  W d    n1 sw   Y  t d  d	\}}t 4 I d H }|| |tj t I d H  |  W d   I d H  n1 I d H sw   Y  ttj |	d  W d    n1 sw   Y  ttj |
d I d H  W d    n	1 sw   Y  ddd}t d  d	\}}t 4 I d H }||| t I d H  |  W d   I d H  n1 I d H sUw   Y  ttj |  W d    n	1 spw   Y  ttj | I d H  W d    d S 1 sw   Y  d S )Nr   rB   rC   rD   r	   r
   c                   rE   r:   rF   rG   r    r    r!   rH      rI   z#test_close_sync.<locals>.send_blockr   r   r9   c                   rJ   r:   rK   rL   r    r    r!   rM      rN   z&test_close_sync.<locals>.receive_blockrO   rP   )r   r   r/   r0   r   r   closer   r   r   r   r   r   r   rQ   rR   r    r    r!   test_close_sync   sZ   

(

(

*
$rU   c                    s  t d  d\} }| }| }| d  | I d H  | W d    n1 s*w   Y  ttj |  W d    n1 sDw   Y  ttj |  W d    n1 s^w   Y  | d  | I d H  ttj | d  W d    d S 1 sw   Y  d S )Nr%   )	r   r   r   r   r   r   r   r   rQ   )r   r   r2Zr3r    r    r!   $test_receive_channel_clone_and_close   s(   



"rW   c               	     s   t t d\ }   d	 fdd}d	fdd}t 4 I d H .}|| || t I d H    I d H  |  I d H dksFJ W d   I d H  d S 1 I d H sWw   Y  d S )
Nr   r	   r
   c                     sD   t tj  dI d H  W d    d S 1 sw   Y  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    )s2r    r!   send_will_succeed  s   z;test_close_multiple_send_handles.<locals>.send_will_succeedr[   r	   r
   )	r   r   r   r   r/   r0   r   r   r   )r   rY   r]   r5   r    )rX   r\   r!    test_close_multiple_send_handles   s   

.r_   c               	     s   t t d\}    d	 fdd}d	fdd}t 4 I d H +}|| || t I d H    I d H  | dI d H  W d   I d H  d S 1 I d H sTw   Y  d S )
Nr   r	   r
   c                     sB   t tj   I d H  W d    d S 1 sw   Y  d S r:   rK   r    )r1r    r!   receive_will_close  rN   z?test_close_multiple_receive_handles.<locals>.receive_will_closec                     s      I d H dksJ d S rZ   r   r    )rV   r    r!   receive_will_succeed  s   zAtest_close_multiple_receive_handles.<locals>.receive_will_succeedr[   r^   )	r   r   r   r   r/   r0   r   r   r   )r   ra   rc   r5   r    )r`   rV   r!   #test_close_multiple_receive_handles  s   

.rd   c                    s   t t td\} }|  tdD ]}| | qW d    n1 s$w   Y  g }|2 z3 d H W }|| q-6 |ttdksDJ d S )Ninfr%   )r   r   floatr+   r   r1   r3   )r   r   r)   r6   r    r    r!   test_inf_capacity%  s   rg   c               	     sn  t d  d\} }|  | ksJ |  }|jdksJ |jdks%J |jdks,J |jdks3J |jdks:J |jdksAJ | d  |  jdksOJ | 	 }|  jdks\J | 
 I d H  | jdkslJ |	 }| jdksyJ |
 I d H  | jdksJ t 4 I d H ;}|d  |  jdksJ ||jd  ||jd  t I d H  |  jdksJ |j  W d   I d H  n1 I d H sw   Y  |  jdksJ z	 |  q tjy   Y nw t 4 I d H &}||j t I d H  |  jdksJ |j  W d   I d H  n1 I d H s&w   Y  |  jdks5J d S )Nr   r   r   )r   
statisticsZcurrent_buffer_usedZmax_buffer_sizeZopen_send_channelsZopen_receive_channelsZtasks_waiting_sendZtasks_waiting_receiver   r   r   r   r/   r0   r   r   Zcancel_scopecancelr   r   r   )r   r   Zstatsr\   rV   r5   r    r    r!   test_statistics3  sX   

(*rj   c               	     s  t ttd f  d\} }| d | dksJ | d | dks'J d  d
 fdd}t 4 I d H 6}||| t I d H  | d t	
tj |  W d    n1 s_w   Y  W d   I d H  n1 I d H stw   Y   dksJ t ttd f  d\} }| d t	
tj | d  W d    n1 sw   Y  t 4 I d H G}|| jd t I d H  | dksJ t	
tj | d	 W d    n1 sw   Y  | I d H dksJ W d   I d H  d S 1 I d H sw   Y  d S )Nr   r   r   r9   r	   r
   c                   s   |   I d H  d S r:   rb   rL   resultr    r!   
do_receives  s   z)test_channel_fairness.<locals>.do_receiver*   rP   )r   r   r   r   r   r   r/   r0   r   r   r   r   r   r   )r   r   rm   r5   r    rk   r!   test_channel_fairnesse  s>   



(
0rn   c               	     sF  t t d\} }ttj |  W d    n1 sw   Y  ttj | d W d    n1 s9w   Y  dd	d
}t 4 I d H 0}|	|| d t
  | I d H dksbJ W d    n1 slw   Y  W d   I d H  n1 I d H sw   Y  ttj |  W d    d S 1 sw   Y  d S )Nr   r   r   r(   vr   r	   r
   c                   s>   t   | |I d H  W d    d S 1 sw   Y  d S r:   )r   r   )r   ro   r    r    r!   do_send  s   "z test_unbuffered.<locals>.do_send)r   r(   ro   r   r	   r
   )r   r   r   r   r   r   r   r   r/   r0   r   r   )r   r   rp   r5   r    r    r!   test_unbuffered  s$   

(
"rq   r^   )r#   r$   r	   r
   )
__future__r   typingr   r   r   r   r   testingr   r   r"   r&   r8   rA   rS   rU   rW   r_   rd   rg   rj   rn   rq   r    r    r    r!   <module>   s&    

+



9
9




2*