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[] { 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)); } }