namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
private static int dockingAvailabilityGetterCalls;
[UnmanagedCallersOnly]
private static byte MockDockingAvailability(nuint computer)
{ dockingAvailabilityGetterCalls++; return Read<byte>(computer + 0x377); }
private static uint LocalDockingAvailabilitySelfTest()
{
var memory = Platform.Allocate(4096); if (memory == 0) return 0;
try
{
var computer = memory; var table = memory + 2048;
var getter = (nuint)(delegate* unmanaged<nuint, byte>)&MockDockingAvailability;
Write(computer, table); Write(table + 0x58, getter);
// These unrelated SCA fields are deliberately invalid. They must
// never be dereferenced when checking the docking computer.
Write(computer + 0x168, nuint.MaxValue); Write(computer + 0x290, uint.MaxValue);
dockingAvailabilityGetterCalls = 0; uint passed = 0;
Write(computer + 0x377, (byte)1);
if (ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 1) passed |= 1;
Write(computer + 0x377, (byte)0);
if (!ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 2) passed |= 2;
if (!ReadLocalDockingAvailability(0, table, getter)) passed |= 4;
if (!ReadLocalDockingAvailability(computer, table + 8, getter)) passed |= 8;
Write(table + 0x58, (nuint)0);
if (!ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 2) passed |= 16;
return passed;
}
finally { Platform.Free(memory); }
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint = "XFENavigationLocalDockingAvailabilitySelfTest")]
internal static uint ExportLocalDockingAvailabilitySelfTest() => RunTest(LocalDockingAvailabilitySelfTest);
#endif
}
namespace XFEEDToolBox.Plugin;
internal static unsafe partial class Navigation
{
private static int dockingAvailabilityGetterCalls;
[UnmanagedCallersOnly]
private static byte MockDockingAvailability(nuint computer)
{ dockingAvailabilityGetterCalls++; return Read<byte>(computer + 0x377); }
private static uint LocalDockingAvailabilitySelfTest()
{
var memory = Platform.Allocate(4096); if (memory == 0) return 0;
try
{
var computer = memory; var table = memory + 2048;
var getter = (nuint)(delegate* unmanaged<nuint, byte>)&MockDockingAvailability;
Write(computer, table); Write(table + 0x58, getter);
// These unrelated SCA fields are deliberately invalid. They must
// never be dereferenced when checking the docking computer.
Write(computer + 0x168, nuint.MaxValue); Write(computer + 0x290, uint.MaxValue);
dockingAvailabilityGetterCalls = 0; uint passed = 0;
Write(computer + 0x377, (byte)1);
if (ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 1) passed |= 1;
Write(computer + 0x377, (byte)0);
if (!ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 2) passed |= 2;
if (!ReadLocalDockingAvailability(0, table, getter)) passed |= 4;
if (!ReadLocalDockingAvailability(computer, table + 8, getter)) passed |= 8;
Write(table + 0x58, (nuint)0);
if (!ReadLocalDockingAvailability(computer, table, getter) && dockingAvailabilityGetterCalls == 2) passed |= 16;
return passed;
}
finally { Platform.Free(memory); }
}
#if PLUGIN_NAVIGATION
[UnmanagedCallersOnly(EntryPoint = "XFENavigationLocalDockingAvailabilitySelfTest")]
internal static uint ExportLocalDockingAvailabilitySelfTest() => RunTest(LocalDockingAvailabilitySelfTest);
#endif
}