o
    is                  	   @   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creationflagsZAgg0
MPLBACKENDSOURCE_DATE_EPOCHT)envstdoutuniversal_newlines)	sysplatform
subprocessZCREATE_NEW_CONSOLEsuper__init__osenvironPIPE)selfargskwargs	__class__ y/var/www/html/eduruby.in/lip-sync/lip-sync-env/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   .0Z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 )	cairocffiZqtcairor.   r   r0   r   r   r   r2   =   s
    c                 S   s0   g | ]}d D ]}ddgdd| | ifqqS ))aggcairor9   gir   gtkr   )r1   versionrendererr   r   r   r2   @   s
     )      tkinterr   tkaggwxZwxaggzmatplotlib.backends._macosxmacosxc                 S   s   g | ]
}t j|s|qS r   	importlibutil	find_specr1   depr   r   r   r2   H   s    linuxz'$DISPLAY and $WAYLAND_DISPLAY are unsetz{} cannot be imported, 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)r   r   r   Zdisplay_is_validformatjoinr   r   get
startswithr:   Z
Repositoryget_defaultZenumerate_versionsappendpytestmarkskipxfailversion_infoparamstr)	Zenvsdepsr   rN   missingr:   r<   reporW   r   r   r   "_get_testable_interactive_backends7   sv   	





ri   c                  C   s&   g d} | D ]
}t |r dS qdS )N)CIZCONTINUOUS_INTEGRATIONZTRAVISZCIRCLECIZJENKINSZ	GITLAB_CIZGITHUB_ACTIONSZTEAMCITY_VERSIONTF)r   getenv)Zci_environment_variablesenv_varr   r   r   is_ci_environmentm   s   
rm   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 )NZLA)   rp   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   Ztmp_img_pathr   r   
CustomTool   s    rt   testgroup)tempfileTemporaryDirectoryr   newr   pathrZ   saver   canvasmanagertoolmanagertoolbarZadd_tool)figtempdirZimgrt   r~   r   r   rs   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backendr8   )r;   ZwebrA   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)Zalt_backendr   )mplpltr   r   check_alt_backend   s   
z1_test_interactive_impl.<locals>.check_alt_backendr7   r9   svgr   zFigure 1r   r~   rQ   r>   g      ?g       @Zkey_press_eventq
draw_eventc                          S Nstart)eventtimerr   r   <lambda>       z(_test_interactive_impl.<locals>.<lambda>close_eventZpng)rY         ?qt5rO   )+importlib.utiliojsonr   r_   
matplotlibr   Zmatplotlib.backend_basesr   rcParamsupdateloadsargvlowerr#   r\   r   raisesImportErrorr   rF   rG   subplotsr   r|   r)   r}   Zget_window_titler   plotr   Zdraw_rubberband	new_timeradd_callbackZ_processmpl_connectprintBytesIOZsavefigshowpauser   getvalue)rE   r   r   r   r_   r   r   r   r   axresultZresult_afterr   )r   r   r   r   _test_interactive_impl   s^   

r   r   r   Ztoolbar2r~   r>   )Z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   rC   r~   z*toolmanager is not implemented for macosx.rB   2wx backend is deprecated; tests failed on appveyorr   timeoutZ	extra_envz,Subprocess failed to test intended behavior

CloseEventr    )r_   ra   _run_helperr   r   dumps_test_timeoutr   CalledProcessErrorfailre   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    r>      r   r   ZWX)concurrent.futuresr   r   r   r   r   r   r   submitr   r   r|   r   r   Zdrawr   r\   flush_events)r   r   r   r   r   futurer   r   r   _test_thread_impl	  s&   

r   r   r9   )r   rB   rC   )parsez10.16T)r   strictr/   r6   rA   CPythonzZPyPy does not support Tkinter threading: https://foss.heptapod.net/pypy/pypy/-/issues/1929)rN   r   rL   rP   rO   rQ   rR   rT   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
isinstancere   Z_backend_modr   )r   r   Z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   r3   pyside6r5   pyside2)Z"matplotlib.backends.backend_qt5aggr   modulesr   r   r   r   r   _implqt5aggf  
    r   c                  C   r   r   )Z$matplotlib.backends.backend_qt5cairor   r   r   r   r   r   
_implcairoo  r   r   c                  C   r   r   )Z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   rD   rH   r   r   r   r2     
    z-test_qt5backends_uses_qt5.<locals>.<listcomp>)r5   r   c                 S   r   r   rD   rH   r   r   r   r2     r   )r3   r   r   need both QT6 and QT5 bindingsr   Zpycairo)lenr_   ra   r   r   r   rE   rF   rG   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   r3   r5   r6   r4   z(Failed to import any of the following Qtmatchr-   z^(?:(?!(PySide6|PyQt6)).)*$Zqt5agg)r   r   r   r   r_   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   rE   r_   r   import_moduleZmatplotlib.backends.backend_qtZQApplicationZwarnsUserWarningbackendsZ
backend_qtZ_create_qApp)
r   rE   r_   _Zhost_bindingZmpl_bindingZmpl_binding_qwidgetsr   Zhost_qwidgetsZ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   rD   rH   r   r   r   r2     r   z)test_cross_Qt_imports.<locals>.<listcomp>)r5   r6   c                 S   r   r   rD   rH   r   r   r   r2     r   )r3   r4   r   r   r   )r   r_   ra   r   r   r   r   r   
returncodesignalSIGSEGVSIGABRT)r   r   r   Zqt6pairexr   r   r   test_cross_Qt_imports  s8   

