o
    :aR                     @   sJ  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yc   ejd	ZY nw 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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/g d7d8fd9g dfd:g d;fd:d-gd<fgg d=d>ej#d?ej*d%ejjd%ddd@ej*dejjdddd@gdAdB Z+ejjddddCdD Z,ejjddddEdF Z-ejjddddGdH Z.ejjddddIdJ Z/ejjddddKdL Z0ejjddddMdN Z1ejjd%dddOdP Z2dQdR Z3dSdT Z4ej#dUe4 dVdW Z5dS )X    N)datedatetime)mock)pyplot)Gcf)_c_internal_utils)QtGui	QtWidgets)_formlayoutzNo usable Qt bindings<   c                 C   s$   | j dj\}td}|j}|S )Nbackendzmatplotlib.backends.qt_compat)ZnodeZget_closest_markerargspytestZimportorskipQtCore)Zrequestr   Z	qt_compatr    r   B/usr/lib/python3/dist-packages/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sJ d S N)	copyr   Zfigspltfigurecanvasmanagerwindowclose)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                    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win32ZcreationflagsZAgg0)
MPLBACKENDSOURCE_DATE_EPOCHT)envstdoutuniversal_newlines)	sysplatform
subprocessZCREATE_NEW_CONSOLEsuper__init__osenvironPIPE)selfr   kwargs	__class__r   r   r)   >   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_forG   s   
zWaitForStringPopen.wait_for)__name__
__module____qualname____doc__r)   r9   __classcell__r   r   r/   r   r   9   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
|di | W d S  tya   td
dd Y d S w )Nr   r   c                     s@   j dkrdd l} | dd d S dd l}   |j d S )Nr   r   )r&   win32apiZGenerateConsoleCtrlEventsignalkillgetpidSIGINT)r@   rA   )r*   r%   r   r   
interupter]   s
   
z%_test_sigint_impl.<locals>.interupterr2   
draw_eventc                  W      t dddS NDRAWTflushprintr   r   r   r   <lambda>j       z#_test_sigint_impl.<locals>.<lambda>c                     s      S r   startrN   timerr   r   rO   n   s    SUCCESSTrJ   r   )r%   matplotlib.pyplotr   r*   	threadingswitch_backendmatplotlib.backends.qt_compatr   getattrZTimerr   r   mpl_connectKeyboardInterruptrM   )	r   target_namer.   r   rW   r   rE   targetr   r   )r*   r%   rT   r   _test_sigint_implT   s.   


r_   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   |  |	 \}} t| d|v sCJ d S )N-cz
_test_sigint_impl(, )rI   timeoutrU   )r   get_backendr   r%   
executableinspect	getsourcer_   r9   communicate_test_timeoutrB   rM   r^   r.   r   procr#   _r   r   r   test_sigintv   s"   
rs   c           
         s   dd l }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
|di | W d S  tyd   tddd
 Y d S w )Nr   r?   rF   c                  W   rG   rH   rL   rN   r   r   r   rO      rP   z7_test_other_signal_before_sigint_impl.<locals>.<lambda>r2   )rc   TSIGUSR1rJ   c                    s       d S r   rQ   ZsignumframerS   r   r   custom_signal_handler   s   zD_test_other_signal_before_sigint_impl.<locals>.custom_signal_handlerrU   r   )rA   r%   rV   r   rX   rY   r   rZ   r   r   r[   Z	new_timerZsingle_shotZadd_callbackrM   rt   r\   )
r   r]   r.   rA   r%   r   r   r^   r   rw   r   rS   r   %_test_other_signal_before_sigint_impl   s(   

rx   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}z$|d t	
|jtj |d t	
|jtj |jtd\}}W n   |
  | \}} t| d|v sXJ t   d S )	Nre   z'
_test_other_signal_before_sigint_impl(rf   rg   rI   rt   rh   rU   )r   rj   r   r%   rk   rl   rm   rx   r9   r*   rB   pidrA   rt   rD   rn   ro   rM   r   rp   r   r   r   test_other_signal_before_sigint   s6   

r|   ZQt5Aggc              
      s   ddl m} t  d   fdd}jd| ttj}dd }ttj| zLt	j
jj   |ks9J ttj|ksCJ tjtjfD ]$}jd| ttj| |   |kscJ ttj|ksmJ qIW ttj| d S ttj| w )Nr   )_BackendQT5c                      s   t t j j  d S r   )rA   	getsignalrD   ZQCoreApplicationexitr   Zevent_loop_handlerr   r   r   fire_signal_and_quit   s   z6test_fig_sigint_override.<locals>.fire_signal_and_quitc                 S      d S r   r   ru   r   r   r   custom_handler   s   z0test_fig_sigint_override.<locals>.custom_handler)Zmatplotlib.backends.backend_qt5r}   r   r   ZQTimerZ
singleShotrA   r~   rD   
matplotlibZbackendsZ
backend_qtZ
_BackendQTZmainloopSIG_DFLSIG_IGN)r   r}   r   Z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)r   r   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_keyr   Zbackspace_mod)Zidsr   )marksc           	         s   ddl m m tjdkr#|dur#|dd}|dd}|dd}d d	j|D ]}t d	|O q,G  fd
dd}fdd}t	 j
}|d| ||  |ksaJ 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                       s0   e Zd Zdd Z fddZfddZdS )z test_correct_key.<locals>._Eventc                 S   s   dS )NFr   r-   r   r   r   isAutoRepeatD      z-test_correct_key.<locals>._Event.isAutoRepeatc                    s   t  dS )NQtCore.Qt.KeyrZ   r   )r   r   qt_keyr   r   keyE  s    z$test_correct_key.<locals>._Event.keyc                    s    S r   r   r   )qt_modr   r   	modifiersF  r   z*test_correct_key.<locals>._Event.modifiersN)r:   r;   r<   r   r   r   r   )r   r   r   r   r   r   _EventC  s    r   c                    s
   | j  d S r   )r   )Zevent)resultr   r   on_key_pressH  s   
