using System.Runtime.InteropServices;
using System.Text.Json;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyRouteOptionsSelfTest()
{
static JsonElement Json(string text){using var d=JsonDocument.Parse(text);return d.RootElement.Clone();}
static bool Reject(string text){try{ParseGameRouteOptions(Json(text));return false;}catch{return true;}}
uint passed=0;
if(ParseGameRouteOptions(Json("{}")) is null&&ParseGameRouteOptions(Json("{\"routeOptions\":null}")) is null&&
ParseGameRouteOptions(Json("{\"routeOptions\":{}}")) is null)passed|=1;
var selected=ParseGameRouteOptions(Json("{\"routeOptions\":{\"mode\":2,\"useJetConeBoost\":false,\"fsdBoostLevel\":3,\"virtualCargoMass\":12.5}}"));
if(selected is{mode:2,useJetConeBoost:false,fsdBoostLevel:3,virtualCargoMass:12.5f,starClassMask:null}&&
ParseGameRouteOptions(Json("{\"routeOptions\":{\"starClassMask\":0}}")) is{starClassMask:0}&&
ParseGameRouteOptions(Json("{\"routeOptions\":{\"starClassMask\":65535}}")) is{starClassMask:65535})passed|=2;
if(new[]{"{\"mode\":true}","{\"mode\":3}","{\"mode\":1,\"fsdBoostLevel\":2}","{\"mode\":2,\"fsdBoostLevel\":4}","{\"useJetConeBoost\":0}","{\"virtualCargoMass\":-1}","{\"virtualCargoMass\":2049}"}
.Concat(new[]{"{\"starClassMask\":-1}","{\"starClassMask\":65536}","{\"starClassMask\":1.5}","{\"starClassMask\":\"32767\"}"})
.All(s=>Reject("{\"routeOptions\":"+s+"}")))passed|=4;
var memory=Platform.Allocate(0x30000);if(memory==0)return passed;
try
{
var expectedImage=memory+0x10000-0x551FE98;var component=memory+0x1000;var main=component+0x30;
var settings=memory+0x5000;var rows=memory+0x7000;var table=memory+0x12000;
Write(component,expectedImage+0x551FE98);Write(expectedImage+0x551FE98,expectedImage+0x3A4C030);Write(main,expectedImage+0x551FFC0);
Write(expectedImage+0x551FFC0+0xF0,expectedImage+0x3A6AEB0);Write(expectedImage+0x551FFC0+0xF8,expectedImage+0x3A6AFA0);
Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE10);Write(expectedImage+0x551FFC0+0x108,expectedImage+0x3A6AD80);
Write(main+0x1B8,settings);Write(settings,table);Write(table+0x1F0,expectedImage+0x2601B60);Write(table+0x200,expectedImage+0x2646760);
Write(settings+0x5F8,2);Write(settings+0x530,1u);Write(settings+0x560,0u);Write(settings+0x538,rows);Write(rows+0x54+29*4,1u);
Write(main+0x5AC,1);Write(main+0x5B0,12.5f);Write(main+0x5B4,(byte)0);Write(main+0x5B8,2);
bool Copy(out GameRouteOptionsSnapshot value)=>CopyGameRouteOptions(component,expectedImage,out _,out value);
if(Copy(out var actual)&&actual==new GameRouteOptionsSnapshot(1,true,2,12.5f,false))passed|=8;
Write(settings+0x5F8,1);var pending=!Copy(out _);Write(settings+0x5F8,2);Write(rows+0x54+29*4,0u);
pending&=Copy(out actual)&&!actual.jetCone;Write(rows+0x54+29*4,2u);pending&=!Copy(out _);Write(rows+0x54+29*4,1u);
if(pending)passed|=16;
Write(settings+0x560,1u);var invalid=!Copy(out _);Write(settings+0x560,0u);Write(settings+0x530,129u);
invalid&=!Copy(out _);Write(settings+0x530,1u);Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE11);
invalid&=!Copy(out _);Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE10);if(invalid)passed|=32;
Write(main+0x5AC,3);invalid=!Copy(out _);Write(main+0x5AC,1);Write(main+0x5B0,float.NaN);invalid&=!Copy(out _);Write(main+0x5B0,12.5f);
Write(main+0x5B8,4);invalid&=!Copy(out _);Write(main+0x5B8,2);Write(main+0x5B4,(byte)2);invalid&=!Copy(out _);Write(main+0x5B4,(byte)0);
var navigation=memory+0x9000;Write(navigation,expectedImage+0x552A9B8);Write(expectedImage+0x552A9B8+0x40,expectedImage+0x15DB8C0);
Write(main+0x220,-1);Write(main+0x228,navigation);Write(navigation+0x168,3);
invalid&=!GameRouteOptionsAllowed(main,expectedImage,new(1,null,null,null))&&GameRouteOptionsAllowed(main,expectedImage,new(null,true,null,null));
Write(navigation+0x168,1);invalid&=!GameRouteOptionsAllowed(main,expectedImage,new(null,true,null,null));
Write(navigation+0x168,0);invalid&=GameRouteOptionsAllowed(main,expectedImage,new(1,null,null,null));Write(main+0x220,0);
if(invalid)passed|=64;
var before=new byte[0x30000];Marshal.Copy((nint)memory,before,0,before.Length);var copied=Copy(out _);var after=new byte[before.Length];Marshal.Copy((nint)memory,after,0,after.Length);
if(copied&&before.SequenceEqual(after))passed|=128;
}
catch{}
finally{Platform.Free(memory);}
return passed;
}
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyRouteOptionsSelfTest")]
public static uint ExportGalaxyRouteOptionsSelfTest()=>GalaxyRouteOptionsSelfTest();
}
using System.Runtime.InteropServices;
using System.Text.Json;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyRouteOptionsSelfTest()
{
static JsonElement Json(string text){using var d=JsonDocument.Parse(text);return d.RootElement.Clone();}
static bool Reject(string text){try{ParseGameRouteOptions(Json(text));return false;}catch{return true;}}
uint passed=0;
if(ParseGameRouteOptions(Json("{}")) is null&&ParseGameRouteOptions(Json("{\"routeOptions\":null}")) is null&&
ParseGameRouteOptions(Json("{\"routeOptions\":{}}")) is null)passed|=1;
var selected=ParseGameRouteOptions(Json("{\"routeOptions\":{\"mode\":2,\"useJetConeBoost\":false,\"fsdBoostLevel\":3,\"virtualCargoMass\":12.5}}"));
if(selected is{mode:2,useJetConeBoost:false,fsdBoostLevel:3,virtualCargoMass:12.5f,starClassMask:null}&&
ParseGameRouteOptions(Json("{\"routeOptions\":{\"starClassMask\":0}}")) is{starClassMask:0}&&
ParseGameRouteOptions(Json("{\"routeOptions\":{\"starClassMask\":65535}}")) is{starClassMask:65535})passed|=2;
if(new[]{"{\"mode\":true}","{\"mode\":3}","{\"mode\":1,\"fsdBoostLevel\":2}","{\"mode\":2,\"fsdBoostLevel\":4}","{\"useJetConeBoost\":0}","{\"virtualCargoMass\":-1}","{\"virtualCargoMass\":2049}"}
.Concat(new[]{"{\"starClassMask\":-1}","{\"starClassMask\":65536}","{\"starClassMask\":1.5}","{\"starClassMask\":\"32767\"}"})
.All(s=>Reject("{\"routeOptions\":"+s+"}")))passed|=4;
var memory=Platform.Allocate(0x30000);if(memory==0)return passed;
try
{
var expectedImage=memory+0x10000-0x551FE98;var component=memory+0x1000;var main=component+0x30;
var settings=memory+0x5000;var rows=memory+0x7000;var table=memory+0x12000;
Write(component,expectedImage+0x551FE98);Write(expectedImage+0x551FE98,expectedImage+0x3A4C030);Write(main,expectedImage+0x551FFC0);
Write(expectedImage+0x551FFC0+0xF0,expectedImage+0x3A6AEB0);Write(expectedImage+0x551FFC0+0xF8,expectedImage+0x3A6AFA0);
Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE10);Write(expectedImage+0x551FFC0+0x108,expectedImage+0x3A6AD80);
Write(main+0x1B8,settings);Write(settings,table);Write(table+0x1F0,expectedImage+0x2601B60);Write(table+0x200,expectedImage+0x2646760);
Write(settings+0x5F8,2);Write(settings+0x530,1u);Write(settings+0x560,0u);Write(settings+0x538,rows);Write(rows+0x54+29*4,1u);
Write(main+0x5AC,1);Write(main+0x5B0,12.5f);Write(main+0x5B4,(byte)0);Write(main+0x5B8,2);
bool Copy(out GameRouteOptionsSnapshot value)=>CopyGameRouteOptions(component,expectedImage,out _,out value);
if(Copy(out var actual)&&actual==new GameRouteOptionsSnapshot(1,true,2,12.5f,false))passed|=8;
Write(settings+0x5F8,1);var pending=!Copy(out _);Write(settings+0x5F8,2);Write(rows+0x54+29*4,0u);
pending&=Copy(out actual)&&!actual.jetCone;Write(rows+0x54+29*4,2u);pending&=!Copy(out _);Write(rows+0x54+29*4,1u);
if(pending)passed|=16;
Write(settings+0x560,1u);var invalid=!Copy(out _);Write(settings+0x560,0u);Write(settings+0x530,129u);
invalid&=!Copy(out _);Write(settings+0x530,1u);Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE11);
invalid&=!Copy(out _);Write(expectedImage+0x551FFC0+0x100,expectedImage+0x3A6AE10);if(invalid)passed|=32;
Write(main+0x5AC,3);invalid=!Copy(out _);Write(main+0x5AC,1);Write(main+0x5B0,float.NaN);invalid&=!Copy(out _);Write(main+0x5B0,12.5f);
Write(main+0x5B8,4);invalid&=!Copy(out _);Write(main+0x5B8,2);Write(main+0x5B4,(byte)2);invalid&=!Copy(out _);Write(main+0x5B4,(byte)0);
var navigation=memory+0x9000;Write(navigation,expectedImage+0x552A9B8);Write(expectedImage+0x552A9B8+0x40,expectedImage+0x15DB8C0);
Write(main+0x220,-1);Write(main+0x228,navigation);Write(navigation+0x168,3);
invalid&=!GameRouteOptionsAllowed(main,expectedImage,new(1,null,null,null))&&GameRouteOptionsAllowed(main,expectedImage,new(null,true,null,null));
Write(navigation+0x168,1);invalid&=!GameRouteOptionsAllowed(main,expectedImage,new(null,true,null,null));
Write(navigation+0x168,0);invalid&=GameRouteOptionsAllowed(main,expectedImage,new(1,null,null,null));Write(main+0x220,0);
if(invalid)passed|=64;
var before=new byte[0x30000];Marshal.Copy((nint)memory,before,0,before.Length);var copied=Copy(out _);var after=new byte[before.Length];Marshal.Copy((nint)memory,after,0,after.Length);
if(copied&&before.SequenceEqual(after))passed|=128;
}
catch{}
finally{Platform.Free(memory);}
return passed;
}
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyRouteOptionsSelfTest")]
public static uint ExportGalaxyRouteOptionsSelfTest()=>GalaxyRouteOptionsSelfTest();
}