r   z,this test fails an azure for unknown reasonsrM   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{}Zwebaggr	   r
   r   zhttp://zwebagg.address:zwebagg.portTz'Failed to connect to the webagg server.r   r   )r_   importorskipr   Popenr   
executableinspect	getsourcer   r   r   r   r   timeperf_counterr   pollurllibrequesturlopenerrorURLErrorr   r   send_signalr   SIGINTwaitkill)r   urlr   retcodeconnr   r   r   test_webagg  sD   

r  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    rV   DISPLAYWAYLAND_DISPLAYr8   )r   r   r   splitr   popr   r   r   get_backendrE   r   r   r   exit)r   r   r   rf   rI   r   r   r   r   _lazy_headless  s*   

r  rJ   zthis a linux-only testc              	   C   s0   t t| d| dti | dddd}d S )Nr   rU   r   )r  r  r   )r   r  r  r   r   r   r   r   test_lazy_linux_headless  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 ]$}|j| |ddgddg\}|| |j|j
 |j  qB| d d S )Nr   r    rQ   T)ZanimatedF)blockg333333?r   
   皙?)r   r   r   r   r   r   r|   r   r   Zcopy_from_bboxZbboxZdraw_artistZblitrangeZrestore_regionr   )r   r   r   lnbgjr   r   r   _test_number_of_draws_script#  s    


r(  	gtk3cairoz#gtk3cairo does not support blittingZ	gtk4cairoz#gtk4cairo does not support blittingzwx does not support blittingr?   c                 C   s:   t tt| d}|jd}d|  k rdk sJ  J d S )Nr   Z	DrawEventr   r   )r   r(  r   r   r   )r   r   Zndrawsr   r   r   test_blitting_eventsd  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.|
| || q!| j}|   tdD ]}|	 }|rN|
| || |   qA| j| }	t|	 d S )Nr   r   r    rQ   r   )gcr   psutilr   r   floatr   Processr$  r   r   r   Zmemory_infoZrssZcollectr   )
r+  r   r,  r   tpr   r   Zmemgrowthr   r   r   _test_figure_leakt  s*   




r2  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 )Nr,  zpsutil needed to run this testrM   r   rB   r   rC   zmacosx backend is leakyrA   rO   iا r   )r_   r  ra   node
add_markerr`   rb   r   r   r   r2  re   r   intr   )r   r3  r  
pause_timeZacceptable_memory_leakager   r1  r   r   r   test_figure_leak_20490  s   

r8  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   )Mockrj   rQ   r   r#  r    Tr   )r   Zunittest.mockr9  r   r   rk   r   r   r|   r   r   r   stopZ
call_countsingle_shotr   )r   r9  r   r7  r   r   Z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   r)  rj   z)gtk3cairo timers do not work in remote CIrB   r   r   )r   rk   r_   ra   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   win32apiZGenerateConsoleCtrlEventr   r  getpidr  )r>  r   )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   rG  r   r   r   r     r   SUCCESSTrD  r   )r   r   r   r   	threadingr   getattrTimerr   r|   r   KeyboardInterruptr   )r   target_namer   r   rJ  r@  targetr   r   )r   r   r   r   _test_sigint_impl  s,   


rP  ztarget, kwargsr   r!  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   ZqtrC   -SIGINT currently only tested on qt and macosxr  z
_test_sigint_impl(rK   )rC  r   rI  )r[   r\   r_   ra   r   r   r  r  r  rP  r'   communicater   	Exceptionr  )r   rO  r   r   r   r   r   r   r   r   test_sigint  s&   



rW  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   rA  rB  rF  rG  r   r   r   r     rH  z7_test_other_signal_before_sigint_impl.<locals>.<lambda>r    )rQ  TSIGUSR1rD  c                    s       d S r   r   )signumframer   r   r   custom_signal_handler"  s   zD_test_other_signal_before_sigint_impl.<locals>.custom_signal_handlerrI  r   )r   r   r   r   rK  r   r|   r   r   r;  r   r   rX  rM  )r   rN  r   r   r   rO  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   rR  rS  rC   zmacosx backend is buggyrM   r  z'
_test_other_signal_before_sigint_impl(rK   rT  rC  rX  r   rI  )r[   r\   r_   ra   r4  r5  r`   rb   r   r   r  r  r  r\  r'   r   r  pidr   rX  r  rU  r   rV  r   )r   rO  r   r  r   r   r   r   r   r   r   test_other_signal_before_sigint,  s>   




r^  )OrE   r   r  r   r   r   r   r   r   rw   r	  urllib.requestr  ZPILr   r_   r   r   r   Zmatplotlib.backend_toolsr   Zmatplotlib.testingr   r   r  r   ri   rm   r   r   r   r`   ZparametrizeZflakyr   r   Z_thread_safe_backendsrd   valuesr   rW   r^   rb   r   Zpackaging.versionr   mac_verTimeoutExpiredr[   python_implementationr   rc   r   r   r   r   r   r   r   r   r   r   r   Zskipifr  r  r   r(  Z_blit_backendsra   r*  r2  r8  r<  r=  rP  rW  r\  r^  r   r   r   r   <module>   s    6U

 
			!	)







#
	!



