summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2022-12-23 19:08:47 -0500
committerKjetil Orbekk <kj@orbekk.com>2022-12-23 19:08:47 -0500
commit8f72f1dcdf2309484b1c5e933984bb6215c14999 (patch)
tree08b4019a97602aea7ab30754a3993879778a540d
parentb62be3482bc8a69d59744964ec4f6d3574d8b918 (diff)
Enforce following suit in card play
-rw-r--r--protocol/src/bridge_engine.rs18
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"),
})
);
}