generated from dopt-python/py311
108 lines
3.6 KiB
Python
108 lines
3.6 KiB
Python
import shutil
|
|
from io import StringIO
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
from dopt_basics.result_pattern import wrap_result
|
|
|
|
from dopt_sensor_anomalies import _interface, constants
|
|
|
|
|
|
def test_print_error_state_WrongState():
|
|
from dopt_basics.result_pattern import STATUS_HANDLER
|
|
|
|
MSG = "to treat state as error"
|
|
with pytest.raises(RuntimeError, match=MSG):
|
|
_interface._print_error_state(STATUS_HANDLER.SUCCESS, out_stream=StringIO())
|
|
|
|
|
|
def test_print_error_state(tmp_path):
|
|
@wrap_result(100)
|
|
def error_func() -> None:
|
|
# do something
|
|
raise RuntimeError("Oops, error occurred")
|
|
|
|
err_state = error_func().status
|
|
output_file = tmp_path / "t_output.txt"
|
|
output_file.touch()
|
|
|
|
with open(output_file, "w") as stream:
|
|
_interface._print_error_state(err_state, stream)
|
|
|
|
lines: list[str]
|
|
with open(output_file, "r") as file:
|
|
lines = file.readlines()
|
|
|
|
assert "following exception" in lines[0]
|
|
assert "Type: RuntimeError" in lines[1]
|
|
assert "Description:" in lines[2]
|
|
assert "Message: Oops, error occurred" in lines[3]
|
|
|
|
|
|
@patch("dopt_sensor_anomalies._find_paths.STOP_FOLDER_NAME", "lib")
|
|
def test_sensor_anomalies_detection_FailImagePath(setup_temp_dir):
|
|
img_path = str(setup_temp_dir / "not-existing.bmp")
|
|
|
|
pixels_per_metric_X: float = 0.251
|
|
pixels_per_metric_Y: float = 0.251
|
|
|
|
MESSAGE = "The provided path seems not to exist"
|
|
|
|
with patch("sys.stderr", new_callable=StringIO) as mock_err:
|
|
ret = _interface.sensor_anomalies_detection(
|
|
img_path, pixels_per_metric_X, pixels_per_metric_Y
|
|
)
|
|
captured = mock_err.getvalue()
|
|
assert ret != 0
|
|
assert "FileNotFoundError" in captured
|
|
assert MESSAGE in captured
|
|
|
|
|
|
@patch("dopt_sensor_anomalies._find_paths.STOP_FOLDER_NAME", "lib")
|
|
def test_sensor_anomalies_detection_FailElectrodeCount(path_img_with_failure_ElectrodeCount):
|
|
img_path = str(path_img_with_failure_ElectrodeCount)
|
|
pixels_per_metric_X: float = 0.251
|
|
pixels_per_metric_Y: float = 0.251
|
|
|
|
MESSAGE = "Number of counted electrodes does not match the"
|
|
|
|
with patch("sys.stderr", new_callable=StringIO) as mock_err:
|
|
ret = _interface.sensor_anomalies_detection(
|
|
img_path, pixels_per_metric_X, pixels_per_metric_Y
|
|
)
|
|
captured = mock_err.getvalue()
|
|
assert ret != 0
|
|
assert "InvalidElectrodeCount" in captured
|
|
assert MESSAGE in captured
|
|
|
|
|
|
@patch("dopt_sensor_anomalies._find_paths.STOP_FOLDER_NAME", "lib")
|
|
def test_sensor_anomalies_detection_Success(
|
|
results_folder, path_img_with_failure_TrainedModel
|
|
):
|
|
# paths: check files for existence and delete because of other tests
|
|
root_img = path_img_with_failure_TrainedModel.parent
|
|
file_stem = path_img_with_failure_TrainedModel.stem
|
|
csv_file = root_img / f"{file_stem}.csv"
|
|
heatmap_file = root_img / f"{file_stem}{constants.HEATMAP_FILENAME_SUFFIX}.png"
|
|
if csv_file.exists():
|
|
csv_file.unlink()
|
|
if heatmap_file.exists():
|
|
heatmap_file.unlink()
|
|
|
|
img_path = str(path_img_with_failure_TrainedModel)
|
|
pixels_per_metric_X: float = 0.251
|
|
pixels_per_metric_Y: float = 0.251
|
|
|
|
ret = _interface.sensor_anomalies_detection(
|
|
img_path, pixels_per_metric_X, pixels_per_metric_Y
|
|
)
|
|
|
|
assert ret == 0
|
|
assert csv_file.exists()
|
|
assert heatmap_file.exists()
|
|
target_folder = results_folder / "csharp_interface"
|
|
target_folder.mkdir(exist_ok=True)
|
|
shutil.copy(csv_file, (target_folder / csv_file.name))
|
|
shutil.copy(heatmap_file, (target_folder / heatmap_file.name))
|