U
    FvfS                     @   sd  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m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 z d dlmZmZ d dlmZ W n  ek
r   ejd	ZY nX d
Zejdd Zejjddddd ZG dd dej Z!dd Z"ejjdddej#ddddifdddifgdd Z$dd Z%ejj&ej'd kd!d"ejjdddej#ddddifdddifgd#d$ Z(ejjd%ddd&d' Z)ejj#d(d)d*gd+fd)g d,fd)d-gd.fd/d*gd0fd/g d1fd2d3gd4fd5d-gd6fd/d-d3d7gd8fd9g dfd:g d;fd:d-gd<fgd=d>d?d@dAdBdCdDdEd;dFgdGej#dHej*d%ejjd%dddIej*dejjddddIgdJdK Z+ejjddddLdM Z,ejjddddNdO Z-ejjddddPdQ Z.ejjddddRdS Z/ejjddddTdU Z0ejjddddVdW Z1ejjd%dddXdY Z2dZd[ Z3d\d] Z4ej#d^e4 d_d` Z5dS )a    N)datedatetime)mock)pyplot)Gcf)_c_internal_utils)QtGui	QtWidgets)_formlayoutzNo usable Qt bindings<   c                 C   s   t d}|j}|S )Nzmatplotlib.backends.qt_compat)pytestZimportorskipQtCore)requestZ	qt_compatr    r   D/tmp/pip-unpacked-wheel-7vhvci0g/matplotlib/tests/test_backend_qt.pyqt_core   s    
r   ZQtAggT)Zskip_on_importerrorc                  C   s4   t  tj} t }|jjj  | tjks0t	d S N)
copyr   ZfigspltfigurecanvasmanagerwindowcloseAssertionError)Z	init_figsfigr   r   r   test_fig_close&   s    r   c                       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                    s@   t jdkrtj|d< t j||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__r   r   r*   =   s    

  zWaitForStringPopen.__init__c                 C   s>   d}| j d}|s"td|||7 }||rdS qdS )z%Read until the terminator is reached.    z)Subprocess died before emitting expected N)r$   readRuntimeErrorendswith)r.   
terminatorbufcr   r   r   wait_forF   s    
zWaitForStringPopen.wait_for)__name__
__module____qualname____doc__r*   r;   __classcell__r   r   r1   r   r   8   s   	r   c           	         s   dd l dd lm} dd l dd l}||  ddlm}  fdd}t||}|	d||
 }|jddd  |jdfd	d z|f | W n  tk
r   td
dd Y nX d S )Nr   r   c                     s>   j dkr dd l} | dd ndd l}   |j d S )Nr   r   )r'   win32apiZGenerateConsoleCtrlEventsignalkillgetpidSIGINT)rB   rC   )r+   r&   r   r   interrupter\   s
    
z&_test_sigint_impl.<locals>.interrupterr4   
draw_eventc                  W   s   t dddS NDRAWTflushprintr/   r   r   r   <lambda>i       z#_test_sigint_impl.<locals>.<lambda>c                     s      S r   startrO   timerr   r   rP   m   rQ   SUCCESSTrK   )r&   matplotlib.pyplotr   r+   	threadingswitch_backendmatplotlib.backends.qt_compatr   getattrTimerr   r   mpl_connectKeyboardInterruptrN   )	backendtarget_namer0   r   rX   r   rG   targetr   r   )r+   r&   rU   r   _test_sigint_implS   s,    


rb   ztarget, kwargsshowblockpauseinterval
   c                 C   s   t  }ttjdttd|d| d|d g}z|d |j	t
d\}}W n"   |  |	 \}} Y nX t| d|kstd S )N-cz
_test_sigint_impl(, )rJ   timeoutrV   )r   get_backendr   r&   
executableinspect	getsourcerb   r;   communicate_test_timeoutrD   rN   r   ra   r0   r_   procr$   _r   r   r   test_sigintu   s"    
rv   c           	         s   dd l }dd lm} ||  ddlm} t||}| }|j	ddd  |jj
dd d _ jtd	dd
  fdd}| |j| z|f | W n  tk
