85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
from aarecommon.models.beamline import MXBeamline
|
|
|
|
from aare.devices.fluorimeter import Fluorimeter
|
|
|
|
|
|
@patch("aare.devices.fluorimeter.PV")
|
|
def test_fluorimeter_init(mock_pv):
|
|
_ = Fluorimeter(MXBeamline.X06DA)
|
|
# Lots of PVs in __init__
|
|
assert mock_pv.call_count >= 20
|
|
|
|
|
|
@patch("aare.devices.fluorimeter.PV")
|
|
def test_fluorimeter_acquisition(mock_pv):
|
|
mock_start = MagicMock()
|
|
mock_stop = MagicMock()
|
|
mock_erase_start = MagicMock()
|
|
|
|
# We need to map which mock is which.
|
|
# __init__ order: start, stop, erase_and_start, erase, ...
|
|
mock_pv.side_effect = [mock_start, mock_stop, mock_erase_start] + [MagicMock()] * 50
|
|
|
|
fluo = Fluorimeter(MXBeamline.X06DA)
|
|
|
|
fluo.start_acquisition(erase=False)
|
|
mock_start.put.assert_called_with(1)
|
|
|
|
fluo.start_acquisition(erase=True)
|
|
mock_erase_start.put.assert_called_with(1)
|
|
|
|
fluo.stop_acquisition()
|
|
mock_stop.put.assert_called_with(1)
|
|
|
|
|
|
@patch("aare.devices.fluorimeter.PV")
|
|
def test_fluorimeter_status(mock_pv):
|
|
mock_status = MagicMock()
|
|
# status is the 6th PV in __init__
|
|
mock_pv.side_effect = [MagicMock()] * 5 + [mock_status] + [MagicMock()] * 50
|
|
fluo = Fluorimeter(MXBeamline.X06DA)
|
|
|
|
mock_status.get.return_value = 0
|
|
assert fluo.check_status_done() is True
|
|
assert fluo.check_status_acquiring() is None
|
|
|
|
mock_status.get.return_value = 1
|
|
assert fluo.check_status_done() is None
|
|
assert fluo.check_status_acquiring() is True
|
|
|
|
|
|
@patch("aare.devices.fluorimeter.poll")
|
|
@patch("aare.devices.fluorimeter.PV")
|
|
def test_fluorimeter_wait_timeout(mock_pv, mock_poll):
|
|
mock_status = MagicMock()
|
|
mock_pv.side_effect = [MagicMock()] * 5 + [mock_status] + [MagicMock()] * 50
|
|
fluo = Fluorimeter(MXBeamline.X06DA)
|
|
|
|
mock_status.get.return_value = 1 # Acquiring (not done)
|
|
with pytest.raises(TimeoutError, match="timeout waiting for done"):
|
|
fluo.wait_till_done(timeout_s=0.1)
|
|
|
|
|
|
@patch("aare.devices.fluorimeter.PV")
|
|
def test_fluorimeter_properties(mock_pv):
|
|
mock_real_time = MagicMock()
|
|
# real_time is 7th PV
|
|
mock_pv.side_effect = [MagicMock()] * 6 + [mock_real_time] + [MagicMock()] * 50
|
|
fluo = Fluorimeter(MXBeamline.X06DA)
|
|
|
|
mock_real_time.get.return_value = 10.0
|
|
assert fluo.real_time == 10.0
|
|
|
|
fluo.real_time = 20.0
|
|
mock_real_time.put.assert_called_with(20.0)
|
|
|
|
|
|
def test_fluorimeter_roi_error():
|
|
with patch("aare.devices.fluorimeter.PV"):
|
|
fluo = Fluorimeter(MXBeamline.X06DA)
|
|
with pytest.raises(ValueError, match="Invalid ROI number"):
|
|
fluo.get_roi("BL", 3)
|