diff --git a/deck/src/models/card.rs b/deck/src/models/card.rs index c90aa22..5b39b33 100644 --- a/deck/src/models/card.rs +++ b/deck/src/models/card.rs @@ -22,6 +22,21 @@ impl Card { pub fn flip(&mut self) { self.is_showed = !self.is_showed; } + + pub fn can_place_on_pile(&self, pile: &Vec) -> bool { + let pile_last_card = pile.last(); + match pile_last_card { + Some(card) => (self.rank + 1 == card.rank) && (self.is_red() != card.is_red()), + None => self.rank == 13, + } + } + + pub fn is_red(&self) -> bool { + match self.suit { + Suit::Hearts | Suit::Diamonds => true, + _ => false, + } + } } impl fmt::Display for Card { @@ -45,6 +60,7 @@ impl fmt::Display for Card { } } } + #[cfg(test)] mod tests { use super::*; @@ -76,4 +92,64 @@ mod tests { card.flip(); assert_eq!(card.is_showed, true); } + + #[test] + fn check_that_card_red() { + let must_be_red = Card::new(10, Suit::Hearts); + assert!(must_be_red.is_red()); + let must_be_red = Card::new(1, Suit::Diamonds); + assert!(must_be_red.is_red()); + let must_be_black = Card::new(10, Suit::Clubs); + assert_eq!(false, must_be_black.is_red()); + let must_be_black = Card::new(1, Suit::Spades); + assert_eq!(false, must_be_black.is_red()); + } + + #[test] + fn can_place_on_pile() { + let card_to_check = Card::new(3, Suit::Hearts); + let pile = vec![Card::new(4, Suit::Spades)]; + + assert!(card_to_check.can_place_on_pile(&pile)); + } + + #[test] + fn cant_be_placed_on_pile_because_rank() { + let card_to_check = Card::new(13, Suit::Hearts); + let pile = vec![Card::new(11, Suit::Spades)]; + + let can_place = card_to_check.can_place_on_pile(&pile); + + assert_eq!(false, can_place); + } + + #[test] + fn cant_be_placed_on_pile_because_color() { + let card_to_check = Card::new(2, Suit::Spades); + let pile = vec![Card::new(3, Suit::Clubs)]; + + let can_place = card_to_check.can_place_on_pile(&pile); + + assert_eq!(false, can_place); + } + + #[test] + fn can_be_placed_on_empty_pile() { + let card_to_check = Card::new(13, Suit::Clubs); + let pile: Vec = vec![]; + + let can_be_placed = card_to_check.can_place_on_pile(&pile); + + assert!(can_be_placed); + } + + #[test] + fn cant_be_placed_on_empty_pile() { + let card_to_check = Card::new(12, Suit::Hearts); + let pile: Vec = vec![]; + + let can_be_placed = card_to_check.can_place_on_pile(&pile); + + assert_eq!(false, can_be_placed); + } }