diff options
author | Kjetil Orbekk <kj@orbekk.com> | 2022-12-23 19:08:47 -0500 |
---|---|---|
committer | Kjetil Orbekk <kj@orbekk.com> | 2022-12-23 19:08:47 -0500 |
commit | 8f72f1dcdf2309484b1c5e933984bb6215c14999 (patch) | |
tree | 08b4019a97602aea7ab30754a3993879778a540d | |
parent | b62be3482bc8a69d59744964ec4f6d3574d8b918 (diff) |
Enforce following suit in card play
-rw-r--r-- | protocol/src/bridge_engine.rs | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/protocol/src/bridge_engine.rs b/protocol/src/bridge_engine.rs index 0c583f3..70dcda4 100644 --- a/protocol/src/bridge_engine.rs +++ b/protocol/src/bridge_engine.rs @@ -198,6 +198,12 @@ impl DealInPlay { let player = self.current_player(); let player_cards = player.get_cards_mut(&mut self.deal); + if let Some(suit) = self.in_progress.suit() { + if card.suit() != suit && player_cards.iter().find(|c| c.suit() == suit).is_some() { + return Err(anyhow!("Must follow {suit} suit")); + } + } + info!( "Next player is {:?}, playing card {} from {:?}", player, card, player_cards @@ -1188,7 +1194,7 @@ mod tests { west: mkcards("♢A ♡Q"), north: mkcards("♢Q ♡9"), east: mkcards("♢7 ♡K"), - south: mkcards("♢9 ♠9"), + south: mkcards("♥10 ♠9"), } } @@ -1332,16 +1338,20 @@ mod tests { let deal = as_playing_hand(deal.play(mkcard("♢A")).unwrap()); assert_eq!(deal.in_progress.trick.cards_played, vec!(mkcard("♢A"))); + { + let err = deal.clone().play(mkcard("♡9")).unwrap_err().to_string(); + assert_eq!(err, "Must follow ♢ suit"); + } let deal = as_playing_hand(deal.play(mkcard("♢Q")).unwrap()); - let deal = as_playing_hand(deal.play(mkcard("♥K")).unwrap()); - let deal = as_playing_hand(deal.play(mkcard("♢9")).unwrap()); + let deal = as_playing_hand(deal.play(mkcard("♢7")).unwrap()); + let deal = as_playing_hand(deal.play(mkcard("♡10")).unwrap()); assert_eq!(deal.in_progress.trick.cards_played, []); assert_eq!( deal.tricks_played, vec!(Trick { leader: Player::West, - cards_played: mkcards("♢A ♢Q ♡K ♢9"), + cards_played: mkcards("♢A ♢Q ♢7 ♡10"), }) ); } |