U
    >vf:                     @   sz  d dl Z d dlZd dlmZ d dlZd dlZd dlmZm	Z	m
Z
 d dlmZmZ d dlZd dlmZmZmZmZmZ d dlmZ d dlmZmZ d dlmZmZmZmZ dd	 Z ej!d
dddddddddg
ddd Z"ej!dd Z#ej$%ddd Z&ej$%ddd Z'ej$(dddd d!d"gd#d$ Z)ej!d%d& Z*ej$j+d'd( Z,ej$j-ej$j+ej$%d&G d)d* d*Z.dS )+    N)dedent)is_ci_environmentis_platform_linuxis_platform_mac)PyperclipExceptionPyperclipWindowsException)NA	DataFrameSeries
get_optionread_clipboard)ArrowStringArrayStringArray)CheckedCall_stringifyTextclipboard_getclipboard_setc                 C   s(   i }|dkr||d< | dkr$| |d< |S )Ndefaultexcelsep )r   r   kwargsr   r   B/tmp/pip-unpacked-wheel-vdrwu74i/pandas/tests/io/test_clipboard.pybuild_kwargs(   s    r   delimsutf8utf16stringlongnonasciicolwidthmixedfloatint)paramsc              	      s  | j }|dkr$tddgddgdS |dkrBtdd	gd
dgdS |dkr`tddgddgdS |dkrtjddddd gd gdS |dkrtd}tj|d ddd ddd gd gdS |dkrtd d dS |d krtd!d  tjdd fd"dddd gd gdS |d#krHttd$d%d& tdd'tj	t
d(d)S |d*krrtjddd+d ddd gd gdS |d,krtjddd-d ddd gd gdS td S ).Nr   z"a,	"b|cu   d	ef´zhi'jzk''lm)abr   u   µasdu	   Ωœ∑´u   øπ∆˚¬u	   œ∑´®r   u   👍👍abcdefr         si)
c_idx_type
r_idx_typec_idx_namesr_idx_namesr   zdisplay.max_rows   c                  W   s   t jdS N   nprandomrandintargsr   r   r   <lambda>S       zdf.<locals>.<lambda>)Z
data_gen_fr-   r.   r/   r0   r   z
in Englishu   en español)enesr    zdisplay.max_colwidthc                     s   d  S )Nxr   r8   Z_cwr   r   r:   `   r;   r!         ?g      @{Gz?   Zabcde)r%   r&   cr"   c                 S   s   t | d S )NrA   )r"   )rrC   r   r   r   r:   r   r;   r#   c                  W   s   t jdS r2   r4   r8   r   r   r   r:   |   r;   )paramr	   tmZmakeCustomDataframer   splitr5   ZarangeZastypeZint64list
ValueError)requestZ	data_typeZmax_rowsr   r?   r   df1   s         	

	

	

rK   c              	   c   s6   dd }|   }|jd|dd dV  W 5 Q R X dS )z<
    Mocks WinError to help with testing the clipboard.
    c                   S   s   dS )NzWindow Errorr   r   r   r   r   _mock_win_error   s    z$mock_ctypes.<locals>._mock_win_errorzctypes.WinErrorF)ZraisingN)contextsetattr)monkeypatchrL   mr   r   r   mock_ctypes   s    
rQ   c              	   C   sN   dd }|  ddd  d|j d}tjt|d t|  W 5 Q R X d	S )
z
    Give CheckCall a function that returns a falsey value and
    mock get_errno so it returns false so an exception is raised.
    c                   S   s   dS NFr   r   r   r   r   _return_false   s    z6test_checked_call_with_bad_call.<locals>._return_falsepandas.io.clipboard.get_errnoc                   S   s   dS NTr   r   r   r   r   r:      r;   z1test_checked_call_with_bad_call.<locals>.<lambda>zError calling z \(Window Error\)matchN)rN   __name__pytestraisesr   r   )rO   rS   msgr   r   r   test_checked_call_with_bad_call   s
    r\   c                 C   s2   dd }|  ddd  t|}| dks.tdS )z
    Give CheckCall a function that returns a truthy value and
    mock get_errno so it returns true so an exception is not raised.
    The function should return the results from _return_true.
    c                   S   s   dS rU   r   r   r   r   r   _return_true   s    z7test_checked_call_with_valid_call.<locals>._return_truerT   c                   S   s   dS rR   r   r   r   r   r   r:      r;   z3test_checked_call_with_valid_call.<locals>.<lambda>TN)rN   r   AssertionError)rO   r]   Zchecked_callr   r   r   !test_checked_call_with_valid_call   s    r_   textZString_testTr1   r@   y              ?c              	   C   sf   t tttf}t| |r0t| }|t | ksbtn2dt| j }t	j
