bec-widgets 0.99.8__py3-none-any.whl → 0.99.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. CHANGELOG.md +18 -20
  2. PKG-INFO +1 -1
  3. bec_widgets/widgets/positioner_box/positioner_box.py +23 -11
  4. bec_widgets/widgets/stop_button/stop_button.py +30 -13
  5. {bec_widgets-0.99.8.dist-info → bec_widgets-0.99.10.dist-info}/METADATA +1 -1
  6. {bec_widgets-0.99.8.dist-info → bec_widgets-0.99.10.dist-info}/RECORD +10 -157
  7. pyproject.toml +6 -1
  8. docs/Makefile +0 -20
  9. docs/_static/custom.css +0 -170
  10. docs/_templates/custom-class-template.rst +0 -34
  11. docs/_templates/custom-module-template.rst +0 -66
  12. docs/api_reference/api_reference.md +0 -12
  13. docs/assets/apps_48dp.svg +0 -1
  14. docs/assets/display_settings_48dp.svg +0 -1
  15. docs/assets/index_api.svg +0 -97
  16. docs/assets/index_contribute.svg +0 -76
  17. docs/assets/index_getting_started.svg +0 -66
  18. docs/assets/index_user_guide.svg +0 -67
  19. docs/assets/rocket_launch_48dp.svg +0 -1
  20. docs/assets/widget_screenshots/buttons.png +0 -0
  21. docs/assets/widget_screenshots/device_box.png +0 -0
  22. docs/assets/widget_screenshots/device_browser.png +0 -0
  23. docs/assets/widget_screenshots/device_inputs.png +0 -0
  24. docs/assets/widget_screenshots/dock_area.png +0 -0
  25. docs/assets/widget_screenshots/figure.png +0 -0
  26. docs/assets/widget_screenshots/image_widget.png +0 -0
  27. docs/assets/widget_screenshots/motor_map_widget.png +0 -0
  28. docs/assets/widget_screenshots/position_indicator.png +0 -0
  29. docs/assets/widget_screenshots/queue.png +0 -0
  30. docs/assets/widget_screenshots/ring_progress_bar.png +0 -0
  31. docs/assets/widget_screenshots/scan_controller.png +0 -0
  32. docs/assets/widget_screenshots/spinner.gif +0 -0
  33. docs/assets/widget_screenshots/status_box.png +0 -0
  34. docs/assets/widget_screenshots/text_box.png +0 -0
  35. docs/assets/widget_screenshots/toggle.png +0 -0
  36. docs/assets/widget_screenshots/waveform_widget.png +0 -0
  37. docs/assets/widget_screenshots/website.png +0 -0
  38. docs/conf.py +0 -82
  39. docs/developer/developer.md +0 -52
  40. docs/developer/introduction/concepts.md +0 -14
  41. docs/developer/introduction/contributing.md +0 -28
  42. docs/developer/introduction/introduction.md +0 -16
  43. docs/developer/introduction/useful_links.md +0 -23
  44. docs/developer/widget_development/bec_dispatcher.md +0 -143
  45. docs/developer/widget_development/widget_base_class.md +0 -171
  46. docs/developer/widget_development/widget_development.md +0 -14
  47. docs/index.md +0 -74
  48. docs/introduction/introduction.md +0 -18
  49. docs/make.bat +0 -35
  50. docs/requirements.txt +0 -12
  51. docs/user/api_reference/api_reference.md +0 -11
  52. docs/user/applications/applications.md +0 -10
  53. docs/user/customisation.md +0 -123
  54. docs/user/getting_started/BECDockArea.png +0 -0
  55. docs/user/getting_started/auto_updates.md +0 -82
  56. docs/user/getting_started/getting_started.md +0 -15
  57. docs/user/getting_started/gui_complex_gui.gif +0 -0
  58. docs/user/getting_started/installation.md +0 -33
  59. docs/user/getting_started/quick_start.md +0 -110
  60. docs/user/getting_started/video_tutorials.md +0 -17
  61. docs/user/user.md +0 -71
  62. docs/user/widgets/bec_figure/BECFigure.png +0 -0
  63. docs/user/widgets/bec_figure/bec_figure.md +0 -105
  64. docs/user/widgets/bec_status_box/bec_status_box.gif +0 -0
  65. docs/user/widgets/bec_status_box/bec_status_box.md +0 -38
  66. docs/user/widgets/buttons/buttons.md +0 -90
  67. docs/user/widgets/buttons/dark_mode_disabled.png +0 -0
  68. docs/user/widgets/buttons/dark_mode_enabled.png +0 -0
  69. docs/user/widgets/device_browser/device_browser.md +0 -36
  70. docs/user/widgets/device_browser/device_browser.png +0 -0
  71. docs/user/widgets/device_input/device_input.md +0 -100
  72. docs/user/widgets/dock_area/BECDockArea.png +0 -0
  73. docs/user/widgets/dock_area/bec_dock_area.md +0 -109
  74. docs/user/widgets/image/image_plot.gif +0 -0
  75. docs/user/widgets/image/image_widget.md +0 -84
  76. docs/user/widgets/motor_map/motor.gif +0 -0
  77. docs/user/widgets/motor_map/motor_map.md +0 -80
  78. docs/user/widgets/position_indicator/position_indicator.md +0 -69
  79. docs/user/widgets/positioner_box/positioner_box.md +0 -63
  80. docs/user/widgets/progress_bar/progress_bar.gif +0 -0
  81. docs/user/widgets/progress_bar/ring_progress_bar.md +0 -103
  82. docs/user/widgets/queue/queue.md +0 -41
  83. docs/user/widgets/scan_control/hide_scan_control.png +0 -0
  84. docs/user/widgets/scan_control/scan_control.gif +0 -0
  85. docs/user/widgets/scan_control/scan_control.md +0 -54
  86. docs/user/widgets/spinner/spinner.md +0 -68
  87. docs/user/widgets/text_box/text_box.md +0 -74
  88. docs/user/widgets/toggle/toggle.md +0 -66
  89. docs/user/widgets/waveform/bec_figure_dap.gif +0 -0
  90. docs/user/widgets/waveform/scatter_2D.gif +0 -0
  91. docs/user/widgets/waveform/w1D.gif +0 -0
  92. docs/user/widgets/waveform/waveform_widget.md +0 -132
  93. docs/user/widgets/website/website.md +0 -69
  94. docs/user/widgets/widgets.md +0 -220
  95. tests/__init__.py +0 -0
  96. tests/end-2-end/__init__.py +0 -0
  97. tests/end-2-end/conftest.py +0 -53
  98. tests/end-2-end/test_bec_dock_rpc_e2e.py +0 -298
  99. tests/end-2-end/test_bec_figure_rpc_e2e.py +0 -212
  100. tests/end-2-end/test_rpc_register_e2e.py +0 -40
  101. tests/end-2-end/test_scan_control_e2e.py +0 -71
  102. tests/references/SpinnerWidget/SpinnerWidget_darwin.png +0 -0
  103. tests/references/SpinnerWidget/SpinnerWidget_linux.png +0 -0
  104. tests/references/SpinnerWidget/SpinnerWidget_started_darwin.png +0 -0
  105. tests/references/SpinnerWidget/SpinnerWidget_started_linux.png +0 -0
  106. tests/unit_tests/__init__.py +0 -0
  107. tests/unit_tests/client_mocks.py +0 -189
  108. tests/unit_tests/conftest.py +0 -64
  109. tests/unit_tests/test_bec_connector.py +0 -80
  110. tests/unit_tests/test_bec_dispatcher.py +0 -119
  111. tests/unit_tests/test_bec_dock.py +0 -155
  112. tests/unit_tests/test_bec_figure.py +0 -270
  113. tests/unit_tests/test_bec_image.py +0 -63
  114. tests/unit_tests/test_bec_image_widget.py +0 -217
  115. tests/unit_tests/test_bec_motor_map.py +0 -282
  116. tests/unit_tests/test_bec_queue.py +0 -111
  117. tests/unit_tests/test_bec_status_box.py +0 -123
  118. tests/unit_tests/test_client_utils.py +0 -76
  119. tests/unit_tests/test_color_map_selector.py +0 -42
  120. tests/unit_tests/test_color_validation.py +0 -75
  121. tests/unit_tests/test_configs/config_device.yaml +0 -33
  122. tests/unit_tests/test_configs/config_device_no_entry.yaml +0 -27
  123. tests/unit_tests/test_configs/config_scan.yaml +0 -82
  124. tests/unit_tests/test_crosshair.py +0 -143
  125. tests/unit_tests/test_dark_mode_button.py +0 -70
  126. tests/unit_tests/test_device_browser.py +0 -83
  127. tests/unit_tests/test_device_input_base.py +0 -76
  128. tests/unit_tests/test_device_input_widgets.py +0 -178
  129. tests/unit_tests/test_error_utils.py +0 -63
  130. tests/unit_tests/test_generate_cli_client.py +0 -123
  131. tests/unit_tests/test_generate_plugin.py +0 -155
  132. tests/unit_tests/test_motor_map_widget.py +0 -194
  133. tests/unit_tests/test_msgs/__init__.py +0 -0
  134. tests/unit_tests/test_msgs/available_scans_message.py +0 -989
  135. tests/unit_tests/test_plot_base.py +0 -95
  136. tests/unit_tests/test_plugin_utils.py +0 -13
  137. tests/unit_tests/test_positioner_box.py +0 -130
  138. tests/unit_tests/test_ring_progress_bar.py +0 -337
  139. tests/unit_tests/test_rpc_register.py +0 -52
  140. tests/unit_tests/test_rpc_server.py +0 -42
  141. tests/unit_tests/test_rpc_widget_handler.py +0 -7
  142. tests/unit_tests/test_scan_control.py +0 -324
  143. tests/unit_tests/test_scan_control_group_box.py +0 -160
  144. tests/unit_tests/test_setting_dialog.py +0 -96
  145. tests/unit_tests/test_spinner.py +0 -31
  146. tests/unit_tests/test_stop_button.py +0 -27
  147. tests/unit_tests/test_text_box_widget.py +0 -54
  148. tests/unit_tests/test_toggle.py +0 -38
  149. tests/unit_tests/test_vscode_widget.py +0 -75
  150. tests/unit_tests/test_waveform1d.py +0 -712
  151. tests/unit_tests/test_waveform_widget.py +0 -462
  152. tests/unit_tests/test_website_widget.py +0 -25
  153. tests/unit_tests/test_widget_io.py +0 -90
  154. tests/unit_tests/test_yaml_dialog.py +0 -163
  155. {bec_widgets-0.99.8.dist-info → bec_widgets-0.99.10.dist-info}/WHEEL +0 -0
  156. {bec_widgets-0.99.8.dist-info → bec_widgets-0.99.10.dist-info}/entry_points.txt +0 -0
  157. {bec_widgets-0.99.8.dist-info → bec_widgets-0.99.10.dist-info}/licenses/LICENSE +0 -0
