o
    es                  	   @   st  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 G dd dejZdd	 Zd
d Ze rfdn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 ]Z%e%j&d  d Z'de'v re%j()ejj*ej+d qe'dkre%j()ejj*ej+d qe'd krd d!l,m-Z- e. d  Z.e.re-e.e-d"k re%j()ejj*ej/d#d$ qe%j&d  0d%d&kre%j()ejj*ej+d qe'd'kre1 d(kre%j()ejj*d)d#d* qe'd'krCd+ej2v s)d,ej2v rCejd-krCej3dd. d/k rCe%j()ej*d0 qej de$ejj!ddd1d2 Z4d3d4 Z5d5d6 Z6d7d8 Z7d9d: Z8d;d< Z9d=d> Z:d?d@ Z;dAdB Z<dCdD Z=dEdF Z>ejj?d+ej2v dGdHejj?ejdIkdJdHdKdL Z@dMdN ZAejj?ejdOkdPdHej de dQdR ZBdSdT ZCe ZDeDD ]hZ%e%j&d  d Z'e'dUkre%j()ejEdV qe'dWkre%j()ejEdX qe'dkre%j()ejEdY qe'd'kr#d+ej2v s	d,ej2v r#ejd-kr#ej3dd. d/k r#e%j()ej*d0 qej deDejj!dZdd[d\ ZFd]d^ ZGejj?ejdIkd_dHej de ej d`dadbgdcdd ZHdedf ZIej de dgdh ZJdidj ZKej de ej dkdldmd#ifdndodpifgdqdr ZLdsdt ZMejj?ejdIkdudHej de ej dkdldmd#ifdndodpifgdvdw ZNdS )x    N)Image)_c_internal_utils)ToolToggleBase)subprocess_run_helperc                       s(   e Zd ZdZ fddZdd Z  ZS )_WaitForStringPopenzL
    A Popen that passes flags that allow triggering KeyboardInterrupt.
    c                    sH   t jdkr
tj|d< t j|i |i tjdddtjdd d S )Nwin32creationflagsAgg0
MPLBACKENDSOURCE_DATE_EPOCHT)envstdoutuniversal_newlines)	sysplatform
subprocessCREATE_NEW_CONSOLEsuper__init__osenvironPIPE)selfargskwargs	__class__ Y/var/www/myenv/lib/python3.10/site-packages/matplotlib/tests/test_backends_interactive.pyr      s   

z_WaitForStringPopen.__init__c                 C   s<   d}	 | j d}|std|||7 }||rdS q)z%Read until the terminator is reached. T   z)Subprocess died before emitting expected N)r   readRuntimeErrorendswith)r   
terminatorbufcr   r   r    wait_for&   s   
z_WaitForStringPopen.wait_for)__name__
__module____qualname____doc__r   r)   __classcell__r   r   r   r    r      s    	r   c            	   	   C   s  g } 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D ]\}}d }dd |D }t jdkrNt sNd}n<|rYdd|}n1|d dkrhtjdrhd}n"|d 	drdd l
}|d d }|j }| d|dvrd}g }|r|tjjd| d| d n?|d 	d
rt jdkr|tjjdd n(|d d	krdtjv sd tjv rt jdkrt jd d! d"k r|tjjd#d | tji |d$d%|i|t|d& q5| S )'Nc                 S   s   g | ]
}|gd |dfqS )qtaggr   QT_APIr   .0qt_apir   r   r    
<listcomp>:   s
    z6_get_testable_interactive_backends.<locals>.<listcomp>)PyQt6PySide6PyQt5PySide2c                 S   s   g | ]}|d gd|dfqS )	cairocffiqtcairor0   r   r2   r   r   r    r5   =   s
    c                 S   s0   g | ]}d D ]}ddgdd| | ifqqS ))aggcairor=   gir   gtkr   )r3   versionrendererr   r   r    r5   @   s
     )      tkinterr   tkaggwxwxaggzmatplotlib.backends._macosxmacosxc                 S   s   g | ]
}t j|s|qS r   	importlibutil	find_specr3   depr   r   r    r5   H   s    linuxz'$DISPLAY and $WAYLAND_DISPLAY are unsetz{} cannot be imported, TF_BUILDzmacosx backend fails on Azurer?   r   rB   z.0Gtkzno usable GTK bindingsz	Skipping z	 because reasondarwinzgithub #16849GITHUB_ACTION   rB      %Tk version mismatch on Azure macOS CIBACKEND_DEPS,)marksid)r   r   r   display_is_validformatjoinr   r   get
startswithr>   
Repositoryget_defaultenumerate_versionsappendpytestmarkskipxfailversion_infoparamstr)	envsdepsr   rT   missingr>   r@   repor]   r   r   r    "_get_testable_interactive_backends7   sv   	





