Files

97 lines
2.3 KiB
Python

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)