From d605fd5536f41fd20107c258100835745431f9c8 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 27 Apr 2026 04:00:59 +0000 Subject: [PATCH] test(core): add missing boundary tests for can_place_on_foundation/tableau - King-on-Queen foundation completion (the end-game move had no test) - King wrong-suit rejected on completed foundation - Ace-on-Two valid placement (Ace.value()+1 == Two.value(), different color) - Same-rank different-color invalid (rank difference is 0, not 1) Co-Authored-By: Claude Sonnet 4.6 --- solitaire_core/src/rules.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/solitaire_core/src/rules.rs b/solitaire_core/src/rules.rs index b82a963..4e19342 100644 --- a/solitaire_core/src/rules.rs +++ b/solitaire_core/src/rules.rs @@ -119,4 +119,37 @@ mod tests { let p = pile_with(PileType::Tableau(0), vec![card(Suit::Hearts, Rank::Seven)]); assert!(can_place_on_tableau(&c, &p)); } + + #[test] + fn foundation_king_on_queen_completes_suit() { + // The last card placed to complete a foundation is always King on Queen. + let c = card(Suit::Spades, Rank::King); + let p = pile_with(PileType::Foundation(Suit::Spades), vec![card(Suit::Spades, Rank::Queen)]); + assert!(can_place_on_foundation(&c, &p, Suit::Spades)); + } + + #[test] + fn foundation_king_wrong_suit_is_invalid() { + // King of Hearts cannot go on a Spades foundation even if rank matches. + let c = card(Suit::Hearts, Rank::King); + let p = pile_with(PileType::Foundation(Suit::Spades), vec![card(Suit::Spades, Rank::Queen)]); + assert!(!can_place_on_foundation(&c, &p, Suit::Spades)); + } + + #[test] + fn tableau_ace_on_two_different_color_is_valid() { + // Ace (rank 1) can be placed on a Two of the opposite colour in the tableau. + // rank check: Ace.value() + 1 = 2 == Two.value() — passes. + let c = card(Suit::Hearts, Rank::Ace); + let p = pile_with(PileType::Tableau(0), vec![card(Suit::Spades, Rank::Two)]); + assert!(can_place_on_tableau(&c, &p)); + } + + #[test] + fn tableau_same_rank_different_color_is_invalid() { + // Two cards of the same rank cannot be stacked regardless of colour. + let c = card(Suit::Hearts, Rank::Nine); + let p = pile_with(PileType::Tableau(0), vec![card(Suit::Spades, Rank::Nine)]); + assert!(!can_place_on_tableau(&c, &p)); + } }