using System.Runtime.InteropServices; using System.Text; namespace XFEEDToolBox.Plugin; internal static unsafe partial class Navigation { static uint GalaxyAccountMissionsSelfTest() { var memory=Platform.Allocate(0x20000);if(memory==0)return 0; try { uint passed=0;var fakeImage=unchecked((nuint)0x140000000UL); var manager=memory;var owner=memory+0x800;var vector=memory+0x1000; var normalBase=memory+0x2000;var normal=normalBase+0x1A8; var failedBase=memory+0x3000;var failed=failedBase+0x118; var text=memory+0x4000;var addresses=memory+0x5000;var failedAddresses=memory+0x5100; var map=memory+0x8000;var summary=map+8;var title=memory+0x6000; const ulong a=9007199254740995UL;const ulong id=0xFEDCBA9876543210UL; Write(manager,fakeImage+0x525EE18);Write(manager+8,fakeImage+0x525EE48);Write(manager+0x58,fakeImage+0x525EF48);Write(manager+0x10,owner); Write(manager+0x98,2UL);Write(manager+0xA8,2UL);Write(manager+0xB0,vector);Write(vector,failed);Write(vector+8,normal); Write(normalBase,fakeImage+0x52609C8);Write(normal,fakeImage+0x5260A18);Write(normal-0xC0,id); Write(failedBase,fakeImage+0x5260B78);Write(failed,fakeImage+0x5260BC8);Write(failed-0x40,ulong.MaxValue); void Header(nuint header,ulong count,nuint rows) {Write(header,count);Write(header+0x10,count);Write(header+0x18,rows);} void String(nuint pointer,string value) {var bytes=Encoding.UTF8.GetBytes(value);Write(pointer,(ulong)bytes.Length);Write(pointer+8,(ulong)bytes.Length);Platform.WriteBytes(pointer+0x14,bytes);} var key=memory+0x6200;var value=memory+0x6400;String(key,":");String(value,$"{a}:private station label"); Header(normal-0xB0,2,text);Write(text,key);Write(text+8,value);Write(text+0x10,(byte)22); // An ordinary text field containing decimal digits is not a system. Write(text+24,key);Write(text+32,value);Write(text+40,(byte)1); Header(normal-0x90,2,addresses);Write(addresses,a+1);Write(addresses+8,a+2); Header(failed+0xE0,2,failedAddresses);Write(failedAddresses,a+3);Write(failedAddresses+8,a+3); Write(manager+0xC8,0UL);Write(manager+0xD0,0UL);Write(manager+0xD8,(nuint)0); bool Copy(out GalaxyAccountMissionItem[] result)=>CopyGalaxyMissionsManager(manager,owner,fakeImage,out result); if(Copy(out var data)&&data.Length==2&&data[0].missionId==id&&data[0].systemAddresses.SequenceEqual(new[]{a,a+1,a+2})&&data[0].selectedSystemAddress==a+2)passed|=1; if(data.Length==2&&data[1].missionId==ulong.MaxValue&&data[1].systemAddresses.SequenceEqual(new[]{a+3,a+3})&&data[1].markerType==4)passed|=2; Header(normal-0xB0,0,0);Header(normal-0x90,0,0);Write(normal-0xC0,0UL); if(Copy(out data)&&data[0].missionId==0&&data[0].systemAddresses.Length==0&&data[0].selectedSystemAddress is null&&!new GalaxyAccountMissions(1,2,data).complete)passed|=4; Write(normal-0xC0,id);Header(normal-0xB0,2,text);Header(normal-0x90,2,addresses); Write(normal-0x27,(byte)1); var special=Copy(out data)&&data[0].markerType==45;Write(normal-0x27,(byte)0);Write(normal-0x20,(byte)1); special&=Copy(out data)&&data[0].markerType==45;Write(normal-0x20,(byte)2); if(special&&Copy(out data)&&data[0].markerType==4)passed|=8; Write(manager+0xC8,1UL);Write(manager+0xD0,64UL);Write(manager+0xD8,map);Write(map,1UL); Write(summary,id);String(title,"fixture mission title");Write(summary+8,title);Header(summary+0x28,1,text); if(Copy(out data)&&data.Length==2&&data[0].selectedSystemAddress==a+2)passed|=16; Write(summary,12345678901234567890UL); if(Copy(out data)&&data.Length==3&&data[2].missionId==12345678901234567890UL&&data[2].selectedSystemAddress==a&&data[2].markerType==4)passed|=32; Write(title,0UL); if(Copy(out data)&&data.Length==2)passed|=64; String(title,"fixture mission title");Write(manager+0x10,owner+8); if(!Copy(out _))passed|=128; Write(manager+0x10,owner);Write(normal,fakeImage+0x5260A48); var tables=!Copy(out _);Write(normal,fakeImage+0x5260A18);Write(failedBase,fakeImage+0x5260BA8); if(tables&&!Copy(out _))passed|=256; Write(failedBase,fakeImage+0x5260B78);Write(manager+0xA8,4097UL); var bounds=!Copy(out _);Write(manager+0xA8,2UL);Header(normal-0x90,4097,addresses); if(bounds&&!Copy(out _))passed|=512; Header(normal-0x90,2,addresses);Write(addresses+8,0UL); var invalid=!Copy(out _);Write(addresses+8,0x80000000000000UL); if(invalid&&!Copy(out _))passed|=1024; Write(addresses+8,a+2);String(value,"not-an-address:123"); var parsing=!Copy(out _);String(value,"184467440737095516160:bad"); if(parsing&&!Copy(out _))passed|=2048; String(key,"|");String(value,$" \t{a}suffix|private description"); if(Copy(out data)&&data[0].systemAddresses[0]==a&&data[2].selectedSystemAddress==a)passed|=4096; Write(manager+0xD0,3UL);var bitmap=!Copy(out _);Write(manager+0xD0,64UL);Write(map,3UL); if(bitmap&&!Copy(out _))passed|=8192; Write(map,1UL);var before=Platform.ReadBytes(memory,0x10000); if(Copy(out data)&&Platform.ReadBytes(memory,0x10000).AsSpan().SequenceEqual(before)) {Write(addresses+8,a+8);if(data[0].selectedSystemAddress==a+2&&data[0].systemAddresses[2]==a+2)passed|=16384;} var watched=new GalaxyMissionCopy();watched.Bytes(addresses,8);Write(addresses,a+9); var stable=!watched.Stable();Write(manager+0xA8,0UL);Write(manager+0xC8,0UL);Write(manager+0xD0,0UL); if(stable&&Copy(out data)&&data.Length==0)passed|=32768; return passed; } finally{Platform.Free(memory);} } #if PLUGIN_NAVIGATION [UnmanagedCallersOnly(EntryPoint="XFENavigationGalaxyAccountMissionsSelfTest")] internal static uint ExportGalaxyAccountMissionsSelfTest()=>RunTest(GalaxyAccountMissionsSelfTest); #endif }