Ejemplo n.º 1
0
def test_snek_mode():
    """
    Sanity check for setting up the mode.
    """
    editor = mock.MagicMock()
    view = mock.MagicMock()
    am = SnekMode(editor, view)
    assert am.name == "Snek"
    assert am.description is not None
    assert am.icon == "snek"
    assert am.editor == editor
    assert am.view == view

    actions = am.actions()
    assert 3 <= len(actions) <= 4
    assert actions[0]["name"] == "serial"
    assert actions[0]["handler"] == am.toggle_repl
    assert actions[1]["name"] == "flash"
    assert actions[1]["handler"] == am.put
    assert actions[2]["name"] == "getflash"
    assert actions[2]["handler"] == am.get

    # Sometimes charts just aren't available for testing
    if len(actions) == 4:
        assert actions[3]["name"] == "plotter"
        assert actions[3]["handler"] == am.toggle_plotter
    assert "code" not in am.module_names
Ejemplo n.º 2
0
def test_api():
    """
    Ensure the correct API definitions are returned.
    """
    editor = mock.MagicMock()
    view = mock.MagicMock()
    am = SnekMode(editor, view)
    assert am.api() == SNEK_APIS
Ejemplo n.º 3
0
def test_snek_stop(snek_device):
    """
    Ensure that this method, called when Mu is quitting, shuts down
    the serial port.
    """
    editor = mock.MagicMock()
    editor.current_device = snek_device
    view = mock.MagicMock()
    mm = SnekMode(editor, view)
    view.remove_repl = mock.MagicMock()
    mm.stop()
    view.remove_repl.assert_called_once_with()
Ejemplo n.º 4
0
def test_snek_put_none():
    """
    Put current editor contents to eeprom
    """
    editor = mock.MagicMock()
    view = mock.MagicMock()
    view.current_tab = None
    view.repl_pane = mock.MagicMock()
    view.repl_pane.send_commands = mock.MagicMock()
    view.show_message = mock.MagicMock()
    mm = SnekMode(editor, view)
    mm.put()
    assert view.repl_pane.send_commands.call_count == 0
Ejemplo n.º 5
0
def test_snek_mode_add_repl_no_port():
    """
    If it's not possible to find a connected snek device then ensure a helpful
    message is enacted.
    """
    editor = mock.MagicMock()
    editor.current_device = None
    view = mock.MagicMock()
    view.show_message = mock.MagicMock()
    mm = SnekMode(editor, view)
    mm.add_repl()
    assert view.show_message.call_count == 1
    message = "Could not find an attached device."
    assert view.show_message.call_args[0][0] == message
Ejemplo n.º 6
0
def test_snek_mode_no_charts():
    """
    If QCharts is not available, ensure the plotter feature is not available.
    """
    editor = mock.MagicMock()
    view = mock.MagicMock()
    am = SnekMode(editor, view)
    with mock.patch("mu.modes.snek.CHARTS", False):
        actions = am.actions()
        assert len(actions) == 3
        assert actions[0]["name"] == "serial"
        assert actions[0]["handler"] == am.toggle_repl
        assert actions[1]["name"] == "flash"
        assert actions[1]["handler"] == am.put
        assert actions[2]["name"] == "getflash"
        assert actions[2]["handler"] == am.get
Ejemplo n.º 7
0
def test_snek_mode_add_repl_exception(snek_device):
    """
    Ensure that any non-IOError based exceptions are logged.
    """
    editor = mock.MagicMock()
    editor.current_device = snek_device
    view = mock.MagicMock()
    ex = Exception("BOOM")
    mm = SnekMode(editor, view)
    mock_repl_connection = mock.MagicMock()
    mock_repl_connection.open = mock.MagicMock(side_effect=ex)
    mock_connection_class = mock.MagicMock(return_value=mock_repl_connection)
    with mock.patch("mu.modes.snek.logger", return_value=None) as logger:
        with mock.patch("mu.modes.snek.SnekREPLConnection",
                        mock_connection_class):
            mm.add_repl()
            logger.error.assert_called_once_with(ex)
Ejemplo n.º 8
0
def test_snek_mode_add_repl(snek_device):
    """
    Nothing goes wrong so check the _view.add_snek_repl gets the
    expected argument.
    """
    editor = mock.MagicMock()
    editor.current_device = snek_device
    view = mock.MagicMock()
    view.show_message = mock.MagicMock()
    view.add_snek_repl = mock.MagicMock()
    mm = SnekMode(editor, view)
    mock_repl_connection = mock.MagicMock()
    mock_connection_class = mock.MagicMock(return_value=mock_repl_connection)
    with mock.patch("mu.modes.snek.SnekREPLConnection", mock_connection_class):
        mm.add_repl()
    assert view.show_message.call_count == 0
    assert view.add_snek_repl.call_args[0][1] == mock_repl_connection
    mock_repl_connection.send_interrupt.assert_called_once_with()
