U
    \	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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 ]vZejd  Zdekrejejjejd qedkrejejjejd qedkrejejjejdd qejdeejjdddd Z ejj!dej"k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 )'    N)_c_internal_utilsc                  C   sz  zddl m}  d}W n tk
r,   d}Y nX g }ddgdfddgdfd	gd
fd	dgdfdgd
fddgdfdgdfdgdfdgdfdgdff
D ]\}}d }dd |D }tjdkrt sd}nD|rdd|}n.|dkrt	j
drd}nd|kr|sd}g }|r0|tjjd| d| d  n,|dr\tjd!kr\|tjjd"d  tj||d#}|| q|S )$Nr   )QtGuiTFcairoZgiZgtk3aggZ	gtk3cairoZPyQt5Zqt5agg	cairocffiZqt5cairoZPySide2tkintertkaggwxZwxaggzmatplotlib.backends._macosxmacosxc                 S   s   g | ]}t j|s|qS  )	importlibutil	find_spec).0depr
   r
   N/tmp/pip-unpacked-wheel-wjyw_3jo/matplotlib/tests/test_backends_interactive.py
<listcomp>+   s      z6_get_testable_interactive_backends.<locals>.<listcomp>linuxz'$DISPLAY and $WAYLAND_DISPLAY are unsetz{} cannot be importedz, TF_BUILDzmacosx backend fails on Azureqt5zno usable Qt5 bindingsz	Skipping z	 because reasondarwinzgithub #16849)marks)Zmatplotlib.backends.qt_compatr   ImportErrorsysplatformr   Zdisplay_is_validformatjoinosenvirongetappendpytestmarkskip
startswithxfailparam)r   Zhave_qt5backendsdepsbackendr   missingr   r
   r
   r   "_get_testable_interactive_backends   sN    







r,   
   c               	      s  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r|||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| |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 )"Nr   )TestCasepyplotrcParams)FigureCanvasBaseF   zwebagg.open_in_browserzwebagg.port_retries   r*   Zagg)Zgtk3Zwebr   Tforcec                    s2   j | dd  } t|jjd|  d S )NTr6   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   svgr8      g      ?qZ
draw_eventc                    s      S )N)start)event)timerr
   r   <lambda>       z(_test_interactive_impl.<locals>.<lambda>close_eventZpng)r         ?r   r   )*importlib.utiliojsonr   Zunittestr.   
matplotlibr0   r1   Zmatplotlib.backend_basesr2   updatelenargvloadslowerassertEqualassertRaisesendswithr%   r:   r   r9   r   r   subplotsr;   r<   r=   r   plotZ	new_timerZadd_callbackZkey_press_eventmpl_connectprintBytesIOZsavefigshowpauser   getvalue)r   rO   rP   r   r.   r1   r2   r*   Zassert_raisesrB   r>   axresultZresult_afterr
   )r?   r@   rA   rI   r   _test_interactive_implK   sZ    



rd   r*   toolbarZtoolbar2toolmanagerrE   )Zrerunsc                 C   s   | dkr|dkrt d tjtjdttd t	
d|igtj| ddttjd	d
}|jrtt d|j d |jddkstd S )Nr	   rf   z*toolmanager is not implemented for macosx.-c
_test_interactive_impl()re   0Z
MPLBACKENDSOURCE_DATE_EPOCHT)envtimeoutstdoutuniversal_newlines2The subprocess returned with non-zero exit status .
CloseEventr3   )r"   r$   
subprocessrunr   
executableinspect	getsourcerd   rP   dumpsr   r   _test_timeoutPIPE
returncodefailrn   countAssertionError)r*   re   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r`||
|j	d  | \}}|d |  |jdd	d
g}|  |jdt |  |jj}|d |  |  |j  d S )Nr   )ThreadPoolExecutorr/   Fr3   r4   r5   rM   rE      rL   )concurrent.futuresr   rP   r   rQ   r0   r1   rR   rS   rT   rU   rZ   r`   Zsubmitr[   rc   r<   r\   r]   ZdrawcloseZflush_events)r   rP   r   rA   r1   r>   rb   futurer
   r
   r   _test_thread_impl   s(    

r   r   )raisesr   r	   T)r   strictc                 C   sN   t jtjdttd gtj| ddt	dt j
dd}|jddksJtd S )	Nrg   z
_test_thread_impl()ri   rj   T)rl   rm   checkrn   ro   rr   r3   )rs   rt   r   ru   rv   rw   r   r   r   ry   rz   rn   r}   r~   )r*   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t	j
dddd} dtjd	 tjd
 }t t }z(|  }|d kspttj|}W qW qZ tjjk
r   t |krt d nY qZY qZX qZ|  | tj | jtddkstd S )NZtornadorg   rh   Zwebaggri   rj   )rl   zhttp://{}:{}zwebagg.addresszwebagg.portz'Failed to connect to the webagg server.)rm   r   )r"   Zimportorskiprs   Popenr   ru   rv   rw   rd   r   r   r   r@   r1   timeperf_counterry   pollr~   urllibrequesturlopenerrorURLErrorr|   r   send_signalsignalSIGINTwait)r   urlrm   retcodeconnr
   r
   r   test_webagg   s4    
 r   r   zthis a linux-only testZQt5Agg)Zskip_on_importerrorc                  C   s4   d} t tjd| g}|jr0td|j d 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)

rg   rp   rq   )rs   rt   r   ru   r{   r"   r|   )Ztest_scriptr   r
   r
   r   test_lazy_linux_headless  s    r   )'r   rN   rv   rP   r   r   rs   r   r   urllib.requestr   r"   rQ   r@   r   r,   ry   rd   r#   ZparametrizeZflakyr   r   Z_thread_safe_backendsr'   valuesr*   r   r!   r&   CalledProcessErrorTimeoutExpiredr   Zskipifr   namer   r   r   r
   r
   r
   r   <module>   s\   +
R


