백엔드 제거하고 평가 기반 정리

This commit is contained in:
2026-05-06 20:39:21 +09:00
parent b578b38628
commit 1e5c5509e1
17 changed files with 560 additions and 212 deletions
+64
View File
@@ -0,0 +1,64 @@
from coolrl_lost_cities.games.classic import (
LostCitiesConfig,
build_bot,
make_bot_factory,
play_game_for_evaluation,
play_match,
)
from coolrl_lost_cities.games.classic.evaluation import main
def test_play_game_for_evaluation_finishes_small_match() -> None:
config = LostCitiesConfig(n_colors=3, n_ranks=5, n_handshakes=1, hand_size=5)
state, result = play_game_for_evaluation(
build_bot("random", seed=1),
build_bot("passive-discard", seed=2),
config,
seed=3,
max_steps=200,
)
assert state.terminal is True
assert result.timed_out is False
assert result.steps > 0
assert result.score_diff0 == result.score0 - result.score1
def test_play_match_alternates_seats_and_reports_rates() -> None:
config = LostCitiesConfig(n_colors=3, n_ranks=5, n_handshakes=1, hand_size=5)
result = play_match(
make_bot_factory("random"),
make_bot_factory("passive-discard"),
config,
games=4,
seed=10,
max_steps=200,
)
assert result.games == 4
assert result.wins0 + result.wins1 + result.draws == 4
assert result.avg_game_length > 0.0
assert result.games_per_second > 0.0
assert result.steps_per_second > 0.0
def test_evaluation_cli_smoke_json(capsys) -> None:
main(
[
"--bot0",
"random",
"--bot1",
"passive-discard",
"--games",
"2",
"--seed",
"20",
"--json",
]
)
captured = capsys.readouterr()
assert '"games": 2' in captured.out
assert '"win_rate0"' in captured.out
+19 -3
View File
@@ -13,10 +13,26 @@ def test_classic_package_exports_common_game_api() -> None:
assert state.config.deck_size == 60
def test_classic_package_exports_backend_alias() -> None:
backend = classic.build_backend("python", classic.classic_config(), seed=1)
def test_classic_package_exports_snapshot_alias() -> None:
state = classic.GameState.new_game(classic.classic_config(seed=1))
snapshot = classic.Snapshot(
config=state.config,
deck=list(state.deck),
hands=[list(hand) for hand in state.hands],
expeditions=[
[list(expedition) for expedition in player_expeditions]
for player_expeditions in state.expeditions
],
discards=[list(discard) for discard in state.discards],
current_player=state.current_player,
phase=state.phase,
pending_discarded_color=state.pending_discarded_color,
turn_count=state.turn_count,
terminal=state.terminal,
legal_mask=state.unified_legal_mask(),
)
assert isinstance(backend.snapshot(), classic.Snapshot)
assert snapshot.score_diff(0) == state.score_diff(0)
def test_classic_package_exports_bot_registry_helpers() -> None:
+16
View File
@@ -0,0 +1,16 @@
import pytest
from coolrl_lost_cities.games.classic import (
LostCitiesConfig,
ReferenceLostCitiesCard,
ReferenceLostCitiesState,
)
def test_reference_card_is_plain_ordered_value() -> None:
assert ReferenceLostCitiesCard(0, 1) < ReferenceLostCitiesCard(1, 0)
def test_reference_state_placeholder_is_explicitly_unimplemented() -> None:
with pytest.raises(NotImplementedError):
ReferenceLostCitiesState.new_game(LostCitiesConfig())