t|d t|  W 5 Q R X d S )NzJonly str, int, float, and bool values can be copied to the clipboard, not rV   )strr#   r"   bool
isinstancer   r^   typerX   rY   rZ   r   )r`   Zvalid_typesresultr[   r   r   r   test_stringify_text   s    
rf   c                 #   sB   i   fdd} fdd}|  d| |  d|  V  dS )aM  Fixture mocking clipboard IO.

    This mocks pandas.io.clipboard.clipboard_get and
    pandas.io.clipboard.clipboard_set.

    This uses a local dict for storing data. The dictionary
    key used is the test ID, available with ``request.node.name``.

    This returns the local dictionary, for direct manipulation by
    tests.
    c                    s   |  j j< d S NnodenamedataZ
_mock_datarJ   r   r   	_mock_set   s    z!mock_clipboard.<locals>._mock_setc                      s    j j S rg   rh   r   rm   r   r   	_mock_get   s    z!mock_clipboard.<locals>._mock_getz!pandas.io.clipboard.clipboard_setz!pandas.io.clipboard.clipboard_getN)rN   )rO   rJ   rn   ro   r   rm   r   mock_clipboard   s    rp   c                 C   sF   dd l }|jjd dt|  ks*t|jj }|dksBtd S )Nr   r'   )pandas.io.clipboardio	clipboardr   setvaluesr^   r   )rp   pandasre   r   r   r   test_mock_clipboard   s
    rw   c                
   @   s  e Zd ZdFddZdd Zejdddd	gd
d Zdd Z	dd Z
dd Zejddddgejddddgdd Zejdddgejddgdd Zdd Zdd Zejddd d!d"d#gd$d$d%gd&d'd&gdddggfdd(d)d*d+gd$d$d%gd&d'd&ggfgd,d- Zd.d/ Zejd0d1d2d3gd4d5 Zejjejd6d7d8d9gejjejd:dkoxe  d;dd<d=d> Zejd?d@dAgdBdC ZdDdE ZdS )GTestClipboardNc                 C   s2   |j |||d t|pdd|d}t|| d S )N)r   r   encoding	r   )r   Z	index_colry   )to_clipboardr   rF   assert_frame_equal)selfrl   r   r   ry   re   r   r   r   check_round_trip_frame   s    z$TestClipboard.check_round_trip_framec                 C   s   |  | d S rg   r~   r}   rK   r   r   r   test_round_trip_frame  s    z#TestClipboard.test_round_trip_framer   rz   ,|c                 C   s   | j ||d d S )Nr   r   )r}   rK   r   r   r   r   test_round_trip_frame_sep  s    z'TestClipboard.test_round_trip_frame_sepc                 C   s<   |j dd d t }| | ks(t|j|jks8td S )NFr   r   )r{   r   	to_stringr^   shape)r}   rK   re   r   r   r   test_round_trip_frame_string
  s    z*TestClipboard.test_round_trip_frame_stringc              	   C   s.   t jtddd |jddd W 5 Q R X d S )NzAto_clipboard in excel mode requires a single character separator.F)rW   Zcheck_stacklevelTz\tr   )rF   assert_produces_warningUserWarningr{   r   r   r   r   test_excel_sep_warning  s    z$TestClipboard.test_excel_sep_warningc              	   C   s&   t   |jddd W 5 Q R X d S )NFrz   r   )rF   r   r{   r   r   r   r   test_copy_delim_warning  s    
z%TestClipboard.test_copy_delim_warningr   r   Tc                 C   s6   t ||}|jf | ||jj |jddks2td S )Nrz   r   )r   r{   ri   rj   Zto_csvr^   )r}   r   r   rK   rJ   rp   r   r   r   r    test_clipboard_copy_tabs_default!  s    
z.TestClipboard.test_clipboard_copy_tabs_defaultFc                 C   sH   t ||}|jf | tdd}| | ks4t|j|jksDtd S )Nz\s+r   )r   r{   r   r   r^   r   )r}   r   r   rK   r   re   r   r   r   test_clipboard_copy_strings)  s
    

z)TestClipboard.test_clipboard_copy_stringsc                 C   s   ddi}t d }|||jj< tf |}|jd d dks@tt d }|||jj< tf |}t d }|||jj< tf |}t|| d S )Nenginepythonz^
            John James	Charlie Mingus
            1	2
            4	Harry Carney
            r1   zHarry Carneyz@
            a	 b
            1  2
            3  4
            z@
            a  b
            1  2
            3  4
            )	r   stripri   rj   r   Zilocr^   rF   r|   )r}   rJ   rp   Zclip_kwargsr`   rK   resexpr   r   r   test_read_clipboard_infer_excel2  s$    


