o
    d:                     @   sd  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!g d
ddd Z"ej!dd Z#ej$%ddd Z&ej$%ddd Z'ej$(dg d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   R/app/.heroku/python/lib/python3.10/site-packages/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r!tdd	gd
dgdS |dkr0tddgddgdS |dkrAtjddddd gd gdS |dkr[td}tj|d ddd ddd gd gdS |dkrjtd d dS |d krtd!d  tjdd fd"dddd gd gdS |d#krttd$d%d& tdd'tj	t
d(d)S |d*krt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).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      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   r9   Z_cwr   r   r;   `   s    r!         ?g      @{Gz?   Zabcde)r%   r&   cr"   c                 S   s   t | d S )NrB   )r"   )rrD   r   r   r   r;   r   r<   r#   c                  W   r2   r3   r5   r9   r   r   r   r;   |   r<   )paramr	   tmZmakeCustomDataframer   splitr6   ZarangeZastypeZint64list
ValueError)requestZ	data_typeZmax_rowsr   r@   r   df1   s   	
		
rL   c                 c   sN    dd }|   }|jd|dd dV  W d   dS 1 s w   Y  dS )z<
    Mocks WinError to help with testing the clipboard.
    c                   S      dS )NzWindow Errorr   r   r   r   r   _mock_win_error      z$mock_ctypes.<locals>._mock_win_errorzctypes.WinErrorF)ZraisingN)contextsetattr)monkeypatchrN   mr   r   r   mock_ctypes   s   
"rT   c                 C   sd   dd }|  ddd  d|j d}tjt|d t|  W d	   d	S 1 s+w   Y  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   rM   NFr   r   r   r   r   _return_false   rO   z6test_checked_call_with_bad_call.<locals>._return_falsepandas.io.clipboard.get_errnoc                   S   rM   NTr   r   r   r   r   r;          z1test_checked_call_with_bad_call.<locals>.<lambda>zError calling z \(Window Error\)matchN)rQ   __name__pytestraisesr   r   )rR   rV   msgr   r   r   test_checked_call_with_bad_call   s   "r`   c                 C   s2   dd }|  ddd  t|}| du sJ 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   rM   rX   r   r   r   r   r   _return_true   rO   z7test_checked_call_with_valid_call.<locals>._return_truerW   c                   S   rM   rU   r   r   r   r   r   r;      rY   z3test_checked_call_with_valid_call.<locals>.<lambda>TN)rQ   r   )rR   ra   Zchecked_callr   r   r   !test_checked_call_with_valid_call   s   rb   text)ZString_testTr1   rA   y              ?c                 C   s~   t tttf}t| |rt| }|t | ksJ d S dt| j }tj	t
|d t|  W d    d S 1 s8w   Y  d S )NzJonly str, int, float, and bool values can be copied to the clipboard, not rZ   )strr#   r"   bool
isinstancer   typer\   r]   r^   r   )rc   Zvalid_typesresultr_   r   r   r   test_stringify_text   s   

"ri   c                 #   sD    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_datarK   r   r   	_mock_set   s   z!mock_clipboard.<locals>._mock_setc                      s    j j S rj   rk   r   rp   r   r   	_mock_get   s   z!mock_clipboard.<locals>._mock_getz!pandas.io.clipboard.clipboard_setz!pandas.io.clipboard.clipboard_getN)rQ   )rR   rK   rq   rr   r   rp   r   mock_clipboard   s   
rs   c                 C   sF   dd l }|jjd dt|  v sJ |jj }|dks!J d S )Nr   r'   )pandas.io.clipboardio	clipboardr   setvaluesr   )rs   pandasrh   r   r   r   test_mock_clipboard   s
   rz   c                   @   s  e Zd Zd;ddZdd Zejdg ddd	 Zd
d Z	dd Z
dd Zejdg dejdg d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g dg d g d!g d"gfdg d#g d g d!gfgd$d% Zd&d' Zejd(g d)d*d+ Zejjejd,g d-ejjejd.du oe  d/d0d1d2d3 Zejd4d5d6gd7d8 Zd9d: ZdS )<TestClipboardNc                 C   s2   |j |||d t|pdd|d}t|| d S )N)r   r   encoding	r   )r   Z	index_colr|   )to_clipboardr   rG   assert_frame_equal)selfro   r   r   r|   rh   r   r   r   check_round_trip_frame   s   z$TestClipboard.check_round_trip_framec                 C   s   |  | d S rj   r   r   rL   r   r   r   test_round_trip_frame  s   z#TestClipboard.test_round_trip_framer   )r}   ,|c                 C   s   | j ||d d S )Nr   r   )r   rL   r   r   r   r   test_round_trip_frame_sep     z'TestClipboard.test_round_trip_frame_sepc                 C   s<   |j dd d t }| | ksJ |j|jksJ d S )NFr   r   )r~   r   	to_stringshape)r   rL   rh   r   r   r   test_round_trip_frame_string
  s   z*TestClipboard.test_round_trip_frame_stringc                 C   sD   t jtddd |jddd W d    d S 1 sw   Y  d S )NzAto_clipboard in excel mode requires a single character separator.F)r[   Zcheck_stacklevelTz\tr   )rG   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 d    d S 1 sw   Y  d S )NFr}   r   )rG   r   r~   r   r   r   r   test_copy_delim_warning  s   
