using System; using Amphora; using UnitTestSharp; namespace Konis.UnitTests { public class FxTimeTests : TestFixture { private static Duration Seconds(double seconds) { return Duration.FromSeconds(seconds); } public class CtorTests : TestFixture { public void AssignsRealGameDtAndSpeed() { var time = new FxTime(real: Seconds(0.25), gameDt: Seconds(0.5), speed: 2); CheckEqual(Seconds(0.25), time.Real); CheckEqual(Seconds(0.5), time.GameDt); CheckEqual(2.0, time.Speed); } public void APausedFrame_IsAllowed() { var time = new FxTime(real: Seconds(0.25), gameDt: Duration.Zero, speed: 0); CheckEqual(Duration.Zero, time.GameDt); CheckEqual(0.0, time.Speed); } public void ZeroRealTime_IsAllowed() { CheckEqual(Duration.Zero, new FxTime(real: Duration.Zero, gameDt: Duration.Zero, speed: 1).Real); } public void NegativeRealTime_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new FxTime(real: Seconds(-0.1), gameDt: Duration.Zero, speed: 1); } public void InfiniteRealTime_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new FxTime(real: Duration.Forever, gameDt: Duration.Zero, speed: 1); } public void NegativeGameDt_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new FxTime(real: Seconds(0.1), gameDt: Seconds(-0.1), speed: 1); } public void InfiniteGameDt_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new FxTime(real: Seconds(0.1), gameDt: Duration.Forever, speed: 1); } public void NegativeSpeed_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new FxTime(real: Seconds(0.1), gameDt: Duration.Zero, speed: -1); } public void NaNSpeed_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new FxTime(real: Seconds(0.1), gameDt: Duration.Zero, speed: double.NaN); } public void InfiniteSpeed_Throws() { CheckThrow(typeof(ArgumentOutOfRangeException)); new FxTime(real: Seconds(0.1), gameDt: Duration.Zero, speed: double.PositiveInfinity); } public void GameTimePassingAtSpeedZero_Throws() { CheckThrow(typeof(ArgumentException)); new FxTime(real: Seconds(0.1), gameDt: Seconds(0.1), speed: 0); } } public class ElapsedTests : TestFixture { public void Real_IsTheRealTime() { var time = new FxTime(real: Seconds(0.25), gameDt: Seconds(1), speed: 4); CheckEqual(Seconds(0.25), time.Elapsed(ClockBase.Real)); } public void Real_IgnoresAPause() { var time = new FxTime(real: Seconds(0.25), gameDt: Duration.Zero, speed: 0); CheckEqual(Seconds(0.25), time.Elapsed(ClockBase.Real)); } public void Game_IsTheGameTime() { var time = new FxTime(real: Seconds(0.25), gameDt: Seconds(1), speed: 4); CheckEqual(Seconds(1), time.Elapsed(ClockBase.Game)); } public void Game_FreezesOnAPause() { var time = new FxTime(real: Seconds(0.25), gameDt: Duration.Zero, speed: 0); CheckEqual(Duration.Zero, time.Elapsed(ClockBase.Game)); } public void GameNormal_DividesOutTheSpeed() { var time = new FxTime(real: Seconds(0.25), gameDt: Seconds(1), speed: 4); CheckEqual(Seconds(0.25), time.Elapsed(ClockBase.GameNormal)); } public void GameNormal_AtNormalSpeed_IsTheGameTime() { var time = new FxTime(real: Seconds(0.25), gameDt: Seconds(0.5), speed: 1); CheckEqual(Seconds(0.5), time.Elapsed(ClockBase.GameNormal)); } public void GameNormal_BelowNormalSpeed_RunsLonger() { var time = new FxTime(real: Seconds(0.25), gameDt: Seconds(0.5), speed: 0.5); CheckEqual(Seconds(1), time.Elapsed(ClockBase.GameNormal)); } public void GameNormal_FreezesOnAPauseWithoutDividingByZero() { var time = new FxTime(real: Seconds(0.25), gameDt: Duration.Zero, speed: 0); CheckEqual(Duration.Zero, time.Elapsed(ClockBase.GameNormal)); } public void GameNormal_WithNoGameTimeAtNormalSpeed_IsZero() { var time = new FxTime(real: Seconds(0.25), gameDt: Duration.Zero, speed: 1); CheckEqual(Duration.Zero, time.Elapsed(ClockBase.GameNormal)); } public void AnUnknownBase_Throws() { var time = new FxTime(real: Seconds(0.25), gameDt: Seconds(1), speed: 1); CheckThrow(typeof(ArgumentOutOfRangeException)); time.Elapsed((ClockBase)99); } } } }