52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
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)
|