z-TestClipboard.test_read_clipboard_infer_excelc                 C   sB   d}|||j j< t }tdd dgdddgdd}t|| d S )	Nzcol1	col2
1	red
	blue
2	greenr1   r3   redbluegreenZcol1Zcol2rk   ri   rj   r   r	   rF   r|   )r}   rJ   rp   r`   rK   df_expectedr   r   r   test_infer_excel_with_nullsZ  s    z)TestClipboard.test_infer_excel_with_nulls
multiindex
z			col1	col2zA	0	True	1	redzA	1	True		bluezB	0	False	2	greenABr   r1   z		col1	col2z	A	0	1	redz	A	1		bluezB	0	2	greenc                 C   sH   |d ||j j< t }tdd dgdddgd|d d}t|| d S )	Nr   r1   r3   r   r   r   r   )rl   indexr   )r}   rJ   rp   r   rK   r   r   r   r    test_infer_excel_with_multiindexg  s    z.TestClipboard.test_infer_excel_with_multiindexc              	   C   sR   d}t jt|d |jdd W 5 Q R X t jt|d tdd W 5 Q R X d S )Nz&clipboard only supports utf-8 encodingrV   asciiry   )rY   rZ   rI   r{   NotImplementedErrorr   )r}   rK   r[   r   r   r   test_invalid_encoding  s
    z#TestClipboard.test_invalid_encodingenczUTF-8zutf-8r   c                 C   s   | j ||d d S )Nr   r   )r}   r   rK   r   r   r   test_round_trip_valid_encodings  s    z-TestClipboard.test_round_trip_valid_encodingsrl   u   👍...u   Ωœ∑´...zabcd...ZDISPLAYzBCannot be runed if a headless system is not put in place with Xvfb)reasonstrictc                 C   s:   t | |t kstt r6t r6tjdddgdd d S )NZxselz--deletez--clipboardT)check)r   r   r^   r   r   
subprocessrun)r}   rl   r   r   r   test_raw_roundtrip  s    	z TestClipboard.test_raw_roundtripr   rC   r   c           
         sv  |dks|dkrt d|dkrTttjddgtjd}ttjdtgtjd}n$tddg}tdd g}d}|||jj	< t
d| td||d	}	W 5 Q R X t|td
dgddtddgdd|tdtgddtdtgddtttgddtddgddtdtgddd	|dkrfddlm  t fddjD  d d gd< t|	 d S )NZpyarrowr   r>   y)Zdtypez@a,b,c,d,e,f,g,h,i
x,1,4.0,x,2,4.0,,True,False
y,2,5.0,,,,,False,zmode.string_storager   )r   dtype_backendr   r1   r3   ZInt64g      @g      @ZFloat64TFboolean)	r%   r&   rC   defghr,   r   )ArrowExtensionArrayc                    s$   i | ]}| j | d dqS )T)Zfrom_pandas)array).0colr   expectedpar   r   
<dictcomp>  s    zCTestClipboard.test_read_clipboard_dtype_backend.<locals>.<dictcomp>r   )rY   Zimportorskipr   r5   r   Zobject_r   r   ri   rj   pdZoption_contextr   r	   r
   Zpandas.arraysr   columnsrF   r|   )
r}   rJ   rp   Zstring_storager   r   Zstring_arrayZstring_array_nar`   re   r   r   r   !test_read_clipboard_dtype_backend  s@    

z/TestClipboard.test_read_clipboard_dtype_backendc              	   C   s,   d}t jt|d tdd W 5 Q R X d S )NzPdtype_backend numpy is invalid, only 'numpy_nullable' and 'pyarrow' are allowed.rV   numpy)r   )rY   rZ   rI   r   )r}   r[   r   r   r   test_invalid_dtype_backend  s    z(TestClipboard.test_invalid_dtype_backend)NNN)rX   
__module____qualname__r~   r   rY   markparametrizer   r   r   r   r   r   r   r   joinr   r   r   
single_cpuZxfailosenvirongetr   r   r   r   r   r   r   r   rx      s`   

	(



1rx   )/r   r   textwrapr   r   r5   rY   Zpandas.compatr   r   r   Zpandas.errorsr   r   rv   r   r   r	   r
   r   r   Zpandas._testingZ_testingrF   Zpandas.core.arraysr   r   rq   r   r   r   r   r   ZfixturerK   rQ   r   Zusefixturesr\   r_   r   rf   rp   rs   rw   r   rx   r   r   r   r   <module>   sd   	
G








	