r   tddd
 Y nX d S )Nr   rA   rH   c                  W   s   t dddS rI   rM   rO   r   r   r   rP      rQ   z7_test_other_signal_before_sigint_impl.<locals>.<lambda>r4   )rf   TSIGUSR1rK   c                    s       d S r   rR   signumframerT   r   r   custom_signal_handler   s    zD_test_other_signal_before_sigint_impl.<locals>.custom_signal_handlerrV   )rC   rW   r   rY   rZ   r   r[   r   r   r]   Z	new_timerZsingle_shotZadd_callbackrN   rw   r^   )	r_   r`   r0   rC   r   r   ra   r   r{   r   rT   r   %_test_other_signal_before_sigint_impl   s$    

r|   r   z,No other signal available to send on Windowsreasonc                 C   s   t  }ttjdttd|d| d|d g}zH|d t	
|jtj |d t	
|jtj |jtd\}}W n"   |
  | \}} Y nX t| d|kstt   d S )	Nrh   z'
_test_other_signal_before_sigint_impl(ri   rj   rJ   rw   rk   rV   )r   rm   r   r&   rn   ro   rp   r|   r;   r+   rD   pidrC   rw   rF   rq   rr   rN   r   r   rs   r   r   r   test_other_signal_before_sigint   s*    

r   ZQt5Aggc              
      s   ddl m} t  d   fdd}jd| ttj}dd }ttj| zt	j
jj   |ksrtttj|ksttjtjfD ]H}jd| ttj| |   |kstttj|kstqW 5 ttj| X d S )Nr   )_BackendQT5c                      s   t t j j  d S r   )rC   	getsignalrF   ZQCoreApplicationexitr   Zevent_loop_handlerr   r   r   fire_signal_and_quit   s    z6test_fig_sigint_override.<locals>.fire_signal_and_quitc                 S   s   d S r   r   rx   r   r   r   custom_handler   s    z0test_fig_sigint_override.<locals>.custom_handler)Zmatplotlib.backends.backend_qt5r   r   r   ZQTimerZ
singleShotrC   r   rF   
matplotlibbackendsZ
backend_qtZ
_BackendQTZmainloopr   SIG_DFLSIG_IGN)r   r   r   original_handlerr   r   r   r   test_fig_sigint_override   s&    	r   zqt_key, qt_mods, answerZKey_AShiftModifierAaControlModifierzctrl+aZ
Key_Aacute   Á   áKey_ControlAltModifierzalt+controlKey_Altzctrl+altMetaModifieru   ctrl+alt+meta+áZKey_PlayKey_Backspace	backspacezctrl+backspaceshiftlowercontrolZunicode_upperZunicode_lowerZalt_controlZcontrol_altZmodifier_orderZnon_unicode_keyZbackspace_mod)idsr_   )marksc           
         s   ddl m m tjdkrF|dk	rF|dd}|dd}|dd}d d	j|D ]}t d	|O qXG  fd
dd}|t	j
dfdd fdd}t j}	|	d| |	|  |kstdS )z
    Make a figure.
    Send a key_press_event event (using non-public, qtX backend specific api).
    Catch the event.
    Assert sent and caught keys are the same.
    r   _enum_to_intdarwinNZctrlcmdr   metaQtCore.Qt.KeyboardModifierc                       s$   e Zd Zdd Z fddZdS )z test_correct_key.<locals>._Eventc                 S   s   dS )NFr   r.   r   r   r   isAutoRepeatB  rQ   z-test_correct_key.<locals>._Event.isAutoRepeatc                    s   t  dS )NQtCore.Qt.Keyr[   r   r   r   qt_keyr   r   keyC  rQ   z$test_correct_key.<locals>._Event.keyN)r<   r=   r>   r   r   r   r   r   r   _EventA  s   r   ZkeyboardModifiersc                    s    S r   r   r   )qt_modr   r   rP   F  rQ   z"test_correct_key.<locals>.<lambda>c                    s
   | j  d S r   )r   )event)resultr   r   on_key_pressH  s    z&test_correct_key.<locals>.on_key_pressZkey_press_event)rZ   r   r   r&   r'   replaceZ
NoModifierr[   setattrr	   ZQApplicationr   r   r   r]   ZkeyPressEventr   )
r_   r   r   Zqt_modsZanswerZmonkeypatchmodr   r   	qt_canvasr   )r   r   r   r   r   r   test_correct_key   s$    ;



r   c               	      s  d} t |  d _tjddd}|j   fdd}j   }	 
  |d |jdks|tjjd	kstjjd
kst| dkst| dkst dkst| dk st|d |jdkstjjdkstjjdkst| dks,t| dks>t dksPt| dk sft|d |jdks~tjjdkstjjdkst| dkst| dkst dkst| dk stW 5 Q R X dS )z}
    Make sure that if the pixel ratio changes, the figure dpi changes but the
    widget remains the same logical size.
    z?matplotlib.backends.backend_qt.FigureCanvasQT.devicePixelRatioF   )      x   )Zfigsizedpic                    s4   |  _ jd     j| ks0td S )N`   )return_valueZlogicalDotsPerInchChangedemitdrawZflush_eventsZdevice_pixel_ratior   )Zratiopr   screenr   r   set_device_pixel_ratioa  s
    z>test_device_pixel_ratio_change.<locals>.set_device_pixel_ratioih  i  i  X     )r   r   r   i  i  g      ?   i  N)r   patchr   r   r   r   rc   r   sizer   ZwindowHandler   r   r   ZrendererwidthheightZget_width_heightZget_size_inchesall)propr   r   r   r   r   r   test_device_pixel_ratio_changeR  sD    