Ejemplo n.º 9
0
def test_snek_mode_add_repl_no_force_interrupt(snek_device):
    """
    Nothing goes wrong so check the _view.add_snek_repl gets the
    expected arguments (including the flag so no keyboard interrupt is called).
    """
    editor = mock.MagicMock()
    editor.current_device = snek_device
    view = mock.MagicMock()
    view.show_message = mock.MagicMock()
    view.add_snek_repl = mock.MagicMock()
    mm = SnekMode(editor, view)
    mm.force_interrupt = False
    mock_repl_connection = mock.MagicMock()
    mock_connection_class = mock.MagicMock(return_value=mock_repl_connection)
    with mock.patch("mu.modes.snek.SnekREPLConnection", mock_connection_class):
        mm.add_repl()
    assert view.show_message.call_count == 0
    assert view.add_snek_repl.call_args[0][1] == mock_repl_connection
    assert mock_repl_connection.send_interrupt.call_count == 0
Ejemplo n.º 10
0
def test_snek_mode_add_repl_ioerror(snek_device):
    """
    Sometimes when attempting to connect to the device there is an IOError
    because it's still booting up or connecting to the host computer. In this
    case, ensure a useful message is displayed.
    """
    editor = mock.MagicMock()
    editor.current_device = snek_device
    view = mock.MagicMock()
    view.show_message = mock.MagicMock()
    ex = IOError("Cannot connect to device on port COM0")
    mm = SnekMode(editor, view)
    mock_repl_connection = mock.MagicMock()
    mock_repl_connection.open = mock.MagicMock(side_effect=ex)
    mock_connection_class = mock.MagicMock(return_value=mock_repl_connection)
    with mock.patch("mu.modes.snek.SnekREPLConnection", mock_connection_class):
        mm.add_repl()
    assert view.show_message.call_count == 1
    assert view.show_message.call_args[0][0] == str(ex)
Ejemplo n.º 11
0
def test_snek_get_existing_modified():
    """
    Get current editor contents into a modified buffer from eeprom
    """
    editor = mock.MagicMock()
    view = mock.MagicMock()
    tab = mock.MagicMock()
    tab.path = None
    tab.setText = mock.MagicMock()
    tab.isModified.return_value = True

    mock_window = mock.MagicMock()
    mock_window.show_confirmation = mock.MagicMock(
        return_value=QMessageBox.Cancel)
    tab.nativeParentWidget = mock.MagicMock(return_value=mock_window)
    view.repl_pane = mock.MagicMock()
    view.repl_pane.send_commands = mock.MagicMock()
    view.widgets = (tab, )
    mm = SnekMode(editor, view)
    mm.repl = True
    mm.get()
    assert mock_window.show_confirmation.call_count == 1
    assert view.repl_pane.send_commands.call_count == 0
Ejemplo n.º 12
0
def test_snek_get_new():
    """
    Get current editor contents to eeprom
    """
    global mm
    editor = mock.MagicMock()
    view = mock.MagicMock()
    view.repl_pane = mock.MagicMock()
    view.repl_pane.send_commands = mock.MagicMock()
    view.widgets = ()
    view.add_tab = mock.MagicMock()
    mm = SnekMode(editor, view)
    mm.repl = False
    mm.toggle_repl = mock.MagicMock()
    mm.toggle_repl.side_effect = set_snek_repl
    mm.get()
    assert mm.toggle_repl.call_count == 1
    assert view.repl_pane.send_commands.call_count == 1
    mm.recv_text("hello")
    assert view.add_tab.call_count == 1
Ejemplo n.º 13
0
def test_snek_get_existing():
    """
    Get current editor contents to eeprom
    """
    editor = mock.MagicMock()
    view = mock.MagicMock()
    tab = mock.MagicMock()
    tab.path = None
    tab.setText = mock.MagicMock()
    tab.setModified(False)
    view.repl_pane = mock.MagicMock()
    view.repl_pane.send_commands = mock.MagicMock()
    view.widgets = (tab, )
    mm = SnekMode(editor, view)
    mm.repl = True
    mm.get()
    assert view.repl_pane.send_commands.call_count == 1
    mm.recv_text("hello")
    assert tab.setText.call_count == 1
Ejemplo n.º 14
0
def test_device_changed(snek_device):
    """
    Ensure REPL pane is updated, when the user changes
    device.
    """
    view = mock.MagicMock()
    editor = mock.MagicMock()
    mm = SnekMode(editor, view)
    mm.repl = mock.MagicMock()
    mm.add_repl = mock.MagicMock()
    mm.remove_repl = mock.MagicMock()
    mm.plotter = mock.MagicMock()
    mm.add_plotter = mock.MagicMock()
    mm.remove_plotter = mock.MagicMock()
    mm.connection = mock.MagicMock()
    mm.device_changed(snek_device)
    mm.remove_repl.assert_called_once_with()
    mm.add_repl.assert_called_once_with()
    mm.remove_plotter.assert_called_once_with()
    mm.add_plotter.assert_called_once_with()
    mm.connection.send_interrupt.assert_called_once_with()