XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
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));
    }
}