@@ -1,324 +0,0 @@
1
- # pylint: disable = no-name-in-module,missing-class-docstring, missing-module-docstring
2
- from unittest.mock import MagicMock
3
-
4
- import pytest
5
- from bec_lib.messages import AvailableResourceMessage
6
-
7
- from bec_widgets.utils.widget_io import WidgetIO
8
- from bec_widgets.widgets.scan_control import ScanControl
9
-
10
- from .client_mocks import mocked_client
11
-
12
- available_scans_message = AvailableResourceMessage(
13
- resource={
14
- "line_scan": {
15
- "class": "LineScan",
16
- "base_class": "ScanBase",
17
- "arg_input": {"device": "device", "start": "float", "stop": "float"},
18
- "gui_config": {
19
- "scan_class_name": "LineScan",
20
- "arg_group": {
21
- "name": "Scan Arguments",
22
- "bundle": 3,
23
- "arg_inputs": {"device": "device", "start": "float", "stop": "float"},
24
- "inputs": [
25
- {
26
- "arg": True,
27
- "name": "device",
28
- "type": "device",
29
- "display_name": "Device",
30
- "tooltip": None,
31
- "default": None,
32
- "expert": False,
33
- },
34
- {
35
- "arg": True,
36
- "name": "start",
37
- "type": "float",
38
- "display_name": "Start",
39
- "tooltip": None,
40
- "default": None,
41
- "expert": False,
42
- },
43
- {
44
- "arg": True,
45
- "name": "stop",
46
- "type": "float",
47
- "display_name": "Stop",
48
- "tooltip": None,
49
- "default": None,
50
- "expert": False,
51
- },
52
- ],
53
- "min": 1,
54
- "max": None,
55
- },
56
- "kwarg_groups": [
57
- {
58
- "name": "Movement Parameters",
59
- "inputs": [
60
- {
61
- "arg": False,
62
- "name": "steps",
63
- "type": "int",
64
- "display_name": "Steps",
65
- "tooltip": "Number of steps",
66
- "default": None,
67
- "expert": False,
68
- },
69
- {
70
- "arg": False,
71
- "name": "relative",
72
- "type": "bool",
73
- "display_name": "Relative",
74
- "tooltip": "If True, the start and end positions are relative to the current position",
75
- "default": False,
76
- "expert": False,
77
- },
78
- ],
79
- },
80
- {
81
- "name": "Acquisition Parameters",
82
- "inputs": [
83
- {
84
- "arg": False,
85
- "name": "exp_time",
86
- "type": "float",
87
- "display_name": "Exp Time",
88
- "tooltip": "Exposure time in s",
89
- "default": 0,
90
- "expert": False,
91
- },
92
- {
93
- "arg": False,
94
- "name": "burst_at_each_point",
95
- "type": "int",
96
- "display_name": "Burst At Each Point",
97
- "tooltip": "Number of acquisition per point",
98
- "default": 1,
99
- "expert": False,
100
- },
101
- ],
102
- },
103
- ],
104
- },
105
- "required_kwargs": ["steps", "relative"],
106
- "arg_bundle_size": {"bundle": 3, "min": 1, "max": None},
107
- },
108
- "grid_scan": {
109
- "class": "Scan",
110
- "base_class": "ScanBase",
111
- "arg_input": {"device": "device", "start": "float", "stop": "float", "steps": "int"},
112
- "gui_config": {
113
- "scan_class_name": "Scan",
114
- "arg_group": {
115
- "name": "Scan Arguments",
116
- "bundle": 4,
117
- "arg_inputs": {
118
- "device": "device",
119
- "start": "float",
120
- "stop": "float",
121
- "steps": "int",
122
- },
123
- "inputs": [
124
- {
125
- "arg": True,
126
- "name": "device",
127
- "type": "device",
128
- "display_name": "Device",
129
- "tooltip": None,
130
- "default": None,
131
- "expert": False,
132
- },
133
- {
134
- "arg": True,
135
- "name": "start",
136
- "type": "float",
137
- "display_name": "Start",
138
- "tooltip": None,
139
- "default": None,
140
- "expert": False,
141
- },
142
- {
143
- "arg": True,
144
- "name": "stop",
145
- "type": "float",
146
- "display_name": "Stop",
147
- "tooltip": None,
148
- "default": None,
149
- "expert": False,
150
- },
151
- {
152
- "arg": True,
153
- "name": "steps",
154
- "type": "int",
155
- "display_name": "Steps",
156
- "tooltip": None,
157
- "default": None,
158
- "expert": False,
159
- },
160
- ],
161
- "min": 2,
162
- "max": None,
163
- },
164
- "kwarg_groups": [
165
- {
166
- "name": "Scan Parameters",
167
- "inputs": [
168
- {
169
- "arg": False,
170
- "name": "exp_time",
171
- "type": "float",
172
- "display_name": "Exp Time",
173
- "tooltip": "Exposure time in seconds",
174
- "default": 0,
175
- "expert": False,
176
- },
177
- {
178
- "arg": False,
179
- "name": "settling_time",
180
- "type": "float",
181
- "display_name": "Settling Time",
182
- "tooltip": "Settling time in seconds",
183
- "default": 0,
184
- "expert": False,
185
- },
186
- {
187
- "arg": False,
188
- "name": "burst_at_each_point",
189
- "type": "int",
190
- "display_name": "Burst At Each Point",
191
- "tooltip": "Number of exposures at each point",
192
- "default": 1,
193
- "expert": False,
194
- },
195
- {
196
- "arg": False,
197
- "name": "relative",
198
- "type": "bool",
199
- "display_name": "Relative",
200
- "tooltip": "If True, the motors will be moved relative to their current position",
201
- "default": False,
202
- "expert": False,
203
- },
204
- ],
205
- }
206
- ],
207
- },
208
- "required_kwargs": ["relative"],
209
- "arg_bundle_size": {"bundle": 4, "min": 2, "max": None},
210
- },
211
- "not_supported_scan_class": {"base_class": "NotSupportedScanClass"},
212
- }
213
- )
214
-
215
-
216
- @pytest.fixture(scope="function")
217
- def scan_control(qtbot, mocked_client): # , mock_dev):
218
- mocked_client.connector.set("scans/available_scans", available_scans_message)
219
- widget = ScanControl(client=mocked_client)
220
- qtbot.addWidget(widget)
221
- qtbot.waitExposed(widget)
222
- yield widget
223
-
224
-
225
- def test_populate_scans(scan_control, mocked_client):
226
- expected_scans = ["line_scan", "grid_scan"]
227
- items = [
228
- scan_control.comboBox_scan_selection.itemText(i)
229
- for i in range(scan_control.comboBox_scan_selection.count())
230
- ]
231
-
232
- assert scan_control.comboBox_scan_selection.count() == 2
233
- assert sorted(items) == sorted(expected_scans)
234
-
235
-
236
- @pytest.mark.parametrize("scan_name", ["line_scan", "grid_scan"])
237
- def test_on_scan_selected(scan_control, scan_name):
238
- expected_scan_info = available_scans_message.resource[scan_name]
239
- scan_control.comboBox_scan_selection.setCurrentText(scan_name)
240
-
241
- # Check arg_box labels and widgets
242
- for index, (arg_key, arg_value) in enumerate(expected_scan_info["arg_input"].items()):
243
- label = scan_control.arg_box.layout.itemAtPosition(0, index).widget()
244
- assert label.text().lower() == arg_key
245
-
246
- for row in range(1, expected_scan_info["arg_bundle_size"]["min"] + 1):
247
- widget = scan_control.arg_box.layout.itemAtPosition(row, index).widget()
248
- assert widget is not None # Confirm that a widget exists
249
- expected_widget_type = scan_control.arg_box.WIDGET_HANDLER.get(arg_value, None)
250
- assert isinstance(widget, expected_widget_type) # Confirm the widget type matches
251
-
252
- # Check kwargs boxes
253
- kwargs_group = [param for param in expected_scan_info["gui_config"]["kwarg_groups"]]
254
- print(kwargs_group)
255
-
256
- for kwarg_box, kwarg_group in zip(scan_control.kwarg_boxes, kwargs_group):
257
- assert kwarg_box.title() == kwarg_group["name"]
258
- for index, kwarg_info in enumerate(kwarg_group["inputs"]):
259
- label = kwarg_box.layout.itemAtPosition(0, index).widget()
260
- assert label.text() == kwarg_info["display_name"]
261
- widget = kwarg_box.layout.itemAtPosition(1, index).widget()
262
- expected_widget_type = kwarg_box.WIDGET_HANDLER.get(kwarg_info["type"], None)
263
- assert isinstance(widget, expected_widget_type)
264
-
265
-
266
- @pytest.mark.parametrize("scan_name", ["line_scan", "grid_scan"])
267
- def test_add_remove_bundle(scan_control, scan_name, qtbot):
268
- expected_scan_info = available_scans_message.resource[scan_name]
269
- scan_control.comboBox_scan_selection.setCurrentText(scan_name)
270
-
271
- # Initial number of args row
272
- initial_num_of_rows = scan_control.arg_box.count_arg_rows()
273
-
274
- assert initial_num_of_rows == expected_scan_info["arg_bundle_size"]["min"]
275
-
276
- scan_control.button_add_bundle.click()
277
- scan_control.button_add_bundle.click()
278
-
279
- if expected_scan_info["arg_bundle_size"]["max"] is None:
280
- assert scan_control.arg_box.count_arg_rows() == initial_num_of_rows + 2
281
-
282
- # Remove one bundle
283
- scan_control.button_remove_bundle.click()
284
- qtbot.wait(200)
285
-
286
- assert scan_control.arg_box.count_arg_rows() == initial_num_of_rows + 1
287
-
288
-
289
- def test_run_line_scan_with_parameters(scan_control, mocked_client):
290
- scan_name = "line_scan"
291
- kwargs = {"exp_time": 0.1, "steps": 10, "relative": True, "burst_at_each_point": 1}
292
- args = {"device": "samx", "start": -5, "stop": 5}
293
-
294
- scan_control.comboBox_scan_selection.setCurrentText(scan_name)
295
-
296
- # Set kwargs in the UI
297
- for kwarg_box in scan_control.kwarg_boxes:
298
- for widget in kwarg_box.widgets:
299
- for key, value in kwargs.items():
300
- if widget.arg_name == key:
301
- WidgetIO.set_value(widget, value)
302
- break
303
- # Set args in the UI
304
- for widget in scan_control.arg_box.widgets:
305
- for key, value in args.items():
306
- if widget.arg_name == key:
307
- WidgetIO.set_value(widget, value)
308
- break
309
-
310
- # Mock the scan function
311
- mocked_scan_function = MagicMock()
312
- setattr(mocked_client.scans, scan_name, mocked_scan_function)
313
-
314
- # Run the scan
315
- scan_control.button_run_scan.click()
316
-
317
- # Retrieve the actual arguments passed to the mock
318
- called_args, called_kwargs = mocked_scan_function.call_args
319
-
320
- # Check if the scan function was called correctly
321
- expected_device = mocked_client.device_manager.devices.samx
322
- expected_args_list = [expected_device, args["start"], args["stop"]]
323
- assert called_args == tuple(expected_args_list)
324
- assert called_kwargs == kwargs
@@ -1,160 +0,0 @@
1
- # pylint: disable = no-name-in-module,missing-class-docstring, missing-module-docstring
2
- import pytest
3
-
4
- from bec_widgets.utils.widget_io import WidgetIO
5
- from bec_widgets.widgets.scan_control.scan_group_box import ScanGroupBox
6
-
7
-
8
- def test_kwarg_box(qtbot):
9
- group_input = {
10
- "name": "Kwarg Test",
11
- "inputs": [
12
- # Test float
13
- {
14
- "arg": False,
15
- "name": "exp_time",
16
- "type": "float",
17
- "display_name": "Exp Time",
18
- "tooltip": "Exposure time in seconds",
19
- "default": 0,
20
- "expert": False,
21
- },
22
- # Test int
23
- {
24
- "arg": False,
25
- "name": "num_points",
26
- "type": "int",
27
- "display_name": "Num Points",
28
- "tooltip": "Number of points",
29
- "default": 1,
30
- "expert": False,
31
- },
32
- # Test bool
33
- {
34
- "arg": False,
35
- "name": "relative",
36
- "type": "bool",
37
- "display_name": "Relative",
38
- "tooltip": "If True, the motors will be moved relative to their current position",
39
- "default": False,
40
- "expert": False,
41
- },
42
- # Test str
43
- {
44
- "arg": False,
45
- "name": "scan_type",
46
- "type": "str",
47
- "display_name": "Scan Type",
48
- "tooltip": "Type of scan",
49
- "default": "line",
50
- "expert": False,
51
- },
52
- ],
53
- }
54
-
55
- kwarg_box = ScanGroupBox(box_type="kwargs", config=group_input)
56
- assert kwarg_box is not None
57
- assert kwarg_box.box_type == "kwargs"
58
- assert kwarg_box.config == group_input
59
- assert kwarg_box.title() == "Kwarg Test"
60
-
61
- # Labels
62
- assert kwarg_box.layout.itemAtPosition(0, 0).widget().text() == "Exp Time"
63
- assert kwarg_box.layout.itemAtPosition(0, 1).widget().text() == "Num Points"
64
- assert kwarg_box.layout.itemAtPosition(0, 2).widget().text() == "Relative"
65
- assert kwarg_box.layout.itemAtPosition(0, 3).widget().text() == "Scan Type"
66
-
67
- # Widget 0
68
- assert kwarg_box.widgets[0].__class__.__name__ == "ScanDoubleSpinBox"
69
- assert kwarg_box.widgets[0].arg_name == "exp_time"
70
- assert WidgetIO.get_value(kwarg_box.widgets[0]) == 0
71
- assert kwarg_box.widgets[0].toolTip() == "Exposure time in seconds"
72
-
73
- # Widget 1
74
- assert kwarg_box.widgets[1].__class__.__name__ == "ScanSpinBox"
75
- assert kwarg_box.widgets[1].arg_name == "num_points"
76
- assert WidgetIO.get_value(kwarg_box.widgets[1]) == 1
77
- assert kwarg_box.widgets[1].toolTip() == "Number of points"
78
-
79
- # Widget 2
80
- assert kwarg_box.widgets[2].__class__.__name__ == "ScanCheckBox"
81
- assert kwarg_box.widgets[2].arg_name == "relative"
82
- assert WidgetIO.get_value(kwarg_box.widgets[2]) == False
83
- assert (
84
- kwarg_box.widgets[2].toolTip()
85
- == "If True, the motors will be moved relative to their current position"
86
- )
87
-
88
- # Widget 3
89
- assert kwarg_box.widgets[3].__class__.__name__ == "ScanLineEdit"
90
- assert kwarg_box.widgets[3].arg_name == "scan_type"
91
- assert WidgetIO.get_value(kwarg_box.widgets[3]) == "line"
92
- assert kwarg_box.widgets[3].toolTip() == "Type of scan"
93
-
94
- parameters = kwarg_box.get_parameters()
95
- assert parameters == {"exp_time": 0, "num_points": 1, "relative": False, "scan_type": "line"}
96
-
97
-
98
- def test_arg_box(qtbot):
99
- group_input = {
100
- "name": "Arg Test",
101
- "inputs": [
102
- # Test device
103
- {
104
- "arg": True,
105
- "name": "device",
106
- "type": "str",
107
- "display_name": "Device",
108
- "tooltip": "Device to scan",
109
- "default": "samx",
110
- "expert": False,
111
- },
112
- # Test float
113
- {
114
- "arg": True,
115
- "name": "start",
116
- "type": "float",
117
- "display_name": "Start",
118
- "tooltip": "Start position",
119
- "default": 0,
120
- "expert": False,
121
- },
122
- # Test int
123
- {
124
- "arg": True,
125
- "name": "stop",
126
- "type": "int",
127
- "display_name": "Stop",
128
- "tooltip": "Stop position",
129
- "default": 1,
130
- "expert": False,
131
- },
132
- ],
133
- }
134
-
135
- arg_box = ScanGroupBox(box_type="args", config=group_input)
136
- assert arg_box is not None
137
- assert arg_box.box_type == "args"
138
- assert arg_box.config == group_input
139
- assert arg_box.title() == "Arg Test"
140
-
141
- # Labels
142
- assert arg_box.layout.itemAtPosition(0, 0).widget().text() == "Device"
143
- assert arg_box.layout.itemAtPosition(0, 1).widget().text() == "Start"
144
- assert arg_box.layout.itemAtPosition(0, 2).widget().text() == "Stop"
145
-
146
- # Widget 0
147
- assert arg_box.widgets[0].__class__.__name__ == "ScanLineEdit"
148
- assert arg_box.widgets[0].arg_name == "device"
149
- assert WidgetIO.get_value(arg_box.widgets[0]) == "samx"
150
- assert arg_box.widgets[0].toolTip() == "Device to scan"
151
-
152
- # Widget 1
153
- assert arg_box.widgets[1].__class__.__name__ == "ScanDoubleSpinBox"
154
- assert arg_box.widgets[1].arg_name == "start"
155
- assert WidgetIO.get_value(arg_box.widgets[1]) == 0
156
- assert arg_box.widgets[1].toolTip() == "Start position"
157
-
158
- # Widget 2
159
- assert arg_box.widgets[2].__class__.__name__ == "ScanSpinBox"
160
- assert arg_box.widgets[2].arg_name
@@ -1,96 +0,0 @@
1
- from unittest.mock import MagicMock, patch
2
-
3
- import pytest
4
- from qtpy.QtWidgets import QWidget
5
-
6
- from bec_widgets.qt_utils.settings_dialog import SettingsDialog, SettingWidget
7
-
8
- ###################################
9
- # SettingWidget base class tests
10
- ###################################
11
-
12
-
13
- @pytest.fixture
14
- def setting_widget(qtbot):
15
- widget = SettingWidget()
16
- qtbot.addWidget(widget)
17
- qtbot.waitExposed(widget)
18
- yield widget
19
-
20
-
21
- def test_setting_widget_initialization(setting_widget):
22
- assert setting_widget.target_widget is None
23
-
24
-
25
- def test_setting_widget_set_target_widget(setting_widget):
26
- mock_target = MagicMock(spec=QWidget)
27
- setting_widget.set_target_widget(mock_target)
28
- assert setting_widget.target_widget == mock_target
29
-
30
-
31
- def test_setting_widget_accept_changes(setting_widget):
32
- with patch.object(setting_widget, "accept_changes") as mock_accept_changes:
33
- setting_widget.accept_changes()
34
- mock_accept_changes.assert_called_once()
35
-
36
-
37
- def test_setting_widget_display_current_settings(setting_widget):
38
- config_dict = {"setting1": "value1", "setting2": "value2"}
39
- with patch.object(setting_widget, "display_current_settings") as mock_display_current_settings:
40
- setting_widget.display_current_settings(config_dict)
41
- mock_display_current_settings.assert_called_once_with(config_dict)
42
-
43
-
44
- ###################################
45
- # SettingsDialog tests
46
- ###################################
47
- @pytest.fixture
48
- def settings_dialog(qtbot, setting_widget):
49
- parent_widget = QWidget()
50
- setting_widget.set_target_widget = MagicMock()
51
- setting_widget.display_current_settings = MagicMock()
52
- setting_widget.accept_changes = MagicMock()
53
-
54
- dialog = SettingsDialog(
55
- parent=parent_widget,
56
- settings_widget=setting_widget,
57
- window_title="Test Settings",
58
- config={"setting1": "value1", "setting2": "value2"},
59
- )
60
- qtbot.addWidget(dialog)
61
- qtbot.waitExposed(dialog)
62
- yield dialog, parent_widget, setting_widget
63
- parent_widget.close()
64
- parent_widget.deleteLater()
65
-
66
-
67
- def test_settings_dialog_initialization(settings_dialog):
68
- dialog, parent_widget, settings_widget = settings_dialog
69
-
70
- assert dialog.windowTitle() == "Test Settings"
71
- settings_widget.set_target_widget.assert_called_once_with(parent_widget)
72
- settings_widget.display_current_settings.assert_called_once_with(
73
- {"setting1": "value1", "setting2": "value2"}
74
- )
75
-
76
-
77
- def test_settings_dialog_accept(settings_dialog, qtbot):
78
- dialog, _, settings_widget = settings_dialog
79
-
80
- dialog.button_box.buttons()[0].click() # OK Button
81
- settings_widget.accept_changes.assert_called_once()
82
-
83
-
84
- def test_settings_dialog_reject(settings_dialog, qtbot):
85
- dialog, _, _ = settings_dialog
86
-
87
- with patch.object(dialog, "reject", wraps=dialog.reject) as mock_reject:
88
- dialog.button_box.buttons()[1].click() # Cancel Button
89
- mock_reject.assert_called_once()
90
-
91
-
92
- def test_settings_dialog_apply_changes(settings_dialog, qtbot):
93
- dialog, _, settings_widget = settings_dialog
94
-
95
- dialog.apply_button.click()
96
- settings_widget.accept_changes.assert_called_once()
@@ -1,31 +0,0 @@
1
- import pytest
2
-
3
- from bec_widgets.utils.colors import apply_theme
4
- from bec_widgets.utils.reference_utils import snap_and_compare
5
- from bec_widgets.widgets.spinner.spinner import SpinnerWidget
6
-
7
-
8
- @pytest.fixture
9
- def spinner_widget(qtbot):
10
- apply_theme("light")
11
- spinner = SpinnerWidget()
12
- qtbot.addWidget(spinner)
13
- qtbot.waitExposed(spinner)
14
- yield spinner
15
- spinner.close()
16
-
17
-
18
- def test_spinner_widget_paint_event(spinner_widget, qtbot):
19
- spinner_widget.paintEvent(None)
20
-
21
-
22
- def test_spinner_widget_rendered(spinner_widget, qtbot, tmpdir):
23
- spinner_widget.update()
24
- qtbot.wait(200)
25
- snap_and_compare(spinner_widget, str(tmpdir), suffix="")
26
-
27
- spinner_widget._started = True
28
- spinner_widget.update()
29
- qtbot.wait(200)
30
-
31
- snap_and_compare(spinner_widget, str(tmpdir), suffix="started")
@@ -1,27 +0,0 @@
1
- # pylint: disable=missing-function-docstring, missing-module-docstring, unused-import
2
-
3
- import pytest
4
-
5
- from bec_widgets.widgets.stop_button.stop_button import StopButton
6
-
7
- from .client_mocks import mocked_client
8
-
9
-
10
- @pytest.fixture
11
- def stop_button(qtbot, mocked_client):
12
- widget = StopButton(client=mocked_client)
13
- qtbot.addWidget(widget)
14
- qtbot.waitExposed(widget)
15
- yield widget
16
-
17
-
18
- def test_stop_button(stop_button):
19
- assert stop_button.text() == "Stop"
20
- assert (
21
- stop_button.styleSheet()
22
- == "background-color: #cc181e; color: white; font-weight: bold; font-size: 12px;"
23
- )
24
- stop_button.click()
25
- assert stop_button.queue.request_scan_abortion.called
26
- assert stop_button.queue.request_queue_reset.called
27
- stop_button.close()