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));
}
}
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));
}
}