using System.Runtime.InteropServices;
using System.Text;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyCommodityFilterSelfTest()
{
uint passed=0;var memory=Platform.Allocate(0x30000);if(memory==0)return passed;
try
{
var expectedImage=memory-0x5FDB000;var main=memory+0x1000;var definitions=memory+0x3000;var service=memory+0x5000;var filter=memory+0x7000;var configuration=memory+0x9000;var colours=memory+0xA000;
var metadata=memory+0xC000;var metadataBuckets=memory+0xD000;var emptyBuckets=memory+0xD100;var metadataNode=memory+0xE000;
var definitionBuckets=memory+0xF000;var definitionNode=memory+0x10000;var name=memory+0x11000;var balanceBuckets=memory+0x12000;var balanceNode=memory+0x13000;
const uint uid=0x2803BBB8;const ulong address=9007199254740993;
var origin=new[]{1599520,1311520,771360};var nativePosition=origin.Select(v=>v/32f).ToArray();
Write(main,expectedImage+0x552D788);Write(main-0x80,expectedImage+0x552D490);Write(main-0x78,expectedImage+0x552D4C0);Write(main-0x70,memory+0x17000);Write(main-0x80+0x3E0,filter);Write(main-0x80+0x50,configuration);
Write(filter,expectedImage+0x552D9C8);Write(filter+0x10,configuration);Write(filter+0xD0,uid);for(nuint i=0;i<3;i++)Write(filter+0x78+i*4,nativePosition[(int)i]);
var parameters=new[]{.25f,1f,.5f,.5f,1f,1f,40f};for(nuint i=0;i<(nuint)parameters.Length;i++)Write(configuration+0x1C0+i*4,parameters[(int)i]);
var rgba=new[]{new[]{.34f,.59f,.98f,1},new[]{.22f,.7f,.28f,1},new[]{.5f,.5f,.5f,1},new[]{.5f,.5f,.5f,1},new[]{.5f,.5f,.5f,.5f}};var sprites=new[]{12,11,12,11,13};
Write(configuration+0x1E0,colours);Write(configuration+0x1E8,5u);
for(nuint row=0;row<5;row++){Write(colours+row*0x20+8,(uint)row);Write(colours+row*0x20+0x1C,(uint)sprites[(int)row]);for(nuint c=0;c<4;c++)Write(colours+row*0x20+0xC+c*4,rgba[(int)row][(int)c]);}
Write(service,expectedImage+0x52420C0);Write(service-0x58,expectedImage+0x5241F80);Write(service-0x50,expectedImage+0x5241FC0);Write(service-0x48,memory+0x15000);
Write(definitions,expectedImage+0x5219600);Write(definitions+8,expectedImage+0x5219630);Write(definitions+0x58,expectedImage+0x5219730);Write(definitions+0x10,memory+0x16000);Write(definitions+0x284,1u);
void Map(nuint header,nuint buckets,ulong count)
{Write(header,buckets);Write(header+8,17UL);Write(header+0x18,count);for(nuint i=0;i<17;i++)Write(buckets+i*8,buckets+i*8);}
Map(definitions+0x1B8,definitionBuckets,1);var definitionSentinel=definitionBuckets+(nuint)(GalaxyCommodityHash(uid)%17)*8;Write(definitionNode,definitionSentinel);Write(definitionNode+8,uid);Write(definitionSentinel,definitionNode);
var text=Encoding.UTF8.GetBytes("ActualSource");Write(definitionNode+0x18,name);Write(name,(ulong)text.Length);for(nuint i=0;i<(nuint)text.Length;i++)Write(name+0x14+i,text[(int)i]);
Write(service+0xE8,definitionNode+0x10);Write(service+0xF0,100u);Write(service+0xE0,(byte)1);Write(service+0x144,7u);
void Balance(float value)
{Map(service+0xF8,balanceBuckets,1);var sentinel=balanceBuckets+(nuint)(GalaxyCommoditySystemHash(address)%17)*8;Write(balanceNode,sentinel);Write(balanceNode+8,address);Write(balanceNode+0x10,value);Write(sentinel,balanceNode);}
Balance(.75f);
Write(metadata,expectedImage+0x551A1B0);Map(metadata+0xA8,metadataBuckets,1);Map(metadata+0xC8,emptyBuckets,0);
var metadataSentinel=metadataBuckets+(nuint)(GalaxyFactHash(address)%17)*8;Write(metadataNode,metadataSentinel);Write(metadataNode+8,address);Write(metadataSentinel,metadataNode);Write(metadataNode+0x40,memory+0x1B000);
bool Context(out GalaxyCommodityFilterContext captured)=>CopyGalaxyCommodityFilterContext(main,service,definitions,metadata,origin,expectedImage,uid,out captured);
bool Fact(GalaxyCommodityFilterContext captured,int mode,out GalaxyCommodityFilterFact? output)=>CopyGalaxyCommodityFilterFact(captured,address,[0,0,0],mode,out output);
var before=Platform.ReadBytes(memory,0x30000);
if(Context(out var context)&&Fact(context,0,out var fact)&&fact is{commodityUid:uid,category:0,opacity:.75f,size:1,sprite:12}&&fact.rgba.SequenceEqual(rgba[0]))passed|=1;
var modes=Fact(context,1,out fact)&&fact is{category:0};modes&=Fact(context,2,out fact)&&fact is{category:4,opacity:1,size:.5f,sprite:13};modes&=Fact(context,3,out fact)&&fact is{category:0};
Balance(-.25f);Write(service+0x144,8u);modes&=Context(out context)&&Fact(context,0,out fact)&&fact is{category:1,opacity:.375f,sprite:11};modes&=Fact(context,1,out fact)&&fact is{category:4};modes&=Fact(context,2,out fact)&&fact is{category:1};modes&=Fact(context,3,out fact)&&fact is{category:1};if(modes)passed|=2;
Balance(0);Write(service+0x144,9u);var zero=Context(out context)&&Fact(context,0,out fact)&&fact is{category:2,opacity:1,size:1,sprite:12};zero&=Fact(context,2,out fact)&&fact is{category:3,sprite:11};
Map(service+0xF8,balanceBuckets,0);Write(service+0x144,10u);zero&=Context(out context)&&Fact(context,0,out fact)&&fact is{category:4,opacity:1,size:.5f}&&fact.rgba[3]==.5f;if(zero)passed|=4;
Balance(.75f);Write(service+0x144,11u);Write(metadataNode+0x30,3);Write(metadataNode+0x40,(nuint)0);var descriptor=Context(out context)&&Fact(context,0,out fact)&&fact is{category:4,opacity:0,size:0};
Write(metadataNode+0x30,0);Write(metadataNode+0x40,memory+0x1B000);descriptor&=Fact(context,0,out fact)&&fact is{category:0};Map(metadata+0xA8,metadataBuckets,0);descriptor&=Fact(context,0,out fact)&&fact is null;
Map(metadata+0xA8,metadataBuckets,1);Write(metadataSentinel,metadataNode);if(descriptor)passed|=8;
var range=CopyGalaxyCommodityFilterFact(context,address,[40,0,0],0,out fact)&&fact is{category:4,opacity:0,size:0};range&=CopyGalaxyCommodityFilterFact(context,address,[39.96875,0,0],0,out fact)&&fact is{category:0};if(range)passed|=16;
Write(filter+0x138,(byte)1);var pending=Context(out var unavailable)&&!unavailable.ready&&Fact(unavailable,0,out fact)&&fact is null;Write(filter+0x138,(byte)0);
Write(service+0x140,(byte)1);pending&=Context(out unavailable)&&!unavailable.ready&&Fact(unavailable,0,out fact)&&fact is null;Write(service+0x140,(byte)0);
Write(filter+0xD0,uid+1);pending&=!Context(out _);Write(filter+0xD0,uid);if(pending)passed|=32;
var saved=Platform.ReadBytes(memory,0x30000);var readonlyResult=Context(out context)&&Fact(context,0,out fact);if(readonlyResult&&Platform.ReadBytes(memory,0x30000).AsSpan().SequenceEqual(saved)&&before.Length==saved.Length)passed|=64;
var previous=context;Write(service+0x144,12u);var stale=!Fact(previous,0,out _);stale&=Context(out context)&&Fact(context,0,out fact)&&fact is{revision:12};Write(main,(nuint)0);stale&=!Context(out _);if(stale)passed|=128;
return passed;
}
catch{return passed;}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyCommodityFilterSelfTest")]
internal static uint ExportGalaxyCommodityFilterSelfTest()=>RunTest(GalaxyCommodityFilterSelfTest);
#endif
}
using System.Runtime.InteropServices;
using System.Text;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
static uint GalaxyCommodityFilterSelfTest()
{
uint passed=0;var memory=Platform.Allocate(0x30000);if(memory==0)return passed;
try
{
var expectedImage=memory-0x5FDB000;var main=memory+0x1000;var definitions=memory+0x3000;var service=memory+0x5000;var filter=memory+0x7000;var configuration=memory+0x9000;var colours=memory+0xA000;
var metadata=memory+0xC000;var metadataBuckets=memory+0xD000;var emptyBuckets=memory+0xD100;var metadataNode=memory+0xE000;
var definitionBuckets=memory+0xF000;var definitionNode=memory+0x10000;var name=memory+0x11000;var balanceBuckets=memory+0x12000;var balanceNode=memory+0x13000;
const uint uid=0x2803BBB8;const ulong address=9007199254740993;
var origin=new[]{1599520,1311520,771360};var nativePosition=origin.Select(v=>v/32f).ToArray();
Write(main,expectedImage+0x552D788);Write(main-0x80,expectedImage+0x552D490);Write(main-0x78,expectedImage+0x552D4C0);Write(main-0x70,memory+0x17000);Write(main-0x80+0x3E0,filter);Write(main-0x80+0x50,configuration);
Write(filter,expectedImage+0x552D9C8);Write(filter+0x10,configuration);Write(filter+0xD0,uid);for(nuint i=0;i<3;i++)Write(filter+0x78+i*4,nativePosition[(int)i]);
var parameters=new[]{.25f,1f,.5f,.5f,1f,1f,40f};for(nuint i=0;i<(nuint)parameters.Length;i++)Write(configuration+0x1C0+i*4,parameters[(int)i]);
var rgba=new[]{new[]{.34f,.59f,.98f,1},new[]{.22f,.7f,.28f,1},new[]{.5f,.5f,.5f,1},new[]{.5f,.5f,.5f,1},new[]{.5f,.5f,.5f,.5f}};var sprites=new[]{12,11,12,11,13};
Write(configuration+0x1E0,colours);Write(configuration+0x1E8,5u);
for(nuint row=0;row<5;row++){Write(colours+row*0x20+8,(uint)row);Write(colours+row*0x20+0x1C,(uint)sprites[(int)row]);for(nuint c=0;c<4;c++)Write(colours+row*0x20+0xC+c*4,rgba[(int)row][(int)c]);}
Write(service,expectedImage+0x52420C0);Write(service-0x58,expectedImage+0x5241F80);Write(service-0x50,expectedImage+0x5241FC0);Write(service-0x48,memory+0x15000);
Write(definitions,expectedImage+0x5219600);Write(definitions+8,expectedImage+0x5219630);Write(definitions+0x58,expectedImage+0x5219730);Write(definitions+0x10,memory+0x16000);Write(definitions+0x284,1u);
void Map(nuint header,nuint buckets,ulong count)
{Write(header,buckets);Write(header+8,17UL);Write(header+0x18,count);for(nuint i=0;i<17;i++)Write(buckets+i*8,buckets+i*8);}
Map(definitions+0x1B8,definitionBuckets,1);var definitionSentinel=definitionBuckets+(nuint)(GalaxyCommodityHash(uid)%17)*8;Write(definitionNode,definitionSentinel);Write(definitionNode+8,uid);Write(definitionSentinel,definitionNode);
var text=Encoding.UTF8.GetBytes("ActualSource");Write(definitionNode+0x18,name);Write(name,(ulong)text.Length);for(nuint i=0;i<(nuint)text.Length;i++)Write(name+0x14+i,text[(int)i]);
Write(service+0xE8,definitionNode+0x10);Write(service+0xF0,100u);Write(service+0xE0,(byte)1);Write(service+0x144,7u);
void Balance(float value)
{Map(service+0xF8,balanceBuckets,1);var sentinel=balanceBuckets+(nuint)(GalaxyCommoditySystemHash(address)%17)*8;Write(balanceNode,sentinel);Write(balanceNode+8,address);Write(balanceNode+0x10,value);Write(sentinel,balanceNode);}
Balance(.75f);
Write(metadata,expectedImage+0x551A1B0);Map(metadata+0xA8,metadataBuckets,1);Map(metadata+0xC8,emptyBuckets,0);
var metadataSentinel=metadataBuckets+(nuint)(GalaxyFactHash(address)%17)*8;Write(metadataNode,metadataSentinel);Write(metadataNode+8,address);Write(metadataSentinel,metadataNode);Write(metadataNode+0x40,memory+0x1B000);
bool Context(out GalaxyCommodityFilterContext captured)=>CopyGalaxyCommodityFilterContext(main,service,definitions,metadata,origin,expectedImage,uid,out captured);
bool Fact(GalaxyCommodityFilterContext captured,int mode,out GalaxyCommodityFilterFact? output)=>CopyGalaxyCommodityFilterFact(captured,address,[0,0,0],mode,out output);
var before=Platform.ReadBytes(memory,0x30000);
if(Context(out var context)&&Fact(context,0,out var fact)&&fact is{commodityUid:uid,category:0,opacity:.75f,size:1,sprite:12}&&fact.rgba.SequenceEqual(rgba[0]))passed|=1;
var modes=Fact(context,1,out fact)&&fact is{category:0};modes&=Fact(context,2,out fact)&&fact is{category:4,opacity:1,size:.5f,sprite:13};modes&=Fact(context,3,out fact)&&fact is{category:0};
Balance(-.25f);Write(service+0x144,8u);modes&=Context(out context)&&Fact(context,0,out fact)&&fact is{category:1,opacity:.375f,sprite:11};modes&=Fact(context,1,out fact)&&fact is{category:4};modes&=Fact(context,2,out fact)&&fact is{category:1};modes&=Fact(context,3,out fact)&&fact is{category:1};if(modes)passed|=2;
Balance(0);Write(service+0x144,9u);var zero=Context(out context)&&Fact(context,0,out fact)&&fact is{category:2,opacity:1,size:1,sprite:12};zero&=Fact(context,2,out fact)&&fact is{category:3,sprite:11};
Map(service+0xF8,balanceBuckets,0);Write(service+0x144,10u);zero&=Context(out context)&&Fact(context,0,out fact)&&fact is{category:4,opacity:1,size:.5f}&&fact.rgba[3]==.5f;if(zero)passed|=4;
Balance(.75f);Write(service+0x144,11u);Write(metadataNode+0x30,3);Write(metadataNode+0x40,(nuint)0);var descriptor=Context(out context)&&Fact(context,0,out fact)&&fact is{category:4,opacity:0,size:0};
Write(metadataNode+0x30,0);Write(metadataNode+0x40,memory+0x1B000);descriptor&=Fact(context,0,out fact)&&fact is{category:0};Map(metadata+0xA8,metadataBuckets,0);descriptor&=Fact(context,0,out fact)&&fact is null;
Map(metadata+0xA8,metadataBuckets,1);Write(metadataSentinel,metadataNode);if(descriptor)passed|=8;
var range=CopyGalaxyCommodityFilterFact(context,address,[40,0,0],0,out fact)&&fact is{category:4,opacity:0,size:0};range&=CopyGalaxyCommodityFilterFact(context,address,[39.96875,0,0],0,out fact)&&fact is{category:0};if(range)passed|=16;
Write(filter+0x138,(byte)1);var pending=Context(out var unavailable)&&!unavailable.ready&&Fact(unavailable,0,out fact)&&fact is null;Write(filter+0x138,(byte)0);
Write(service+0x140,(byte)1);pending&=Context(out unavailable)&&!unavailable.ready&&Fact(unavailable,0,out fact)&&fact is null;Write(service+0x140,(byte)0);
Write(filter+0xD0,uid+1);pending&=!Context(out _);Write(filter+0xD0,uid);if(pending)passed|=32;
var saved=Platform.ReadBytes(memory,0x30000);var readonlyResult=Context(out context)&&Fact(context,0,out fact);if(readonlyResult&&Platform.ReadBytes(memory,0x30000).AsSpan().SequenceEqual(saved)&&before.Length==saved.Length)passed|=64;
var previous=context;Write(service+0x144,12u);var stale=!Fact(previous,0,out _);stale&=Context(out context)&&Fact(context,0,out fact)&&fact is{revision:12};Write(main,(nuint)0);stale&=!Context(out _);if(stale)passed|=128;
return passed;
}
catch{return passed;}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyCommodityFilterSelfTest")]
internal static uint ExportGalaxyCommodityFilterSelfTest()=>RunTest(GalaxyCommodityFilterSelfTest);
#endif
}