use crate::card::{Card, Rank, Suit};
use rand::seq::SliceRandom;
pub struct Deck {
cards: Vec<Card>,
}
impl Deck {
pub fn new() -> Self {
let mut cards = Vec::with_capacity(52);
for suit in &[Suit::Heart, Suit::Diamond, Suit::Club, Suit::Spade] {
for rank in &[
Rank::Two,
Rank::Three,
Rank::Four,
Rank::Five,
Rank::Six,
Rank::Seven,
Rank::Eight,
Rank::Nine,
Rank::Ten,
Rank::Jack,
Rank::Queen,
Rank::King,
Rank::Ace,
] {
cards.push(Card::new(*rank, *suit));
}
}
Self { cards }
}
pub fn shuffle(&mut self) {
let mut rng = rand::thread_rng();
self.cards.shuffle(&mut rng);
}
pub fn deal(&mut self) -> Option<Card> {
self.cards.pop()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_shuffle() {
let mut deck = Deck::new();
let original_deck = deck.cards.clone();
deck.shuffle();
assert_eq!(deck.cards.len(), 52);
assert_ne!(deck.cards, original_deck);
}
#[test]
fn test_deal() {
let mut deck = Deck::new();
let card = deck.deal();
assert_eq!(deck.cards.len(), 51);
assert!(card.is_some());
for _ in 0..51 {
let card = deck.deal();
assert!(card.is_some());
}
assert_eq!(deck.cards.len(), 0);
let card = deck.deal();
assert!(card.is_none());
}
}