A test for _send_jog_command
This commit is contained in:
parent
b4c2a7271a
commit
22994bdf9b
1 changed files with 85 additions and 0 deletions
|
|
@ -371,6 +371,91 @@ def test_jog_commands_are_sent(dummy_stage, mocker, caplog):
|
||||||
assert command_3.displacement is None
|
assert command_3.displacement is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_send_jog_commands(dummy_stage, mocker, caplog):
|
||||||
|
"""Check that the jog command acts as expected."""
|
||||||
|
|
||||||
|
# Create a way to make mock threads.
|
||||||
|
def mock_thread_factory(*_args, **_kwargs):
|
||||||
|
"""Return a mock thread instance that claims to be alive."""
|
||||||
|
mock_instance = mocker.Mock()
|
||||||
|
mock_instance.is_alive.return_value = True
|
||||||
|
return mock_instance
|
||||||
|
|
||||||
|
# Mock both the Queue class and threading.Thread to incercept calls.
|
||||||
|
mock_queue = mocker.patch(
|
||||||
|
"openflexure_microscope_server.things.stage.JogQueue", side_effect=mocker.Mock
|
||||||
|
)
|
||||||
|
mock_thread = mocker.patch(
|
||||||
|
"openflexure_microscope_server.things.stage.threading.Thread",
|
||||||
|
side_effect=mock_thread_factory,
|
||||||
|
)
|
||||||
|
|
||||||
|
commands = [
|
||||||
|
JogCommand([1, 1, 1]),
|
||||||
|
JogCommand([2, 2, 2]),
|
||||||
|
JogCommand([3, 3, 3]),
|
||||||
|
JogCommand([4, 4, 4]),
|
||||||
|
]
|
||||||
|
# First call, will create a new thread and a new queue
|
||||||
|
dummy_stage._send_jog_command(commands[0])
|
||||||
|
|
||||||
|
# Both a new queue and a new thread are created
|
||||||
|
assert mock_queue.call_count == 1
|
||||||
|
assert mock_thread.call_count == 1
|
||||||
|
# The thread target is the jog loop
|
||||||
|
assert mock_thread.call_args.kwargs["target"] == dummy_stage._jog_loop
|
||||||
|
# Args are jut the first command
|
||||||
|
thread_args = mock_thread.call_args.kwargs["args"]
|
||||||
|
assert len(thread_args) == 1
|
||||||
|
assert thread_args[0] is commands[0]
|
||||||
|
# Nothing yet put in the thread
|
||||||
|
assert dummy_stage._jog_queue.put.call_count == 0
|
||||||
|
|
||||||
|
# Send second command:
|
||||||
|
dummy_stage._send_jog_command(commands[1])
|
||||||
|
|
||||||
|
# No new queue or thread created
|
||||||
|
assert mock_queue.call_count == 1
|
||||||
|
assert mock_thread.call_count == 1
|
||||||
|
# Put is used instead
|
||||||
|
assert dummy_stage._jog_queue.put.call_count == 1
|
||||||
|
# Called with the second command
|
||||||
|
assert dummy_stage._jog_queue.put.call_args.args[0] is commands[1]
|
||||||
|
|
||||||
|
# Make it so the thread has finished
|
||||||
|
dummy_stage._jog_thread.is_alive.return_value = False
|
||||||
|
assert not dummy_stage._jog_thread.is_alive()
|
||||||
|
|
||||||
|
# 3rd call call, will create a new thread and a new queue
|
||||||
|
dummy_stage._send_jog_command(commands[2])
|
||||||
|
|
||||||
|
# Thread is alive again
|
||||||
|
assert dummy_stage._jog_thread.is_alive()
|
||||||
|
# Both a new queue and a new thread are created
|
||||||
|
assert mock_queue.call_count == 2
|
||||||
|
assert mock_thread.call_count == 2
|
||||||
|
# The thread target is the jog loop
|
||||||
|
assert mock_thread.call_args.kwargs["target"] == dummy_stage._jog_loop
|
||||||
|
# Args are jut the first command
|
||||||
|
thread_args = mock_thread.call_args.kwargs["args"]
|
||||||
|
assert len(thread_args) == 1
|
||||||
|
assert thread_args[0] is commands[2]
|
||||||
|
# New queue is never used
|
||||||
|
assert dummy_stage._jog_queue.put.call_count == 0
|
||||||
|
|
||||||
|
# Finally acquire the jog lock
|
||||||
|
with dummy_stage._jog_lock:
|
||||||
|
# and check a warning is thrown
|
||||||
|
with caplog.at_level(logging.WARNING):
|
||||||
|
dummy_stage._send_jog_command(commands[3])
|
||||||
|
assert len(caplog.records) == 1
|
||||||
|
# No new thread or queue created
|
||||||
|
assert mock_queue.call_count == 2
|
||||||
|
assert mock_thread.call_count == 2
|
||||||
|
# And still nothing added to the queue
|
||||||
|
assert dummy_stage._jog_queue.put.call_count == 0
|
||||||
|
|
||||||
|
|
||||||
def test_get_jog_from_queue_most_recent(dummy_stage):
|
def test_get_jog_from_queue_most_recent(dummy_stage):
|
||||||
"""Test that the jog queue gives the most recent Jog Command."""
|
"""Test that the jog queue gives the most recent Jog Command."""
|
||||||
# Try to stack 4 moves in the queue, only 1 should be queued.
|
# Try to stack 4 moves in the queue, only 1 should be queued.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue