o
    :a.                     @   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 Z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 qiedkrejejjejd qie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 qiejd  $ddkrejejjejd qiedkre% dkrejejjddd  qiejdeejjddd!d" Z&ejj'd#ej(v d$d%ejj'ej)d&kd'd%d(d) Z*ejj'ejd*kd+d%ejjd,dd-d.d/ Z+dS )0    N)_c_internal_utilsc            	      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 | tj||t|d  q5| S )!Nc                 S   s   g | ]
}|gd |dfqS )Zqtagg
MPLBACKENDQT_API .0Zqt_apir   r   L/usr/lib/python3/dist-packages/matplotlib/tests/test_backends_interactive.py
<listcomp>   s
    z6_get_testable_interactive_backends.<locals>.<listcomp>)ZPyQt6ZPySide6Z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
     )      Ztkinterr   tkaggwxZwxaggzmatplotlib.backends._macosxmacosxc                 S   s   g | ]
}t j|s|qS r   )	importlibutil	find_spec)r   Z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)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paramstr)	ZenvsZdepsenvr   missingr   r   Zrepor   r   r   r	   "_get_testable_interactive_backends   s^   	




r3   <   c                     s0  dd l } dd l}dd l}dd l}ddlm} dd lddlmm} ddl	m
} |ddd t|jdkrB|||jd  jd	  }| j | j}|d
r|ds  |dkr~|t jddd W d    n1 syw   Y   fdd}	| jdr|	|d d d  |	d j|dd  \}
} t|
jjd| |ddgddg |
jd |j!|
jd |
j"dfdd |
j"dt# |$ }|
j%|dd &  'd |$ }|
j%|dd |d s|j(d!kr |) |)  d S d S d S )"Nr   )TestCasepyplotrcParams)FigureCanvasBaseF   zwebagg.open_in_browserzwebagg.port_retries   backendr   )r   Zwebr   TZforcec                    s2   j | dd  } t|jjd|  d S )NTr>   matplotlib.backends.backend_{})usefiguretypecanvas
__module__r#   )Zalt_backendfig)assert_equalmplpltr   r	   check_alt_backendp   s   
z1_test_interactive_impl.<locals>.check_alt_backendr   r   Zsvgr?   r   g      ?qZ
draw_eventc                    s      S )N)start)Zevent)timerr   r	   <lambda>   s    z(_test_interactive_impl.<locals>.<lambda>close_eventZpng)r#         ?Zqt5r   )*importlib.utiliojsonr!   Zunittestr5   
matplotlibr7   r8   Zmatplotlib.backend_basesr9   updatelenargvloadslowerZassertEqualZassertRaisesendswithr(   rA   ImportErrorr@   r   r   subplotsrB   rC   rD   r#   plotZ	new_timerZadd_callbackZkey_press_eventmpl_connectprintBytesIOZsavefigZshowpauser"   getvalue)r   rR   rS   r!   r5   r8   r9   r=   Zassert_raisesrI   rE   axresultZresult_afterr   )rF   rG   rH   rM   r	   _test_interactive_implK   s^   



re   r1   toolbarZtoolbar2toolmanagerr   )Zrerunsc                 C   s   | d dkr|dkrt d tjtjdttd t	
d|igi tjdd	i| ttjd
d}|jr?t d|j d |jddksIJ d S )Nr   r   rg   z*toolmanager is not implemented for macosx.-c
_test_interactive_impl()rf   SOURCE_DATE_EPOCH0T)r1   timeoutstdoutuniversal_newlines2The subprocess returned with non-zero exit status .
CloseEventr:   )r+   r-   
subprocessrunr!   
executableinspect	getsourcere   rS   dumpsr%   r&   _test_timeoutPIPE
returncodefailrm   count)r1   rf   procr   r   r	   test_interactive_backend   s&   

r~   c                  C   s   ddl m}  dd l}dd l}ddlm}m} |ddd t|j	dkr0||
|j	d  | \}}|d |  |jg d	}|  |jd
t |  |jj}|d |  |  |j  d S )Nr   )ThreadPoolExecutorr6   Fr:   r;   r<   rP   )r:   r      rO   )Zconcurrent.futuresr   rS   r!   rT   r7   r8   rU   rV   rW   rX   r\   ra   Zsubmitr]   rd   rC   r^   r_   ZdrawcloseZflush_events)r   rS   r!   rH   r8   rE   rc   Zfuturer   r   r	   _test_thread_impl   s(   

r   r   r   )raisesr   r   )parsez10.16T)r   strictr   r   r   ZCPythonzZPyPy does not support Tkinter threading: https://foss.heptapod.net/pypy/pypy/-/issues/1929)r   r   c                 C   sT   t jtjdttd gi tjddi| t	dt j
dd}|jddks(J d S )	Nrh   z
_test_thread_impl()rj   rk   T)r1   rl   checkrm   rn   rq   r:   )rr   rs   r!   rt   ru   rv   r   r%   r&   rx   ry   rm   r|   )r1   r}   r   r   r	   test_interactive_thread_safety   s   r   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 gi t	j
dddd} dtjd	 tjd
 }t t }	 z|  }|d u s;J tj|}W n tjjy[   t |krWt d nY q/Y nw q0|  | tj | jtddksqJ d S )NZtornadorh   ri   Zwebaggrk   )r   rj   r1   zhttp://{}:{}zwebagg.addresszwebagg.portTz'Failed to connect to the webagg server.)rl   r   )r+   Zimportorskiprr   Popenr!   rt   ru   rv   re   r%   r&   r#   rG   r8   timeperf_counterrx   ZpollurllibZrequestZurlopenerrorZURLErrorr{   r   Zsend_signalsignalSIGINTwait)r}   Zurlrl   ZretcodeZconnr   r   r	   test_webagg   s:   
r   r   zthis a linux-only testZQtAgg)Zskip_on_importerrorc                  C   sJ   d} t jtjd| gi tjddid}|jr#td|j d d S d S )Na  
import os
import sys

# make it look headless
os.environ.pop('DISPLAY', None)
os.environ.pop('WAYLAND_DISPLAY', None)

# we should fast-track to Agg
import matplotlib.pyplot as plt
plt.get_backend() == 'agg'
assert 'PyQt5' not in sys.modules

# make sure we really have pyqt installed
import PyQt5
assert 'PyQt5' in sys.modules

# try to switch and make sure we fail with ImportError
try:
    plt.switch_backend('qt5agg')
except ImportError:
    ...
else:
    sys.exit(1)

rh   r    r   ro   rp   )	rr   rs   r!   rt   r%   r&   rz   r+   r{   )Ztest_scriptr}   r   r   r	   test_lazy_linux_headless  s   r   ),r   rQ   ru   rS   r%   r"   r   rr   r!   r   Zurllib.requestr   r+   rT   rG   r   r3   rx   re   r,   ZparametrizeZflakyr~   r   Z_thread_safe_backendsr/   valuesr=   r   r*   r.   ZCalledProcessErrorZpackaging.versionr   Zmac_verZTimeoutExpiredr'   Zpython_implementationr   Zskipifr&   namer   r   r   r   r   r	   <module>   s    *
R

