diff --git a/src/ophyd_async/epics/signal/_common.py b/src/ophyd_async/epics/signal/_common.py index 82070ef38e..34d344ba07 100644 --- a/src/ophyd_async/epics/signal/_common.py +++ b/src/ophyd_async/epics/signal/_common.py @@ -55,7 +55,7 @@ def get_supported_values( f"which do not match {datatype}, which has {choices}." ) return {x: datatype(x) if x else "_" for x in pv_choices} - elif datatype is None: + elif datatype is None or datatype is str: return {x: x or "_" for x in pv_choices} raise TypeError( diff --git a/tests/epics/signal/test_common.py b/tests/epics/signal/test_common.py index e45a78f031..7a16a59a51 100644 --- a/tests/epics/signal/test_common.py +++ b/tests/epics/signal/test_common.py @@ -35,8 +35,14 @@ class MyEnum(str, Enum): get_supported_values("", MyEnum, ("test",)) -def test_given_no_supplied_enum_then_returns_generated_choices_enum_with_pv_choices(): - supported_vals = get_supported_values("", None, ("test",)) +@pytest.mark.parametrize( + "datatype", + [None, str], +) +def test_given_no_enum_or_string_then_returns_generated_choices_enum_with_pv_choices( + datatype, +): + supported_vals = get_supported_values("", datatype, ("test",)) assert len(supported_vals) == 1 assert "test" in supported_vals diff --git a/tests/epics/signal/test_signals.py b/tests/epics/signal/test_signals.py index 61c0ca5d68..d0e418db2c 100644 --- a/tests/epics/signal/test_signals.py +++ b/tests/epics/signal/test_signals.py @@ -769,6 +769,19 @@ async def test_str_enum_returns_enum(ioc: IOC): assert val == "Bbb" +async def test_str_datatype_in_mbbo(ioc: IOC): + backend = await ioc.make_backend(MyEnum, "enum") + pv_name = f"{ioc.protocol}://{PV_PREFIX}:{ioc.protocol}:enum" + sig = epics_signal_rw(str, pv_name) + datakey = await backend.get_datakey(sig.source) + assert datakey["choices"] == ["Aaa", "Bbb", "Ccc"] + await sig.connect() + description = await sig.describe() + assert description[""]["choices"] == ["Aaa", "Bbb", "Ccc"] + val = await sig.get_value() + assert val == "Bbb" + + async def test_runtime_enum_returns_str(ioc: IOC): await ioc.make_backend(MySubsetEnum, "enum") pv_name = f"{ioc.protocol}://{PV_PREFIX}:{ioc.protocol}:enum"