improvements

This commit is contained in:
Michal Vrba
2026-09-03 17:54:36 +02:00
parent 00aa94ea7c
commit 035da18584
14 changed files with 1006 additions and 52 deletions
+117
View File
@@ -110,6 +110,8 @@ public class GameEngineTests
p3.Hand.Clear();
p3.FinishedPosition = 1;
engine.State.LastFinishedPlayer = p3;
engine.State.ReviveTurnsRemaining = 4;
engine.State.ReviveRoundsRemaining = 2;
p1.Hand.Clear();
var redSeven = new Card(Suit.Hearts, Rank.Seven);
@@ -126,6 +128,64 @@ public class GameEngineTests
Assert.Equal(3, p3.Hand.Count);
}
[Fact]
public void RedSeven_AnyCardOneRound_CanPlayOnAnyCard()
{
var rules = new RuleOptions { RedSevenMode = RedSevenMode.AnyCardOneRound };
var redSeven = new Card(Suit.Hearts, Rank.Seven);
var topCard = new Card(Suit.Acorns, Rank.King); // completely different suit and rank
var canPlay = ActionValidator.CanPlayCard(redSeven, topCard, null, 0, false, rules);
Assert.True(canPlay);
}
[Fact]
public void RedSeven_ColorOrSeven_OnlyOnMatchingSuitOrSeven()
{
var rules = new RuleOptions { RedSevenMode = RedSevenMode.ColorOrSevenThreeRounds };
var redSeven = new Card(Suit.Hearts, Rank.Seven);
var topAcornsKing = new Card(Suit.Acorns, Rank.King);
var topHeartsKing = new Card(Suit.Hearts, Rank.King);
var topBellsSeven = new Card(Suit.Bells, Rank.Seven);
Assert.False(ActionValidator.CanPlayCard(redSeven, topAcornsKing, null, 0, false, rules));
Assert.True(ActionValidator.CanPlayCard(redSeven, topHeartsKing, null, 0, false, rules));
Assert.True(ActionValidator.CanPlayCard(redSeven, topBellsSeven, null, 0, false, rules));
}
[Fact]
public void RedSeven_ReviveExpiresAfterTurns()
{
var engine = new GameEngine(seed: 42);
var p1 = new Player("Hráč 1", PlayerType.Human);
var p2 = new Player("Hráč 2", PlayerType.Human);
var p3 = new Player("Hráč 3", PlayerType.Human);
var rules = new RuleOptions { RedSevenMode = RedSevenMode.AnyCardOneRound };
engine.StartGame(new List<Player> { p1, p2, p3 }, rules);
p3.Hand.Clear();
p3.Hand.Add(new Card(Suit.Leaves, Rank.Eight));
engine.State.DiscardPile.Clear();
engine.State.DiscardPile.Add(new Card(Suit.Leaves, Rank.Seven));
// p3 finishes
engine.State.CurrentPlayerIndex = 2;
var played = engine.PlayCard(p3, p3.Hand[0]);
Assert.True(played);
Assert.True(p3.HasFinished);
Assert.Equal(p3, engine.State.LastFinishedPlayer);
Assert.True(engine.State.ReviveTurnsRemaining > 0);
// Advance turns until window expires
while (engine.State.ReviveTurnsRemaining > 0)
{
engine.DrawOrAcknowledge(engine.State.CurrentPlayer);
}
Assert.Null(engine.State.LastFinishedPlayer);
Assert.Equal(0, engine.State.ReviveTurnsRemaining);
}
[Fact]
public void FourOfAKind_BurnsAndAllowsAnotherMove()
{
@@ -314,4 +374,61 @@ public class GameEngineTests
Assert.Equal(p1, engine.State.MatchWinner);
Assert.Equal(TurnState.GameOver, engine.State.TurnState);
}
[Fact]
public void GreenUnderKnave_CancelsSevenPenalty()
{
var engine = new GameEngine(seed: 42);
var p1 = new Player("Hráč 1", PlayerType.Human);
var p2 = new Player("Hráč 2", PlayerType.Human);
var rules = new RuleOptions { GreenUnderKnaveMode = GreenUnderKnaveMode.OnlyOnSevenOrUnderKnave };
engine.StartGame(new List<Player> { p1, p2 }, rules);
// p1 plays 7 -> penalty 3
p1.Hand.Clear();
p1.Hand.Add(new Card(Suit.Bells, Rank.Seven));
p1.Hand.Add(new Card(Suit.Leaves, Rank.Eight));
engine.State.DiscardPile.Clear();
engine.State.DiscardPile.Add(new Card(Suit.Bells, Rank.King));
engine.PlayCard(p1, p1.Hand[0]);
Assert.Equal(3, engine.State.PendingDrawCount);
// p2 plays Green Under Knave -> penalty becomes 0
p2.Hand.Clear();
var greenUnderKnave = new Card(Suit.Leaves, Rank.UnderKnave);
p2.Hand.Add(greenUnderKnave);
p2.Hand.Add(new Card(Suit.Hearts, Rank.Nine));
var played = engine.PlayCard(p2, greenUnderKnave);
Assert.True(played);
Assert.Equal(0, engine.State.PendingDrawCount);
Assert.Equal(greenUnderKnave, engine.State.TopCard);
}
[Fact]
public void GreenUnderKnave_UniversalWildcard_AllowsAnyPlay()
{
var rules = new RuleOptions { GreenUnderKnaveMode = GreenUnderKnaveMode.UniversalWildcard };
var greenUnderKnave = new Card(Suit.Leaves, Rank.UnderKnave);
var topAcornsKing = new Card(Suit.Acorns, Rank.King);
var arbitraryCard = new Card(Suit.Hearts, Rank.Ten);
// Green Under Knave can be played on Acorns King
Assert.True(ActionValidator.CanPlayCard(greenUnderKnave, topAcornsKing, null, 0, false, rules));
// Arbitrary card (Hearts Ten) can be played on Green Under Knave
Assert.True(ActionValidator.CanPlayCard(arbitraryCard, greenUnderKnave, null, 0, false, rules));
}
[Fact]
public void GreenUnderKnave_Disabled_DoesNotCancelPenalty()
{
var rules = new RuleOptions { GreenUnderKnaveMode = GreenUnderKnaveMode.Disabled };
var greenUnderKnave = new Card(Suit.Leaves, Rank.UnderKnave);
var topSeven = new Card(Suit.Hearts, Rank.Seven);
// When facing penalty and disabled, Green Under Knave cannot be played
Assert.False(ActionValidator.CanPlayCard(greenUnderKnave, topSeven, null, 3, false, rules));
}
}