From 6be02c447dd19a3a103c9735600604f5be58de75 Mon Sep 17 00:00:00 2001 From: Paul Harrison Date: Fri, 18 Nov 2022 19:30:19 +0000 Subject: [PATCH] feat: Ensure hand comprises unique cards --- poker/models.py | 18 ++++++++++++++++-- tests/test_models.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tests/test_models.py diff --git a/poker/models.py b/poker/models.py index e62df17..5ecda90 100644 --- a/poker/models.py +++ b/poker/models.py @@ -1,4 +1,4 @@ -from pydantic import BaseModel, Field +from pydantic import BaseModel, validator from poker.constants import Suit, Value @@ -9,8 +9,22 @@ class Card(BaseModel): suit: Suit 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): """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 diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 0000000..37e9c03 --- /dev/null +++ b/tests/test_models.py @@ -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), + ) + )