using System.Runtime.InteropServices; using System.Text.Json; using XFEEDToolBox.Core.Galaxy; using XFEEDToolBox.Core.Models; using XFEEDToolBox.Core.Rendering; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public sealed class GalaxyPowerInfluenceTests { const long Centre=9007199254740995,Candidate=9007199254741119; static readonly GalaxyNativePowerOuter Outer=new(true,Centre,new Coordinates(1,2,3),100); static string Wire(bool reverse=false)=>JsonSerializer.Serialize(new{source=GalaxyNativePowerInfluence.Source,eligible=true, fromSystemAddress=(reverse?Candidate:Centre).ToString(),toSystemAddress=(reverse?Centre:Candidate).ToString(), fromPosition=reverse?new[]{6d,2,3}:new[]{1d,2,3},toPosition=reverse?new[]{1d,2,3}:new[]{6d,2,3},linearRgb=new[]{.2f,.4f,1.5f}, kind=reverse?1:0,phase=-.375f,phaseRate=.25f,capturedAtTick="9007199254740997"}); static GalaxyNativePowerInfluence? Read(string json,GalaxyNativePowerOuter? outer=null) {using var document=JsonDocument.Parse(json);return GalaxyNativePowerInfluence.FromWire(document.RootElement,Candidate,outer??Outer);} [Test] public void OriginalInfluenceIsBoundToActualCentreCandidateAndPreservesDirectedKindAndPhase() { var fromCentre=Read(Wire())!;var fromCandidate=Read(Wire(true))!; Check.That(fromCentre.Eligible&&fromCentre.FromSystemAddress==Centre&&fromCentre.ToSystemAddress==Candidate&&fromCentre.Kind==0); Check.That(fromCandidate.FromSystemAddress==Candidate&&fromCandidate.ToSystemAddress==Centre&&fromCandidate.Kind==1); Check.Equal(1.5f,fromCentre.LinearRgb![2]);Check.Equal(-.375f,fromCentre.Phase);Check.Equal(.25f,fromCentre.PhaseRate);Check.Equal(9007199254740997UL,fromCentre.CapturedAtTick); } [Test] public void UnknownAndSourceProvenNoLinkAreDifferentAndNeitherHasStagedGeometry() { Check.That(Read("null") is null); var noLink=Read("{\"source\":\"original-power-influence\",\"eligible\":false}")!; Check.That(!noLink.Eligible&&!GalaxyOriginalPowerInfluenceGeometry.TryCreate(noLink,out _)&&!GalaxyOriginalPowerInfluenceGeometry.TryCreate(null,out _)); } [Test] public void WrongViewUnboundAddressesWrongCentreAndMalformedSourceCannotBecomeLinks() { void Reject(string value,GalaxyNativePowerOuter? outer=null){var rejected=false;try{Read(value,outer);}catch(InvalidDataException){rejected=true;}Check.That(rejected);} Reject("{}");Reject(Wire(),Outer with{Visible=false});Reject(Wire().Replace(GalaxyNativePowerInfluence.Source,"jump-connections")); Reject(Wire().Replace(Candidate.ToString(),"42"));Reject(Wire().Replace("\"9007199254740995\"","9007199254740995")); Reject(Wire().Replace("[1,2,3]","[1,2,4]"));Reject(Wire().Replace("\"kind\":0","\"kind\":2")); Reject(Wire().Replace("[0.2,0.4,1.5]","[-0.2,0.4,1.5]"));Reject(Wire().Replace("\"9007199254740997\"","9007199254740997")); Reject("{\"source\":\"original-power-influence\",\"eligible\":false,\"phase\":1}"); } [Test] public void StagedRecordKeepsOriginal64ByteLayoutAndDoesNotInventFinalLineWidthOrPattern() { Check.Equal(64,Marshal.SizeOf()); Check.That(GalaxyOriginalPowerInfluenceGeometry.TryCreate(Read(Wire()),out var record)); Check.Equal(1f,record.From.X);Check.Equal(6f,record.To.X);Check.Equal(0f,record.From.W);Check.Equal(0f,record.To.W); Check.Equal(1.5f,record.Colour.Z);Check.Equal(1f,record.Colour.W);Check.Equal(-.375f,record.Pattern.X); Check.Equal(0f,record.Pattern.Y);Check.Equal(0f,record.Pattern.Z);Check.Equal(0f,record.Pattern.W); Check.That(!GalaxyOriginalPowerInfluenceGeometry.TryCreate(Read(Wire())! with{ToSystemAddress=Centre},out _)); } [Test] public void InitialPhaseUsesExactAddressHashAndOneOver256InsteadOfOneOver255() { foreach(ulong address in new[]{1UL,42UL,9007199254740995UL,9007199254741119UL,(1UL<<55)-1}) { var phase=GalaxyOriginalPowerInfluenceGeometry.InitialPhase(address);Check.That(phase>=0&&phase<1); Check.Equal(MathF.Truncate(phase*256),phase*256); } Check.That(GalaxyOriginalPowerInfluenceGeometry.InitialPhase(9007199254740995UL)!=GalaxyOriginalPowerInfluenceGeometry.InitialPhase(9007199254740996UL)); } }