improvements
This commit is contained in:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user