This commit is contained in:
nose
2025-11-25 22:19:36 -08:00
commit 79d4f1a09e
132 changed files with 11052 additions and 0 deletions

213
tests/test_deck.py Normal file
View File

@@ -0,0 +1,213 @@
"""
Tests for Tarot deck and card classes.
"""
import pytest
from src.tarot.deck import Deck, Card, MajorCard, MinorCard, PipCard, AceCard, CourtCard
from src.tarot.attributes import Meaning, Suit, CardImage
class TestCard:
def test_card_creation(self):
card = Card(1, "Test Card", Meaning("Upright", "Reversed"), "Minor")
assert card.number == 1
assert card.name == "Test Card"
assert card.meaning.upright == "Upright"
def test_card_str(self):
card = Card(1, "Test Card", Meaning("Upright", "Reversed"), "Minor")
assert str(card) == "1. Test Card"
def test_card_repr(self):
card = Card(1, "Test Card", Meaning("Upright", "Reversed"), "Minor")
assert repr(card) == "Card(1, 'Test Card')"
class TestMajorCard:
def test_major_card_creation(self):
card = MajorCard(
number=1,
name="The Magician",
meaning=Meaning("Upright", "Reversed"),
arcana="Major",
kabbalistic_number=1
)
assert card.number == 1
assert card.arcana == "Major"
def test_major_card_invalid_low(self):
with pytest.raises(ValueError):
MajorCard(
number=1,
name="Test",
meaning=Meaning("Up", "Rev"),
arcana="Major",
kabbalistic_number=-1
)
def test_major_card_invalid_high(self):
with pytest.raises(ValueError):
MajorCard(
number=1,
name="Test",
meaning=Meaning("Up", "Rev"),
arcana="Major",
kabbalistic_number=22
)
def test_major_card_valid_range(self):
for i in range(22):
card = MajorCard(
number=i,
name=f"Card {i}",
meaning=Meaning("Up", "Rev"),
arcana="Major"
)
assert card.number == i
class TestMinorCard:
def test_minor_card_creation(self):
suit = Suit("Cups", "Water", "Chalice", 1)
card = MinorCard(
number=1,
name="Ace of Cups",
meaning=Meaning("Upright", "Reversed"),
arcana="Minor",
suit=suit,
pip=1
)
assert card.number == 1
assert card.suit.name == "Cups"
assert card.pip == 1
def test_minor_card_invalid_pip_low(self):
suit = Suit("Cups", "Water", "Chalice", 1)
with pytest.raises(ValueError):
PipCard(
number=1,
name="Test",
meaning=Meaning("Up", "Rev"),
arcana="Minor",
suit=suit,
pip=0
)
def test_minor_card_invalid_pip_high(self):
suit = Suit("Cups", "Water", "Chalice", 1)
with pytest.raises(ValueError):
PipCard(
number=1,
name="Test",
meaning=Meaning("Up", "Rev"),
arcana="Minor",
suit=suit,
pip=15
)
def test_minor_card_valid_pips(self):
suit = Suit("Cups", "Water", "Chalice", 1)
for i in range(1, 15):
card = MinorCard(
number=i,
name=f"Card {i}",
meaning=Meaning("Up", "Rev"),
arcana="Minor",
suit=suit,
pip=i
)
assert card.pip == i
class TestDeck:
def test_deck_creation(self):
deck = Deck()
assert len(deck.cards) == 78
def test_deck_major_arcana_count(self):
deck = Deck()
major_cards = [c for c in deck.cards if c.arcana == "Major"]
assert len(major_cards) == 22
def test_deck_minor_arcana_count(self):
deck = Deck()
minor_cards = [c for c in deck.cards if c.arcana == "Minor"]
assert len(minor_cards) == 56
def test_deck_shuffle(self):
deck1 = Deck()
cards_before = [c.name for c in deck1.cards]
deck1.shuffle()
cards_after = [c.name for c in deck1.cards]
# After shuffle, order should change (with high probability)
# We don't assert they're different since shuffle could randomly give same order
assert len(cards_after) == 78
def test_deck_draw_single(self):
deck = Deck()
initial_count = len(deck.cards)
drawn = deck.draw(1)
assert len(drawn) == 1
assert len(deck.cards) == initial_count - 1
def test_deck_draw_multiple(self):
deck = Deck()
initial_count = len(deck.cards)
drawn = deck.draw(5)
assert len(drawn) == 5
assert len(deck.cards) == initial_count - 5
def test_deck_draw_too_many(self):
deck = Deck()
with pytest.raises(ValueError):
deck.draw(100)
def test_deck_draw_invalid_amount(self):
deck = Deck()
with pytest.raises(ValueError):
deck.draw(0)
def test_deck_reset(self):
deck = Deck()
deck.draw(5)
assert len(deck.cards) < 78
deck.reset()
assert len(deck.cards) == 78
def test_deck_remaining(self):
deck = Deck()
assert deck.remaining() == 78
deck.draw(1)
assert deck.remaining() == 77
def test_deck_len(self):
deck = Deck()
assert len(deck) == 78
deck.draw(1)
assert len(deck) == 77
def test_deck_repr(self):
deck = Deck()
assert "78 cards" in repr(deck)
deck.draw(1)
assert "77 cards" in repr(deck)
def test_deck_all_suits(self):
deck = Deck()
suits = {c.suit.name for c in deck.cards if c.arcana == "Minor"}
assert suits == {"Cups", "Pentacles", "Swords", "Wands"}
def test_deck_unique_cards(self):
deck = Deck()
card_names = [c.name for c in deck.cards]
assert len(card_names) == len(set(card_names)) # All unique