o
    h\q                  	   @   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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mZ G dd dejZe jdd	 Zd
d Ze rod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/m0Z0 e1 d  Z1e1re0e1e0d"k re(j+,ej"j-ej2d#d$ qe(j)d  3d%d&kr	e(j+,ej"j-ej.d qe*d'kr"e4 d(kr"e(j+,ej"j-d)d#d* qe*d'krMd+ej5v s3d,ej5v rMe	jd-krMe	j6dd. d/k rMe(j+,ej"-d0 qej"#de'ej"j$ddd1d2 Z7d3d4 Z8d5d6 Z9d7d8 Z:d9d: Z;d;d< Z<d=d> Z=d?d@ Z>dAdB Z?dCdD Z@dEdF ZAej"jBe	jdGkoeC  dHdIej"#dJg eA dKdL ZDej"jBd+ej5v dMdIej"jBe	jdNkdOdIdPdQ ZEdRdS ZFej"jBe	jdGkdTdIej"#de dUdV ZGdWdX ZHe ZIeID ]hZ(e(j)d  d Z*e*dYkre(j+,ej"JdZ qe*d[kre(j+,ej"Jd\ qe*dkr!e(j+,ej"Jd] qe*d'krLd+ej5v s2d,ej5v rLe	jd-krLe	j6dd. d/k rLe(j+,ej"-d0 qej"#deIej"j$d^dd_d` ZKdadb ZLej"#de dcdd ZMdedf ZNej"#de ej"#dgdhdid#ifdjdkdlifgdmdn ZOdodp ZPej"jBe	jdNkdqdIej"#de ej"#dgdhdid#ifdjdkdlifgdrds ZQdS )t    N)Image)_c_internal_utils)ToolToggleBase)subprocess_run_helperis_ci_environmentc                       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__ ~/var/www/html/construction_image-detection-poc/venv/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   sH  t jdko	t  } t jdkot  }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 }|radd|}nX|rs|d	 d
ksp|d	 drsd}nF| rxd}nA|d	 dkrtj	
drd}n2|d	 drzdd l}W n ty   g }Y nw |j }	|	d}|d	 d }
|
 d|vrd}g }|r|tjjd| d| d nC|d	 drt jdkr|tjjd d n,|d	 d
krdtj	v sd!tj	v rt jdkrt jd d" d#k r|tjjd$d |i |d%d&|i|f qI|S )'Nlinuxc                 S   s   g | ]
}|gd |dfqS )qtaggr   QT_APIr    .0qt_apir    r    r!   
<listcomp>@   s
    z7_get_available_interactive_backends.<locals>.<listcomp>)PyQt6PySide6PyQt5PySide2c                 S   s   g | ]}|d gd|dfqS )	cairocffiqtcairor2   r    r4   r    r    r!   r7   C   s
    c                 S   s0   g | ]}d D ]}ddgdd| | ifqqS ))aggcairor?   gir   gtkr    )r5   versionrendererr    r    r!   r7   F   s
     )      tkinterr   tkaggwxwxaggzmatplotlib.backends._macosxmacosxc                 S   s   g | ]
}t j|s|qS r    	importlibutil	find_specr5   depr    r    r!   r7   N   s    z{} cannot be imported, z$DISPLAY is unset'$DISPLAY and $WAYLAND_DISPLAY are unsetTF_BUILDzmacosx backend fails on AzurerA   r   GtkrD   z.0zno usable GTK bindingsz	Skipping z	 because reasondarwinzgithub #16849GITHUB_ACTION   rD      %Tk version mismatch on Azure macOS CIBACKEND_DEPS,)r   r   r   display_is_validxdisplay_is_validformatjoin
startswithr   r   getr@   ImportError
Repositoryget_defaultenumerate_versionsappendpytestmarkskipxfailversion_info)_is_linux_and_display_invalid_is_linux_and_xdisplay_invalidenvsdepsr   rV   missingr@   available_gtk_versionsgi_reporB   marksr    r    r!   #_get_available_interactive_backends8   s   

	