r   c               	   C   s:   t  \} }tddd  | jjj  W 5 Q R X d S )N#matplotlib.backends.qt_compat._execc                 S   s   d S r   r   objr   r   r   rP     rQ   z"test_subplottool.<locals>.<lambda>)r   subplotsr   r   r   r   toolbarZconfigure_subplotsr   axr   r   r   test_subplottool  s    r   c               	   C   sr   t  \} }|ddg |dgg |jtdtdtdd tddd  | jj	j
  W 5 Q R X d S )Nr4   r   r   )r:   r   c                 S   s   d S r   r   r   r   r   r   rP     rQ   z$test_figureoptions.<locals>.<lambda>)r   r   plotZimshowZscatterranger   r   r   r   r   edit_parametersr   r   r   r   test_figureoptions  s    r   c               	   C   sb   t  \} }tddddtddddg}||| tddd  | jjj	  W 5 Q R X d S )N  r4   yearmonthdayr   r   c                 S   s   d S r   r   r   r   r   r   rP     rQ   z7test_figureoptions_with_datetime_axes.<locals>.<lambda>)
r   r   r   r   r   r   r   r   r   r   )r   r   Zxydatar   r   r   %test_figureoptions_with_datetime_axes  s    r   c                  C   s   t  \} }| j  | jjj}d\}}| || | j |tj	d  ksPt
| j |tj	d  kslt
| }| }| || | |kst
| |kst
d S )N)r   r   z
figure.dpi)r   r   r   r   r   r   Zset_size_inchesr   r   ZrcParamsr   r   )r   r   r   whZ	old_widthZ
old_heightr   r   r   test_double_resize  s    

r   c                     sH   ddl m}  d  fdd}t \}}||_| |}d|_ sDtd S )Nr   )FigureCanvasQTAggFc                    s   | j   d d S )NT)r   Z	draw_idle)r   stalecalledr   r   crashing_callback  s    
z-test_canvas_reinit.<locals>.crashing_callbackT)Z!matplotlib.backends.backend_qtaggr   r   r   Zstale_callbackr   r   )r   r   r   r   r   r   r   r   test_canvas_reinit  s    r   c                  C   sx   ddl m}  |   dtddddfdtddddfg}t|}|  | }|tddddtddddgksttd S )	Nr   )_create_qAppzDatetime fieldr   r      r   z
Date field)	Zmatplotlib.backends.backend_qtr   r   r   r
   Z
FormWidgetsetupgetr   )r   formZwidgetvaluesr   r   r   2test_form_widget_get_with_datetime_and_date_fields  s    
r   c               &      s   dd l } ddlm m ddlm}m}  dj  dj  dj	  dj
 dD ]}t d| qT dj  dj  fdd	d
