From 23e9991506bca6312bdd3339b9327a76c0f4a9cc Mon Sep 17 00:00:00 2001 From: James Souter Date: Wed, 8 Jan 2025 13:29:52 +0000 Subject: [PATCH] Use MonitorQueue in soft signal backend tests --- src/ophyd_async/testing/_assert.py | 6 ++- tests/core/test_soft_signal_backend.py | 70 +++++++------------------- 2 files changed, 23 insertions(+), 53 deletions(-) diff --git a/src/ophyd_async/testing/_assert.py b/src/ophyd_async/testing/_assert.py index dbbd1c9647..f998dee221 100644 --- a/src/ophyd_async/testing/_assert.py +++ b/src/ophyd_async/testing/_assert.py @@ -145,9 +145,10 @@ def __eq__(self, value): class MonitorQueue(AbstractContextManager): - def __init__(self, signal: SignalR): + def __init__(self, signal: SignalR, monotonic=False): self.signal = signal self.updates: asyncio.Queue[dict[str, Reading]] = asyncio.Queue() + self._monotonic_timestamps = monotonic async def assert_updates(self, expected_value): # Get an update, value and reading @@ -159,10 +160,11 @@ async def assert_updates(self, expected_value): # Check they match what we expected assert value == expected_value assert type(value) is expected_type + timestamp = time.monotonic() if self._monotonic_timestamps else time.time() expected_reading = { self.signal.name: { "value": expected_value, - "timestamp": pytest.approx(time.time(), rel=0.1), + "timestamp": pytest.approx(timestamp, rel=0.1), "alarm_severity": 0, } } diff --git a/tests/core/test_soft_signal_backend.py b/tests/core/test_soft_signal_backend.py index f5c0b15c88..63b2421cdc 100644 --- a/tests/core/test_soft_signal_backend.py +++ b/tests/core/test_soft_signal_backend.py @@ -1,21 +1,18 @@ -import asyncio import os -import time from collections.abc import Callable, Sequence from typing import Any import numpy as np import pytest -from bluesky.protocols import Reading from ophyd_async.core import ( Array1D, - SignalBackend, SoftSignalBackend, StrictEnum, T, soft_signal_rw, ) +from ophyd_async.testing import MonitorQueue class MyEnum(StrictEnum): @@ -44,30 +41,6 @@ def waveform_d(value): return {"dtype": "array", "shape": [len(value)]} -class MonitorQueue: - def __init__(self, backend: SignalBackend): - self.backend = backend - self.updates: asyncio.Queue[Reading] = asyncio.Queue() - backend.set_callback(self.updates.put_nowait) - - async def assert_updates(self, expected_value): - expected_reading = { - "value": expected_value, - "timestamp": pytest.approx(time.monotonic(), rel=0.1), - "alarm_severity": 0, - } - reading = await self.updates.get() - - backend_value = await self.backend.get_value() - backend_reading = await self.backend.get_reading() - - assert reading["value"] == expected_value == backend_value - assert reading == expected_reading == backend_reading - - def close(self): - self.backend.set_callback(None) - - # Can be removed once numpy >=2 is pinned. default_int_type = ( "