using MrGameEng.Core; using Xunit; namespace MrGameEng.Core.Tests; public class GameSpeedTests { [Fact] public void Constructor_DefaultSteps_RunsAtFirstStep() { var clock = new GameClock(); var speed = new GameSpeed(clock); Assert.Equal(new[] { 1f, 3f, 6f }, speed.Steps); Assert.False(speed.IsPaused); Assert.Equal(1f, speed.CurrentSpeed); Assert.Equal(1f, clock.TimeScale); } [Fact] public void Constructor_NonPositiveStep_Throws() { Assert.Throws(() => new GameSpeed(new GameClock(), 1f, 0f)); } [Fact] public void Pause_SetsClockToZero_ResumeRestoresStep() { var clock = new GameClock(); var speed = new GameSpeed(clock, 1f, 3f, 6f); speed.SetStep(2); speed.Pause(); Assert.True(speed.IsPaused); Assert.Equal(0f, clock.TimeScale); Assert.Equal(0f, speed.CurrentSpeed); speed.Resume(); Assert.False(speed.IsPaused); Assert.Equal(6f, clock.TimeScale); Assert.Equal(2, speed.StepIndex); } [Fact] public void SetStep_OutOfRange_Clamps() { var clock = new GameClock(); var speed = new GameSpeed(clock, 1f, 3f, 6f); speed.SetStep(99); Assert.Equal(2, speed.StepIndex); Assert.Equal(6f, clock.TimeScale); speed.SetStep(-5); Assert.Equal(0, speed.StepIndex); Assert.Equal(1f, clock.TimeScale); } [Fact] public void FasterAndSlower_ClampAtEnds_AndUnpause() { var clock = new GameClock(); var speed = new GameSpeed(clock, 1f, 3f, 6f); speed.Faster(); Assert.Equal(1, speed.StepIndex); speed.Faster(); speed.Faster(); // clamps at fastest Assert.Equal(2, speed.StepIndex); speed.Pause(); speed.Slower(); // unpauses and steps down Assert.False(speed.IsPaused); Assert.Equal(1, speed.StepIndex); } [Fact] public void Cycle_GoesPauseThroughStepsBackToPause() { var clock = new GameClock(); var speed = new GameSpeed(clock, 1f, 3f, 6f); speed.Pause(); speed.Cycle(); // -> step 0 Assert.False(speed.IsPaused); Assert.Equal(0, speed.StepIndex); speed.Cycle(); // -> step 1 Assert.Equal(1, speed.StepIndex); speed.Cycle(); // -> step 2 (fastest) Assert.Equal(2, speed.StepIndex); speed.Cycle(); // -> pause Assert.True(speed.IsPaused); } [Fact] public void Changed_FiresOnTransitions() { var clock = new GameClock(); var speed = new GameSpeed(clock, 1f, 3f, 6f); var count = 0; speed.Changed += () => count++; speed.Pause(); speed.Resume(); speed.Faster(); Assert.Equal(3, count); } }