mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-14 03:31:50 +02:00
191 lines
5.7 KiB
Python
191 lines
5.7 KiB
Python
import pytest
|
|
|
|
from bec_widgets.cli.client import Image, MotorMap, Waveform
|
|
from bec_widgets.cli.rpc.rpc_base import RPCReference
|
|
|
|
# pylint: disable=unused-argument
|
|
# pylint: disable=redefined-outer-name
|
|
# pylint: disable=too-many-locals
|
|
# pylint: disable=protected-access
|
|
|
|
|
|
def test_gui_rpc_registry(qtbot, connected_client_gui_obj):
|
|
gui = connected_client_gui_obj
|
|
dock_area = gui.new("cool_dock_area")
|
|
|
|
def check_dock_area_registered():
|
|
return dock_area._gui_id in gui._server_registry
|
|
|
|
qtbot.waitUntil(check_dock_area_registered, timeout=5000)
|
|
assert hasattr(gui, "cool_dock_area")
|
|
|
|
dock = dock_area.new("dock_0")
|
|
|
|
def check_dock_registered():
|
|
return dock._gui_id in gui._server_registry
|
|
|
|
qtbot.waitUntil(check_dock_registered, timeout=5000)
|
|
assert hasattr(gui.cool_dock_area, "dock_0")
|
|
|
|
|
|
def test_rpc_add_dock_with_plots_e2e(qtbot, bec_client_lib, connected_client_gui_obj):
|
|
|
|
gui = connected_client_gui_obj
|
|
# BEC client shortcuts
|
|
dock = gui.bec
|
|
client = bec_client_lib
|
|
dev = client.device_manager.devices
|
|
scans = client.scans
|
|
queue = client.queue
|
|
|
|
# Create 3 docks
|
|
d0 = dock.new("dock_0")
|
|
d1 = dock.new("dock_1")
|
|
d2 = dock.new("dock_2")
|
|
|
|
# Check that callback for dock_registry is done
|
|
def check_docks_registered():
|
|
return all(
|
|
[gui_id in gui._server_registry for gui_id in [d0._gui_id, d1._gui_id, d2._gui_id]]
|
|
)
|
|
|
|
# Waii until docks are registered
|
|
qtbot.waitUntil(check_docks_registered, timeout=5000)
|
|
qtbot.wait(500)
|
|
assert len(dock.panels) == 3
|
|
assert hasattr(gui.bec, "dock_0")
|
|
|
|
# Add 3 figures with some widgets
|
|
wf = d0.new("Waveform")
|
|
im = d1.new("Image")
|
|
mm = d2.new("MotorMap")
|
|
|
|
def check_figs_registered():
|
|
return all(
|
|
[gui_id in gui._server_registry for gui_id in [wf._gui_id, im._gui_id, mm._gui_id]]
|
|
)
|
|
|
|
qtbot.waitUntil(check_figs_registered, timeout=5000)
|
|
|
|
assert len(d0.element_list) == 1
|
|
assert len(d1.element_list) == 1
|
|
assert len(d2.element_list) == 1
|
|
|
|
assert wf.__class__.__name__ == "RPCReference"
|
|
assert wf.__class__ == RPCReference
|
|
assert gui._ipython_registry[wf._gui_id].__class__ == Waveform
|
|
assert im.__class__.__name__ == "RPCReference"
|
|
assert im.__class__ == RPCReference
|
|
assert gui._ipython_registry[im._gui_id].__class__ == Image
|
|
assert mm.__class__.__name__ == "RPCReference"
|
|
assert mm.__class__ == RPCReference
|
|
assert gui._ipython_registry[mm._gui_id].__class__ == MotorMap
|
|
|
|
mm.map("samx", "samy")
|
|
curve = wf.plot(x_name="samx", y_name="bpm4i")
|
|
im_item = im.image("eiger")
|
|
|
|
assert curve.__class__.__name__ == "RPCReference"
|
|
assert curve.__class__ == RPCReference
|
|
assert im_item.__class__.__name__ == "RPCReference"
|
|
assert im_item.__class__ == RPCReference
|
|
|
|
|
|
def test_dock_manipulations_e2e(qtbot, connected_client_gui_obj):
|
|
gui = connected_client_gui_obj
|
|
dock_area = gui.bec
|
|
|
|
d0 = dock_area.new("dock_0")
|
|
d1 = dock_area.new("dock_1")
|
|
d2 = dock_area.new("dock_2")
|
|
|
|
assert hasattr(gui.bec, "dock_0")
|
|
assert hasattr(gui.bec, "dock_1")
|
|
assert hasattr(gui.bec, "dock_2")
|
|
assert len(gui.bec.panels) == 3
|
|
|
|
d0.detach()
|
|
dock_area.detach_dock("dock_2")
|
|
# How can we properly check that the dock is detached?
|
|
assert len(gui.bec.panels) == 3
|
|
|
|
d0.attach()
|
|
assert len(gui.bec.panels) == 3
|
|
|
|
gui_id = d2._gui_id
|
|
|
|
def wait_for_dock_removed():
|
|
return gui_id not in gui._ipython_registry
|
|
|
|
d2.remove()
|
|
qtbot.waitUntil(wait_for_dock_removed, timeout=5000)
|
|
assert len(gui.bec.panels) == 2
|
|
|
|
ids = [widget._gui_id for widget in dock_area.panel_list]
|
|
|
|
def wait_for_docks_removed():
|
|
return all(widget_id not in gui._ipython_registry for widget_id in ids)
|
|
|
|
dock_area.delete_all()
|
|
qtbot.waitUntil(wait_for_docks_removed, timeout=5000)
|
|
assert len(gui.bec.panels) == 0
|
|
|
|
|
|
def test_ring_bar(qtbot, connected_client_gui_obj):
|
|
gui = connected_client_gui_obj
|
|
dock_area = gui.bec
|
|
d0 = dock_area.new("dock_0")
|
|
|
|
bar = d0.new("RingProgressBar")
|
|
assert bar.__class__.__name__ == "RPCReference"
|
|
assert gui._ipython_registry[bar._gui_id].__class__.__name__ == "RingProgressBar"
|
|
|
|
|
|
def test_rpc_gui_obj(connected_client_gui_obj, qtbot):
|
|
gui = connected_client_gui_obj
|
|
|
|
qtbot.waitUntil(lambda: len(gui.windows) == 1, timeout=3000)
|
|
assert gui.windows["bec"] is gui.bec
|
|
mw = gui.bec
|
|
assert mw.__class__.__name__ == "RPCReference"
|
|
assert gui._ipython_registry[mw._gui_id].__class__.__name__ == "BECDockArea"
|
|
|
|
xw = gui.new("X")
|
|
assert xw.__class__.__name__ == "RPCReference"
|
|
assert gui._ipython_registry[xw._gui_id].__class__.__name__ == "BECDockArea"
|
|
assert len(gui.windows) == 2
|
|
|
|
assert gui._gui_is_alive()
|
|
gui.kill_server()
|
|
assert not gui._gui_is_alive()
|
|
gui.start(wait=True)
|
|
assert gui._gui_is_alive()
|
|
# calling start multiple times should not change anything
|
|
gui.start(wait=True)
|
|
gui.start(wait=True)
|
|
|
|
def wait_for_gui_started():
|
|
return "bec" in gui.windows
|
|
|
|
qtbot.waitUntil(wait_for_gui_started, timeout=3000)
|
|
# gui.windows should have bec with gui_id 'bec'
|
|
assert len(gui.windows) == 1
|
|
|
|
# communication should work, main dock area should have same id and be visible
|
|
|
|
yw = gui.new("Y")
|
|
assert len(gui.windows) == 2
|
|
yw.remove()
|
|
assert len(gui.windows) == 1 # only bec is left
|
|
|
|
|
|
def test_rpc_call_with_exception_in_safeslot_error_popup(connected_client_gui_obj, qtbot):
|
|
gui = connected_client_gui_obj
|
|
|
|
gui.bec.new("test")
|
|
qtbot.waitUntil(lambda: len(gui.bec.panels) == 1) # test
|
|
qtbot.wait(500)
|
|
with pytest.raises(ValueError):
|
|
gui.bec.new("test")
|
|
# time.sleep(0.1)
|