using XFEEDToolBox.Core.Navigation; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public class CruiseOverchargeNativeGuardTests { private static CruiseOverchargeGateFrame Good=>new(){IdentityVerified=true,GeometryVerified=true,TargetVerified=true,InSupercruise=true,NativeCanEngage=true, RawFsdState=2,OverchargeState=0,ObservedAt=1000,Hull=1,Heat=40,HeatRise=0,MainFuel=32,FuelCapacity=32,FuelRateUpper=1,RequiredFuelReserve=8,Distance=1e12,Speed=1e6,AimErrorDegrees=0, ThermalInput=new(){Verified=true,HeatCapacity=100,HeatDisplayScale=1,ScoInputUpper=10,OtherInputUpper=5, CoolingPassive=10,CoolingMaximum=10,CoolingScale=1,CoolingHeatLower=0,CoolingHeatUpper=1, LeaseRemainingSeconds=.15,ResponseDelaySeconds=.01,AfterStopSeconds=.5}}; private static string? Refuse(CruiseOverchargeGateFrame? frame=null,ulong now=1100,ulong deadline=1250)=>CruiseOverchargeNativeGuard.Refusal(frame??Good,now,deadline); [Test]public void VerifiedOriginalDistantAlignedShipIsAllowed()=>Check.That(Refuse() is null); [Test]public void ALeaseCannotOutliveItsOriginalDeadline() {Check.Equal("expired",Refuse(now:1250));Check.Equal("expired",Refuse(deadline:1351));Check.Equal("expired",Refuse(Good with{ObservedAt=1101}));} [Test]public void IdentityTargetAndAssistChangesStopBoost() {Check.That(Refuse(Good with{TargetVerified=false}) is not null);Check.That(Refuse(Good with{IdentityVerified=false}) is not null);Check.That(Refuse(Good with{AssistEnabled=true}) is not null);} [Test]public void NormalSpaceUnknownFsdAndCoolingCannotStart() {Check.That(Refuse(Good with{InSupercruise=false}) is not null);Check.That(Refuse(Good with{RawFsdState=3}) is not null);Check.That(Refuse(Good with{OverchargeState=3}) is not null);} [Test]public void AcknowledgementDoesNotReplaceOriginalReadiness() {Check.That(Refuse(Good with{NativeCanEngage=false}) is not null);Check.That(Refuse(Good with{GeometryVerified=false}) is not null);} [Test]public void DamageAndCollisionStopBoostImmediately() {Check.That(Refuse(Good with{Hull=0}) is not null);Check.That(Refuse(Good with{Emergency=true}) is not null);Check.That(Refuse(Good with{CollisionCourse=true}) is not null);} [Test]public void AStableHistoricallyDamagedShipCanUseFreshVerifiedScoWithoutWeakeningTheEmergencyGate() {Check.That(Refuse(Good with{Hull=.49}) is null);Check.That(Refuse(Good with{Hull=.94}) is null);Check.Equal("health",Refuse(Good with{Hull=.49,Emergency=true}));} [Test]public void ComponentHeatAndUnknownSourceModelStopBeforeOverheat() {Check.Equal("heat",Refuse(Good with{Heat=99.5,HeatRise=-10}));Check.Equal("thermal-model",Refuse(Good with{ThermalInput=null}));Check.Equal("heat",Refuse(Good with{Heat=100,OverchargeState=2}));} [Test]public void RapidOverallRiseAloneDoesNotImposeTheOldFiftyPercentStop() { Check.That(Refuse(Good with{Heat=52,HeatRise=10,OverchargeState=2}) is null); Check.That(Refuse(Good with{Heat=90,HeatRise=double.NaN,OverchargeState=2}) is null); Check.That(Refuse(Good with{Heat=60.1,HeatRise=0,OverchargeState=0}) is null); } [Test]public void LargeShipsUseTheirOwnFuelRateAndReserve() {Check.That(Refuse(Good with{MainFuel=128,FuelCapacity=128,FuelRateUpper=12,RequiredFuelReserve=70}) is null);Check.Equal("fuel",Refuse(Good with{MainFuel=14,FuelRateUpper=4}));} [Test]public void UnknownFuelOrGeometryCannotEnable() {Check.Equal("fuel",Refuse(Good with{FuelRateUpper=double.NaN}));Check.Equal("approach-or-alignment",Refuse(Good with{Distance=1e8}));Check.Equal("approach-or-alignment",Refuse(Good with{AimErrorDegrees=4}));} [Test]public void ANewFrameIsEvaluatedAgainstTheTimeAfterItWasSampled() { var observed=Good with{ObservedAt=1101}; Check.Equal("expired",Refuse(observed,now:1100)); Check.That(Refuse(observed,now:1102) is null); Check.Equal("expired",Refuse(observed,now:1302,deadline:1350)); Check.Equal("expired",Refuse(observed,now:1250)); } [Test]public void NativeAndApplicationApproachBuffersAgreeForTheRealShortBurstCase() { const double ls=299792458;var value=Good with{OverchargeState=2,CruiseParametersVerified=true,CruiseApproachSeconds=6,Distance=784.9268650541314*ls,Speed=26.417687132075883*ls}; Check.That(Refuse(value) is null);Check.Equal(13d,ScoApproachEnvelope.StopHorizonSeconds(true,6)); Check.Equal("approach-or-alignment",Refuse(value with{CruiseParametersVerified=false})); Check.Equal("approach-or-alignment",Refuse(value with{Distance=100*ls})); Check.Equal("heat",Refuse(value with{Heat=99.5}));Check.Equal("fuel",Refuse(value with{MainFuel=9})); foreach(var bad in new[]{double.NaN,0d,-1,61})Check.Equal(30d,ScoApproachEnvelope.StopHorizonSeconds(true,bad)); } }