Files
slic/tests/test_core_runname.py
T
tligui_y fa777d0923
Run CI Tests / test (push) Successful in 2m22s
Update tests/test_core_runname.py
2025-11-23 17:23:44 +01:00

178 lines
6.0 KiB
Python

import pytest
from pathlib import Path
from slic.core.scanner.runname import (
extract_runnumber,
extract_runnumbers,
RunFilenameGenerator,
EVERYTHING
)
@pytest.fixture
def tmpdir_runs(tmp_path):
d = tmp_path / "runs"
d.mkdir()
return d
@pytest.mark.parametrize(
"fname,prefix,separator,expected",
[
("scan0004_test.json", "scan", "_", 4),
("scan0001_alpha.txt", "scan", "_", 1),
("run-0042_demo.csv", "run-", "_", 42),
("data9999_final.txt", "data", "_", 9999),
("scan5_test.json", "scan", "_", 5),
(str(Path("/tmp/data/scan0007_exp.json")), "scan", "_", 7),
(str(Path("/Users/yasmine_tligui/test_pv/runs/scan0123_test.json")), "scan", "_", 123),
("scan0010_report.csv", "scan", "_", 10),
("scan0300_analysis.yaml", "scan", "_", 300),
("experimentscan0070_trial.txt", "experimentscan", "_", 70),
("meas:001_test.txt", "meas:", "_", 1),
(str(Path("a/b/c/scan0042_demo.json")), "scan", "_", 42),
("scan1234_extra_part.json", "scan", "_", 1234),
# error
("scan_0042_test.json", "scan_", "_", 42),
],
)
def test_extract_runnumber_valid_cases(fname, prefix, separator, expected):
assert extract_runnumber(fname, prefix, separator) == expected
@pytest.mark.parametrize(
"fname,prefix,separator",
[
("scan00A3_test.json", "scan", "_"),
("file_test.json", "scan", "_"),
("scan_test.json", "scan", "_"),
("run#_info.txt", "run#", "#"),
("1234_scan_test.json", "scan", "_"),
],
)
def test_extract_runnumber_invalid_cases(fname, prefix, separator):
with pytest.raises(ValueError):
extract_runnumber(fname, prefix, separator)
@pytest.mark.parametrize(
"fnames,prefix,separator,expected",
[
(["scan0001_a", "scan0002_b", "scan0030_c"], "scan", "_", [1, 2, 30]),
(["scan1_a", "scan02_b", "scan300_c"], "scan", "_", [1, 2, 300]),
(["run-0004_x", "run-0005_y", "run-0010_z"], "run-", "_", [4, 5, 10]),
(["data9_file", "data10_file", "data11_file"], "data", "_", [9, 10, 11]),
(["scan001--a", "scan002--b", "scan003--c"], "scan", "--", [1, 2, 3]),
],
)
def test_extract_runnumbers_valid(fnames, prefix, separator, expected):
result = extract_runnumbers(fnames, prefix, separator)
assert result == expected
@pytest.mark.parametrize(
"prefix,run_index,separator,name,suffix,expected",
[
("pfx", "7", "-", "abc", ".txt", "pfx7-abc"),
("scan", "001", "_", "data", "_scan_info.json", "scan001_data"),
("run", "42", "-", "test", ".meta", "run42-test"),
("exp", "003", "--", "trial", ".log", "exp003--trial"),
("data", "99", "::", "final", ".json", "data99::final"),
("experiment_", "005", "_", "measure", ".csv", "experiment_005_measure"),
],
)
def test_fill_filename_pattern(prefix, run_index, separator, name, suffix, expected):
gen = RunFilenameGenerator(
base_dir=".",
prefix=prefix,
separator=separator,
suffix=suffix
)
formatted = gen._fill_filename_pattern(run_index, name)
assert formatted == expected
@pytest.mark.parametrize(
"prefix,n_digits,separator,suffix,expected",
[
("scan", 3, "_", "_scan_info.json", "scan" + "[0-9]"*3 + "_" + EVERYTHING + "_scan_info.json"),
("run-", 4, "-", ".json", "run-" + "[0-9]"*4 + "-" + EVERYTHING + ".json"),
("data", 2, "#", ".meta", "data" + "[0-9]"*2 + "#" + EVERYTHING + ".meta"),
("exp", 1, ".", "_info.txt", "exp" + "[0-9]"*1 + "." + EVERYTHING + "_info.txt"),
],
)
def test_pattern_exact_match(tmpdir_runs, prefix, n_digits, separator, suffix, expected):
gen = RunFilenameGenerator(
base_dir=tmpdir_runs,
prefix=prefix,
n_digits=n_digits,
separator=separator,
suffix=suffix,
)
pattern = gen.pattern
assert pattern == expected
def test_get_existing_runnumbers_empty(monkeypatch, tmpdir_runs):
gen = RunFilenameGenerator(tmpdir_runs)
monkeypatch.setattr("slic.core.scanner.runname.glob_files", lambda b, p: [])
assert gen.get_existing_runnumbers() == []
@pytest.mark.parametrize(
"file_structure,search_base_dir,prefix,separator,suffix,n_digits,expected_next",
[
(
{
"experiments": ["scan0001_test_scan_info.json", "scan0002_test_scan_info.json"],
"other_folder": ["scan0003_test_scan_info.json", "scan0004_test_scan_info.json"]
},
"experiments",
"scan", "_", "_scan_info.json", 4,
"scan0003_test"
),
(
{
"project/data": ["scan0001_test_scan_info.json"],
"project/data/raw": ["scan0002_test_scan_info.json"],
"project/backup": ["scan0003_test_scan_info.json"],
"other_project": ["scan0004_test_scan_info.json"]
},
"project/data",
"scan", "_", "_scan_info.json", 4,
"scan0002_test"
),
(
{
"empty_dir": [],
"full_dir": ["scan0001_test_scan_info.json", "scan0002_test_scan_info.json"],
},
"empty_dir",
"scan", "_", "_scan_info.json", 4,
"scan0000_test"
),
],
)
def test_get_next_run_filename(tmpdir, file_structure, search_base_dir, prefix, separator, suffix, n_digits, expected_next):
for dir_path, filenames in file_structure.items():
current_dir = tmpdir
for part in dir_path.split("/"):
current_dir = current_dir / part
if not current_dir.exists():
current_dir.mkdir()
for filename in filenames:
(current_dir / filename).write("test")
actual_base_dir = tmpdir / search_base_dir
gen = RunFilenameGenerator(
base_dir=str(actual_base_dir),
prefix=prefix,
n_digits=n_digits,
separator=separator,
suffix=suffix,
)
next_file = gen.get_next_run_filename("test")
assert next_file == expected_next