Skip to content

Commit aaee94b

Browse files
committed
Initial system tests
1 parent 5cdfa53 commit aaee94b

File tree

2 files changed

+179
-0
lines changed

2 files changed

+179
-0
lines changed

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ PyHamcrest
88
requests
99
six
1010
unittest-xml-reporting
11+
ibex_bluesky_core

test_bluesky.py

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
import unittest
2+
from io import StringIO
3+
4+
from utilities.utilities import (
5+
g,
6+
load_config_if_not_already_loaded,
7+
set_genie_python_raises_exceptions,
8+
)
9+
from ibex_bluesky_core.run_engine import get_run_engine
10+
from bluesky.run_engine import RunEngine
11+
import bluesky.plan_stubs as bps
12+
import bluesky.plans as bp
13+
from ophyd_async.plan_stubs import ensure_connected
14+
from ibex_bluesky_core.devices.block import block_r, block_rw, block_rw_rbv
15+
from bluesky.preprocessors import subs_decorator
16+
from bluesky.callbacks import LiveTable
17+
from ibex_bluesky_core.callbacks.plotting import LivePlot
18+
from ibex_bluesky_core.devices import get_pv_prefix
19+
from ibex_bluesky_core.devices.simpledae import SimpleDae
20+
from ibex_bluesky_core.devices.simpledae.controllers import PeriodPerPointController, RunPerPointController
21+
from ibex_bluesky_core.devices.simpledae.waiters import GoodFramesWaiter, PeriodGoodFramesWaiter
22+
from ibex_bluesky_core.devices.simpledae.reducers import GoodFramesNormalizer, PeriodGoodFramesNormalizer
23+
24+
RE: RunEngine = get_run_engine()
25+
26+
P3_INIT_VALUE = 123.456
27+
P5_INIT_VALUE = 987.654321
28+
29+
30+
class TestBluesky(unittest.TestCase):
31+
def setUp(self):
32+
g.set_instrument(None)
33+
# load_config_if_not_already_loaded("bluesky_sys_test")
34+
set_genie_python_raises_exceptions(True)
35+
g.cset("p3", P3_INIT_VALUE)
36+
g.cset("p5", P5_INIT_VALUE)
37+
38+
def _run_per_point_dae(self) -> SimpleDae:
39+
prefix = get_pv_prefix()
40+
controller = RunPerPointController(save_run=True)
41+
waiter = GoodFramesWaiter(100)
42+
reducer = GoodFramesNormalizer(
43+
prefix=prefix,
44+
detector_spectra=[i for i in range(1, 10)],
45+
)
46+
47+
dae = SimpleDae(
48+
prefix=prefix,
49+
controller=controller,
50+
waiter=waiter,
51+
reducer=reducer,
52+
)
53+
return dae
54+
55+
def _period_per_point_dae(self) -> SimpleDae:
56+
prefix = get_pv_prefix()
57+
controller = PeriodPerPointController(save_run=True)
58+
waiter = PeriodGoodFramesWaiter(100)
59+
reducer = PeriodGoodFramesNormalizer(
60+
prefix=prefix,
61+
detector_spectra=[i for i in range(1, 10)],
62+
)
63+
64+
dae = SimpleDae(
65+
prefix=prefix,
66+
controller=controller,
67+
waiter=waiter,
68+
reducer=reducer,
69+
)
70+
return dae
71+
72+
def test_rd_block(self):
73+
def _plan():
74+
p3 = block_r(float, "p3")
75+
yield from ensure_connected(p3)
76+
return (yield from bps.rd(p3))
77+
78+
result = RE(_plan())
79+
80+
self.assertAlmostEqual(result.plan_result, P3_INIT_VALUE, places=5)
81+
82+
def test_abs_scan_two_blocks(self):
83+
def _plan():
84+
p3 = block_r(float, "p3")
85+
p5 = block_rw_rbv(float, "p5")
86+
yield from ensure_connected(p3, p5)
87+
yield from bp.scan([p3], p5, -10, 10, num=41)
88+
89+
RE(_plan())
90+
91+
# At end of scan, p5 should be left at last value by default.
92+
self.assertAlmostEqual(g.cget("p5")["value"], 10)
93+
94+
def test_rel_scan_two_blocks(self):
95+
def _plan():
96+
p3 = block_r(float, "p3")
97+
p5 = block_rw_rbv(float, "p5")
98+
yield from ensure_connected(p3, p5)
99+
yield from bp.rel_scan([p3], p5, -10, 10, num=41)
100+
101+
RE(_plan())
102+
103+
# After a rel_scan, the movable is moved back to original value
104+
self.assertAlmostEqual(g.cget("p5")["value"], P5_INIT_VALUE)
105+
106+
def test_scan_with_livetable_callback(self):
107+
livetable_lines = []
108+
109+
@subs_decorator([
110+
LiveTable(["p3", "p5"], out=livetable_lines.append),
111+
])
112+
def _plan():
113+
p3 = block_r(float, "p3")
114+
p5 = block_rw_rbv(float, "p5")
115+
yield from ensure_connected(p3, p5)
116+
yield from bp.scan([p3], p5, -10, 10, num=41)
117+
118+
RE(_plan())
119+
120+
# Tricky as livetable contains timestamps etc, but check that the table
121+
# describes the first and last point we were trying to measure, with appropriate
122+
# precisions.
123+
self.assertTrue(any("| 123.456 | -10.00000 |" in line for line in livetable_lines))
124+
self.assertTrue(any("| 123.456 | 10.00000 |" in line for line in livetable_lines))
125+
126+
def test_count_simple_dae(self):
127+
start_run_number = int(g.get_runnumber())
128+
129+
def _plan():
130+
dae = self._run_per_point_dae()
131+
yield from ensure_connected(dae)
132+
yield from bps.mv(dae.number_of_periods, 1)
133+
yield from bp.count([dae])
134+
135+
RE(_plan())
136+
end_run_number = int(g.get_runnumber())
137+
138+
self.assertEqual(start_run_number + 1, end_run_number)
139+
140+
def test_scan_simple_dae_in_run_per_point_mode(self):
141+
npoints = 3
142+
start_run_number = int(g.get_runnumber())
143+
144+
def _plan():
145+
dae = self._run_per_point_dae()
146+
p3 = block_rw_rbv(float, "p3")
147+
yield from ensure_connected(dae, p3)
148+
yield from bps.mv(dae.number_of_periods, 1)
149+
yield from bp.scan([dae], p3, 0, 10, num=npoints)
150+
151+
RE(_plan())
152+
end_run_number = int(g.get_runnumber())
153+
154+
# Assert we've done npoints runs
155+
self.assertEqual(start_run_number + npoints, end_run_number)
156+
157+
def test_scan_simple_dae_in_period_per_point_mode(self):
158+
npoints = 3
159+
start_run_number = int(g.get_runnumber())
160+
161+
def _plan():
162+
dae = self._period_per_point_dae()
163+
p3 = block_rw_rbv(float, "p3")
164+
yield from ensure_connected(dae, p3)
165+
yield from bps.mv(dae.number_of_periods, npoints)
166+
yield from bp.scan([dae], p3, 0, 10, num=npoints)
167+
168+
RE(_plan())
169+
end_run_number = int(g.get_runnumber())
170+
171+
# Assert we've done only one run
172+
self.assertEqual(start_run_number + 1, end_run_number)
173+
# Assert we successfully set npoints periods
174+
self.assertEqual(g.get_number_periods(), npoints)
175+
176+
177+
if __name__ == "__main__":
178+
unittest.main()

0 commit comments

Comments
 (0)