From decdef29cfeec0f339679ad406e4a722c6c4b084 Mon Sep 17 00:00:00 2001 From: gamer147 Date: Mon, 1 Jun 2026 15:01:19 -0400 Subject: [PATCH] test(battle-node): TurnEnd cycle can fire multiple times Locks the loop invariant: after the first cycle the phase resets to AfterReady, so the next player TurnEnd matches the same case arm and produces the same two-frame burst. --- .../Sessions/BattleSessionDispatchTests.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/SVSim.UnitTests/BattleNode/Sessions/BattleSessionDispatchTests.cs b/SVSim.UnitTests/BattleNode/Sessions/BattleSessionDispatchTests.cs index 197216b..3b1f6e7 100644 --- a/SVSim.UnitTests/BattleNode/Sessions/BattleSessionDispatchTests.cs +++ b/SVSim.UnitTests/BattleNode/Sessions/BattleSessionDispatchTests.cs @@ -120,6 +120,26 @@ public class BattleSessionDispatchTests Assert.That(s.Phase, Is.EqualTo(BattleSessionPhase.AfterReady)); } + [Test] + public void TurnEnd_CanFireMultipleTimesConsecutively() + { + var s = NewSession(); + s.ComputeResponses(NewEnvelope(NetworkBattleUri.InitNetwork)); + s.ComputeResponses(NewEnvelope(NetworkBattleUri.InitBattle)); + s.ComputeResponses(NewEnvelope(NetworkBattleUri.Loaded)); + s.ComputeResponses(NewEnvelope(NetworkBattleUri.Swap)); + + var first = s.ComputeResponses(NewEnvelope(NetworkBattleUri.TurnEnd)); + var second = s.ComputeResponses(NewEnvelope(NetworkBattleUri.TurnEnd)); + + // Both calls produce the same two-frame burst. + Assert.That(first.Select(r => r.Envelope.Uri), + Is.EqualTo(new[] { NetworkBattleUri.TurnStart, NetworkBattleUri.TurnEnd })); + Assert.That(second.Select(r => r.Envelope.Uri), + Is.EqualTo(new[] { NetworkBattleUri.TurnStart, NetworkBattleUri.TurnEnd })); + Assert.That(s.Phase, Is.EqualTo(BattleSessionPhase.AfterReady)); + } + [Test] public void Retire_PushesBattleFinishNoContest_TransitionsToTerminal() {