using System.Text.Json;
using System.Text.Json.Nodes;
using XFEEDToolBox.Core.Navigation;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class ScoReferenceWorldReleaseTests
{
private static readonly DateTimeOffset Now=DateTimeOffset.Parse("2026-10-26T19:53:45.566Z");
private const ulong Entity=11828247554985,OldWorld=2553114773867,Component=0x13003cf80d8;
private const string Owner="b4b49dfd52764e98bdf06f98b56c6e00",Start="9c159a5e9e8641caa3c36b380403c342";
private static JsonObject Status()=>JsonSerializer.SerializeToNode(new
{
owned=false,sampleReady=true,watchEntityId=Entity.ToString(),watchReferenceWorld=OldWorld.ToString(),watchInterface="13003cf80d8",
sample=new{verified=true,entityId=Entity.ToString(),referenceWorldAddress="72060147152701803",@interface="13003cf80d8",vtableRva="533e6e0",
state=0,active=false,playerOverride=false,healthEmergency=false,inSupercruise=true,stableFsd=true,rawFsdState=2,hullFraction=1,observedAtUnixMilliseconds=Now.ToUnixTimeMilliseconds()},
lastOriginalStop=new{owner=Owner,startRequestId=Start,selectionGeneration=18,entityId=Entity.ToString(),referenceWorldAddress=OldWorld.ToString(),
nativeMethodCalled=true,nativeMethodRva="2eaacd0",argument=false,stateBefore=2,stateAfter=3,reason="geometry-or-assist",observedAtUnixMilliseconds=Now.ToUnixTimeMilliseconds(),
gate=new{identityVerified=true,targetVerified=true,emergency=false,damageSeen=false,collisionCourse=false,assistEnabled=false}}
})!.AsObject();
private static bool Accept(JsonObject row,DateTimeOffset? now=null,ulong component=Component,long? startedAt=null)
=>ScoReferenceWorldRelease.CanConfirm(JsonSerializer.SerializeToElement(row),Owner,Start,18,
startedAt??Now.AddSeconds(-2).ToUnixTimeMilliseconds(),Entity,OldWorld,component,now??Now);
[Test]public void Live08OriginalStopAndSameComponentOffInTheNewSoiFinishOnlyTheOldOwnership()
{
var row=Status();Check.That(Accept(row));
row["sample"]!["state"]=3;Check.That(Accept(row));
// A historical stop remains causal evidence while the current Off
// observation must stay fresh. It does not migrate any SCO proof.
row["sample"]!["observedAtUnixMilliseconds"]=Now.AddSeconds(30).ToUnixTimeMilliseconds();Check.That(Accept(row,Now.AddSeconds(30)));
}
[Test]public void UnknownForeignReusedActiveStaleAndUnsafeEvidenceCannotReleaseAcrossWorlds()
{
foreach(var change in new Action<JsonObject>[]
{
r=>r["owned"]=true,r=>r["sampleReady"]=false,r=>r["watchEntityId"]="99",r=>r["watchReferenceWorld"]="99",r=>r["watchInterface"]="13003cf80d9",
r=>r["sample"]!["verified"]=false,r=>r["sample"]!["entityId"]="99",r=>r["sample"]!["referenceWorldAddress"]="0",r=>r["sample"]!["referenceWorldAddress"]=OldWorld.ToString(),
r=>r["sample"]!["interface"]="13003cf80d9",r=>r["sample"]!.AsObject().Remove("interface"),r=>r["sample"]!["vtableRva"]="unknown",
r=>r["sample"]!["state"]=2,r=>r["sample"]!["active"]=true,r=>r["sample"]!["playerOverride"]=true,r=>r["sample"]!["healthEmergency"]=true,
r=>r["sample"]!["hullFraction"]=0,r=>r["sample"]!["rawFsdState"]=1,r=>r["sample"]!["observedAtUnixMilliseconds"]=Now.AddMilliseconds(-201).ToUnixTimeMilliseconds(),
r=>r["sample"]!["observedAtUnixMilliseconds"]=Now.AddMilliseconds(1).ToUnixTimeMilliseconds(),
r=>r["lastOriginalStop"]!["owner"]="foreign",r=>r["lastOriginalStop"]!["startRequestId"]="prior-burst",r=>r["lastOriginalStop"]!["selectionGeneration"]=17,
r=>r["lastOriginalStop"]!["entityId"]="99",r=>r["lastOriginalStop"]!["referenceWorldAddress"]="99",r=>r["lastOriginalStop"]!["nativeMethodCalled"]=false,
r=>r["lastOriginalStop"]!["nativeMethodRva"]="unknown",r=>r["lastOriginalStop"]!["argument"]=true,r=>r["lastOriginalStop"]!["stateBefore"]=0,
r=>r["lastOriginalStop"]!["stateAfter"]=2,r=>r["lastOriginalStop"]!["reason"]="health",r=>r["lastOriginalStop"]!["observedAtUnixMilliseconds"]=Now.AddSeconds(-3).ToUnixTimeMilliseconds(),
r=>r["lastOriginalStop"]!["observedAtUnixMilliseconds"]=Now.AddMilliseconds(1).ToUnixTimeMilliseconds(),
r=>r["lastOriginalStop"]!["gate"]!["identityVerified"]=false,r=>r["lastOriginalStop"]!["gate"]!["targetVerified"]=false,
r=>r["lastOriginalStop"]!["gate"]!["emergency"]=true,r=>r["lastOriginalStop"]!["gate"]!["damageSeen"]=true,
r=>r["lastOriginalStop"]!["gate"]!["collisionCourse"]=true,r=>r["lastOriginalStop"]!["gate"]!["assistEnabled"]=true
}){var row=Status();change(row);Check.That(!Accept(row),row.ToJsonString());}
Check.That(!Accept(Status(),component:0));Check.That(!Accept(Status(),startedAt:0));
}
}
using System.Text.Json;
using System.Text.Json.Nodes;
using XFEEDToolBox.Core.Navigation;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class ScoReferenceWorldReleaseTests
{
private static readonly DateTimeOffset Now=DateTimeOffset.Parse("2026-10-26T19:53:45.566Z");
private const ulong Entity=11828247554985,OldWorld=2553114773867,Component=0x13003cf80d8;
private const string Owner="b4b49dfd52764e98bdf06f98b56c6e00",Start="9c159a5e9e8641caa3c36b380403c342";
private static JsonObject Status()=>JsonSerializer.SerializeToNode(new
{
owned=false,sampleReady=true,watchEntityId=Entity.ToString(),watchReferenceWorld=OldWorld.ToString(),watchInterface="13003cf80d8",
sample=new{verified=true,entityId=Entity.ToString(),referenceWorldAddress="72060147152701803",@interface="13003cf80d8",vtableRva="533e6e0",
state=0,active=false,playerOverride=false,healthEmergency=false,inSupercruise=true,stableFsd=true,rawFsdState=2,hullFraction=1,observedAtUnixMilliseconds=Now.ToUnixTimeMilliseconds()},
lastOriginalStop=new{owner=Owner,startRequestId=Start,selectionGeneration=18,entityId=Entity.ToString(),referenceWorldAddress=OldWorld.ToString(),
nativeMethodCalled=true,nativeMethodRva="2eaacd0",argument=false,stateBefore=2,stateAfter=3,reason="geometry-or-assist",observedAtUnixMilliseconds=Now.ToUnixTimeMilliseconds(),
gate=new{identityVerified=true,targetVerified=true,emergency=false,damageSeen=false,collisionCourse=false,assistEnabled=false}}
})!.AsObject();
private static bool Accept(JsonObject row,DateTimeOffset? now=null,ulong component=Component,long? startedAt=null)
=>ScoReferenceWorldRelease.CanConfirm(JsonSerializer.SerializeToElement(row),Owner,Start,18,
startedAt??Now.AddSeconds(-2).ToUnixTimeMilliseconds(),Entity,OldWorld,component,now??Now);
[Test]public void Live08OriginalStopAndSameComponentOffInTheNewSoiFinishOnlyTheOldOwnership()
{
var row=Status();Check.That(Accept(row));
row["sample"]!["state"]=3;Check.That(Accept(row));
// A historical stop remains causal evidence while the current Off
// observation must stay fresh. It does not migrate any SCO proof.
row["sample"]!["observedAtUnixMilliseconds"]=Now.AddSeconds(30).ToUnixTimeMilliseconds();Check.That(Accept(row,Now.AddSeconds(30)));
}
[Test]public void UnknownForeignReusedActiveStaleAndUnsafeEvidenceCannotReleaseAcrossWorlds()
{
foreach(var change in new Action<JsonObject>[]
{
r=>r["owned"]=true,r=>r["sampleReady"]=false,r=>r["watchEntityId"]="99",r=>r["watchReferenceWorld"]="99",r=>r["watchInterface"]="13003cf80d9",
r=>r["sample"]!["verified"]=false,r=>r["sample"]!["entityId"]="99",r=>r["sample"]!["referenceWorldAddress"]="0",r=>r["sample"]!["referenceWorldAddress"]=OldWorld.ToString(),
r=>r["sample"]!["interface"]="13003cf80d9",r=>r["sample"]!.AsObject().Remove("interface"),r=>r["sample"]!["vtableRva"]="unknown",
r=>r["sample"]!["state"]=2,r=>r["sample"]!["active"]=true,r=>r["sample"]!["playerOverride"]=true,r=>r["sample"]!["healthEmergency"]=true,
r=>r["sample"]!["hullFraction"]=0,r=>r["sample"]!["rawFsdState"]=1,r=>r["sample"]!["observedAtUnixMilliseconds"]=Now.AddMilliseconds(-201).ToUnixTimeMilliseconds(),
r=>r["sample"]!["observedAtUnixMilliseconds"]=Now.AddMilliseconds(1).ToUnixTimeMilliseconds(),
r=>r["lastOriginalStop"]!["owner"]="foreign",r=>r["lastOriginalStop"]!["startRequestId"]="prior-burst",r=>r["lastOriginalStop"]!["selectionGeneration"]=17,
r=>r["lastOriginalStop"]!["entityId"]="99",r=>r["lastOriginalStop"]!["referenceWorldAddress"]="99",r=>r["lastOriginalStop"]!["nativeMethodCalled"]=false,
r=>r["lastOriginalStop"]!["nativeMethodRva"]="unknown",r=>r["lastOriginalStop"]!["argument"]=true,r=>r["lastOriginalStop"]!["stateBefore"]=0,
r=>r["lastOriginalStop"]!["stateAfter"]=2,r=>r["lastOriginalStop"]!["reason"]="health",r=>r["lastOriginalStop"]!["observedAtUnixMilliseconds"]=Now.AddSeconds(-3).ToUnixTimeMilliseconds(),
r=>r["lastOriginalStop"]!["observedAtUnixMilliseconds"]=Now.AddMilliseconds(1).ToUnixTimeMilliseconds(),
r=>r["lastOriginalStop"]!["gate"]!["identityVerified"]=false,r=>r["lastOriginalStop"]!["gate"]!["targetVerified"]=false,
r=>r["lastOriginalStop"]!["gate"]!["emergency"]=true,r=>r["lastOriginalStop"]!["gate"]!["damageSeen"]=true,
r=>r["lastOriginalStop"]!["gate"]!["collisionCourse"]=true,r=>r["lastOriginalStop"]!["gate"]!["assistEnabled"]=true
}){var row=Status();change(row);Check.That(!Accept(row),row.ToJsonString());}
Check.That(!Accept(Status(),component:0));Check.That(!Accept(Status(),startedAt:0));
}
}