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