using System.Collections.Immutable; using SideScrollerGame.Sim.Definitions; using SideScrollerGame.Sim.Input; namespace SideScrollerGame.Sim.Tests; public sealed class SimulationSerializationTests { [Fact] public void SaveStateLoadState_PreservesStateAndNextStepHash() { var definition = SimulationTestFactory.CreateGameDefinition(triggers: ImmutableArray.Create(new TriggerDefinition("checkpoint_a", new(new(11, 21), new(12, 22)), "TriggerActivated"))); var config = SimulationTestFactory.CreateConfig(); Simulation original = new(definition, config, 17); original.Step(SimulationTestFactory.CreateTick(1, new MoveAxisChanged(new(1), 1, 1))); var bytes = original.SaveState(); var loaded = Simulation.LoadState(bytes, definition, config); Assert.Equal(original.CurrentTick, loaded.CurrentTick); Assert.Equal(original.CurrentSnapshot.StateHash, loaded.CurrentSnapshot.StateHash); Assert.Equal(original.CurrentState.GetRequiredPlayer(new(1)).Health, loaded.CurrentState.GetRequiredPlayer(new(1)).Health); Assert.Equal(original.CurrentState.ActivatedTriggerIds, loaded.CurrentState.ActivatedTriggerIds); var nextBatch = SimulationTestFactory.CreateTick(2, new ButtonChanged(new(1), InputButton.FirePrimary, true)); var originalHash = original.Step(nextBatch).StateHash; var loadedHash = loaded.Step(nextBatch).StateHash; Assert.Equal(originalHash, loadedHash); } [Fact] public void Constructor_NormalizesZeroSeed() { Simulation simulation = new(SimulationTestFactory.CreateGameDefinition(), SimulationTestFactory.CreateConfig(), 0); simulation.Step(TickActionBatch.Empty(1)); Assert.NotEqual(0UL, simulation.CurrentState.RandomState); } }