z&test_correct_key.<locals>.on_key_pressZkey_press_event)rY   r   r   r%   r&   replaceZ
NoModifierrZ   r   r   r   r[   ZkeyPressEvent)	r   r   r   Zqt_modsZanswer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=J jjd	ksEJ jjd
ksMJ | dksUJ | dks]J  dkseJ | dk soJ |d |jdkszJ jjdksJ jjdksJ | dksJ | dksJ  dksJ | dk sJ |d |jdksJ jjdksJ jjdksJ | dksJ | dksJ  dksJ | dk sJ W d   dS 1 sw   Y  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sJ d S )N`   )return_valueZlogicalDotsPerInchChangedemitdrawZflush_eventsZdevice_pixel_ratio)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   r`   r   sizer   ZwindowHandler   r   ZrendererwidthheightZget_width_heightZget_size_inchesall)Zpropr   r   r   r   r   r   test_device_pixel_ratio_changeR  sF   
"r   c                  C   sP   t  \} }tddd  | jjj  W d    d S 1 s!w   Y  d S )N#matplotlib.backends.qt_compat._execc                 S   r   r   r   objr   r   r   rO     r   z"test_subplottool.<locals>.<lambda>)r   subplotsr   r   r   r   toolbarZconfigure_subplotsr   axr   r   r   test_subplottool  s   "r   c                  C   s   t  \} }|ddg |dgg |jtdtdtdd tddd  | jj	j
  W d    d S 1 s=w   Y  d S )Nr2   r   r   )r8   r   c                 S   r   r   r   r   r   r   r   rO     r   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   sx   t  \} }tddddtddddg}||| tddd  | jjj	  W d    d S 1 s5w   Y  d S )N  r2   ZyearZmonthZdayr   r   c                 S   r   r   r   r   r   r   r   rO     r   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s(J | j
 |tj	d  ks6J | }|
 }| || | |ksLJ |
 |ksTJ d S )N)r   r   z
figure.dpi)r   r   r   r   r   r   Zset_size_inchesr   r   ZrcParamsr   )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|_ s"J d S )Nr   )FigureCanvasQTAggFc                    s   | j   d d S )NT)r   Z	draw_idle)r   staleZ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   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s:J d S )	Nr   )_create_qAppzDatetime fieldr   r      r   z
Date field)Zmatplotlib.backends.backend_qtr   r   r   r
   Z
FormWidgetZsetupget)r   ZformZwidgetvaluesr   r   r   2test_form_widget_get_with_datetime_and_date_fields  s   
r   c            	         sp  dd l } ddlm mm} ddlm}m}  dj  dj	  dj
  dj dD ]	}t d| q, dj  dj  fdd	g d
ddddddddddddddddddd| jdkrudnd fd!| jdkrd"ndfd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2R 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   r   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_TabZtab)r   r   )Z
Key_Returnenter)Z	Key_Enterr   )Z
Key_Insertinsert)Z
Key_Deletedelete)Z	Key_Pauserb   )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   ?      ZSizeAllCursorZPointingHandCursorZArrowCursorZCrossCursorZ
WaitCursorc                    s    i | ]\}}t  d ||qS )zQtCore.Qt.MouseButtonr   r   r   r   r   r   J  r   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%   rY   r   r   r   Zmatplotlib.backend_basesr   r   Z
Acceptabler   r   ZApplyrZ   ZFormat_ARGB32_Premultipliedr&   ZMOVEZHANDZPOINTERZSELECT_REGIONZWAITZLEFTZRIGHTZMIDDLEZBACKZFORWARDZWA_OpaquePaintEventZStrongFocusZTopToolBarAreaZ
AlignRightZAlignVCenterZ	ExpandingZIgnoredZMaskOutColor)	r%   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 ]S\}}d }dd |D }t jdkr"t s"d}n|r-dd|}n|d	 d
kr;tjdr;d}g }|rO|	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   Zdepr   r   r   r   m  s    Zlinuxz'$DISPLAY and $WAYLAND_DISPLAY are unsetz{} cannot be importedrf   r    ZmacosxZTF_BUILDzmacosx backend fails on Azurez	Skipping z	 because ry   )r   id)r%   r&   r   Zdisplay_is_validformatjoinr*   r+   r   appendr   markskipparamstr)ZenvsZdepsr"   rz   missingr   r   r   r   _get_testable_qt_backendsf  s*   

r  r"   c                 C   s@   t jtjdttd gi tjddi| t	dt j
dd}d S )Nre   z
_test_enums_impl()r!   r   T)r"   ri   checkr#   r$   )r'   runr%   rk   rl   rm   r   r*   r+   ro   r,   )r"   rq   r   r   r   test_enums_available}  s   
r  )6r   r   rl   r*   rA   r'   r%   r   r   Zunittestr   r   r   r   r   Zmatplotlib._pylab_helpersr   r   rY   r   r	   Zmatplotlib.backends.qt_editorr
   ImportErrorr  r  Z
pytestmarkro   Zfixturer   r   r   Popenr   r_   Zparametrizers   rx   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