U
    g*                     @  s  d dl mZ d dlZ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 d dlZd dlZd dlmZmZ d dlmZmZmZ erd dlZejdd	d
ddZejddddZejdddddZddddZddddZddddddZddddddZdddd Zddd!d"Zddddd#d$Zddddd%d&Z ddd'd(d)Z!ddd'd*d+Z"ddddd,d-Z#ddddd.d/Z$ddd0d1d2Z%ddd0d3d4Z&ddd5d6Z'ddd0d7d8Z(ddd
d9d:Z)dS );    )annotationsN)TYPE_CHECKING)mock)sentinel)_core_file_io)_FILE_ASYNC_METHODS_FILE_SYNC_ATTRSAsyncIOWrapperzpathlib.Pathstr)tmp_pathreturnc                 C  s   t | d S )Ntest)osfspath)r    r   </tmp/pip-unpacked-wheel-ks04xdmi/trio/_tests/test_file_io.pypath   s    r   z	mock.Mockr   c                   C  s   t jtjdS )N)Zspec_set)r   ZMockioStringIOr   r   r   r   wrapped   s    r   zAsyncIOWrapper[mock.Mock])r   r   c                 C  s
   t | S N)trio	wrap_file)r   r   r   r   
async_file   s    r   Nonec                	   C  s$   t t td W 5 Q R X d S )N )pytestraises	TypeErrorr   r   r   r   r   r   test_wrap_invalid$   s    r!   c               	   C  sf   G dd d} |  }t |tjr$tt|}t |ts<t| `t	t
 t|   W 5 Q R X d S )Nc                   @  s(   e Zd ZddddZddddZdS )z&test_wrap_non_iobase.<locals>.FakeFiler   r   c                 S  s   d S r   r   selfr   r   r   close+   s    z,test_wrap_non_iobase.<locals>.FakeFile.closec                 S  s   d S r   r   r"   r   r   r   write.   s    z,test_wrap_non_iobase.<locals>.FakeFile.writeN)__name__
__module____qualname__r$   r%   r   r   r   r   FakeFile*   s   r)   )
isinstancer   IOBaseAssertionErrorr   r   r
   r%   r   r   r    )r)   r   r   r   r   r   test_wrap_non_iobase)   s    
r-   )r   r   r   c                 C  s   | j |kstd S r   )r   r,   r   r   r   r   r   test_wrapped_property=   s    r/   c                   sF   t t}t fdd|D s&tt fdd|D rBtd S )Nc                 3  s&   | ]}|t kr|t  kV  qd S r   dir.0attrr.   r   r   	<genexpr>K   s      z+test_dir_matches_wrapped.<locals>.<genexpr>c                 3  s&   | ]}|t kr|t  kV  qd S r   r0   r2   r.   r   r   r5   M   s     )r	   unionr   allr,   any)r   r   attrsr   r.   r   test_dir_matches_wrappedD   s
    
r:   c               	   C  sN   G dd dt j} t|  }t|jds.ttt	 |j
 W 5 Q R X d S )Nc                   @  s   e Zd ZddddZdS )z0test_unsupported_not_forwarded.<locals>.FakeFiler   r   c                 S  s   d S r   r   r"   r   r   r   unsupported_attrT   s    zAtest_unsupported_not_forwarded.<locals>.FakeFile.unsupported_attrN)r&   r'   r(   r;   r   r   r   r   r)   S   s   r)   r;   )r   	RawIOBaser   r   hasattrr   r,   r   r   AttributeErrorr;   )r)   r   r   r   r   test_unsupported_not_forwardedR   s
    r?   c                  C  s  t jdk	stt jj} t| tjjs(tt	| 
d}|D ]}d|kr< qXq<td |D ]}d|kr\ qxq\td g }|D ]X}| r|ds qtd|}|dk	r|d	dk	rd
nd}||d|f qdd tD }|dd tD 7 }|  |  ||kstdS )z9Check the manual stubs match the list of wrapped methods.Nztrio._file_iozclass AsyncIOWrapperzNo class definition line?zif TYPE_CHECKINGzNo TYPE CHECKING line?z        z!\s*(async )?def ([a-zA-Z0-9_]+)\(   asyncsync   c                 S  s   g | ]}|d fqS )rA   r   r3   fnamer   r   r   
<listcomp>   s     z/test_type_stubs_match_lists.<locals>.<listcomp>c                 S  s   g | ]}|d fqS )rB   r   rD   r   r   r   rF      s     )r   __spec__r,   loaderr*   	importlibabcSourceLoaderr   r   
get_sourcer   Zfailstrip
startswithrematchgroupappendr   r	   sort)rH   sourcelinefoundrP   kindexpectedr   r   r   test_type_stubs_match_lists`   s2    

