dynamisk-rettsstat/tests/test_kjerne_og_fasit.py
Kjell Tore Guttormsen 464ad38b49
feat: model core, launcher, reproduction check and the first two skills
The core in modell/kjerne/ is an unmodified copy of sim.py, diagnose.py and
forlop.py from den-dynamiske-rettsstaten @2badc25, pinned by sha256.
kjor.py is the single entry point; kontroll.py reproduces the note's 22 data
files and printed results. Skills: diagnose and forlop (Norwegian).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 13:53:32 +01:00

67 lines
2.7 KiB
Python

# Copyright (c) 2026 Kjell Tore Guttormsen. MIT License, see LICENSE.
"""Kjernen er uendret fra notatet, og kjernens utskrifter er lik fasit."""
from __future__ import annotations
import hashlib
import json
import os
import subprocess
import sys
from typing import TYPE_CHECKING
import pytest
from conftest import EKSEMPLER, FASIT, MODELL, fasit
if TYPE_CHECKING:
from pathlib import Path
KILDE = json.loads((MODELL / "kjerne" / "KILDE.json").read_text(encoding="utf-8"))
def test_kilde_peker_paa_notatets_commit() -> None:
assert KILDE["repo"] == "https://git.fromaitochitta.com/open/den-dynamiske-rettsstaten"
assert KILDE["commit"] == "2badc25e5134ee26309bd8c3bd008ac64afe55a4"
assert set(KILDE["filer"]) == {"sim.py", "diagnose.py", "forlop.py"}
assert {f.name for f in (MODELL / "kjerne").glob("*.py")} == set(KILDE["filer"])
@pytest.mark.parametrize("navn", ["sim.py", "diagnose.py", "forlop.py"])
def test_kjernen_har_sin_sha256(navn: str) -> None:
innhold = (MODELL / "kjerne" / navn).read_bytes()
assert hashlib.sha256(innhold).hexdigest() == KILDE["filer"][navn]["sha256"]
assert KILDE["filer"][navn]["kilde"] == f"paper/{navn}"
def test_fasit_har_22_datafiler() -> None:
assert len(list((FASIT / "data").glob("*.dat"))) == 22
@pytest.mark.parametrize(
("skript", "eksempel"),
[("diagnose", "eksempel_domstol"), ("diagnose", "norge_2025"),
("forlop", "eksempel_domstol"), ("forlop", "norge_2025")],
)
def test_kjernens_utskrift_er_lik_fasit(skript: str, eksempel: str, tmp_path: Path) -> None:
miljo = dict(os.environ, PYTHONIOENCODING="utf-8", PYTHONDONTWRITEBYTECODE="1")
prosess = subprocess.run(
[sys.executable, str(MODELL / "kjerne" / f"{skript}.py"), str(EKSEMPLER / f"{eksempel}.json")],
capture_output=True, text=True, encoding="utf-8", env=miljo, cwd=str(tmp_path), check=False,
)
assert prosess.returncode == 0, prosess.stderr
assert prosess.stdout == fasit(f"{skript}_{eksempel}.txt")
def test_fasit_har_ankrene_fra_notatet() -> None:
domstol = fasit("diagnose_eksempel_domstol.txt")
assert "Skranken som binder: Domstol (utnyttelse 1,28" in domstol
assert "det vil si 19 % mer" in domstol
norge = fasit("diagnose_norge_2025.txt")
for ledd, utnyttelse in (("Politi og påtale", "1,09"), ("Tingrett, meddomsrett", "1,04"),
("Lagmannsrett, bevisanke", "0,88"), ("Fengsel", "1,09")):
linje = next(linje for linje in norge.splitlines() if linje.startswith(ledd))
assert linje.split()[-4] == utnyttelse
forlop = fasit("forlop_eksempel_domstol.txt")
assert "Kritisk forsinkelse: 7,2 mnd." in forlop
assert "- nå: bestill 19 % mer kapasitet" in forlop
assert "- om 12 mnd: bestill 12 % mer kapasitet" in forlop