U
    FvfZ                     @   s  d dl Z d dlZ d dlZd dlZd dlZd dlZd dlZd dl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Zd dlZd dlmZ d dlmZ d dlmZ dd ZdZd	d
 Zdd Zejde ejdddgejjdddd Zdd Z e Z!e!D ]nZ"e"j#d  d Z$de$kr@e"j%&ejj'ej(d qe$dkrfe"j%&ejj'ej(d qe$dkrd dl)m*Z* e+ d  Z+e+rte*e+e*dk rte"j%&ejj'ej,dd ne"j#d  -d d!kre"j%&ejj'ej(d ne$d"kre. d#kre"j%&ejj'd$dd% nVe$d"krd&ej/ks@d'ej/krejd(krej0dd) d*k re"j%&ej'd+ qejde!ejjddd,d- Z1d.d/ Z2d0d1 Z3d2d3 Z4d4d5 Z5d6d7 Z6d8d9 Z7d:d; Z8d<d= Z9ejj:d&ej/kd>d?ejj:ej;d@kdAd?dBdC Z<dDdE Z=ejj:ejdFkdGd?ejde dHdI Z>dJdK Z?ejj$dLddMdNdO Z@dPdQ ZAe ZBeBD ]Z"e"j#d  d Z$e$dRkre"j%&ejCdS ne$dTkre"j%&ejCdU nve$dkre"j%&ejCdV nVe$d"krxd&ej/ksd'ej/krxejd(krxej0dd) d*k rxe"j%&ej'd+ qxejdeBejjdWddXdY ZDdZd[ ZEejj:ejd\kd]d?ejde ejd^d_d`gdadb ZFdS )c    N)Image)_c_internal_utils)ToolToggleBase)subprocess_run_helperc            	   	   C   s  g } dd dD dd dD dd dD dgdd	ifd
gdd
ifd
gddifdgddiffD ]\}}d }dd |D }t jdkrt sd}n||rdd|}nf|d dkrtjdrd}nH|d 	drdd l
}|d d }|j }| d|dkrd}g }|r:|tjjd| d| d n|d 	d
rlt jdkrl|tjjdd nZ|d d	krdtjksd tjkrt jdkrt jd d! d"k r|tjjd#d | tj|d$d%|i|t|d& q^| S )'Nc                 S   s   g | ]}|gd |dfqS )Zqtagg
MPLBACKENDQT_API .0Zqt_apir	   r	   N/tmp/pip-unpacked-wheel-7vhvci0g/matplotlib/tests/test_backends_interactive.py
<listcomp>   s   z6_get_testable_interactive_backends.<locals>.<listcomp>)PyQt6PySide6PyQt5PySide2c                 S   s   g | ]}|d gd|dfqS )	cairocffiZqtcairor   r	   r
   r	   r	   r   r   "   s   c                 S   s0   g | ](}d D ]}ddgdd| | ifqqS ))aggcairor   gir   gtkr	   )r   versionZrendererr	   r	   r   r   %   s     )      tkinterr   tkaggwxZwxaggzmatplotlib.backends._macosxmacosxc                 S   s   g | ]}t j|s|qS r	   	importlibutil	find_specr   depr	   r	   r   r   -   s      linuxz'$DISPLAY and $WAYLAND_DISPLAY are unsetz{} cannot be importedz, TF_BUILDzmacosx backend fails on Azurer   r   r   z.0ZGtkzno usable GTK bindingsz	Skipping z	 because reasondarwinzgithub #16849GITHUB_ACTION   r      %Tk version mismatch on Azure macOS CIBACKEND_DEPS,)marksid)sysplatformr   Zdisplay_is_validformatjoinosenvironget
startswithr   Z
Repositoryget_defaultZenumerate_versionsappendpytestmarkskipxfailversion_infoparamstr)	Zenvsdepsenvr'   missingr   r   repor0   r	   r	   r   "_get_testable_interactive_backends   st    



 rG   x   c              	      s|   t  j}tdd}tj|d |  G  fdddt}| j	j