""rw   c                   C   s   dd t  D S )Nc              
   S   s<   g | ]\}}t ji |g |d dd | D dqS )-c                 s   s"    | ]\}}| d | V  qdS )=Nr    )r5   kvr    r    r!   	<genexpr>|   s     z@_get_testable_interactive_backends.<locals>.<listcomp>.<genexpr>)rv   id)rj   paramrb   items)r5   r   rv   r    r    r!   r7   {   s
    
z6_get_testable_interactive_backends.<locals>.<listcomp>)rw   r    r    r    r!   "_get_testable_interactive_backendsy   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   pathrb   saver   canvasmanagertoolmanagertoolbaradd_tool)figtempdirimgr   r   r   r    r   r!   !_test_toolbar_button_la_mode_icon   s   



"r   c                     sJ  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rs|t  jd
dd W d    n1 snw   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" |
* |* ks#J d S )$Nr   pyplot)KeyEventFr#   zwebagg.open_in_browserzwebagg.port_retriesbackendr>   )rA   webrG   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   rY   rD   g      ?g       @key_press_eventq
draw_eventc                          S Nstart)eventtimerr    r!   <lambda>       z(_test_interactive_impl.<locals>.<lambda>close_eventpng)ra         ?)+importlib.utiliojsonr   rj   
matplotlibr   matplotlib.backend_basesr   rcParamsupdateloadsargvlowerr&   rc   r   r   raisesre   r   rM   rN   subplotsr   r   r,   r   get_window_titler   plotr   draw_rubberband	new_timeradd_callback_processmpl_connectprintBytesIOsavefigshowpausegetvalue)rL   r   r   r   rj   r   r   r   r   axresultresult_afterr    )r   r   r   r!   _test_interactive_impl   sZ   


r   r   r   toolbar2r   rD   )rerunsc              
   C   s   | d dkr|dkrt d | d dkrt d | d dkr)|dkr)t d ztttd	|it| d
}W n tjyU } zt 	dt
|j  W Y d }~nd }~ww |jddks`J d S )Nr   rJ   r   z*toolmanager is not implemented for macosx.rH   2wx backend is deprecated; tests failed on appveyorrI   zMTemporarily deactivated: show() changes figure height and thus fails the testr   timeout	extra_envz,Subprocess failed to test intended behavior

CloseEventr#   )rj   rl   _run_helperr   r   dumps_test_timeoutr   CalledProcessErrorfailstr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#   rD      r   r   rH   )concurrent.futuresr   r   r   r   r   r   r   submitr   r   r   r   r   drawr   r   rc   flush_events)r   r   r   r   r   futurer    r    r!   _test_thread_impl  s&   

r   r   r?   )r   rH   rJ   )parsez10.16T)r   strictr3   r;   rG   CPythonzZPyPy does not support Tkinter threading: https://foss.heptapod.net/pypy/pypy/-/issues/1929)rV   r   rS   rX   rW   rY   rZ   r\   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_safetyK  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
isinstancer   _backend_modr   )r   r   bkr    r    r!   &_impl_test_lazy_auto_backend_selectionR  s   
r   c                   C      t ttd d S Nr   )r   r   r   r    r    r    r!    test_lazy_auto_backend_selection`  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   r8   pyside6r:   pyside2)"matplotlib.backends.backend_qt5aggr   modulesr   r   r    r    r!   _implqt5agge  
    r  c                  C   r  r  )$matplotlib.backends.backend_qt5cairor   r	  r
  r    r    r!   
_implcairon  r  r  c                  C   r  r  )matplotlib.backends.backend_qt5r   r	  r
  r    r    r!   	_implcorew  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   rK   rO   r    r    r!   r7     
    z-test_qt5backends_uses_qt5.<locals>.<listcomp>)r:   r  c                 S   r  r   rK   rO   r    r    r!   r7     r  )r8   r  r   need both QT6 and QT5 bindingsr  pycairo)lenrj   rl   r   r  r   rL   rM   rN   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   r8   r:   r;   r9   z(Failed to import any of the following Qt)matchr1   z^(?:(?!(PySide6|PyQt6)).)*$qt5agg)r   r	  r   r   rj   r   re   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ddtd |j	j
  d S )Nr   z.QtCorez
