namespace HSchool.Simulation.Tests; public class ClockTempoTests { private static readonly DateTime Start = new(2012, 4, 3, 6, 0, 0, DateTimeKind.Utc); private const double OneTwentiethOfASecond = 1d / 20d; private const double GameMinutesPerRealSecond = 1d; [Fact] public void AtX10_TwentyImpulses_RunHeavyTenTimesAndAdvanceTenGameMinutes() { using var school = School.Create(1, "Страйд", Start); school.Clock.SpeedIndex = 4; for (var i = 0; i < 20; i++) { school.Tick(OneTwentiethOfASecond, GameMinutesPerRealSecond); } Assert.Equal(Start.AddMinutes(10), school.Clock.Time); Assert.Equal(10, school.HeavySystemsInvocations); Assert.Equal(1d, school.LastHeavyGameMinutes); } [Theory] [InlineData(0, 0.5)] [InlineData(1, 1d)] [InlineData(2, 2d)] public void LowSpeed_EveryImpulseRunsHeavySystems(int speedIndex, double expectedMinutes) { using var school = School.Create(1, "Каждый импульс", Start); school.Clock.SpeedIndex = speedIndex; for (var i = 0; i < 20; i++) { school.Tick(OneTwentiethOfASecond, GameMinutesPerRealSecond); } Assert.Equal(Start.AddMinutes(expectedMinutes), school.Clock.Time); Assert.Equal(20, school.HeavySystemsInvocations); } [Fact] public void AtX5_TwentyImpulses_RunHeavyFiveTimesAndAdvanceFiveGameMinutes() { using var school = School.Create(1, "Страйд ×5", Start); school.Clock.SpeedIndex = 3; for (var i = 0; i < 20; i++) { school.Tick(OneTwentiethOfASecond, GameMinutesPerRealSecond); } Assert.Equal(Start.AddMinutes(5), school.Clock.Time); Assert.Equal(5, school.HeavySystemsInvocations); Assert.Equal(1d, school.LastHeavyGameMinutes); } [Theory] [InlineData(3, 5d)] [InlineData(4, 10d)] public void HighSpeedIndex_OneRealSecond_AdvancesExpectedGameMinutes(int speedIndex, double expectedMinutes) { using var school = School.Create(1, "Быстро", Start); school.Clock.SpeedIndex = speedIndex; for (var i = 0; i < 20; i++) { school.Tick(OneTwentiethOfASecond, GameMinutesPerRealSecond); } Assert.Equal(Start.AddMinutes(expectedMinutes), school.Clock.Time); } }