j}| j	j
j}|d| |dd W 5 Q R X d S )NZLA)   rI   ztest_la_icon.pngc                       s   e Zd Z ZdZdS )z5_test_toolbar_button_la_mode_icon.<locals>.CustomTool N)__name__
__module____qualname__imagedescriptionr	   Ztmp_img_pathr	   r   
CustomTool]   s   rQ   testgroup)tempfileTemporaryDirectoryr   newr6   pathr5   saver   canvasmanagertoolmanagertoolbarZadd_tool)figtempdirimgrQ   r[   r\   r	   rP   r   !_test_toolbar_button_la_mode_iconU   s    



r`   c               	      sH  dd l } dd l}dd l}dd l}ddlm} dd lddlm ddlm	} j
ddd j
||jd  j
d  }| j | j}|d	r|d
s  |dkr|t jddd W 5 Q R X  fdd}| jdr||d d d  |d j|dd  \}	}
 t|	jjd| j
d dkrbt|	 |
ddgddg |	jjr|	jj d dddd |	j!d"|d|	jdj# |	j$dfdd |	j$d t% |& }|	j'|d!d" (  )d# |& }|	j'|d!d" |d$sD|j*d%krD |+ |+  d S )&Nr   )TestCasepyplot)KeyEventF   zwebagg.open_in_browserzwebagg.port_retriesbackendr   )r   Zwebr   Tforcec                    s2   j | dd  } t|jjd|  d S )NTrh   matplotlib.backends.backend_{})usefiguretyperY   rL   r4   )Zalt_backendr]   )assert_equalmplpltr	   r   check_alt_backend   s    
z1_test_interactive_impl.<locals>.check_alt_backendr   r   svgrj   r\   r[   r*   r   g      ?g       @Zkey_press_eventq
draw_eventc                    s      S N)start)event)timerr	   r   <lambda>       z(_test_interactive_impl.<locals>.<lambda>close_eventZpng)r4         ?qt5r(   ),importlib.utiliojsonr2   Zunittestra   
matplotlibrc   Zmatplotlib.backend_basesrd   rcParamsupdateloadsargvlowerassertEqualassertRaisesendswithr9   rl   ImportErrorrk   r    r!   subplotsrm   rY   rL   r4   r`   plotr\   Zdraw_rubberbandZ	new_timerZadd_callbackZ_processmpl_connectprintBytesIOZsavefigshowpauser3   getvalue)r   r   r   r2   ra   rd   rg   Zassert_raisesrq   r]   axresultZresult_afterr	   )rn   ro   rp   ry   r   _test_interactive_impll   s`    




r   rD   r\   Ztoolbar2r[   r   )Zrerunsc              
   C   s   | d dkr|dkrt d | d dkr4t d ztttd|it| d}W n8 tjk
r } zt 	d	t
|j  W 5 d }~X Y nX |jd
dkstd S )Nr   r   r[   z*toolmanager is not implemented for macosx.r   2wx backend is deprecated; tests failed on appveyorr\   timeoutZ	extra_envz,Subprocess failed to test intended behavior

CloseEventre   )r<   r>   _run_helperr   r   dumps_test_timeout
subprocessCalledProcessErrorfailrB   stderrstdoutcountAssertionError)rD   r\   procerrr	   r	   r   test_interactive_backend   s&    


r   c                  C   s   ddl m}  dd l}ddlm} |jddd | \}}|d |  |j	ddd	g}|
  |jd
t |  |jj}|d |
  |  |jd dr|j  d S )Nr   )ThreadPoolExecutorrb   Fre   rf   r}   r      r|   rg   ZWX)concurrent.futuresr   r   rc   r   r   r   r   Zsubmitr   r   rY   r   r   Zdrawcloser9   flush_events)r   ro   rp   r]   r   futurer	   r	   r   _test_thread_impl   s$    

r   r   r   )raisesr   r   )parsez10.16T)r   strictr   r   r   CPythonzZPyPy does not support Tkinter threading: https://foss.heptapod.net/pypy/pypy/-/issues/1929)r'   r   r%   r)   r(   r*   r+   r-   c                 C   s&   t tt| d}|jddks"td S )Nr   r   re   )r   r   r   r   r   r   rD   r   r	   r	   r   test_interactive_thread_safety  s    r   c                  C   sr   dd l } dd lm} | jd}t|tr.t|jd ks<t|	d |jd k	sTt| jd}t|tsntd S )Nr   rg      )
r   matplotlib.pyplotrc   r   _get
isinstancerB   r   Z_backend_modr   )r   rp   Zbkr	   r	   r   &_impl_test_lazy_auto_backend_selection#  s    
r   c                   C   s   t ttd d S Nr   )r   r   r   r	   r	   r	   r    test_lazy_auto_backend_selection1  s    r   c               	   C   st   dd l } dd l}d|jkstd|jks,td|jksDd|jksDtdd l} tjtdd | jj	j
 W 5 Q R X d S Nr   r   pyside6r   pyside2QtWidgets.QApplication.instancematch)Z"matplotlib.backends.backend_qt5aggr2   modulesr   matplotlib.backends.backend_qt5r<   warnsDeprecationWarningbackendsbackend_qt5qAppr   r2   r	   r	   r   _implqt5agg6  s    r   c               	   C   st   dd l } dd l}d|jkstd|jks,td|jksDd|jksDtdd l} tjtdd | jj	j
 W 5 Q R X d S r   )Z$matplotlib.backends.backend_qt5cairor2   r   r   r   r<   r   r   r   r   r   r   r	   r	   r   
_implcairoD  s    r   c               	   C   sl   dd l } dd l}d|jkstd|jks,td|jksDd|jksDttjtdd | jjj	 W 5 Q R X d S r   )
r   r2   r   r   r<   r   r   r   r   r   r   r	   r	   r   	_implcoreR  s    r   c                  C   sv   dd dD } dd dD }t | dks4t |dkr>td tttd tjd	d k	rftt	td tt
td d S )
Nc                 S   s    g | ]}t j|d k	r|qS rv   r   r"   r	   r	   r   r   `  s   z-test_qt5backends_uses_qt5.<locals>.<listcomp>)r   r   c                 S   s    g | ]}t j|d k	r|qS rv   r   r"   r	   r	   r   r   d  s   )r   r   r   need both QT6 and QT5 bindingsr   Zpycairo)lenr<   r>   r   r   r   r   r    r!   r   r   )qt5_bindingsqt6_bindingsr	   r	   r   test_qt5backends_uses_qt5_  s    
r   c            
   	   C   s   dd l } dd l}dd l}| j\}}}|| d || d}dd l}|| d}|dg}	|jtdd |j	j
  W 5 Q R X d S )Nr   z.QtCorez
