using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
// Private allocated fixture only. It never starts a game, opens an
// account, calls an original function, requests data, or installs a hook.
static uint GalaxyAccountThargoidSelfTest()
{
var memory=Platform.Allocate(0x6000);if(memory==0)return 0;
try
{
uint passed=0;var fakeImage=unchecked((nuint)0x140000000UL);var manager=memory;var owner=memory+0x800;
var rows=memory+0x1000;var metadata=memory+0x2000;var buckets=memory+0x3000;var empty=memory+0x3100;var node=memory+0x4000;
const ulong address=9007199254740995UL;
Write(manager,fakeImage+0x55276B8);Write(manager+8,fakeImage+0x55276E8);Write(manager+0x70,fakeImage+0x5527890);Write(manager+0x10,owner);
Write(manager+0x1A2,(byte)1);Write(manager+0x1A3,(byte)1);
for(nuint group=0;group<6;group++)Write(manager+0x318+group*4,100u+(uint)group);
Write(manager+0x510,2UL);Write(manager+0x520,2UL);Write(manager+0x528,rows);
Write(rows,address);Write(rows+8,(byte)1);Write(rows+0x10,address+1);Write(rows+0x18,(byte)0);
void Recommend(nuint group,nuint rank,ulong id,float progress)
{Write(manager+0x330+group*0x50+rank*0x10,id);Write(manager+0x338+group*0x50+rank*0x10,progress);}
Recommend(0,0,address+2,.75f);Recommend(0,1,address+3,.5f);Recommend(1,0,address+4,.6f);Recommend(2,0,address+5,.4f);
bool Copy(out GalaxyAccountThargoid value)=>CopyGalaxyThargoidManager(manager,owner,fakeImage,metadata,out value);
if(Copy(out var data)&&data.signals.Length==2&&data.signals[0].id==0&&data.signals[0].systemAddress==address&&
data.signals[0].stronghold&&!data.signals[0].destroyed&&data.signals[1].destroyed&&
data.signals[0].labelKey=="Maps_AntiXeno_Panel_Signal_System9007199254740995"&&
data.states.Length==6&&data.states[0].state==33&&data.states[4].state==37&&data.states[4].count==104)passed|=1;
if(data.recommended.Length==4&&data.recommended[0].id==33<<8&&data.recommended[1].id==(33<<8|1)&&
data.recommended[2].state==34&&data.recommended[3].state==35&&data.recommended[0].progress==.75f)passed|=2;
Write(manager+0x1A3,(byte)0);
var pendingResponse=Copy(out data)&&!data.responseObserved&&data.states.All(state=>state.count is null)&&!data.complete&&data.signals.Length==2;
Write(manager+0x1A3,(byte)1);Write(manager+0x1A2,(byte)0);
if(pendingResponse&&Copy(out data)&&!data.metadataObserved&&data.states.All(state=>state.count is null)&&data.signals.Length==2)passed|=4;
Write(manager+0x1A2,(byte)1);
Write(manager+0x1A3,(byte)1);Write(manager+0x520,0UL);
if(Copy(out data)&&data.signals.Length==0&&!data.complete)passed|=8;
Write(manager+0x520,2UL);Write(manager+0x10,owner+8);
if(!Copy(out _))passed|=16;
Write(manager+0x10,owner);Write(manager+0x70,fakeImage+0x55278C0);
if(!Copy(out _))passed|=32;
Write(manager+0x70,fakeImage+0x5527890);Write(manager+0x510,8192UL);Write(manager+0x520,4097UL);
if(!Copy(out _))passed|=64;
Write(manager+0x510,1UL);Write(manager+0x520,2UL);
if(!Copy(out _))passed|=128;
Write(manager+0x510,2UL);Write(manager+0x1A2,(byte)2);
if(!Copy(out _))passed|=256;
Write(manager+0x1A2,(byte)1);Write(rows+8,(byte)2);
if(!Copy(out _))passed|=512;
Write(rows+8,(byte)1);Write(rows+0x10,address);
if(!Copy(out _))passed|=1024;
Write(rows+0x10,0x80000000000000UL);
if(!Copy(out _))passed|=2048;
Write(rows+0x10,address+1);Recommend(0,0,address+2,float.NaN);
if(!Copy(out _))passed|=4096;
Recommend(0,0,address+2,.25f);
if(!Copy(out _))passed|=8192;
Recommend(0,0,address+2,.75f);Recommend(0,1,0,float.NaN);Recommend(0,2,address+3,.99f);
if(Copy(out data)&&data.recommended.Count(row=>row.state==33)==1&&data.recommended[0].rank==0)passed|=16384;
Recommend(0,1,address+3,.5f);Recommend(0,2,0,0);
Write(metadata,fakeImage+0x551A1B0);Write(metadata+0xA8,buckets);Write(metadata+0xB0,1UL);Write(metadata+0xC0,1UL);
Write(metadata+0xC8,empty);Write(metadata+0xD0,1UL);Write(metadata+0xE0,0UL);Write(empty,empty);
Write(buckets,node);Write(node,buckets);Write(node+8,address);Write(node+0x1E0,(byte)1);Write(node+0x1D8,3U);Write(node+0x1DC,5U);
var before=Platform.ReadBytes(memory,0x6000);
var known=Copy(out data)&&data.signals[0].affectedSystemsCount==8&&data.signals[1].affectedSystemsCount is null&&
Platform.ReadBytes(memory,0x6000).AsSpan().SequenceEqual(before);
Write(node+0x1D8,uint.MaxValue);
if(known&&Copy(out data)&&data.signals[0].affectedSystemsCount is null)passed|=32768;
return passed;
}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyThargoidSelfTest")]
internal static uint ExportGalaxyAccountThargoidSelfTest()=>RunTest(GalaxyAccountThargoidSelfTest);
#endif
}
using System.Runtime.InteropServices;
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
// Private allocated fixture only. It never starts a game, opens an
// account, calls an original function, requests data, or installs a hook.
static uint GalaxyAccountThargoidSelfTest()
{
var memory=Platform.Allocate(0x6000);if(memory==0)return 0;
try
{
uint passed=0;var fakeImage=unchecked((nuint)0x140000000UL);var manager=memory;var owner=memory+0x800;
var rows=memory+0x1000;var metadata=memory+0x2000;var buckets=memory+0x3000;var empty=memory+0x3100;var node=memory+0x4000;
const ulong address=9007199254740995UL;
Write(manager,fakeImage+0x55276B8);Write(manager+8,fakeImage+0x55276E8);Write(manager+0x70,fakeImage+0x5527890);Write(manager+0x10,owner);
Write(manager+0x1A2,(byte)1);Write(manager+0x1A3,(byte)1);
for(nuint group=0;group<6;group++)Write(manager+0x318+group*4,100u+(uint)group);
Write(manager+0x510,2UL);Write(manager+0x520,2UL);Write(manager+0x528,rows);
Write(rows,address);Write(rows+8,(byte)1);Write(rows+0x10,address+1);Write(rows+0x18,(byte)0);
void Recommend(nuint group,nuint rank,ulong id,float progress)
{Write(manager+0x330+group*0x50+rank*0x10,id);Write(manager+0x338+group*0x50+rank*0x10,progress);}
Recommend(0,0,address+2,.75f);Recommend(0,1,address+3,.5f);Recommend(1,0,address+4,.6f);Recommend(2,0,address+5,.4f);
bool Copy(out GalaxyAccountThargoid value)=>CopyGalaxyThargoidManager(manager,owner,fakeImage,metadata,out value);
if(Copy(out var data)&&data.signals.Length==2&&data.signals[0].id==0&&data.signals[0].systemAddress==address&&
data.signals[0].stronghold&&!data.signals[0].destroyed&&data.signals[1].destroyed&&
data.signals[0].labelKey=="Maps_AntiXeno_Panel_Signal_System9007199254740995"&&
data.states.Length==6&&data.states[0].state==33&&data.states[4].state==37&&data.states[4].count==104)passed|=1;
if(data.recommended.Length==4&&data.recommended[0].id==33<<8&&data.recommended[1].id==(33<<8|1)&&
data.recommended[2].state==34&&data.recommended[3].state==35&&data.recommended[0].progress==.75f)passed|=2;
Write(manager+0x1A3,(byte)0);
var pendingResponse=Copy(out data)&&!data.responseObserved&&data.states.All(state=>state.count is null)&&!data.complete&&data.signals.Length==2;
Write(manager+0x1A3,(byte)1);Write(manager+0x1A2,(byte)0);
if(pendingResponse&&Copy(out data)&&!data.metadataObserved&&data.states.All(state=>state.count is null)&&data.signals.Length==2)passed|=4;
Write(manager+0x1A2,(byte)1);
Write(manager+0x1A3,(byte)1);Write(manager+0x520,0UL);
if(Copy(out data)&&data.signals.Length==0&&!data.complete)passed|=8;
Write(manager+0x520,2UL);Write(manager+0x10,owner+8);
if(!Copy(out _))passed|=16;
Write(manager+0x10,owner);Write(manager+0x70,fakeImage+0x55278C0);
if(!Copy(out _))passed|=32;
Write(manager+0x70,fakeImage+0x5527890);Write(manager+0x510,8192UL);Write(manager+0x520,4097UL);
if(!Copy(out _))passed|=64;
Write(manager+0x510,1UL);Write(manager+0x520,2UL);
if(!Copy(out _))passed|=128;
Write(manager+0x510,2UL);Write(manager+0x1A2,(byte)2);
if(!Copy(out _))passed|=256;
Write(manager+0x1A2,(byte)1);Write(rows+8,(byte)2);
if(!Copy(out _))passed|=512;
Write(rows+8,(byte)1);Write(rows+0x10,address);
if(!Copy(out _))passed|=1024;
Write(rows+0x10,0x80000000000000UL);
if(!Copy(out _))passed|=2048;
Write(rows+0x10,address+1);Recommend(0,0,address+2,float.NaN);
if(!Copy(out _))passed|=4096;
Recommend(0,0,address+2,.25f);
if(!Copy(out _))passed|=8192;
Recommend(0,0,address+2,.75f);Recommend(0,1,0,float.NaN);Recommend(0,2,address+3,.99f);
if(Copy(out data)&&data.recommended.Count(row=>row.state==33)==1&&data.recommended[0].rank==0)passed|=16384;
Recommend(0,1,address+3,.5f);Recommend(0,2,0,0);
Write(metadata,fakeImage+0x551A1B0);Write(metadata+0xA8,buckets);Write(metadata+0xB0,1UL);Write(metadata+0xC0,1UL);
Write(metadata+0xC8,empty);Write(metadata+0xD0,1UL);Write(metadata+0xE0,0UL);Write(empty,empty);
Write(buckets,node);Write(node,buckets);Write(node+8,address);Write(node+0x1E0,(byte)1);Write(node+0x1D8,3U);Write(node+0x1DC,5U);
var before=Platform.ReadBytes(memory,0x6000);
var known=Copy(out data)&&data.signals[0].affectedSystemsCount==8&&data.signals[1].affectedSystemsCount is null&&
Platform.ReadBytes(memory,0x6000).AsSpan().SequenceEqual(before);
Write(node+0x1D8,uint.MaxValue);
if(known&&Copy(out data)&&data.signals[0].affectedSystemsCount is null)passed|=32768;
return passed;
}
finally{Platform.Free(memory);}
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyThargoidSelfTest")]
internal static uint ExportGalaxyAccountThargoidSelfTest()=>RunTest(GalaxyAccountThargoidSelfTest);
#endif
}