|
6 | 6 |
|
7 | 7 | import numpy
|
8 | 8 | import pytest
|
| 9 | +from bluesky import Msg |
9 | 10 | from bluesky.protocols import Reading
|
| 11 | +from bluesky.run_engine import call_in_bluesky_event_loop |
| 12 | +from bluesky.suspenders import ( |
| 13 | + SuspendBoolHigh, |
| 14 | + SuspendBoolLow, |
| 15 | + SuspendCeil, |
| 16 | + SuspendFloor, |
| 17 | + SuspendInBand, |
| 18 | + SuspendOutBand, |
| 19 | + SuspendWhenOutsideBand, |
| 20 | +) |
10 | 21 |
|
11 | 22 | from ophyd_async.core import (
|
12 | 23 | DEFAULT_TIMEOUT,
|
@@ -457,3 +468,58 @@ def some_function(self):
|
457 | 468 | assert isinstance((await signal.get_value()), SomeClass)
|
458 | 469 | await signal.set(1)
|
459 | 470 | assert (await signal.get_value()) == 1
|
| 471 | + |
| 472 | + |
| 473 | +@pytest.mark.parametrize( |
| 474 | + "klass,sc_args,start_val,fail_val,resume_val,wait_time", |
| 475 | + [ |
| 476 | + (SuspendBoolHigh, (), 0, 1, 0, 0.2), |
| 477 | + (SuspendBoolLow, (), 1, 0, 1, 0.2), |
| 478 | + (SuspendFloor, (0.5,), 1, 0, 1, 0.2), |
| 479 | + (SuspendCeil, (0.5,), 0, 1, 0, 0.2), |
| 480 | + (SuspendWhenOutsideBand, (0.5, 1.5), 1, 0, 1, 0.2), |
| 481 | + ((SuspendInBand, True), (0.5, 1.5), 1, 0, 1, 0.2), # renamed to WhenOutsideBand |
| 482 | + ((SuspendOutBand, True), (0.5, 1.5), 0, 1, 0, 0.2), |
| 483 | + ], |
| 484 | +) # deprecated |
| 485 | +async def test_bluesky_suspenders( |
| 486 | + klass, sc_args, start_val, fail_val, resume_val, wait_time, RE |
| 487 | +): |
| 488 | + sleep_time = 0.2 |
| 489 | + fail_time = 0.1 |
| 490 | + resume_time = 0.5 |
| 491 | + signal = epics_signal_rw(int, "mock_signal") |
| 492 | + await signal.connect(mock=True) |
| 493 | + try: |
| 494 | + klass, deprecated = klass |
| 495 | + except TypeError: |
| 496 | + deprecated = False |
| 497 | + if deprecated: |
| 498 | + with pytest.warns(UserWarning): |
| 499 | + suspender = klass(signal, *sc_args, sleep=wait_time) |
| 500 | + else: |
| 501 | + suspender = klass(signal, *sc_args, sleep=wait_time) |
| 502 | + |
| 503 | + RE.install_suspender(suspender) |
| 504 | + |
| 505 | + await signal.set(start_val) |
| 506 | + |
| 507 | + async def _set_after_time(): |
| 508 | + await asyncio.sleep(fail_time) |
| 509 | + await signal.set(fail_val) |
| 510 | + await asyncio.sleep(resume_time - fail_time) |
| 511 | + await signal.set(resume_val) |
| 512 | + |
| 513 | + start = time.time() |
| 514 | + |
| 515 | + # loop = RE.loop |
| 516 | + |
| 517 | + call_in_bluesky_event_loop(_set_after_time()) |
| 518 | + # task = RE.loop.create_task(_set_after_time()) |
| 519 | + |
| 520 | + RE([Msg("checkpoint"), Msg("sleep", None, sleep_time)]) |
| 521 | + |
| 522 | + stop = time.time() |
| 523 | + delta = stop - start |
| 524 | + # await task |
| 525 | + assert delta >= resume_time + sleep_time + wait_time |
0 commit comments