using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyFilterFactsSelfTest()
{
var memory=Platform.Allocate(32768);if(memory==0)return 0;
try
{
var expected=unchecked((nuint)0x140000000UL);var metadata=memory+1024;var trade=memory+2048;var child=memory+4096;
var treeNode=memory+8192;var metaBucket=memory+12288;var metaNode=memory+12352;var metaEmpty=memory+12416;
var ownedBucket=memory+12800;var ownedNode=memory+12900;var pendingBucket=memory+13100;var pendingNode=memory+13200;
void Map(nuint map,nuint bucket,nuint node)
{Write(map,bucket);Write(map+8,1UL);Write(map+0x18,node==0?0UL:1UL);Write(bucket,node==0?bucket:node);if(node!=0){Write(node,bucket);Write(node+8,300UL);}}
Write(metadata,expected+0x551A1B0);Write(trade,expected+0x552EBA0);
Map(metadata+0xA8,metaBucket,metaNode);Map(metadata+0xC8,metaEmpty,0);Write(metaNode+0x30,4);
Map(trade+0xB8,ownedBucket,ownedNode);Map(trade+0xD8,pendingBucket,0);
Write(child+0x100,3);Write(child+0x108,100UL);Write(child+0x120,treeNode);Write(treeNode+0x20,300UL);
var context=new GalaxyFilterContext{expectedImage=expected,metadata=metadata,trade=trade,explorationChild=child,currentSystem=100,
hasCurrentPosition=true,currentPosition=new(0,0,0)};
GalaxyFilterFacts ReadFact(ulong address,double distance=1)
{if(!CopyGalaxyFilterFacts(context,address,[distance,0,0],out var result))throw new InvalidOperationException();return result;}
uint passed=0;
var fact=ReadFact(300);
if(fact.exploration=="dataavailable"&&fact.tradeData=="havedata"&&fact.withinDataRange==true&&fact.metadataStatus==4)passed|=1;
fact=ReadFact(301);
if(fact.exploration=="nodataavailable"&&fact.tradeData is null&&fact.metadataStatus is null)passed|=2;
Write(child+0x100,2);var notReady=ReadFact(300);Write(child+0x100,3);Write(child+0x108,101UL);var wrongSystem=ReadFact(300);Write(child+0x108,100UL);
if(notReady.exploration is null&&wrongSystem.exploration is null)passed|=4;
Write(metaNode+0x30,1);if(ReadFact(300).tradeData=="nodataavailable")passed|=8;
Write(metaNode+0x30,28);Write(trade+0xD0,0UL);Map(trade+0xD8,pendingBucket,pendingNode);
if(ReadFact(300).tradeData=="havedata")passed|=16;
Write(trade+0xF0,0UL);if(ReadFact(300).tradeData=="dataavailable")passed|=32;
Write(metaNode+0x30,29);var future=ReadFact(300);Write(metaNode+0x30,4);
Write(metadata+0xC0,0UL);var absent=ReadFact(300);Write(metadata+0xC0,1UL);Write(metaNode,metaNode);var malformed=ReadFact(301);Write(metaNode,metaBucket);
if(future.metadataStatus is null&&future.tradeData is null&&absent.tradeData is null&&malformed.tradeData is null)passed|=64;
var boundary=ReadFact(300,20);context.hasCurrentPosition=false;var noPosition=ReadFact(300);
if(boundary.withinDataRange==false&&boundary.exploration is null&&boundary.tradeData is null&&
noPosition.withinDataRange is null&&noPosition.exploration is null&&noPosition.tradeData is null)passed|=128;
return passed;
}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyFilterFactsSelfTest")]
internal static uint ExportGalaxyFilterFactsSelfTest()=>RunTest(GalaxyFilterFactsSelfTest);
#endif
}
using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyFilterFactsSelfTest()
{
var memory=Platform.Allocate(32768);if(memory==0)return 0;
try
{
var expected=unchecked((nuint)0x140000000UL);var metadata=memory+1024;var trade=memory+2048;var child=memory+4096;
var treeNode=memory+8192;var metaBucket=memory+12288;var metaNode=memory+12352;var metaEmpty=memory+12416;
var ownedBucket=memory+12800;var ownedNode=memory+12900;var pendingBucket=memory+13100;var pendingNode=memory+13200;
void Map(nuint map,nuint bucket,nuint node)
{Write(map,bucket);Write(map+8,1UL);Write(map+0x18,node==0?0UL:1UL);Write(bucket,node==0?bucket:node);if(node!=0){Write(node,bucket);Write(node+8,300UL);}}
Write(metadata,expected+0x551A1B0);Write(trade,expected+0x552EBA0);
Map(metadata+0xA8,metaBucket,metaNode);Map(metadata+0xC8,metaEmpty,0);Write(metaNode+0x30,4);
Map(trade+0xB8,ownedBucket,ownedNode);Map(trade+0xD8,pendingBucket,0);
Write(child+0x100,3);Write(child+0x108,100UL);Write(child+0x120,treeNode);Write(treeNode+0x20,300UL);
var context=new GalaxyFilterContext{expectedImage=expected,metadata=metadata,trade=trade,explorationChild=child,currentSystem=100,
hasCurrentPosition=true,currentPosition=new(0,0,0)};
GalaxyFilterFacts ReadFact(ulong address,double distance=1)
{if(!CopyGalaxyFilterFacts(context,address,[distance,0,0],out var result))throw new InvalidOperationException();return result;}
uint passed=0;
var fact=ReadFact(300);
if(fact.exploration=="dataavailable"&&fact.tradeData=="havedata"&&fact.withinDataRange==true&&fact.metadataStatus==4)passed|=1;
fact=ReadFact(301);
if(fact.exploration=="nodataavailable"&&fact.tradeData is null&&fact.metadataStatus is null)passed|=2;
Write(child+0x100,2);var notReady=ReadFact(300);Write(child+0x100,3);Write(child+0x108,101UL);var wrongSystem=ReadFact(300);Write(child+0x108,100UL);
if(notReady.exploration is null&&wrongSystem.exploration is null)passed|=4;
Write(metaNode+0x30,1);if(ReadFact(300).tradeData=="nodataavailable")passed|=8;
Write(metaNode+0x30,28);Write(trade+0xD0,0UL);Map(trade+0xD8,pendingBucket,pendingNode);
if(ReadFact(300).tradeData=="havedata")passed|=16;
Write(trade+0xF0,0UL);if(ReadFact(300).tradeData=="dataavailable")passed|=32;
Write(metaNode+0x30,29);var future=ReadFact(300);Write(metaNode+0x30,4);
Write(metadata+0xC0,0UL);var absent=ReadFact(300);Write(metadata+0xC0,1UL);Write(metaNode,metaNode);var malformed=ReadFact(301);Write(metaNode,metaBucket);
if(future.metadataStatus is null&&future.tradeData is null&&absent.tradeData is null&&malformed.tradeData is null)passed|=64;
var boundary=ReadFact(300,20);context.hasCurrentPosition=false;var noPosition=ReadFact(300);
if(boundary.withinDataRange==false&&boundary.exploration is null&&boundary.tradeData is null&&
noPosition.withinDataRange is null&&noPosition.exploration is null&&noPosition.tradeData is null)passed|=128;
return passed;
}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyFilterFactsSelfTest")]
internal static uint ExportGalaxyFilterFactsSelfTest()=>RunTest(GalaxyFilterFactsSelfTest);
#endif
}