using XFEEDToolBox.Core.Models; using XFEEDToolBox.Core.Navigation; using XFEEDToolBox.Core.Session; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public sealed class NativeMenuExitSafetyTests { private static readonly DateTimeOffset Now=DateTimeOffset.UtcNow; private static PlayerState Player=>new(){InGame=true,LoadGameAt=Now.AddMinutes(-1),CommanderId="F1",CurrentShipId=7,GameMode="Solo",CargoReliable=true,CargoCount=1200,Ships=[new(){ShipId=7,HullHealth=1}]}; private static NativeSessionFrame Frame(string state="Pause",string? next=null)=>new(1,Now,state,next??state,[]); [Test]public void SafeMenusAndNormalLoadingAreNeverPermissionToTerminateAClient() { foreach(var state in new[]{"MainMenu","ContinueMenu","SetupPlaySolo","SetupPlayWithEveryone","PreMultiplayerWarnings","MultiplayerStart","MultiplayerLoad","EnteringLocation","SaveGameOnEnterLocation"}) Check.That(!NativeMenuExitSafety.CanExitClient(Player,Player,Frame(state),Now)); Check.That(!NativeMenuExitSafety.CanExitClient(Player,Player,Frame("Pause","MainMenu"),Now)); Check.That(!NativeMenuExitSafety.CanExitClient(Player,Player with{LoadGameAt=Now},Frame("InGame"),Now)); Check.That(NativeMenuExitSafety.CanExitClient(Player,Player,Frame(),Now)); } [Test]public void DamageIdentityCargoThreatAndUnknownObservationsRetainTheirProtection() { foreach(var changed in new[]{Player with{CommanderId="Other"},Player with{CurrentShipId=8},Player with{GameMode="Open"},Player with{CargoCount=1199},Player with{CargoReliable=false}, Player with{Ships=[new(){ShipId=7,HullHealth=.9}]},Player with{Navigation=Player.Navigation with{ExternalThreat=true}}}) Check.That(!NativeMenuExitSafety.CanExitClient(Player,changed,Frame(),Now)); Check.That(!NativeMenuExitSafety.CanExitClient(Player,Player,Frame() with{ObservedAt=Now.AddSeconds(-1)},Now)); Check.That(!NativeMenuExitSafety.CanExitClient(Player,Player,Frame("Unknown"),Now)); Check.That(!NativeMenuExitSafety.CanExitClient(Player,Player,Frame("Pause","Unknown"),Now)); } [Test]public void WrappedProtocolAndHealthFailuresCannotAuthorizeAnAutomaticRestart() { foreach(var error in new Exception[]{new InvalidDataException("wrong menu identity"),new NotSupportedException("unverified menu"),new FlightHealthPauseException(), new IOException("transport wrapper",new InvalidDataException("wrong ship")),new TimeoutException("wrapper",new FlightThreatPauseException())}) Check.That(!NativeMenuExitSafety.CanFallback(error,default)); Check.That(NativeMenuExitSafety.CanFallback(new NativeMenuExitTimeoutException(),default)); } }