Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion rascal2/widgets/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
from rascal2.widgets.controls import ControlsWidget
from rascal2.widgets.inputs import AdaptiveDoubleSpinBox, MultiSelectComboBox, MultiSelectList, get_validated_input
from rascal2.widgets.inputs import (
AdaptiveDoubleSpinBox,
MultiSelectComboBox,
MultiSelectList,
PathWidget,
ProgressButton,
get_validated_input,
)
from rascal2.widgets.plot import PlotWidget
from rascal2.widgets.project.slider_view import SliderViewWidget
from rascal2.widgets.terminal import TerminalWidget
Expand All @@ -10,7 +17,9 @@
"get_validated_input",
"MultiSelectComboBox",
"MultiSelectList",
"PathWidget",
"PlotWidget",
"ProgressButton",
"TerminalWidget",
"SliderViewWidget",
]
46 changes: 45 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import os
import tempfile
from pathlib import Path
from unittest.mock import patch
from unittest.mock import MagicMock, patch

os.environ["DELAY_MATLAB_START"] = "1"
import pytest
from PyQt6 import QtCore, QtWidgets

Expand All @@ -19,6 +21,11 @@ def global_setting():
return GLOBAL_SETTING


@pytest.fixture
def mock_window_view():
return MockWindowView()


@pytest.fixture(scope="session", autouse=True)
def mock_setting(request):
global GLOBAL_SETTING
Expand All @@ -38,3 +45,40 @@ def teardown_mock_setting():
target.stop()

request.addfinalizer(teardown_mock_setting)


class MockUndoStack:
"""A mock Undo stack."""

def __init__(self):
self.stack = []
self.clean = True

def push(self, command):
self.clean = False
command.redo()

def setClean(self):
self.clean = True

def isClean(self):
return self.clean


class MockWindowView(QtWidgets.QMainWindow):
"""A mock MainWindowView class."""

def __init__(self):
super().__init__()
self.undo_stack = MockUndoStack()
self.presenter = MagicMock()
self.controls_widget = MagicMock()
self.project_widget = MagicMock()
self.terminal_widget = MagicMock()
self.plot_widget = MagicMock()
self.handle_results = MagicMock()
self.settings = MagicMock()
self.get_project_folder = lambda: "new path/"
self.windowTitle = lambda: "RasCAL2"
self.show_message = MagicMock()
self.toggle_sliders = MagicMock()
90 changes: 90 additions & 0 deletions tests/core/test_commands.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
"""Tests for the undo Command classes."""

from unittest.mock import MagicMock, patch

import pytest
from ratapi import Controls, Project
from ratapi.rat_core import ProblemDefinition

from rascal2.core.commands import CommandID, EditControls, EditProject, SaveCalculationOutputs
from rascal2.ui.presenter import MainWindowPresenter


@pytest.fixture
def presenter(mock_window_view):
with (
patch("rascal2.ui.presenter.LOGGER", autospec=True),
patch("rascal2.ui.model.os.chdir", autospec=True),
):
pr = MainWindowPresenter(mock_window_view)
results = MagicMock()
results.calculationResults.sumChi = 45
pr.quick_run = MagicMock(return_value=results)
pr.model.controls = Controls()
pr.model.project = Project()
pr.model.results = None
pr.model.result_log = ""

yield pr


def test_edit_controls(presenter):
command = EditControls({"procedure": "de", "targetValue": 3}, presenter)
assert command.id() == CommandID.EditControls
assert presenter.model.controls.procedure == "calculate"
assert presenter.model.controls.targetValue == 1
command.redo()
assert presenter.model.controls.procedure == "de"
assert presenter.model.controls.targetValue == 3
command.undo()
assert presenter.model.controls.procedure == "calculate"
assert presenter.model.controls.targetValue == 1


def test_edit_project(presenter):
command = EditProject({"model": "custom layers"}, presenter)
assert command.id() == CommandID.EditProject
assert presenter.model.project.model == "standard layers"
command.redo()
assert presenter.model.project.model == "custom layers"
command.undo()
assert presenter.model.project.model == "standard layers"


def test_edit_project_preview(presenter):
command = EditProject({"model": "custom layers"}, presenter, preview=True)
command.redo()
presenter.quick_run.assert_called_once()
assert presenter.model.results.calculationResults.sumChi == 45
command.undo()
assert presenter.model.results is None
command.redo()
# confirm quick_run is always done once
presenter.quick_run.assert_called_once()
assert presenter.model.results.calculationResults.sumChi == 45

presenter.quick_run.side_effect = ValueError("calculate error")
command = EditProject({"model": "custom layers"}, presenter, preview=True)
command.redo()
# run failed so result is None
assert command.new_result is None


def test_save_calculation_outputs(presenter):
project = ProblemDefinition()
project.params = [4.5]
results = MagicMock()
results.calculationResults.sumChi = 45
log = "Stuff happened during calculation"
command = SaveCalculationOutputs(project, results, log, presenter)
assert presenter.model.project.parameters[0].value == 3
assert presenter.model.results is None
assert presenter.model.result_log == ""
command.redo()
assert presenter.model.project.parameters[0].value == 4.5
assert presenter.model.results.calculationResults.sumChi == 45
assert presenter.model.result_log == log
command.undo()
assert presenter.model.project.parameters[0].value == 3
assert presenter.model.results is None
assert presenter.model.result_log == ""
10 changes: 8 additions & 2 deletions tests/dialogs/test_about_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
@patch("rascal2.dialogs.about_dialog.MatlabHelper", autospec=True)
def test_update_info_works(mock_matlab):
"""Check if `update_rascal_info` adds all necessary information to the dialog."""
mock_matlab.return_value = MagicMock()
helper = MagicMock()
mock_matlab.return_value = helper
helper.get_matlab_path.return_value = "Test_Path"
parent = QtWidgets.QMainWindow()
about = AboutDialog(parent)
assert about._rascal_label.text() == "information about RASCAL-2"
Expand All @@ -17,5 +19,9 @@ def test_update_info_works(mock_matlab):
rascal_info = about._rascal_label.text()
assert "Version" in rascal_info
assert "RasCAL 2" in rascal_info
assert "Matlab Path:" in rascal_info
assert "Matlab Path:</td><td>Test_Path" in rascal_info
assert "Log File:" in rascal_info

helper.get_matlab_path.return_value = ""
about.update_rascal_info()
assert "Matlab Path:</td><td>None" in about._rascal_label.text()
File renamed without changes.
4 changes: 2 additions & 2 deletions tests/ui/test_presenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ def __init__(self):


@pytest.fixture
def presenter():
def presenter(mock_window_view):
with (
patch("rascal2.ui.presenter.LOGGER", autospec=True) as mock_log,
patch("rascal2.ui.model.os.chdir", autospec=True),
):
pr = MainWindowPresenter(MockWindowView())
pr = MainWindowPresenter(mock_window_view)
pr.runner = MagicMock()
pr.model.controls = Controls()
pr.model.project = MagicMock()
Expand Down
Loading
Loading