Add Monte Carlo simulator, game metrics and sim CLI (Phase 5)
`dojo sim` plays seeded games over a scenario matrix (variant, players, Kiai bonus, start position, bot lineup) in parallel, prints a summary per scenario and optionally writes one CSV row per game. Metrics are replayed from the event log. Plan updated with the Phase 5 baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -56,3 +56,28 @@ def test_legend_next_to_the_quadrant_is_used_by_default(
|
||||
|
||||
assert main(["board", "validate", "--quadrant", str(quadrant)]) == EXIT_FORMAT_ERRORS
|
||||
assert "legend links tunnel '9'" in capsys.readouterr().err
|
||||
|
||||
|
||||
def test_sim_prints_a_summary_per_scenario_and_writes_games(
|
||||
tmp_path: Path, capsys: pytest.CaptureFixture[str]
|
||||
) -> None:
|
||||
games = tmp_path / "games.csv"
|
||||
argv = ["sim", "--games", "2", "--variant", "A", "B", "--players", "3", "--jobs", "1"]
|
||||
|
||||
assert main([*argv, "--csv", str(games)]) == EXIT_OK
|
||||
|
||||
output = capsys.readouterr().out
|
||||
assert "== A p3 kiai+2 start0 balanced,farmer,aggressive (2 games" in output
|
||||
assert "== B p3 kiai+2 start0" in output
|
||||
rows = games.read_text(encoding="utf-8").splitlines()
|
||||
assert rows[0].startswith("scenario,seed,lineup,winner_seat")
|
||||
assert len(rows) == 1 + 4
|
||||
|
||||
|
||||
@pytest.mark.parametrize("bad", [["--lineup", "balanced,cheater"], ["--games", "0"]])
|
||||
def test_sim_rejects_bad_arguments(bad: list[str], capsys: pytest.CaptureFixture[str]) -> None:
|
||||
with pytest.raises(SystemExit) as exit_info:
|
||||
main(["sim", *bad])
|
||||
|
||||
assert exit_info.value.code == 2
|
||||
assert "error:" in capsys.readouterr().err
|
||||
|
||||
Reference in New Issue
Block a user