178 lines
6.0 KiB
Python
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 |