.QtWidgetszmpl testingzMixing Qt majorr   )r2   r   r<   r   import_modulematplotlib.backends.backend_qtZQApplicationr   UserWarningr   
backend_qtZ_create_qApp)
r2   r   r<   _Zhost_bindingZmpl_bindingZmpl_binding_qwidgetsr   Zhost_qwidgetsZhost_appr	   r	   r   _impl_test_cross_Qt_importsp  s    r   c                  C   s   dd dD } dd dD }t | dks4t |dkr>td | D ]}|D ]}||g||gfD ]r}zttf|dti W q^ tjk
r } z4|jt	j
 krW Y  q^n|jt	j krW Y q^ W 5 d }~X Y q^X q^qJqBd S )	Nc                 S   s    g | ]}t j|d k	r|qS rv   r   r"   r	   r	   r   r     s   z)test_cross_Qt_imports.<locals>.<listcomp>)r   r   c                 S   s    g | ]}t j|d k	r|qS rv   r   r"   r	   r	   r   r     s   )r   r   r   r   r   )r   r<   r>   r   r   r   r   r   
returncodesignalSIGSEGVSIGABRT)r   r   r~   Zqt6pairexr	   r	   r   test_cross_Qt_imports  s.    


r   z,this test fails an azure for unknown reasonsr&   ntzCannot send SIGINT on Windows.c                  C   s   t d tjtjdttd dgt	j
dddd} d	tjd
 tjd }t t }z(|  }|d ksrttj|}W qW q\ tjjk
