2026-10-29 10:18:12 +01:00
|
|
|
"""Integrazione sui CSV di gen_data (input/gen_{1,2,3}.csv, ignorati da git: i test sono saltati se mancano) e sulla CLI."""
|
2026-10-29 10:13:01 +01:00
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
from conftest import RADICE
|
|
|
|
|
|
|
|
|
|
from fitseg import cli, dati, domini
|
|
|
|
|
from fitseg.analisi import analizza_domini
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def analizza(csv, cfg):
|
|
|
|
|
t, serie = dati.leggi_csv(csv, cfg)
|
|
|
|
|
ds = domini.proponi(t, serie, cfg)
|
|
|
|
|
return ds, analizza_domini(t, serie, ds, cfg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_domini_su_csv_gen(csv_gen, cfg):
|
|
|
|
|
ds, _ = analizza(csv_gen, cfg)
|
2026-10-29 10:28:00 +01:00
|
|
|
assert [d["tipo"] for d in ds] == ["riposo", "riscaldamento", "raffreddamento", "riscaldamento", "raffreddamento",
|
|
|
|
|
"riscaldamento", "raffreddamento"]
|
2026-10-29 10:13:01 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_raffreddamento_tau_nominale(csv_gen, cfg):
|
|
|
|
|
_, ris = analizza(csv_gen, cfg) # τ nominale 1/k = 15.9 s, k perturbato del 2 % per seed
|
|
|
|
|
for vs in ris[-1]["serie"].values():
|
|
|
|
|
assert vs["scelta"] == "esp_decad"
|
|
|
|
|
fit = next(x for x in vs["fit"] if x["modello"] == "esp_decad")
|
|
|
|
|
assert fit["parametri"]["tau"] == pytest.approx(15.9, rel=0.1)
|
|
|
|
|
|
|
|
|
|
|
2026-10-29 10:28:00 +01:00
|
|
|
def test_raffreddamenti_intermedi_ereditano_costanti(csv_gen, cfg):
|
2026-10-29 10:13:01 +01:00
|
|
|
_, ris = analizza(csv_gen, cfg)
|
|
|
|
|
for nome in ris[0]["serie"]:
|
2026-10-29 10:28:00 +01:00
|
|
|
finale = next(x for x in ris[-1]["serie"][nome]["fit"] if x["modello"] == "esp_decad")["parametri"]
|
|
|
|
|
for i in (2, 4):
|
|
|
|
|
fit = next(x for x in ris[i]["serie"][nome]["fit"] if x["modello"] == "esp_decad")
|
|
|
|
|
assert fit["fissi"] == ["c", "tau"] and fit["parametri"]["tau"] == finale["tau"] and fit["parametri"]["A"] > 0
|
2026-10-29 10:13:01 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_cli_domini_e_analizza(tmp_path, capsys):
|
2026-10-29 10:18:12 +01:00
|
|
|
csv = RADICE / "input/gen_1.csv"
|
2026-10-29 10:13:01 +01:00
|
|
|
if not csv.exists():
|
|
|
|
|
pytest.skip(f"{csv} assente")
|
2026-10-29 10:18:12 +01:00
|
|
|
base = ["--config", str(RADICE / "config.toml"), "--output", str(tmp_path)]
|
|
|
|
|
out = tmp_path / "gen_1"
|
2026-10-29 10:13:01 +01:00
|
|
|
cli.main([*base, "domini", str(csv)])
|
2026-10-29 10:18:12 +01:00
|
|
|
assert (out / "01_domini/domini.toml").exists() and (out / "01_domini/domini.png").exists()
|
|
|
|
|
assert not (out / "03_report").exists() or not any((out / "03_report").iterdir()) # `domini` non fa nessun fit
|
|
|
|
|
cli.main([*base, "analizza", str(csv), "--domini", str(out / "01_domini/domini.toml")]) # domini corretti a mano
|
2026-10-29 10:28:00 +01:00
|
|
|
for f in ("02_sovrapposizione/sovrapposizione_T_C.png", "02_sovrapposizione/dominio7_T_C.png",
|
2026-10-29 10:18:12 +01:00
|
|
|
"03_report/report.md", "03_report/risultati.json"):
|
|
|
|
|
assert (out / f).exists(), f
|
|
|
|
|
report = (out / "03_report/report.md").read_text()
|
2026-10-29 10:28:00 +01:00
|
|
|
assert "../01_domini/domini.png" in report and "../02_sovrapposizione/dominio7_T_C.png" in report
|
|
|
|
|
assert "dominio 7 raffreddamento" in capsys.readouterr().out
|
2026-10-29 10:30:46 +01:00
|
|
|
# grandezze matematiche in LaTeX, con i dollari bilanciati su ogni riga
|
|
|
|
|
for riga in report.splitlines():
|
|
|
|
|
assert riga.count("$") % 2 == 0, riga
|
|
|
|
|
for formula in (r"$y = c + A\,e^{-t'/\tau}$", r"$t' = t - t_0$", r"$\sigma_\text{rumore}", r"$R^2 = ", r"$\rho_1 = ",
|
|
|
|
|
r"$\Delta = +", r"$\Delta\mathrm{AICc}", r"$$ y = "):
|
|
|
|
|
assert formula in report, formula
|
2026-10-29 10:13:01 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_cli_errori(tmp_path):
|
2026-10-29 10:18:12 +01:00
|
|
|
base = ["--config", str(RADICE / "config.toml"), "--output", str(tmp_path)]
|
2026-10-29 10:13:01 +01:00
|
|
|
with pytest.raises(SystemExit) as e:
|
|
|
|
|
cli.main([*base, "domini", str(tmp_path / "non_esiste.csv")])
|
|
|
|
|
assert e.value.code == 4
|
|
|
|
|
with pytest.raises(SystemExit) as e:
|
|
|
|
|
cli.main(["--config", "/non/esiste.toml", "domini", "x.csv"])
|
|
|
|
|
assert e.value.code == 3
|