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>
67 lines
2.7 KiB
Python
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
|