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<GalaxyOriginalPowerInfluence>());
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));
}
}
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<GalaxyOriginalPowerInfluence>());
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));
}
}