rY   c                 C  s4   t D ]*}|t| krqt| |t||kstqd S r   )r	   r1   getattrr,   r   r   	attr_namer   r   r   test_sync_attrs_forwarded   s    r]   c              
   C  s\   t D ]R}|t| krqtt t| | W 5 Q R X tt t|| W 5 Q R X qd S r   )r	   r1   r   r   r>   rZ   r[   r   r   r   test_sync_attrs_match_wrapper   s    r^   )r   r   c                 C  s4   t D ]*}|t| krqt| |t| |kstqd S r   )r   r1   rZ   r,   )r   	meth_namer   r   r   !test_async_methods_generated_once   s    r`   c                 C  sD   | j jdkst| j jdks t| j jd k	s0td| j jks@td S )NreadzAsyncIOWrapper.readzio.StringIO.read)ra   r&   r,   r(   __doc__)r   r   r   r   test_async_methods_signature   s    rc   c                   sn   t D ]d}|t| krqt| |}t||}|tjtjdI d H }|jtjtjd || ks`t|  qd S )N)keyword)	r   r1   rZ   r   argumentrd   Zassert_called_once_withr,   Z
reset_mock)r   r   r_   methZwrapped_methvaluer   r   r   test_async_methods_wrap   s    

rh   c              
     s\   t D ]R}|t| krqtt t| | W 5 Q R X tt t|| W 5 Q R X qd S r   )r   r1   r   r   r>   rZ   )r   r   r_   r   r   r    test_async_methods_match_wrapper   s    ri   )r   r   c                   s2   t | dI d H }t|ts t| I d H  d S Nw)r   	open_filer*   r
   r,   acloser   fr   r   r   	test_open   s    rp   c              
     sR   t | dI d H 4 I d H }t|ts*t|jr4tW 5 Q I d H R X |jsNtd S rj   )r   rl   r*   r
   r,   closedrn   r   r   r   test_open_context_manager   s    rr   c                    sJ   t td} t| j}| jd dd | 2 I d H }||ksFtd S )Nztest
foo
barr   c                   s   g | z3 d H W }|q6 S r   r   )r3   rU   r   r   r   rF      s     z#test_async_iter.<locals>.<listcomp>)r   r   r   r   listr   seekr,   )r   rX   resultr   r   r   test_async_iter   s
    
rv   c              
     s   t  n}t| dI d H }|  tt j |dI d H  W 5 Q R X tt j |	 I d H  W 5 Q R X W 5 Q R X |j
std S )Nrk   a)r   ZCancelScoper   rl   cancelr   r   Z	Cancelledr%   rm   rq   r,   )r   Zcscopero   r   r   r   test_aclose_cancelled   s    
"ry   c              	     sl   | d }|   t|dddD}t|}t|}| I d H }t|tsPt	|j
|ks^t	W 5 Q R X d S )Nfilenamerbr   )mode	buffering)touchopenr   BufferedReaderr   r   detachr*   r
   r,   r   )r   Ztmp_filerawZbufferedr   Zdetachedr   r   r   test_detach_rewraps_asynciobase  s    

r   )*
__future__r   rI   r   r   rO   typingr   Zunittestr   Zunittest.mockr   r   r   r   r   Ztrio._file_ior   r	   r
   pathlibZfixturer   r   r   r!   r-   r/   r:   r?   rY   r]   r^   r`   rc   rh   ri   rp   rr   rv   ry   r   r   r   r   r   <module>   sH   (		