r   t |krt d nY q\Y q\X q\|  | tj | jtddkstd S )NZtornadoz-cz
_test_interactive_impl()z{}Zwebagg0)r   SOURCE_DATE_EPOCH)rD   zhttp://{}:{}zwebagg.addresszwebagg.portz'Failed to connect to the webagg server.r   r   )r<   importorskipr   Popenr2   
executableinspect	getsourcer   r6   r7   r4   ro   r   timeperf_counterr   pollr   urllibrequesturlopenerrorURLErrorr   r   send_signalr   SIGINTwait)r   urlr   retcodeconnr	   r	   r   test_webagg  s6    
 r   c                  C   s   dd l } dd l}|jdd  \}}|d}| jdd  | jdd  |D ]}||jksLtqLdd lm	} |
 dks|t|D ]}||jkstq|D ]}t| ||jkstqz|| W n tk
r   Y nX |d d S )Nr   re   r/   DISPLAYWAYLAND_DISPLAYr   )r6   r2   r   splitr7   popr   r   r   rc   get_backendr   r   Zswitch_backendr   exit)r6   r2   rg   rC   r#   rp   r	   r	   r   _lazy_headless  s(    

r   r$   zthis a linux-only testc              	   C   s,   t t| d| dt| dddd}d S )Nr   r.   rJ   )r   r   r   )r   r   r   r   r   r	   r	   r   test_lazy_linux_headless  s     r   c               	   C   s8   dd l } dd l}|jtdd | jjj W 5 Q R X d S )Nr   r   r   )r   r<   r   r   r   r   r   )r   r<   r	   r	   r   _qApp_warn_impl  s     r   ZQtAgg)Zskip_on_importerrorc                   C   s   t ttd d S r   )r   r   r   r	   r	   r	   r   test_qApp_warn  s    r   c                  C   s   dd l m}  |  \}}|jddgddgdd\}| jdd | d |jd	t |j	|j
}|| |j|j
 td
D ]H}|j| |ddgddg\}|| |j|j
 |j  q| d d S )Nr   re   r*   T)ZanimatedF)blockg333333?ru   
   皙?)r   rc   r   r   r   r   rY   r   r   Zcopy_from_bboxZbboxZdraw_artistZblitrangeZrestore_regionr   )rp   r]   r   lnbgjr	   r	   r   _test_number_of_draws_script  s     


r  Z	gtk3cairoz#gtk3cairo does not support blittingZ	gtk4cairoz#gtk4cairo does not support blittingzwx does not support blittingr   c                 C   s8   t tt| d}|jd}d|  k r.dk s4n td S )Nr   Z	DrawEventr   r   )r   r  r   r   r   r   )rD   r   Zndrawsr	   r	   r   test_blitting_events9  s      r	  c            
      C   s   dd l } dd l}dd l}ddlm} t|jd }| }tdD ]$}|	 }|r\|
| || qB| j}|   tdD ],}|	 }|r|
| || |   q| j| }	t|	 d S )Nr   rb   re   r*   r   )gcr2   psutilr   rc   floatr   Processr  rl   r   r   Zmemory_infoZrssZcollectr   )
r
  r2   r  rp   tpr   r]   Zmemgrowthr	   r	   r   _test_figure_leakI  s*    




r  win32z0appveyor tests fail; gh-22988 suggests reworkingtime_mem)g        i )r  ic                 C   s   t jddd |\}}| d dkr,t d | d dksN| d dkrVtjd	krV|d
7 }ttt|t| d}t	|j
}||kstd S )Nr  zpsutil needed to run this testr&   r   r   r   r   r   r(   iا r   )r<   r   r>   r2   r3   r   r  rB   r   intr   r   )rD   r  Z
pause_timeZacceptable_memory_leakager   r  r	   r	   r   test_figure_leak_20490h  s$    

  
r  )Gr   r   r   r   r6   r3   r   r   r2   rT   r   urllib.requestr   ZPILr   r<   r   ro   r   Zmatplotlib.backend_toolsr   Zmatplotlib.testingr   r   rG   r   r`   r   r=   ZparametrizeZflakyr   r   Z_thread_safe_backendsrA   valuesrg   r0   r;   r?   r   Zpackaging.versionr   mac_verTimeoutExpiredr8   python_implementationr7   r@   r   r   r   r   r   r   r   r   r   Zskipifnamer   r   r   r   r   r  Z_blit_backendsr>   r	  r  r  r	   r	   r	   r   <module>   s  6V






!		
)







