+++ /dev/null
-use std::collections::{HashMap, HashSet};
-
-use itertools::Itertools;
-
-use crate::card::{Card, Suit, FIFTY_TWO_CARD_DECK};
-
-#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct Hands {
- hands: HashMap<String, HashSet<Card>>,
- community: Vec<Card>,
- trick: Vec<(String, Card)>,
- deck: HashSet<Card>,
-}
-
-impl Hands {
- pub fn new() -> Hands {
- Hands {
- hands: HashMap::new(),
- community: Vec::new(),
- trick: Vec::new(),
- deck: FIFTY_TWO_CARD_DECK.iter().cloned().collect(),
- }
- }
-
- pub fn clear(&mut self) {
- self.hands.clear();
- self.community.clear();
- self.trick.clear();
- self.deck = FIFTY_TWO_CARD_DECK.iter().cloned().collect();
- }
-
- pub fn clear_trick(&mut self) {
- self.trick.clear();
- }
-
- pub fn trick_winner(&self, trumps: Option<Suit>) -> Option<String> {
- let mut winner = None;
- for (player, card) in &self.trick {
- match winner {
- None => winner = Some((player, card)),
- Some((_, best)) if
- Some(card.suit) == trumps && (card.rank > best.rank || Some(best.suit) != trumps) ||
- card.suit == best.suit && card.rank > best.rank
- => winner = Some((player, card)),
- Some((_, _)) => {},
- }
- }
- winner.map(|(player, _)| (*player).clone())
- }
-
- pub fn all_players_have_played_a_card(&self) -> bool {
- let all_players: HashSet<_> = self.hands.keys().collect();
- let players_that_have_played_a_card: HashSet<_> = self.trick.iter().map(|(player, _)| player).collect();
- all_players == players_that_have_played_a_card
- }
-
- pub fn play_card(&mut self, username: String, card: Card) {
- if let Some(set) = self.hands.get_mut(&username) {
- if set.remove(&card) {
- self.trick.push((username, card));
- } else {
- error!("Tried to remove {} from {}'s hand - had [{}]", card, username, set.iter().format(", "));
- }
- } else {
- error!("Tried to remove {} from {}'s hand - had [{}]", card, username, self.hands.keys().format(", "));
- }
- }
-
- pub fn reveal_card(&mut self, username: &str, card: Card) {
- // TODO
- }
-
- pub fn deck(&self) -> HashSet<Card> {
- self.deck.clone()
- }
-
- pub fn deal_card(&mut self, username: String, card: Card) {
- if !self.deck.remove(&card) {
- error!("Tried to deal card {} but it was not present in deck: [{}]", card, self.deck.iter().format(", "));
- }
- let set = self.hands.entry(username).or_insert_with(HashSet::new);
- set.insert(card);
- }
-
- pub fn deal_community_card(&mut self, card: Card) {
- self.community.push(card);
- }
-
- pub fn player_has_card(&self, username: &str, card: Card) -> bool {
- if let Some(hand) = self.hands.get(username) {
- hand.contains(&card)
- } else {
- false
- }
- }
-}
#[test]
fn player_after_absent_player_is_none() {
let mut seats = Seats::new();
- seats.add_player(1, "Player_1".parse().unwrap());
- seats.add_player(2, "Player_2".parse().unwrap());
- seats.add_player(3, "Player_3".parse().unwrap());
+ seats.add_player(1, "Player_1".parse().unwrap()).unwrap();
+ seats.add_player(2, "Player_2".parse().unwrap()).unwrap();
+ seats.add_player(3, "Player_3".parse().unwrap()).unwrap();
assert_eq!(None, seats.player_after("Player_4".parse().unwrap()));
assert!(seats.seat_is_available(0));
assert!(!seats.seat_is_available(1));
#[test]
fn player_after_single_player_is_none() {
let mut seats = Seats::new();
- seats.add_player(1, "Player_1".parse().unwrap());
+ seats.add_player(1, "Player_1".parse().unwrap()).unwrap();
assert_eq!(None, seats.player_after("Player_1".parse().unwrap()));
assert!(seats.seat_is_available(0));
assert!(!seats.seat_is_available(1));
let player_2 = "Player_2".parse().unwrap();
let player_3 = "Player_3".parse().unwrap();
let mut seats = Seats::new();
- seats.add_player(1, player_1);
- seats.add_player(2, player_2);
- seats.add_player(3, player_3);
+ seats.add_player(1, player_1).unwrap();
+ seats.add_player(2, player_2).unwrap();
+ seats.add_player(3, player_3).unwrap();
assert_eq!(player_2, seats.player_after(player_1).unwrap());
assert_eq!(player_3, seats.player_after(player_2).unwrap());
}
let player_5 = "Player_5".parse().unwrap();
let player_8 = "Player_8".parse().unwrap();
let mut seats = Seats::new();
- seats.add_player(1, player_1);
- seats.add_player(5, player_5);
- seats.add_player(8, player_8);
+ seats.add_player(1, player_1).unwrap();
+ seats.add_player(5, player_5).unwrap();
+ seats.add_player(8, player_8).unwrap();
assert_eq!(player_1, seats.player_after(player_8).unwrap());
}
let player_1 = "Player_1".parse().unwrap();
let player_4 = "Player_4".parse().unwrap();
let mut seats = Seats::new();
- seats.add_player(1, player_1);
- seats.add_player(4, player_4);
+ seats.add_player(1, player_1).unwrap();
+ seats.add_player(4, player_4).unwrap();
assert_eq!(player_4, seats.player_after(player_1).unwrap());
assert_eq!(player_1, seats.player_after(player_4).unwrap());
}
let player_2 = "Player_2".parse().unwrap();
let player_3 = "Player_3".parse().unwrap();
let mut seats = Seats::new();
- seats.add_player(1, player_1);
- seats.add_player(2, player_2);
- seats.add_player(3, player_3);
- seats.remove_player(player_2);
+ seats.add_player(1, player_1).unwrap();
+ seats.add_player(2, player_2).unwrap();
+ seats.add_player(3, player_3).unwrap();
+ seats.remove_player(player_2).unwrap();
assert_eq!(player_3, seats.player_after(player_1).unwrap());
assert_eq!(None, seats.player_after(player_2));
assert_eq!(player_1, seats.player_after(player_3).unwrap());