From 8d764e2d46a1e017dadc3c4630648c1ca708afc2 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Thu, 18 Jul 2024 15:24:57 +0200 Subject: [PATCH] test(waveform_widget): test added --- .../curve_dialog/curve_dialog.py | 2 + .../widgets/waveform/waveform_widget.py | 6 +- tests/unit_tests/test_waveform_widget.py | 262 ++++++++++++++++++ 3 files changed, 267 insertions(+), 3 deletions(-) create mode 100644 tests/unit_tests/test_waveform_widget.py diff --git a/bec_widgets/widgets/waveform/waveform_toolbar/curve_dialog/curve_dialog.py b/bec_widgets/widgets/waveform/waveform_toolbar/curve_dialog/curve_dialog.py index 7062f041..a8781974 100644 --- a/bec_widgets/widgets/waveform/waveform_toolbar/curve_dialog/curve_dialog.py +++ b/bec_widgets/widgets/waveform/waveform_toolbar/curve_dialog/curve_dialog.py @@ -82,6 +82,8 @@ class CurveSettings(SettingWidget): ).add_dap_row() def _enable_ui_elements(self, name, entry): + if name is None: + name = "best_effort" if name in ["index", "timestamp", "best_effort"]: self.ui.x_mode.setCurrentText(name) self.set_x_mode() diff --git a/bec_widgets/widgets/waveform/waveform_widget.py b/bec_widgets/widgets/waveform/waveform_widget.py index dd457553..10cf9fa6 100644 --- a/bec_widgets/widgets/waveform/waveform_widget.py +++ b/bec_widgets/widgets/waveform/waveform_widget.py @@ -129,7 +129,7 @@ class BECWaveformWidget(BECWidget, QWidget): dialog = SettingsDialog( self, settings_widget=AxisSettings(), - window_title="Motor Map Settings", + window_title="Axis Settings", config=self._config_dict["axis"], ) dialog.exec() @@ -492,13 +492,13 @@ class BECWaveformWidget(BECWidget, QWidget): """ self.waveform.lock_aspect_ratio(lock) - @Slot() + @SafeSlot() def enable_mouse_rectangle_mode(self): self.toolbar.widgets["rectangle_mode"].action.setChecked(True) self.toolbar.widgets["drag_mode"].action.setChecked(False) self.waveform.plot_item.getViewBox().setMouseMode(pg.ViewBox.RectMode) - @Slot() + @SafeSlot() def enable_mouse_pan_mode(self): self.toolbar.widgets["drag_mode"].action.setChecked(True) self.toolbar.widgets["rectangle_mode"].action.setChecked(False) diff --git a/tests/unit_tests/test_waveform_widget.py b/tests/unit_tests/test_waveform_widget.py new file mode 100644 index 00000000..44185545 --- /dev/null +++ b/tests/unit_tests/test_waveform_widget.py @@ -0,0 +1,262 @@ +from unittest.mock import MagicMock, patch + +import pyqtgraph as pg +import pytest + +from bec_widgets.widgets.waveform.waveform_widget import BECWaveformWidget + +from .client_mocks import mocked_client + + +@pytest.fixture +def waveform_widget(qtbot, mocked_client): + widget = BECWaveformWidget(client=mocked_client()) + qtbot.addWidget(widget) + qtbot.waitExposed(widget) + yield widget + widget.close() + + +@pytest.fixture +def mock_waveform(waveform_widget): + waveform_mock = MagicMock() + waveform_widget.waveform = waveform_mock + return waveform_mock + + +def test_waveform_widget_inti(waveform_widget): + assert waveform_widget is not None + assert waveform_widget.client is not None + assert isinstance(waveform_widget, BECWaveformWidget) + assert waveform_widget.config.widget_class == "BECWaveformWidget" + + +################################### +# Wrapper methods for Waveform +################################### + + +def test_waveform_widget_get_curve(waveform_widget, mock_waveform): + waveform_widget.get_curve("curve_id") + waveform_widget.waveform.get_curve.assert_called_once_with("curve_id") + + +def test_waveform_widget_set_colormap(waveform_widget, mock_waveform): + waveform_widget.set_colormap("colormap") + waveform_widget.waveform.set_colormap.assert_called_once_with("colormap") + + +def test_waveform_widget_set_x(waveform_widget, mock_waveform): + waveform_widget.set_x("samx", "samx") + waveform_widget.waveform.set_x.assert_called_once_with("samx", "samx") + + +def test_waveform_plot_data(waveform_widget, mock_waveform): + waveform_widget.plot(x=[1, 2, 3], y=[1, 2, 3]) + waveform_widget.waveform.plot.assert_called_once_with( + x=[1, 2, 3], + y=[1, 2, 3], + x_name=None, + y_name=None, + z_name=None, + x_entry=None, + y_entry=None, + z_entry=None, + color=None, + color_map_z="plasma", + label=None, + validate=True, + dap=None, + ) + + +def test_waveform_plot_scan_curves(waveform_widget, mock_waveform): + waveform_widget.plot(x_name="samx", y_name="samy", dap="GaussianModel") + waveform_widget.waveform.plot.assert_called_once_with( + x=None, + y=None, + x_name="samx", + y_name="samy", + z_name=None, + x_entry=None, + y_entry=None, + z_entry=None, + color=None, + color_map_z="plasma", + label=None, + validate=True, + dap="GaussianModel", + ) + + +def test_waveform_widget_add_dap(waveform_widget, mock_waveform): + waveform_widget.add_dap(x_name="samx", y_name="bpm4i") + waveform_widget.waveform.add_dap.assert_called_once_with( + x_name="samx", + y_name="bpm4i", + x_entry=None, + y_entry=None, + color=None, + dap="GaussianModel", + validate_bec=True, + ) + + +def test_waveform_widget_get_dap_params(waveform_widget, mock_waveform): + waveform_widget.get_dap_params() + waveform_widget.waveform.get_dap_params.assert_called_once() + + +def test_waveform_widget_get_dap_summary(waveform_widget, mock_waveform): + waveform_widget.get_dap_summary() + waveform_widget.waveform.get_dap_summary.assert_called_once() + + +def test_waveform_widget_remove_curve(waveform_widget, mock_waveform): + waveform_widget.remove_curve("curve_id") + waveform_widget.waveform.remove_curve.assert_called_once_with("curve_id") + + +def test_waveform_widget_scan_history(waveform_widget, mock_waveform): + waveform_widget.scan_history(0) + waveform_widget.waveform.scan_history.assert_called_once_with(0, None) + + +def test_waveform_widget_get_all_data(waveform_widget, mock_waveform): + waveform_widget.get_all_data() + waveform_widget.waveform.get_all_data.assert_called_once() + + +def test_waveform_widget_set_title(waveform_widget, mock_waveform): + waveform_widget.set_title("Title") + waveform_widget.waveform.set_title.assert_called_once_with("Title") + + +def test_waveform_widget_set_base(waveform_widget, mock_waveform): + waveform_widget.set( + title="Test Title", + x_label="X Label", + y_label="Y Label", + x_scale="linear", + y_scale="log", + x_lim=(0, 10), + y_lim=(0, 10), + legend_label_size=12, + ) + waveform_widget.waveform.set.assert_called_once_with( + title="Test Title", + x_label="X Label", + y_label="Y Label", + x_scale="linear", + y_scale="log", + x_lim=(0, 10), + y_lim=(0, 10), + legend_label_size=12, + ) + + +def test_waveform_widget_set_x_label(waveform_widget, mock_waveform): + waveform_widget.set_x_label("X Label") + waveform_widget.waveform.set_x_label.assert_called_once_with("X Label") + + +def test_waveform_widget_set_y_label(waveform_widget, mock_waveform): + waveform_widget.set_y_label("Y Label") + waveform_widget.waveform.set_y_label.assert_called_once_with("Y Label") + + +def test_waveform_widget_set_x_scale(waveform_widget, mock_waveform): + waveform_widget.set_x_scale("linear") + waveform_widget.waveform.set_x_scale.assert_called_once_with("linear") + + +def test_waveform_widget_set_y_scale(waveform_widget, mock_waveform): + waveform_widget.set_y_scale("log") + waveform_widget.waveform.set_y_scale.assert_called_once_with("log") + + +def test_waveform_widget_set_x_lim(waveform_widget, mock_waveform): + waveform_widget.set_x_lim((0, 10)) + waveform_widget.waveform.set_x_lim.assert_called_once_with((0, 10)) + + +def test_waveform_widget_set_y_lim(waveform_widget, mock_waveform): + waveform_widget.set_y_lim((0, 10)) + waveform_widget.waveform.set_y_lim.assert_called_once_with((0, 10)) + + +def test_waveform_widget_set_legend_label_size(waveform_widget, mock_waveform): + waveform_widget.set_legend_label_size(12) + waveform_widget.waveform.set_legend_label_size.assert_called_once_with(12) + + +def test_waveform_widget_set_auto_range(waveform_widget, mock_waveform): + waveform_widget.set_auto_range(True, "xy") + waveform_widget.waveform.set_auto_range.assert_called_once_with(True, "xy") + + +def test_waveform_widget_set_grid(waveform_widget, mock_waveform): + waveform_widget.set_grid(True, False) + waveform_widget.waveform.set_grid.assert_called_once_with(True, False) + + +def test_waveform_widget_lock_aspect_ratio(waveform_widget, mock_waveform): + waveform_widget.lock_aspect_ratio(True) + waveform_widget.waveform.lock_aspect_ratio.assert_called_once_with(True) + + +def test_waveform_widget_export(waveform_widget, mock_waveform): + waveform_widget.export() + waveform_widget.waveform.export.assert_called_once() + + +################################### +# ToolBar interactions +################################### + + +def test_toolbar_drag_mode_action_triggered(waveform_widget, qtbot): + action_drag = waveform_widget.toolbar.widgets["drag_mode"].action + action_rectangle = waveform_widget.toolbar.widgets["rectangle_mode"].action + action_drag.trigger() + assert action_drag.isChecked() == True + assert action_rectangle.isChecked() == False + + +def test_toolbar_rectangle_mode_action_triggered(waveform_widget, qtbot): + action_drag = waveform_widget.toolbar.widgets["drag_mode"].action + action_rectangle = waveform_widget.toolbar.widgets["rectangle_mode"].action + action_rectangle.trigger() + assert action_drag.isChecked() == False + assert action_rectangle.isChecked() == True + + +def test_toolbar_auto_range_action_triggered(waveform_widget, mock_waveform, qtbot): + action = waveform_widget.toolbar.widgets["auto_range"].action + action.trigger() + qtbot.wait(200) + waveform_widget.waveform.set_auto_range.assert_called_once_with(True, "xy") + + +def test_toolbar_fit_params_action_triggered(qtbot, waveform_widget): + action = waveform_widget.toolbar.widgets["fit_params"].action + with patch( + "bec_widgets.widgets.waveform.waveform_widget.FitSummaryWidget" + ) as MockFitSummaryWidget: + mock_dialog_instance = MockFitSummaryWidget.return_value + action.trigger() + mock_dialog_instance.show.assert_called_once() + + +def test_enable_mouse_pan_mode(qtbot, waveform_widget): + action_drag = waveform_widget.toolbar.widgets["drag_mode"].action + action_rectangle = waveform_widget.toolbar.widgets["rectangle_mode"].action + + mock_view_box = MagicMock() + waveform_widget.waveform.plot_item.getViewBox = MagicMock(return_value=mock_view_box) + + waveform_widget.enable_mouse_pan_mode() + + assert action_drag.isChecked() == True + assert action_rectangle.isChecked() == False + mock_view_box.setMouseMode.assert_called_once_with(pg.ViewBox.PanMode)