feat: Ensure hand comprises unique cards

This commit is contained in:
Paul Harrison 2022-11-18 19:30:19 +00:00
parent c337984965
commit 6be02c447d
2 changed files with 44 additions and 2 deletions

View File

@ -1,4 +1,4 @@
from pydantic import BaseModel, Field from pydantic import BaseModel, validator
from poker.constants import Suit, Value from poker.constants import Suit, Value
@ -9,8 +9,22 @@ class Card(BaseModel):
suit: Suit suit: Suit
value: Value value: Value
def __hash__(self) -> int:
"""Hash function."""
return hash(f"{self.value} {self.suit}")
HandType = tuple[Card, Card, Card, Card, Card]
class Hand(BaseModel): class Hand(BaseModel):
"""Hand domain model class.""" """Hand domain model class."""
cards: list[Card] = Field(..., min_length=5, max_length=5) cards: HandType
@validator("cards")
def validate_unique(cls, cards: HandType) -> HandType:
"""Validate hand comprises unique cards."""
if len(cards) != len(set(cards)):
raise ValueError("Hand contains duplicate cards.")
return cards

28
tests/test_models.py Normal file
View File

@ -0,0 +1,28 @@
import pytest
from pydantic import ValidationError
from poker.constants import Suit, Value
from poker.models import Card, Hand
def test_hand_should_contain_unique_cards() -> None:
with pytest.raises(ValidationError):
_ = Hand(
cards=(
Card(suit=Suit.CLUBS, value=Value.ACE),
Card(suit=Suit.CLUBS, value=Value.TWO),
Card(suit=Suit.CLUBS, value=Value.THREE),
Card(suit=Suit.CLUBS, value=Value.FOUR),
Card(suit=Suit.CLUBS, value=Value.FOUR),
)
)
_ = Hand(
cards=(
Card(suit=Suit.CLUBS, value=Value.ACE),
Card(suit=Suit.CLUBS, value=Value.TWO),
Card(suit=Suit.CLUBS, value=Value.THREE),
Card(suit=Suit.CLUBS, value=Value.FOUR),
Card(suit=Suit.CLUBS, value=Value.FIVE),
)
)