ddddddddddddddddddd| jdkrdnd fd!| jdkrd"ndfd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2f%D } fd3d4d5D } fd6d	|jd7f|jd8f|jd9f|jd:f|jd;ffD } fd<d	d=|jfd>|jfd?|jfd@|jfdA|jffD } dBj  dCj  dDj  dDj  dEj  dEj  dFj  dFj  dGj  dDj  dDj  dEj  dEj  dFj  dFj d S )HNr   r   )cursorsMouseButtonzQtGui.QDoubleValidator.Statez)QtWidgets.QDialogButtonBox.StandardButton)OkCancelzQtGui.QImage.Formatc                    s$   i | ]\}}t  d ||qS )r   r   .0kvr   r   r   
<dictcomp>  s    z$_test_enums_impl.<locals>.<dictcomp>)Z
Key_Escapeescape)ZKey_Tabtab)r   r   )Z
Key_Returnenter)Z	Key_Enterr   )Z
Key_Insertinsert)Z
Key_Deletedelete)Z	Key_Pausere   )Z
Key_SysReqZsysreq)Z	Key_Clearclear)ZKey_Homehome)ZKey_Endend)ZKey_Leftleft)ZKey_UpZup)Z	Key_Rightright)ZKey_DownZdown)Z
Key_PageUpZpageup)ZKey_PageDownZpagedown)	Key_Shiftr   r   r   r   r   Key_Metar   )r   Zalt)ZKey_CapsLockZ	caps_lock)ZKey_F1f1)ZKey_F2f2)ZKey_F3Zf3)ZKey_F4Zf4)ZKey_F5Zf5)ZKey_F6Zf6)ZKey_F7Zf7)ZKey_F8Zf8)ZKey_F9Zf9)Key_F10Zf10)r  Zf11)ZKey_F12Zf12)ZKey_Super_Lr)   )ZKey_Super_Rr)   c                    s4   g | ],\}}t  d |t  d|fqS )r   r   r   )r   r   r   r   r   r   
<listcomp>3  s   z$_test_enums_impl.<locals>.<listcomp>))r   r   )r   r   )r   r  )r   r  c                    s    i | ]\}}|t  d |qS )zQtCore.Qt.CursorShaper   r   r   r   r   r   ?  s    ZSizeAllCursorZPointingHandCursorZArrowCursorZCrossCursorZ
WaitCursorc                    s    i | ]\}}t  d ||qS )zQtCore.Qt.MouseButtonr   r   r  r   r   r   J  s    Z
LeftButtonZRightButtonZMiddleButtonZXButton1ZXButton2zQtCore.Qt.WidgetAttributezQtCore.Qt.FocusPolicyzQtCore.Qt.ToolBarAreazQtCore.Qt.AlignmentFlagzQtWidgets.QSizePolicy.PolicyzQtCore.Qt.MaskMode) r&   rZ   r   r   Zmatplotlib.backend_basesr   r   Z
Acceptabler   r   ZApplyr[   ZFormat_ARGB32_Premultipliedr'   ZMOVEZHANDPOINTERZSELECT_REGIONZWAITLEFTRIGHTZMIDDLEBACKFORWARDZWA_OpaquePaintEventZStrongFocusZTopToolBarAreaZ
AlignRightZAlignVCenterZ	ExpandingZIgnoredZMaskOutColor)r&   r   r   Zbtn_typeZSPECIAL_KEYSZ_MODIFIER_KEYSZcursordZbuttondr   r   r   _test_enums_impl  s    





.















r  c                  C   s   g } dd dD D ]\}}d }dd |D }t jdkrDt sDd}n2|rZdd|}n|d	 d
krvtjdrvd}g }|r|	t
jjd| d| d | 	t
j||t|d q| S )Nc                 S   s   g | ]}|gd |dfqS )Zqtagg)r!   ZQT_APIr   )r   Zqt_apir   r   r   r  h  s   z-_get_testable_qt_backends.<locals>.<listcomp>)ZPyQt6ZPySide6ZPyQt5ZPySide2c                 S   s   g | ]}t j|s|qS r   )	importlibutil	find_spec)r   depr   r   r   r  m  s      linuxz'$DISPLAY and $WAYLAND_DISPLAY are unsetz{} cannot be importedri   r!   macosxZTF_BUILDzmacosx backend fails on Azurez	Skipping z	 because r}   )r   id)r&   r'   r   Zdisplay_is_validformatjoinr+   r,   r   appendr   markskipparamstr)Zenvsdepsr#   r~   missingr   r   r   r   _get_testable_qt_backendsf  s*    

r  r#   c                 C   s:   t jtjdttd gtjddi| t	dt j
dd}d S )Nrh   z
_test_enums_impl()r"   r    T)r#   rl   checkr$   r%   )r(   runr&   rn   ro   rp   r  r+   r,   rr   r-   )r#   rt   r   r   r   test_enums_available}  s      r"  )6r   r  ro   r+   rC   r(   r&   r   r   Zunittestr   r   r   r   r   Zmatplotlib._pylab_helpersr   r   rZ   r   r	   Zmatplotlib.backends.qt_editorr
   ImportErrorr  r  Z
pytestmarkrr   Zfixturer   r_   r   Popenr   rb   Zparametrizerv   r|   Zskipifr'   r   r   r  r   r   r   r   r   r   r   r   r  r  r"  r   r   r   r   <module>   s   

"




8



+	#
H

	



s