Continue improving simulation camera tests

This commit is contained in:
Julian Stirling 2026-01-11 14:58:21 +00:00
parent 0abbd827fd
commit 40a2e4c6ed
2 changed files with 48 additions and 8 deletions

View file

@ -9,8 +9,6 @@ import numpy as np
import pytest import pytest
from PIL import Image from PIL import Image
import labthings_fastapi as lt
from openflexure_microscope_server.things.camera.simulation import SimulatedCamera from openflexure_microscope_server.things.camera.simulation import SimulatedCamera
from openflexure_microscope_server.things.stage.dummy import DummyStage from openflexure_microscope_server.things.stage.dummy import DummyStage
@ -18,7 +16,7 @@ from ..shared_utils.lt_test_utils import LabThingsTestEnv
@pytest.fixture @pytest.fixture
def test_env() -> lt.ThingClient: def test_env() -> LabThingsTestEnv:
"""Yield a test environment with the Simulated Camera and Dummy Stage.""" """Yield a test environment with the Simulated Camera and Dummy Stage."""
thing_conf = {"camera": SimulatedCamera, "stage": DummyStage} thing_conf = {"camera": SimulatedCamera, "stage": DummyStage}
with LabThingsTestEnv(things=thing_conf) as env: with LabThingsTestEnv(things=thing_conf) as env:

View file

@ -1,7 +1,9 @@
"""Test the functionality specific to the simulated camera.""" """Test the functionality specific to the simulated camera."""
import logging import logging
import time
import numpy as np
import pytest import pytest
from hypothesis import given from hypothesis import given
from hypothesis import strategies as st from hypothesis import strategies as st
@ -16,13 +18,25 @@ from ..shared_utils.lt_test_utils import LabThingsTestEnv
@pytest.fixture @pytest.fixture
def test_env() -> lt.ThingClient: def test_env() -> LabThingsTestEnv:
"""Yield a test environment with the Simulated Camera and Dummy Stage.""" """Yield a test environment with the Simulated Camera and Dummy Stage."""
thing_conf = {"camera": SimulatedCamera, "stage": DummyStage} thing_conf = {"camera": SimulatedCamera, "stage": DummyStage}
with LabThingsTestEnv(things=thing_conf) as env: with LabThingsTestEnv(things=thing_conf) as env:
yield env yield env
@pytest.fixture
def camera(test_env) -> lt.Thing:
"""Return the SimulatedCamera Thing set up in the test environment."""
return test_env.get_thing_by_type(SimulatedCamera)
@pytest.fixture
def stage(test_env) -> lt.Thing:
"""Return the DummyStage Thing set up in the test environment."""
return test_env.get_thing_by_type(DummyStage)
def test_downsample_shape_2d(): def test_downsample_shape_2d():
"""Test downsampling for 2D array.""" """Test downsampling for 2D array."""
shape_2d = (100, 80) shape_2d = (100, 80)
@ -104,9 +118,8 @@ def test_colour_list_regex(colour_str):
simulation.colour_str_to_colour(colour_str) simulation.colour_str_to_colour(colour_str)
def test_canvas_regeneration(test_env, caplog): def test_canvas_regeneration(camera, caplog):
"""Check canvas is regenerated if blob density of colour are changed.""" """Check canvas is regenerated if blob density of colour are changed."""
camera = test_env.get_thing_by_type(SimulatedCamera)
cached_canvas = camera.canvas cached_canvas = camera.canvas
original_colour = camera.colour original_colour = camera.colour
@ -133,9 +146,38 @@ def test_canvas_regeneration(test_env, caplog):
assert camera.canvas is not cached_canvas assert camera.canvas is not cached_canvas
def test_simulation_cam_calibration(test_env): def test_infinite_sample(camera, stage):
"""Check that setting camera.repeating makes the sample infinite."""
# Turn off noise to make comparison easier
camera.noise_level = 0
assert not camera.repeating
cached_canvas = camera.canvas
array_not_repeating = camera.capture_array()
camera.repeating = True
time.sleep(0.2) # Ensure frame regenerates
# Canvas shouldn't regenerate
assert camera.canvas is cached_canvas
array_repeating = camera.capture_array()
# Images are identical whether or not repeating
assert np.array_equal(array_not_repeating, array_repeating)
# Move outside the non-repeating sample area
stage._hardware_position["x"] = 100_000_000
camera.repeating = False
time.sleep(0.2) # Ensure frame regenerates
# If not repeating the array is just background
assert np.all(camera.capture_array() == simulation.BG_COLOR)
# Turn on repeating
camera.repeating = True
time.sleep(0.2) # Ensure frame regenerates
# Sample is now infitine, so not all background
assert not np.all(camera.capture_array() == simulation.BG_COLOR)
def test_simulation_cam_calibration(camera):
"""Test that the simulated camera can be calibrated and reports calibration correctly.""" """Test that the simulated camera can be calibrated and reports calibration correctly."""
camera = test_env.get_thing_by_type(SimulatedCamera)
assert camera.calibration_required assert camera.calibration_required
camera.full_auto_calibrate() camera.full_auto_calibrate()
assert not camera.calibration_required assert not camera.calibration_required