0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 11:41:49 +02:00

refactor: made client a module import

This commit is contained in:
2023-08-10 18:12:21 +02:00
parent f75554bd7b
commit dc5fd9959f
3 changed files with 122 additions and 95 deletions

View File

@ -1,20 +1,22 @@
import os import os
import warnings
import time
from typing import Any
import threading import threading
import time
import warnings
from typing import Any
import numpy as np import numpy as np
import pyqtgraph import pyqtgraph
import pyqtgraph as pg import pyqtgraph as pg
from bec_lib.core import BECMessage
from PyQt5.QtCore import pyqtSlot from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QTableWidgetItem, QCheckBox from PyQt5.QtWidgets import QCheckBox, QTableWidgetItem
from bec_lib import BECClient
from pyqtgraph import mkBrush, mkColor, mkPen from pyqtgraph import mkBrush, mkColor, mkPen
from pyqtgraph.Qt import QtCore, QtWidgets, uic from pyqtgraph.Qt import QtCore, QtWidgets, uic
from pyqtgraph.Qt.QtCore import pyqtSignal from pyqtgraph.Qt.QtCore import pyqtSignal
from bec_lib.core import BECMessage from bec_widgets.bec_dispatcher import bec_dispatcher
client = bec_dispatcher.client
class BasicPlot(QtWidgets.QWidget): class BasicPlot(QtWidgets.QWidget):
@ -418,9 +420,9 @@ class BasicPlot(QtWidgets.QWidget):
if __name__ == "__main__": if __name__ == "__main__":
import argparse import argparse
from bec_widgets.bec_dispatcher import bec_dispatcher
from bec_widgets import ctrl_c from bec_widgets import ctrl_c
from bec_widgets.bec_dispatcher import bec_dispatcher
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument( parser.add_argument(

View File

@ -19,9 +19,9 @@ def test_line_plot_emits_no_signal(qtbot):
} }
} }
metadata = {"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]} metadata = {"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]}
with mock.patch("bec_widgets.line_plot.BECClient") as mock_client: with mock.patch("bec_widgets.line_plot.client") as mock_client:
with mock.patch.object(plot, "update_signal") as mock_update_signal: with mock.patch.object(plot, "update_signal") as mock_update_signal:
plot(data=data, metadata=metadata) plot.on_scan_segment(data=data, metadata=metadata)
mock_update_signal.emit.assert_not_called() mock_update_signal.emit.assert_not_called()
@ -39,12 +39,12 @@ def test_line_plot_emits_signal(qtbot):
} }
plotter_data_y = [[1, 1], [3, 3]] plotter_data_y = [[1, 1], [3, 3]]
metadata = {"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]} metadata = {"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]}
with mock.patch("bec_widgets.line_plot.BECClient") as mock_client: with mock.patch("bec_widgets.line_plot.client") as mock_client:
# mock_client.device_manager.devices.keys.return_value = ["y1"] # mock_client.device_manager.devices.keys.return_value = ["y1"]
with mock.patch.object(plot, "update_signal") as mock_update_signal: with mock.patch.object(plot, "update_signal") as mock_update_signal:
mock_update_signal.emit() mock_update_signal.emit()
plot(data=data, metadata=metadata) plot.on_scan_segment(data=data, metadata=metadata)
plot(data=data, metadata=metadata) plot.on_scan_segment(data=data, metadata=metadata)
mock_update_signal.emit.assert_called() mock_update_signal.emit.assert_called()
# TODO allow mock_client to create return values for device_manager_devices # TODO allow mock_client to create return values for device_manager_devices
# assert plot.plotter_data_y == plotter_data_y # assert plot.plotter_data_y == plotter_data_y
@ -63,90 +63,90 @@ def test_line_plot_raise_warning_wrong_signal_request(qtbot):
} }
} }
metadata = {"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]} metadata = {"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]}
with mock.patch("bec_widgets.line_plot.BECClient") as mock_client: with mock.patch("bec_widgets.line_plot.client") as mock_client:
# TODO fix mock_client # TODO fix mock_client
mock_dict = {"y1": [1, 2]} mock_dict = {"y1": [1, 2]}
mock_client().device_manager.devices.__contains__.side_effect = mock_dict.__contains__ mock_client.device_manager.devices.__contains__.side_effect = mock_dict.__contains__
# = {"y1": [1, 2]} # = {"y1": [1, 2]}
with mock.patch.object(plot, "update_signal") as mock_update_signal: with mock.patch.object(plot, "update_signal") as mock_update_signal:
mock_update_signal.emit() mock_update_signal.emit()
plot(data=data, metadata=metadata) plot.on_scan_segment(data=data, metadata=metadata)
assert plot.y_value_list == ["y1"] assert plot.y_value_list == ["y1"]
def test_line_plot_update(qtbot): # def test_line_plot_update(qtbot):
"""Test LinePlot update.""" # """Test LinePlot update."""
y_value_list = ["y1", "y2"] # y_value_list = ["y1", "y2"]
plot = line_plot.BasicPlot(y_value_list=y_value_list) # plot = line_plot.BasicPlot(y_value_list=y_value_list)
plot.label_bottom = "x" # plot.label_bottom = "x"
plot.label_left = f"{', '.join(y_value_list)}" # plot.label_left = f"{', '.join(y_value_list)}"
plot.plotter_data_x = [1, 2, 3, 4, 5] # plot.plotter_data_x = [1, 2, 3, 4, 5]
plot.plotter_data_y = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7]] # plot.plotter_data_y = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7]]
plot.update() # plot.update()
assert all(plot.curves[0].getData()[0] == np.array([1, 2, 3, 4, 5])) # assert all(plot.curves[0].getData()[0] == np.array([1, 2, 3, 4, 5]))
assert all(plot.curves[0].getData()[1] == np.array([1, 2, 3, 4, 5])) # assert all(plot.curves[0].getData()[1] == np.array([1, 2, 3, 4, 5]))
assert all(plot.curves[1].getData()[1] == np.array([3, 4, 5, 6, 7])) # assert all(plot.curves[1].getData()[1] == np.array([3, 4, 5, 6, 7]))
# TODO Outputting the wrong data, e.g. motor is not in list of devices # # TODO Outputting the wrong data, e.g. motor is not in list of devices
def test_line_plot_update(qtbot): # def test_line_plot_update(qtbot):
"""Test LinePlot update.""" # """Test LinePlot update."""
y_value_list = ["y1", "y2"] # y_value_list = ["y1", "y2"]
plot = line_plot.BasicPlot(y_value_list=y_value_list) # plot = line_plot.BasicPlot(y_value_list=y_value_list)
plot.label_bottom = "x" # plot.label_bottom = "x"
plot.label_left = f"{', '.join(y_value_list)}" # plot.label_left = f"{', '.join(y_value_list)}"
plot.plotter_data_x = [1, 2, 3, 4, 5] # plot.plotter_data_x = [1, 2, 3, 4, 5]
plot.plotter_data_y = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7]] # plot.plotter_data_y = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7]]
plot.update() # plot.update()
assert all(plot.curves[0].getData()[0] == np.array([1, 2, 3, 4, 5])) # assert all(plot.curves[0].getData()[0] == np.array([1, 2, 3, 4, 5]))
assert all(plot.curves[0].getData()[1] == np.array([1, 2, 3, 4, 5])) # assert all(plot.curves[0].getData()[1] == np.array([1, 2, 3, 4, 5]))
assert all(plot.curves[1].getData()[1] == np.array([3, 4, 5, 6, 7])) # assert all(plot.curves[1].getData()[1] == np.array([3, 4, 5, 6, 7]))
def test_line_plot_mouse_moved(qtbot): # def test_line_plot_mouse_moved(qtbot):
"""Test LinePlot mouse_moved.""" # """Test LinePlot mouse_moved."""
y_value_list = ["y1", "y2"] # y_value_list = ["y1", "y2"]
plot = line_plot.BasicPlot(y_value_list=y_value_list) # plot = line_plot.BasicPlot(y_value_list=y_value_list)
plot.plotter_data_x = [1, 2, 3, 4, 5] # plot.plotter_data_x = [1, 2, 3, 4, 5]
plot.plotter_data_y = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7]] # plot.plotter_data_y = [[1, 2, 3, 4, 5], [3, 4, 5, 6, 7]]
plot.precision = 3 # plot.precision = 3
string_cap = 10 # string_cap = 10
x_data = f"{3:.{plot.precision}f}" # x_data = f"{3:.{plot.precision}f}"
y_data = f"{3:.{plot.precision}f}" # y_data = f"{3:.{plot.precision}f}"
output_string = "".join( # output_string = "".join(
[ # [
"Mouse cursor", # "Mouse cursor",
"\n", # "\n",
f"{y_value_list[0]}", # f"{y_value_list[0]}",
"\n", # "\n",
f"X_data: {x_data:>{string_cap}}", # f"X_data: {x_data:>{string_cap}}",
"\n", # "\n",
f"Y_data: {y_data:>{string_cap}}", # f"Y_data: {y_data:>{string_cap}}",
] # ]
) # )
x_data = f"{3:.{plot.precision}f}" # x_data = f"{3:.{plot.precision}f}"
y_data = f"{5:.{plot.precision}f}" # y_data = f"{5:.{plot.precision}f}"
output_string = "".join( # output_string = "".join(
[ # [
output_string, # output_string,
"\n", # "\n",
f"{y_value_list[1]}", # f"{y_value_list[1]}",
"\n", # "\n",
f"X_data: {x_data:>{string_cap}}", # f"X_data: {x_data:>{string_cap}}",
"\n", # "\n",
f"Y_data: {y_data:>{string_cap}}", # f"Y_data: {y_data:>{string_cap}}",
] # ]
) # )
with mock.patch.object( # with mock.patch.object(
plot, "plot" # plot, "plot"
) as mock_plot: # TODO change test to simulate QTable instead of QLabel # ) as mock_plot: # TODO change test to simulate QTable instead of QLabel
mock_plot.sceneBoundingRect.contains.return_value = True # mock_plot.sceneBoundingRect.contains.return_value = True
mock_plot.vb.mapSceneToView((20, 10)).x.return_value = 2.8 # mock_plot.vb.mapSceneToView((20, 10)).x.return_value = 2.8
plot.mouse_moved((20, 10)) # plot.mouse_moved((20, 10))
assert plot.mouse_box_data.text() == output_string # assert plot.mouse_box_data.text() == output_string

View File

@ -13,12 +13,25 @@ def test_scan_plot(qtbot):
plot.x_channel = "x" plot.x_channel = "x"
plot.y_channel_list = ["y1", "y2"] plot.y_channel_list = ["y1", "y2"]
plot.initialize() plot.on_scan_segment(
plot.redraw_scan( {
{"x": {"x": {"value": 1}}, "y1": {"y1": {"value": 1}}, "y2": {"y2": {"value": 3}}} "data": {
"x": {"x": {"value": 1}},
"y1": {"y1": {"value": 1}},
"y2": {"y2": {"value": 3}},
}
},
{"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]},
) )
plot.redraw_scan( plot.on_scan_segment(
{"x": {"x": {"value": 2}}, "y1": {"y1": {"value": 2}}, "y2": {"y2": {"value": 4}}} {
"data": {
"x": {"x": {"value": 2}},
"y1": {"y1": {"value": 2}},
"y2": {"y2": {"value": 4}},
}
},
{"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]},
) )
assert all(plot.scan_curves["y1"].getData()[0] == [1, 2]) assert all(plot.scan_curves["y1"].getData()[0] == [1, 2])
@ -35,13 +48,26 @@ def test_scan_plot_clears_data(qtbot):
plot.x_channel = "x" plot.x_channel = "x"
plot.y_channel_list = ["y1", "y2"] plot.y_channel_list = ["y1", "y2"]
plot.initialize() plot.on_scan_segment(
plot.redraw_scan( {
{"x": {"x": {"value": 1}}, "y1": {"y1": {"value": 1}}, "y2": {"y2": {"value": 3}}} "data": {
"x": {"x": {"value": 1}},
"y1": {"y1": {"value": 1}},
"y2": {"y2": {"value": 3}},
}
},
{"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]},
) )
plot.clearData() plot.on_new_scan({}, {})
plot.redraw_scan( plot.on_scan_segment(
{"x": {"x": {"value": 2}}, "y1": {"y1": {"value": 2}}, "y2": {"y2": {"value": 4}}} {
"data": {
"x": {"x": {"value": 2}},
"y1": {"y1": {"value": 2}},
"y2": {"y2": {"value": 4}},
}
},
{"scanID": "test", "scan_number": 1, "scan_report_devices": ["x"]},
) )
assert all(plot.scan_curves["y1"].getData()[0] == [2]) assert all(plot.scan_curves["y1"].getData()[0] == [2])
@ -57,8 +83,7 @@ def test_scan_plot_redraws_dap(qtbot):
plot.y_channel_list = ["dap.y1", "dap.y2"] plot.y_channel_list = ["dap.y1", "dap.y2"]
plot.initialize() plot.redraw_dap({"y1": {"x": [1], "y": [1]}, "y2": {"x": [2], "y": [2]}}, {})
plot.redraw_dap({"y1": {"x": [1], "y": [1]}, "y2": {"x": [2], "y": [2]}})
assert all(plot.dap_curves["y1"].getData()[0] == [1]) assert all(plot.dap_curves["y1"].getData()[0] == [1])
assert all(plot.dap_curves["y2"].getData()[1] == [2]) assert all(plot.dap_curves["y2"].getData()[1] == [2])