diff --git a/README.md b/README.md index ee3313f..cfcf006 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ usage: pf1e-sim [-h] --map MAP [--side NAME [FILE ...]] [--runs RUNS] | `--side NAME [FILE ...]` | Camp `NAME` avec un ou plusieurs JSON de monstres ; répétable pour chaque camp | — | | `--runs RUNS` | Nombre de combats simulés | `1000` | | `--seed SEED` | Graine du générateur aléatoire | `1` | -| `--round-cap ROUND_CAP` | Plafond de rounds par combat (au-delà, combat nul) | `100` | +| `--round-cap ROUND_CAP` | Plafond de rounds par combat, entier ≥ 1 (au-delà, combat nul) | `100` | | `--transcript` | Imprimer le déroulé du premier combat **en tableau** avant le rapport (voir ci-dessous) | désactivé | | `--simple-monster-death` | Mort simplifiée des monstres : `hp ≤ 0` au lieu de `hp ≤ -CON` (les PJ ne sont jamais affectés) | désactivé | diff --git a/src/pf1e_simulator/cli.py b/src/pf1e_simulator/cli.py index c22039b..e9d29fc 100644 --- a/src/pf1e_simulator/cli.py +++ b/src/pf1e_simulator/cli.py @@ -105,6 +105,9 @@ def render_transcript_table(transcript: Sequence[str]) -> str: def _build_spec(args: argparse.Namespace) -> EncounterSpec: + if args.round_cap < 1: + msg = f"--round-cap must be >= 1, got {args.round_cap}" + raise CliError(msg) map_spec = load_map(args.map) provided = [tuple(raw) for raw in args.side] provided_names = {raw[0] for raw in provided} @@ -189,7 +192,7 @@ def main(argv: list[str] | None = None) -> int: "--round-cap", type=int, default=100, - help="max rounds per battle (default: 100)", + help="max rounds per battle, >= 1 (default: 100)", ) parser.add_argument( "--transcript", diff --git a/tests/test_cli.py b/tests/test_cli.py index ac4eaac..843e005 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -84,6 +84,48 @@ def test_cli_rejects_duplicate_side_names(capsys: pytest.CaptureFixture[str]) -> assert "players" in err +def test_cli_rejects_negative_round_cap(capsys: pytest.CaptureFixture[str]) -> None: + rc = main( + [ + "--map", + str(MAP), + "--side", + "players", + str(GOBLIN), + "--side", + "monsters", + str(ORC), + "--runs", + "10", + "--round-cap", + "-3", + ] + ) + assert rc == 2 + assert "--round-cap must be >= 1" in capsys.readouterr().err + + +def test_cli_rejects_zero_round_cap(capsys: pytest.CaptureFixture[str]) -> None: + rc = main( + [ + "--map", + str(MAP), + "--side", + "players", + str(GOBLIN), + "--side", + "monsters", + str(ORC), + "--runs", + "10", + "--round-cap", + "0", + ] + ) + assert rc == 2 + assert "--round-cap must be >= 1" in capsys.readouterr().err + + def test_cli_transcript_prints_first_battle_log(capsys: pytest.CaptureFixture[str]) -> None: rc = main( [