from enum import Enum from unittest.mock import patch import pytest from aare.devices.enum_pv import EnumPV class MockPV: def __init__(self, name): self.pvname = name self.enum_strs = None self.value = None def get(self, as_string=False): if as_string: return str(self.value) return self.value def put(self, value): self.value = value @pytest.fixture def mock_pvs(): with patch("aare.devices.set_get_pv.PV") as mock_pv: set_pv = MockPV("SET") get_pv = MockPV("GET") mock_pv.side_effect = lambda name: set_pv if name == "SET" else get_pv yield set_pv, get_pv def test_enum_pv_init_fail(mock_pvs): set_pv, _get_pv = mock_pvs set_pv.enum_strs = None with pytest.raises(RuntimeError): EnumPV("test", "SET", "GET") def test_enum_pv_init_success(mock_pvs): set_pv, _get_pv = mock_pvs set_pv.enum_strs = ("State1", "State2") epv = EnumPV("test", "SET", "GET") assert epv.name == "test" def test_enum_pv_position(mock_pvs): set_pv, get_pv = mock_pvs set_pv.enum_strs = ("State1", "State2") get_pv.value = "State1" epv = EnumPV("test", "SET", "GET") assert epv.position == "State1" def test_enum_pv_resolve_enum(mock_pvs): set_pv, _get_pv = mock_pvs set_pv.enum_strs = ("State1", "State2") epv = EnumPV("test", "SET", "GET") class MyEnum(Enum): State1 = 1 res = epv._resolve(MyEnum.State1) assert res.target == "State1" def test_enum_pv_resolve_int(mock_pvs): set_pv, _get_pv = mock_pvs set_pv.enum_strs = ("State1", "State2") epv = EnumPV("test", "SET", "GET") res = epv._resolve(0) assert res.target == "State1" with pytest.raises(ValueError): epv._resolve(5) def test_enum_pv_resolve_str(mock_pvs): set_pv, _get_pv = mock_pvs set_pv.enum_strs = (" State1 ", "State2") epv = EnumPV("test", "SET", "GET") res = epv._resolve("state1") assert res.target == " State1 " with pytest.raises(ValueError): epv._resolve("Missing") def test_enum_pv_resolve_invalid_type(mock_pvs): set_pv, _get_pv = mock_pvs set_pv.enum_strs = ("State1", "State2") epv = EnumPV("test", "SET", "GET") with pytest.raises(TypeError): epv._resolve(1.5)