XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
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
}