You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
"""
 | 
						|
========================
 | 
						|
Widget testing utilities
 | 
						|
========================
 | 
						|
 | 
						|
See also :mod:`matplotlib.tests.test_widgets`.
 | 
						|
"""
 | 
						|
 | 
						|
from unittest import mock
 | 
						|
 | 
						|
import matplotlib.pyplot as plt
 | 
						|
 | 
						|
 | 
						|
def get_ax():
 | 
						|
    """Create a plot and return its Axes."""
 | 
						|
    fig, ax = plt.subplots(1, 1)
 | 
						|
    ax.plot([0, 200], [0, 200])
 | 
						|
    ax.set_aspect(1.0)
 | 
						|
    fig.canvas.draw()
 | 
						|
    return ax
 | 
						|
 | 
						|
 | 
						|
def noop(*args, **kwargs):
 | 
						|
    pass
 | 
						|
 | 
						|
 | 
						|
def mock_event(ax, button=1, xdata=0, ydata=0, key=None, step=1):
 | 
						|
    r"""
 | 
						|
    Create a mock event that can stand in for `.Event` and its subclasses.
 | 
						|
 | 
						|
    This event is intended to be used in tests where it can be passed into
 | 
						|
    event handling functions.
 | 
						|
 | 
						|
    Parameters
 | 
						|
    ----------
 | 
						|
    ax : `~matplotlib.axes.Axes`
 | 
						|
        The Axes the event will be in.
 | 
						|
    xdata : float
 | 
						|
        x coord of mouse in data coords.
 | 
						|
    ydata : float
 | 
						|
        y coord of mouse in data coords.
 | 
						|
    button : None or `MouseButton` or {'up', 'down'}
 | 
						|
        The mouse button pressed in this event (see also `.MouseEvent`).
 | 
						|
    key : None or str
 | 
						|
        The key pressed when the mouse event triggered (see also `.KeyEvent`).
 | 
						|
    step : int
 | 
						|
        Number of scroll steps (positive for 'up', negative for 'down').
 | 
						|
 | 
						|
    Returns
 | 
						|
    -------
 | 
						|
    event
 | 
						|
        A `.Event`\-like Mock instance.
 | 
						|
    """
 | 
						|
    event = mock.Mock()
 | 
						|
    event.button = button
 | 
						|
    event.x, event.y = ax.transData.transform([(xdata, ydata),
 | 
						|
                                               (xdata, ydata)])[0]
 | 
						|
    event.xdata, event.ydata = xdata, ydata
 | 
						|
    event.inaxes = ax
 | 
						|
    event.canvas = ax.get_figure(root=True).canvas
 | 
						|
    event.key = key
 | 
						|
    event.step = step
 | 
						|
    event.guiEvent = None
 | 
						|
    event.name = 'Custom'
 | 
						|
    return event
 | 
						|
 | 
						|
 | 
						|
def do_event(tool, etype, button=1, xdata=0, ydata=0, key=None, step=1):
 | 
						|
    """
 | 
						|
    Trigger an event on the given tool.
 | 
						|
 | 
						|
    Parameters
 | 
						|
    ----------
 | 
						|
    tool : matplotlib.widgets.AxesWidget
 | 
						|
    etype : str
 | 
						|
        The event to trigger.
 | 
						|
    xdata : float
 | 
						|
        x coord of mouse in data coords.
 | 
						|
    ydata : float
 | 
						|
        y coord of mouse in data coords.
 | 
						|
    button : None or `MouseButton` or {'up', 'down'}
 | 
						|
        The mouse button pressed in this event (see also `.MouseEvent`).
 | 
						|
    key : None or str
 | 
						|
        The key pressed when the mouse event triggered (see also `.KeyEvent`).
 | 
						|
    step : int
 | 
						|
        Number of scroll steps (positive for 'up', negative for 'down').
 | 
						|
    """
 | 
						|
    event = mock_event(tool.ax, button, xdata, ydata, key, step)
 | 
						|
    func = getattr(tool, etype)
 | 
						|
    func(event)
 | 
						|
 | 
						|
 | 
						|
def click_and_drag(tool, start, end, key=None):
 | 
						|
    """
 | 
						|
    Helper to simulate a mouse drag operation.
 | 
						|
 | 
						|
    Parameters
 | 
						|
    ----------
 | 
						|
    tool : `~matplotlib.widgets.Widget`
 | 
						|
    start : [float, float]
 | 
						|
        Starting point in data coordinates.
 | 
						|
    end : [float, float]
 | 
						|
        End point in data coordinates.
 | 
						|
    key : None or str
 | 
						|
         An optional key that is pressed during the whole operation
 | 
						|
         (see also `.KeyEvent`).
 | 
						|
    """
 | 
						|
    if key is not None:
 | 
						|
        # Press key
 | 
						|
        do_event(tool, 'on_key_press', xdata=start[0], ydata=start[1],
 | 
						|
                 button=1, key=key)
 | 
						|
    # Click, move, and release mouse
 | 
						|
    do_event(tool, 'press', xdata=start[0], ydata=start[1], button=1)
 | 
						|
    do_event(tool, 'onmove', xdata=end[0], ydata=end[1], button=1)
 | 
						|
    do_event(tool, 'release', xdata=end[0], ydata=end[1], button=1)
 | 
						|
    if key is not None:
 | 
						|
        # Release key
 | 
						|
        do_event(tool, 'on_key_release', xdata=end[0], ydata=end[1],
 | 
						|
                 button=1, key=key)
 |