.QtWidgetszmpl testingerrorz.*Mixing Qt major.*)messagecategory)rL   r   warningsr   import_modulematplotlib.backends.backend_qtQApplicationfilterwarningsUserWarningbackends
backend_qt_create_qApp)
rL   r   r!  _host_bindingmpl_bindingmpl_binding_qwidgetsr   host_qwidgetshost_appr    r    r!   _impl_test_cross_Qt_imports  s   r0  c                  c   s    dd dD } dd dD }t | dkst |dkr+tjd d tjdgdV  d S | D ]}|D ]}||g||gfE d H  q1q-d S )	Nc                 S   r  r   rK   rO   r    r    r!   r7     r  z%qt5_and_qt6_pairs.<locals>.<listcomp>)r:   r;   c                 S   r  r   rK   rO   r    r    r!   r7     r  )r8   r9   r   r  )rv   )r  rj   r~   rk   rl   )r  r  qt5qt6r    r    r!   qt5_and_qt6_pairs  s"   r3  r0   rR   rU   z	host, mplc              
   C   sX   z
t t| |td}W n tjy  } z	|j}W Y d }~nd }~ww |j}d|v s*J d S )Nr  z2Mixing Qt major versions may not work as expected.)r   r0  r   r   r   r   )hostr   r   exr   r    r    r!   test_cross_Qt_imports  s   
r6  z,this test fails an azure for unknown reasonsr   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   )rj   importorskipr   Popenr   
executableinspect	getsourcer   r   r   r   r   timeperf_counterr   pollurllibrequesturlopenr  URLErrorr   r   send_signalsignal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_backendrL   r"  r  re   exit)r   r   r   rr   rP   r   r    r    r!   _lazy_headless  s*   

rW  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#   rY   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 blittingrE   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_eventsj  s
    rk  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   )MockCIrY   r   r\  r#   Tr   )r   unittest.mockrl  r   r   getenvr   r   r   r   r   r   stop
call_countsingle_shotr   )r   rl  r   
pause_timer   r   mockr    r    r!   _impl_test_interactive_timersx  s,   




ru  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  rm  z)gtk3cairo timers do not work in remote CIrH   r   r   )r   ro  rj   rl   r   ru  r   r:  r    r    r!   test_interactive_timers  s   


rv  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GenerateConsoleCtrlEventrI  rL  getpidrJ  )rw  rI  )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  rz  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   qtrJ   -SIGINT currently only tested on qt and macosxr8  z
_test_sigint_impl(rQ   )r}  r  r  )rd   rc   rj   rl   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    )rI  r   r   r  r  r   r   r   r   rr  r   r   r  r  )r   r  r   rI  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j	dkr2|dkr2|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y   |  | \}} w t| d|v sJ d S )Nr   r  r  rJ   zmacosx backend is buggyrU   rW   r   zQt backend is buggy on macOSr8  z'
_test_other_signal_before_sigint_impl(rQ   r  r}  r  r  r  )rd   rc   rj   rl   node
add_markerrk   rm   r   r   r   r>  r?  r@  r  r*   r   rL  pidrI  r  rJ  r  r   r  r   )r   r  r   rE  r   r   r   r*  r    r    r!   test_other_signal_before_sigint  sF   




r  )R	functoolsrL   r   r?  r   r   r   rI  r   r   r   rA  urllib.requestrD  PILr   rj   r   r   r   matplotlib.backend_toolsr   matplotlib.testingr   r   r   r=  r   	lru_cacherw   r   r   r   r   rk   parametrizeflakyr   r   _thread_safe_backendsr~   valuesr   rv   ri   rm   r   packaging.versionr   mac_verTimeoutExpiredrd   python_implementationr   rn   r   r   r  r  r  r  r  r  r  r0  r3  skipifr_   r6  rP  rW  rX  rf  _blit_backendsrl   rk  ru  rv  r  r  r  r  r    r    r    r!   <module>   s"   
@S

 
			!	)







#
	!



