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