using System.Text.Json;
using XFEEDToolBox.Views;
namespace XFEEDToolBox;
public partial class App
{
// Read-only application preflight: never sends flight inputs or invokes target selection.
private static async Task RunNavigationCheckAsync(string[] args,string reportPath)
{
if(File.Exists(reportPath))throw new IOException("Use a new navigation check report path.");
var destination=GetArgument(args,"--check-destination");
AppShellPage.Current!.Navigate(typeof(NavigationPage));
await Task.Delay(150);
object Snapshot()=>new
{
destination=ViewModel.NavigationDestination,
routeMatches=ViewModel.NavigationRouteMatches,
pluginReady=ViewModel.PluginNavigationReady,
driverBound=Runtime.FlightDriver is not null,
commandEnabled=ViewModel.StartNavigationCommand.CanExecute(null),
buttonEnabled=Descendants(AppShellPage.Current!.CurrentPage).OfType<Button>().FirstOrDefault(b=>b.Content as string=="开始自动导航")?.IsEnabled,
status=ViewModel.NavigationStatus,
startHint=ViewModel.NavigationStartHint,
statusSeverity=ViewModel.NavigationStatusSeverity.ToString(),
nativeStatus=ViewModel.NavigationNativeStatus,
routeSummary=ViewModel.NavigationRouteSummary,
ship=ViewModel.NavigationShip,
navigationActive=ViewModel.NavigationActive,
runActive=ViewModel.RunActive,
sessionBusy=ViewModel.SessionBusy,
error=ViewModel.ErrorMessage,
legs=ViewModel.NavigationLegs.Select(r=>r.Record).ToArray()
};
var initial=Snapshot();
if(destination is not null)ViewModel.NavigationDestination=destination;
if(args.Contains("--check-invalid-reserve"))ViewModel.NavigationFuelReserve=double.NaN;
string? preflightFailure=null;
var rejectedStart=args.Contains("--check-rejected-start");
if(rejectedStart)
{
ViewModel.NavigationDestination="";
if(ViewModel.NavigationDestination.Length!=0)throw new InvalidOperationException("Rejected-start fixture did not clear the destination.");
await ViewModel.StartNavigationCommand.ExecuteAsync(null);
preflightFailure=ViewModel.NavigationStatus;
}
else
{
try{await ViewModel.ValidateNavigationStartAsync();}
catch(Exception error){preflightFailure=error.Message;}
await ViewModel.CheckNavigationCommand.ExecuteAsync(null);
}
await Task.Delay(150);
await File.WriteAllTextAsync(reportPath,JsonSerializer.Serialize(new
{
at=DateTimeOffset.UtcNow,initial,afterCheck=Snapshot(),preflightPassed=preflightFailure is null,preflightFailure,rejectedStartCommandExercised=rejectedStart,
player=new {Runtime.Player.InGame,Runtime.Player.InDanger,Runtime.Player.Docked,Runtime.Player.SystemName,Runtime.Player.Navigation.CurrentSystemAddress,Runtime.Player.MaxJumpRange,gameRouteCount=Runtime.Player.Navigation.Route.Count},
activity=Runtime.Activity,
flightCommandsInvoked=false,targetSelectionInvoked=false,screenUse=false,journalWrites=0,navRouteWrites=0
},new JsonSerializerOptions{WriteIndented=true}));
MainWindow.Close();
}
}
using System.Text.Json;
using XFEEDToolBox.Views;
namespace XFEEDToolBox;
public partial class App
{
// Read-only application preflight: never sends flight inputs or invokes target selection.
private static async Task RunNavigationCheckAsync(string[] args,string reportPath)
{
if(File.Exists(reportPath))throw new IOException("Use a new navigation check report path.");
var destination=GetArgument(args,"--check-destination");
AppShellPage.Current!.Navigate(typeof(NavigationPage));
await Task.Delay(150);
object Snapshot()=>new
{
destination=ViewModel.NavigationDestination,
routeMatches=ViewModel.NavigationRouteMatches,
pluginReady=ViewModel.PluginNavigationReady,
driverBound=Runtime.FlightDriver is not null,
commandEnabled=ViewModel.StartNavigationCommand.CanExecute(null),
buttonEnabled=Descendants(AppShellPage.Current!.CurrentPage).OfType<Button>().FirstOrDefault(b=>b.Content as string=="开始自动导航")?.IsEnabled,
status=ViewModel.NavigationStatus,
startHint=ViewModel.NavigationStartHint,
statusSeverity=ViewModel.NavigationStatusSeverity.ToString(),
nativeStatus=ViewModel.NavigationNativeStatus,
routeSummary=ViewModel.NavigationRouteSummary,
ship=ViewModel.NavigationShip,
navigationActive=ViewModel.NavigationActive,
runActive=ViewModel.RunActive,
sessionBusy=ViewModel.SessionBusy,
error=ViewModel.ErrorMessage,
legs=ViewModel.NavigationLegs.Select(r=>r.Record).ToArray()
};
var initial=Snapshot();
if(destination is not null)ViewModel.NavigationDestination=destination;
if(args.Contains("--check-invalid-reserve"))ViewModel.NavigationFuelReserve=double.NaN;
string? preflightFailure=null;
var rejectedStart=args.Contains("--check-rejected-start");
if(rejectedStart)
{
ViewModel.NavigationDestination="";
if(ViewModel.NavigationDestination.Length!=0)throw new InvalidOperationException("Rejected-start fixture did not clear the destination.");
await ViewModel.StartNavigationCommand.ExecuteAsync(null);
preflightFailure=ViewModel.NavigationStatus;
}
else
{
try{await ViewModel.ValidateNavigationStartAsync();}
catch(Exception error){preflightFailure=error.Message;}
await ViewModel.CheckNavigationCommand.ExecuteAsync(null);
}
await Task.Delay(150);
await File.WriteAllTextAsync(reportPath,JsonSerializer.Serialize(new
{
at=DateTimeOffset.UtcNow,initial,afterCheck=Snapshot(),preflightPassed=preflightFailure is null,preflightFailure,rejectedStartCommandExercised=rejectedStart,
player=new {Runtime.Player.InGame,Runtime.Player.InDanger,Runtime.Player.Docked,Runtime.Player.SystemName,Runtime.Player.Navigation.CurrentSystemAddress,Runtime.Player.MaxJumpRange,gameRouteCount=Runtime.Player.Navigation.Route.Count},
activity=Runtime.Activity,
flightCommandsInvoked=false,targetSelectionInvoked=false,screenUse=false,journalWrites=0,navRouteWrites=0
},new JsonSerializerOptions{WriteIndented=true}));
MainWindow.Close();
}
}