"z%TestClipboard.test_copy_delim_warning)r}   Nr   r   )TNr   c                 C   s:   t ||}|jdi | ||jj |jddksJ d S )Nr}   r   r   )r   r~   rl   rm   Zto_csv)r   r   r   rL   rK   rs   r   r   r   r    test_clipboard_copy_tabs_default!  s   
 z.TestClipboard.test_clipboard_copy_tabs_defaultr   Fc                 C   sL   t ||}|jdi | tdd}| | ksJ |j|jks$J d S )Nz\s+r   r   )r   r~   r   r   r   )r   r   r   rL   r   rh   r   r   r   test_clipboard_copy_strings)  s
   

z)TestClipboard.test_clipboard_copy_stringsc                 C   s   ddi}t d }|||jj< tdi |}|jd d dks"J t d }|||jj< tdi |}t d }|||jj< tdi |}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   )r   striprl   rm   r   ZilocrG   r   )r   rK   rs   Zclip_kwargsrc   rL   resexpr   r   r   test_read_clipboard_infer_excel2  s*   z-TestClipboard.test_read_clipboard_infer_excelc                 C   s>   d}|||j j< t }tg dg ddd}t|| d S )Nzcol1	col2
1	red
	blue
2	greenr1   Nr4   redbluegreenZcol1Zcol2rn   rl   rm   r   r	   rG   r   )r   rK   rs   rc   rL   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)Ar   B)r   r1   r   )TTF)z		col1	col2z	A	0	1	redz	A	1		bluezB	0	2	greenc                 C   sD   |d ||j j< t }tg dg dd|d d}t|| d S )Nr   r   r   r   r1   )ro   indexr   )r   rK   rs   r   rL   r   r   r   r    test_infer_excel_with_multiindexg  s   z.TestClipboard.test_infer_excel_with_multiindexc                 C   s|   d}t jt|d |jdd W d    n1 sw   Y  t jt|d tdd W d    d S 1 s7w   Y  d S )Nz&clipboard only supports utf-8 encodingrZ   asciir|   )r]   r^   rJ   r~   NotImplementedErrorr   )r   rL   r_   r   r   r   test_invalid_encoding  s   "z#TestClipboard.test_invalid_encodingenc)zUTF-8zutf-8r   c                 C   s   | j ||d d S )Nr   r   )r   r   rL   r   r   r   test_round_trip_valid_encodings  r   z-TestClipboard.test_round_trip_valid_encodingsro   )u   👍...u   Ωœ∑´...zabcd...ZDISPLAYzBCannot be runed if a headless system is not put in place with XvfbT)reasonstrictc                 C   s@   t | |t ksJ t rt rtjg ddd d S d S d S )N)Zxselz--deletez--clipboardT)check)r   r   r   r   
subprocessrun)r   ro   r   r   r   test_raw_roundtrip  s
   	z TestClipboard.test_raw_roundtripr   rD   r   c           
         s  |dks|dkrt d|dkr*t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 d    n1 s\w   Y  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rd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   r4   ZInt64g      @g      @ZFloat64TFboolean)	r%   r&   rD   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   )r]   Zimportorskipr   r6   r   Zobject_r   r   rl   rm   pdZoption_contextr   r	   r
   Zpandas.arraysr   columnsrG   r   )
r   rK   rs   Zstring_storager   r   Zstring_arrayZstring_array_narc   rh   r   r   r   !test_read_clipboard_dtype_backend  sB   
z/TestClipboard.test_read_clipboard_dtype_backendc                 C   sB   d}t jt|d tdd W d    d S 1 sw   Y  d S )NzPdtype_backend numpy is invalid, only 'numpy_nullable' and 'pyarrow' are allowed.rZ   numpy)r   )r]   r^   rJ   r   )r   r_   r   r   r   test_invalid_dtype_backend  s
   "z(TestClipboard.test_invalid_dtype_backend)NNN)r\   
__module____qualname__r   r   r]   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   r{      sZ    

	(


1r{   )/r   r   textwrapr   r   r6   r]   Zpandas.compatr   r   r   Zpandas.errorsr   r   ry   r   r   r	   r
   r   r   Zpandas._testingZ_testingrG   Zpandas.core.arraysr   r   rt   r   r   r   r   r   ZfixturerL   rT   r   Zusefixturesr`   rb   r   ri   rs   rv   rz   r   r{   r   r   r   r   <module>   sH    	
G








	
