Refresh web UI and make ML imports optional
All checks were successful
ci / tests (push) Successful in 21s

This commit is contained in:
dan
2025-12-25 09:15:10 +03:00
parent f542747d5e
commit 2499deb071
49 changed files with 4367 additions and 500 deletions

51
tests/test_dev_rules.py Normal file
View File

@@ -0,0 +1,51 @@
from __future__ import annotations
import pytest
from catan.data import DevelopmentCard
from catan.game import Game, GameConfig, Phase
def _prepare_turn(game: Game) -> None:
game.phase = Phase.MAIN
game.has_rolled = True
game.robber_move_required = False
game.pending_discards.clear()
def _other_hex(game: Game, exclude: int) -> int:
return next(h for h in game.board.hexes if h != exclude)
def test_only_one_dev_card_per_turn() -> None:
game = Game(GameConfig(player_names=["A", "B", "C", "D"]))
_prepare_turn(game)
player = game.current_player
player.dev_cards = [DevelopmentCard.KNIGHT, DevelopmentCard.KNIGHT]
player.new_dev_cards.clear()
first_target = _other_hex(game, game.board.robber_hex)
game.play_knight(first_target, None)
second_target = _other_hex(game, first_target)
with pytest.raises(ValueError, match="development card"):
game.play_knight(second_target, None)
def test_dev_card_limit_resets_next_turn() -> None:
game = Game(GameConfig(player_names=["A", "B", "C", "D"]))
_prepare_turn(game)
player = game.current_player
player.dev_cards = [DevelopmentCard.KNIGHT]
player.new_dev_cards.clear()
target_hex = _other_hex(game, game.board.robber_hex)
game.play_knight(target_hex, None)
game.end_turn()
_prepare_turn(game)
next_player = game.current_player
next_player.dev_cards = [DevelopmentCard.KNIGHT]
next_player.new_dev_cards.clear()
next_target = _other_hex(game, game.board.robber_hex)
# Should not raise now that it's a new turn.
game.play_knight(next_target, None)