using XFEEDToolBox.Core.Navigation; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public class NativeDockingObservationTests { [Test]public void PhysicalDockingAndAnOriginalDutyRemainObservationOnlyWhenTheGrantHasTransitioned() { using var complete=System.Text.Json.JsonDocument.Parse("{\"verified\":true,\"clearanceGranted\":false,\"nativeDutyActive\":false,\"nativeLaunchActive\":false,\"nativeLaunchRequested\":false}"); Check.That(NativeSystemFlightObservation.ObserveOriginalArrival(complete.RootElement,5)); Check.That(NativeSystemFlightObservation.ObserveOriginalArrival(complete.RootElement,7)); Check.That(!NativeSystemFlightObservation.ObserveOriginalArrival(complete.RootElement,3)); using var active=System.Text.Json.JsonDocument.Parse("{\"verified\":true,\"clearanceGranted\":false,\"nativeDutyActive\":true}"); Check.That(NativeSystemFlightObservation.ObserveOriginalArrival(active.RootElement,4)); using var unverified=System.Text.Json.JsonDocument.Parse("{\"verified\":false,\"nativeDutyActive\":true}"); Check.That(!NativeSystemFlightObservation.ObserveOriginalArrival(unverified.RootElement,5)); using var launch=System.Text.Json.JsonDocument.Parse("{\"verified\":true,\"nativeDutyActive\":true,\"nativeLaunchActive\":true}"); Check.That(!NativeSystemFlightObservation.ObserveOriginalArrival(launch.RootElement,5)); } [Test] public void LaunchCancellationIncludesRequestsWhichHaveNotStartedTheirNativeDuty() { using var pending=System.Text.Json.JsonDocument.Parse("{\"nativeLaunchActive\":false,\"nativeLaunchRequested\":true}"); using var active=System.Text.Json.JsonDocument.Parse("{\"nativeLaunchActive\":true,\"nativeLaunchRequested\":false}"); using var complete=System.Text.Json.JsonDocument.Parse("{\"nativeLaunchActive\":false,\"nativeLaunchRequested\":false}"); Check.That(NativeSystemFlightObservation.LaunchNeedsCancellation(pending.RootElement)); Check.That(NativeSystemFlightObservation.LaunchNeedsCancellation(active.RootElement)); Check.That(!NativeSystemFlightObservation.LaunchNeedsCancellation(complete.RootElement)); } [Test] public void OriginalAssistDropRetainsAiOwnershipUntilItsDutyActuallyEnds() { Check.Equal(NativeAssistState.Engaged,NativeSystemFlightObservation.CruiseAssist(true,false,true,true,true)); Check.Equal(LocalFlightMode.Transition,NativeSystemFlightObservation.Mode(false,true,5)); Check.Equal(LocalFlightMode.Supercruise,NativeSystemFlightObservation.Mode(false,true,2)); Check.Equal(LocalFlightMode.Transition,NativeSystemFlightObservation.Mode(false,false,2,true)); Check.Equal(LocalFlightMode.Docked,NativeSystemFlightObservation.Mode(true,false,2,true)); Check.Equal(NativeAssistState.Requested,NativeSystemFlightObservation.CruiseAssist(true,true,false,true,true)); Check.Equal(NativeAssistState.Ready,NativeSystemFlightObservation.CruiseAssist(true,false,false,true,false)); } [Test] public void OriginalDockingActivityEventIsOrderedAndDoesNotSurviveAnotherSession() { var projector=new NavigationProjector();var at=DateTimeOffset.UtcNow; void Apply(string name,int seconds,string track="")=>projector.Apply(Check.Event(new{timestamp=at.AddSeconds(seconds),@event=name,MusicTrack=track})); Apply("LoadGame",0);Apply("Music",2,"DockingComputer");Check.That(projector.State.DockingComputerActive); Apply("Music",1,"Exploration");Check.That(projector.State.DockingComputerActive); Apply("Music",3,"Exploration");Check.That(!projector.State.DockingComputerActive); Apply("Music",4,"DockingComputer");Apply("LoadGame",5);Check.That(!projector.State.DockingComputerActive); Apply("Music",4,"DockingComputer");Check.That(!projector.State.DockingComputerActive); } [Test] public void LaunchCompletionRequiresAnActualUndockedEventAndIgnoresOlderEvents() { var projector=new NavigationProjector();var at=DateTimeOffset.UtcNow; projector.Apply(Check.Event(new{timestamp=at,@event="DockingGranted"}));Check.That(projector.State.UndockedAt is null); projector.Apply(Check.Event(new{timestamp=at,@event="Undocked"}));projector.Apply(Check.Event(new{timestamp=at.AddSeconds(-1),@event="Undocked"})); Check.Equal(at,projector.State.UndockedAt); } }