"""
========================
Widget testing utilities
========================
Functions that are useful for testing widgets.
See also matplotlib.tests.test_widgets
"""
import matplotlib.pyplot as plt
from unittest import mock


def get_ax():
    """Creates plot and returns its axes"""
    fig, ax = plt.subplots(1, 1)
    ax.plot([0, 200], [0, 200])
    ax.set_aspect(1.0)
    ax.figure.canvas.draw()
    return ax


def do_event(tool, etype, button=1, xdata=0, ydata=0, key=None, step=1):
    """
    Trigger an event

    Parameters
    ----------
    tool : matplotlib.widgets.RectangleSelector
    etype
        the event to trigger
    xdata : int
        x coord of mouse in data coords
    ydata : int
        y coord of mouse in data coords
    button : int or str
        button pressed None, 1, 2, 3, 'up', 'down' (up and down are used
        for scroll events)
    key
        the key depressed when the mouse event triggered (see
        :class:`KeyEvent`)
    step : int
        number of scroll steps (positive for 'up', negative for 'down')
    """
    event = mock.Mock()
    event.button = button
    ax = tool.ax
    event.x, event.y = ax.transData.transform([(xdata, ydata),
                                               (xdata, ydata)])[0]
    event.xdata, event.ydata = xdata, ydata
    event.inaxes = ax
    event.canvas = ax.figure.canvas
    event.key = key
    event.step = step
    event.guiEvent = None
    event.name = 'Custom'

    func = getattr(tool, etype)
    func(event)