97 lines
2.3 KiB
Python
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)
|