rs   c                  C   s&   g d} | D ]
}t |r dS qdS )N)CICONTINUOUS_INTEGRATIONTRAVISCIRCLECIJENKINS	GITLAB_CIGITHUB_ACTIONSTEAMCITY_VERSIONTF)r   getenv)ci_environment_variablesenv_varr   r   r    is_ci_environmentm   s   
r   x      c                    s   t  ;}tdd}tj|d |  G  fdddt}| j	j
j}| j	j
j}|d| |dd W d    d S 1 sBw   Y  d S )NLA)   r   ztest_la_icon.pngc                       s   e Zd Z ZdZdS )z5_test_toolbar_button_la_mode_icon.<locals>.CustomToolr!   N)r*   r+   r,   imagedescriptionr   tmp_img_pathr   r    
CustomTool   s    r   testgroup)tempfileTemporaryDirectoryr   newr   pathra   saver   canvasmanagertoolmanagertoolbaradd_tool)figtempdirimgr   r   r   r   r   r    !_test_toolbar_button_la_mode_icon   s   



"r   c                     s`  dd l } dd l}dd l}dd l}dd l}dd l ddlm ddlm}  j	
ddd  j	
||jd  j	d  }|dr|d	s  |d
krn|t  jd
dd W d    n1 siw   Y   fdd}| jdr||d d d  |d  j|dd  \}}	t|jjd| ksJ |jj dksJ  j	d dkrt| |	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$s*|j)d%kr,|
* |* ks.J d S d S d S )&Nr   pyplot)KeyEventFr"   zwebagg.open_in_browserzwebagg.port_retriesbackendr<   )r?   webrE   Tforcec                    s>    j | dd  }t|jjd|  ksJ d d S )NTr   matplotlib.backends.backend_all)usefiguretyper   r+   close)alt_backendr   )mplpltr   r    check_alt_backend   s   
z1_test_interactive_impl.<locals>.check_alt_backendr:   r=   svgr   zFigure 1r   r   rW   rB   g      ?g       @key_press_eventq
draw_eventc                          S Nstart)eventtimerr   r    <lambda>       z(_test_interactive_impl.<locals>.<lambda>close_eventpng)r`         ?qt5rU   )+importlib.utiliojsonr   rh   
matplotlibr   matplotlib.backend_basesr   rcParamsupdateloadsargvlowerr%   rc   r   raisesImportErrorr   rK   rL   subplotsr   r   r+   r   get_window_titler   plotr   draw_rubberband	new_timeradd_callback_processmpl_connectprintBytesIOsavefigshowpauser   getvalue)rJ   r   r   r   rh   r   r   r   r   axresultresult_afterr   )r   r   r   r    _test_interactive_impl   s^   

r   r   r   toolbar2r   rB   )rerunsc              
   C   s   | d dkr|dkrt d | d dkrt d ztttd|it| d}W n tjyF } zt 	d	t
|j  W Y d }~nd }~ww |jd
dksQJ d S )Nr   rH   r   z*toolmanager is not implemented for macosx.rF   2wx backend is deprecated; tests failed on appveyorr   timeout	extra_envz,Subprocess failed to test intended behavior

CloseEventr"   )rh   rj   _run_helperr   r   dumps_test_timeoutr   CalledProcessErrorfailrn   stderrr   count)r   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	g d}|
  |jd	t |  |jj}|d |
  |  |jd
 dr]|j  d S d S )Nr   )ThreadPoolExecutorr   Fr"   r   r   )r"   rB      r   r   WX)concurrent.futuresr   r   r   r   r   r   r   submitr   r   r   r   r   drawr   rc   flush_events)r   r   r   r   r   futurer   r   r    _test_thread_impl	  s&   

r   r   r=   )r   rF   rH   )parsez10.16T)r   strictr1   r9   rE   CPythonzZPyPy does not support Tkinter threading: https://foss.heptapod.net/pypy/pypy/-/issues/1929)rT   r   rQ   rV   rU   rW   rX   rZ   c                 C   s&   t tt| d}|jddksJ d S )Nr   r   r"   )r   r   r   r   r   r   r   r   r   r    test_interactive_thread_safetyL  s   r   c                  C   sr   dd l } dd lm} | jd}t|trJ |jd u sJ |d |jd us*J | jd}t|ts7J d S )Nr   r      )	r   matplotlib.pyplotr   r   _get
isinstancern   _backend_modr   )r   r   bkr   r   r    &_impl_test_lazy_auto_backend_selectionS  s   
r   c                   C      t ttd d S Nr   )r   r   r   r   r   r   r     test_lazy_auto_backend_selectiona  s   
r  c                  C   L   dd l } dd l}d|jvsJ d|jvsJ d|jv s"d|jv s$J d S d S Nr   r6   pyside6r8   pyside2)"matplotlib.backends.backend_qt5aggr   modulesr   r   r   r   r    _implqt5aggf  
    r  c                  C   r  r  )$matplotlib.backends.backend_qt5cairor   r
  r  r   r   r    
_implcairoo  r  r  c                  C   r  r  )matplotlib.backends.backend_qt5r   r
  r  r   r   r    	_implcorex  r  r  c                  C   sv   dd dD } dd dD }t | dkst |dkrtd tttd tjd	d ur3tt	td tt
td d S )
Nc                 S       g | ]}t j|d ur|qS r   rI   rM   r   r   r    r5     
    z-test_qt5backends_uses_qt5.<locals>.<listcomp>)r8   r  c                 S   r  r   rI   rM   r   r   r    r5     r  )r6   r  r   need both QT6 and QT5 bindingsr  pycairo)lenrh   rj   r   r  r   rJ   rK   rL   r  r  )qt5_bindingsqt6_bindingsr   r   r    test_qt5backends_uses_qt5  s   
r  c                  C   s   dd l } d | jd< d | jd< d | jd< d | jd< dd lm} tjtdd |d W d    n1 s5w   Y  tjtd	d |d
 W d    d S 1 sRw   Y  d S )Nr   r6   r8   r9   r7   z(Failed to import any of the following Qtmatchr/   z^(?:(?!(PySide6|PyQt6)).)*$qt5agg)r   r
  r   r   rh   r   r   switch_backend)r   r   r   r   r    _impl_missing  s   



"r  c                   C   r  r  )r   r  r   r   r   r   r    test_qt_missing  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 d    d S 1 sMw   Y  d S )Nr   z.QtCorez
.QtWidgetszmpl testingzMixing Qt majorr  )r   rJ   rh   r   import_modulematplotlib.backends.backend_qtQApplicationwarnsUserWarningbackends
backend_qt_create_qApp)
r   rJ   rh   _host_bindingmpl_bindingmpl_binding_qwidgetsr   host_qwidgetshost_appr   r   r    _impl_test_cross_Qt_imports  s   "r.  c                  C   s   dd dD } dd dD }t | dkst |dkrtd | D ]G}|D ]B}||g||gfD ]7}zttg|R dti W q/ tjyf } z|jt	j
 krTW Y d }~q/|jt	j kraW Y d }~q/ d }~ww q%q!d S )	Nc                 S   r  r   rI   rM   r   r   r    r5     r  z)test_cross_Qt_imports.<locals>.<listcomp>)r8   r9   c                 S   r  r   rI   rM   r   r   r    r5     r  )r6   r7   r   r  r   )r  rh   rj   r   r.  r   r   r   
returncodesignalSIGSEGVSIGABRT)r  r  r   qt6pairexr   r   r    test_cross_Qt_imports  s8   

r6  z,this test fails an azure for unknown reasonsrS   r   zCannot send SIGINT on Windows.c                  C   s   t d tjtjdttd dgi t	j
dddd} d	tjd
  dtjd  }t t }zQ	 z|  }|d u s?J tj|}W n tjjy_   t |kr[t d nY q3Y nw q4|  | tj | jtddksuJ W |  d u r|   d S d S |  d u r|   w w )Ntornado-cz
_test_interactive_impl()z{}webaggr
   r   r   zhttp://zwebagg.address:zwebagg.portTz'Failed to connect to the webagg server.r  r   )rh   importorskipr   Popenr   
executableinspect	getsourcer   r   r   r   r   timeperf_counterr   pollurllibrequesturlopenerrorURLErrorr   r   send_signalr0  SIGINTwaitkill)r   urlr   retcodeconnr   r   r    test_webagg  sD   

rP  c                  C   s   dd l } dd l}|jdd  \}}|d}| jdd  | jdd  |D ]	}||jvs/J q&dd lm} |	 dks>J |D ]	}||jvsIJ q@|D ]}t
| ||jv sZJ qLz|| W n
 tyl   Y d S w |d d S )Nr   r"   r\   DISPLAYWAYLAND_DISPLAYr<   )r   r   r   splitr   popr
  r   r   get_backendrJ   r   r  r   exit)r   r   r   rp   rN   r   r   r   r    _lazy_headless  s*   

rW  rO   zthis a linux-only testc              	   C   s0   t t| d| dti | dddd}d S )Nr   r[   r!   )rQ  rR  r   )r   rW  rT  r   r   r   r   r    test_lazy_linux_headless  s   
rX  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 ]$}|j| |ddgddg\}|| |j|j
 |j  qB| d d S )Nr   r"   rW   T)animatedF)blockg333333?r   
   皙?)r   r   r   r   r   r   r   r   r   copy_from_bboxbboxdraw_artistblitrangerestore_regionr   )r   r   r   lnbgjr   r   r    _test_number_of_draws_script#  s    


rf  	gtk3cairoz#gtk3cairo does not support blitting	gtk4cairoz#gtk4cairo does not support blittingzwx does not support blittingrC   c                 C   s:   t tt| d}|jd}d|  k rdk sJ  J d S )Nr   	DrawEventr   r   )r   rf  r   r   r   )r   r   ndrawsr   r   r    test_blitting_eventsd  s
    rk  c            
      C   s   dd l } dd l}dd l}ddlm} t|jd }| }tdD ]}|	 }|r.|
| || q!| j}|   tdD ]}|	 }|rN|
| || |   qA| j| }	t|	 d S )Nr   r   r"   rW   r   )gcr   psutilr   r   floatr   Processra  r   r   r   memory_inforsscollectr   )
rl  r   rm  r   tpr(  r   memgrowthr   r   r    _test_figure_leakt  s*   




rw  z0appveyor 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r'|jt jjdd | d d	kr6tjd
kr6|d7 }t	t
t|t| d}t|j}||ksKJ d S )Nrm  zpsutil needed to run this testrS   r   rF   r   rH   zmacosx backend is leakyrE   rU   iا r   )rh   r<  rj   node
add_markerri   rk   r   r   r   rw  rn   r   intr   )r   rx  rE  
pause_timeacceptable_memory_leakager   rv  r   r   r    test_figure_leak_20490  s   

r~  c                  C   s   dd l } ddlm} dd lm} | drdnd}| }|| |j	d}| }|
| |  || |  |jdksDJ d|_d|_|  || |jdksZJ |  || |jdksjJ |d	 d S )
Nr   )Mockrt   rW   r   r\  r"   Tr   )r   unittest.mockr  r   r   r|   r   r   r   r   r   r   stop
call_countsingle_shotr   )r   r  r   r|  r   r   mockr   r   r    _impl_test_interactive_timers  s,   




r  c                 C   sH   | d dkrt drtd | d dkrtd ttt| d d S )Nr   rg  rt   z)gtk3cairo timers do not work in remote CIrF   r   r   )r   r|   rh   rj   r   r  r   r:  r   r   r    test_interactive_timers  s   


r  c                    s   dd l dd lm} dd l dd l}||   fdd}t||}|d|| }|j	
ddd  |j	
dfdd z
|di | W d S  ty[   td	d
d Y d S w )Nr   c                     s@   j dkrdd l} | dd d S dd l}   |j d S )Nr   r   )r   win32apiGenerateConsoleCtrlEventr0  rL  getpidrJ  )r  r0  )r   r   r   r    interrupter  s
   
z&_test_sigint_impl.<locals>.interrupterr"   r   c                  W      t dddS NDRAWTflushr   r   r   r   r    r         z#_test_sigint_impl.<locals>.<lambda>c                     r   r   r   r  r   r   r    r     r   SUCCESSTr  r   )r   r   r   r   	threadingr  getattrTimerr   r   r   KeyboardInterruptr   )r   target_namer   r   r  r  targetr   r   )r   r   r   r    _test_sigint_impl  s,   


r  ztarget, kwargsr   rZ  r   intervalr[  c                 C   s   |  d}|dstd ttjdtt	d|d|d|d g}z|
d |jtd	\}}W n tyG   |  | \}} w d
|v sNJ d S )Nr   qtrH   -SIGINT currently only tested on qt and macosxr8  z
_test_sigint_impl(rP   )r  r  r  )rb   rc   rh   rj   r   r   r>  r?  r@  r  r)   communicater   	ExceptionrL  )r   r  r   r   r   r   r(  r   r   r    test_sigint  s&   



r  c                    s   dd l }dd lm} ||  t||}| }|jddd  |jjdd d _	 j
tddd	  fd
d}| |j| z
|di | W d S  tyZ   tddd	 Y d S w )Nr   r   c                  W   r  r  r  r  r   r   r    r     r  z7_test_other_signal_before_sigint_impl.<locals>.<lambda>r"   )r  TSIGUSR1r  c                    s       d S r   r   )signumframer   r   r    custom_signal_handler"  s   zD_test_other_signal_before_sigint_impl.<locals>.custom_signal_handlerr  r   )r0  r   r   r  r  r   r   r   r   r  r   r   r  r  )r   r  r   r0  r   r  r   r  r   r   r    %_test_other_signal_before_sigint_impl  s    

r  z,No other signal available to send on Windowsc                 C   s   |  d}|dstd |dkr|jtjjdd tt	j
dttd|d	|d	|d
 g}z$|d t|jtj |d t|jtj |jtd\}}W n tyk   |  | \}} w t| d|v svJ d S )Nr   r  r  rH   zmacosx backend is buggyrS   r8  z'
_test_other_signal_before_sigint_impl(rP   r  r  r  r  r  )rb   rc   rh   rj   ry  rz  ri   rk   r   r   r>  r?  r@  r  r)   r   rL  pidr0  r  rJ  r  r   r  r   )r   r  r   rE  r   r   r   r(  r   r   r    test_other_signal_before_sigint,  s>   




r  )OrJ   r   r?  r   r   r   r0  r   r   r   rA  urllib.requestrD  PILr   rh   r   r   r   matplotlib.backend_toolsr   matplotlib.testingr   r   r=  r   rs   r   r   r   r   ri   parametrizeflakyr   r   _thread_safe_backendsrm   valuesr   r]   rg   rk   r   packaging.versionr   mac_verTimeoutExpiredrb   python_implementationr   rl   r   r   r  r  r  r  r  r  r  r.  r6  skipifrP  rW  rX  rf  _blit_backendsrj   rk  rw  r~  r  r  r  r  r  r  r   r   r   r    <module>   s    6U

 
			!	)







#
	!



