using System.Text.Json; using XFEEDToolBox.Core.Galaxy; using XFEEDToolBox.Core.Models; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public sealed class GalaxyColonisationOwnershipTests { static GalaxyNativeColonisationOwnership? Read(string json) {using var doc=JsonDocument.Parse(json);return GalaxyNativeColonisationOwnership.FromWire(doc.RootElement);} static string Wire(string local="9007199254740995",string claim="9007199254740995",int status=3,bool own=true)=> JsonSerializer.Serialize(new{source=GalaxyNativeColonisationOwnership.Source,localCommanderId=local,claimCommanderId=claim,claimStatus=status,own}); [Test] public void ExactOriginalCommanderIdsRemainIndependentFromClaimLifecycleAndNullableAbsence() { var own=Read(Wire())!;Check.Equal(9007199254740995UL,own.LocalCommanderId);Check.That(own.Own);Check.Equal((byte)3,own.ClaimStatus); var foreign=Read(Wire(claim:"9007199254740996",status:1,own:false))!;Check.That(!foreign.Own);Check.Equal(9007199254740996UL,foreign.ClaimCommanderId); Check.That(Read("null") is null); } [Test] public void UnknownSentinelInexactIdsWrongSourceAndContradictoryFlagsAreRejected() { void Reject(string value){var rejected=false;try{Read(value);}catch(InvalidDataException){rejected=true;}Check.That(rejected);} Reject(Wire(local:"0"));Reject(Wire(local:ulong.MaxValue.ToString()));Reject(Wire(claim:"-1"));Reject(Wire(status:4));Reject(Wire(own:false)); Reject(Wire().Replace("original-colonisation-classifier-owner","journal-owned-colony")); Reject(Wire().Replace("\"9007199254740995\"","9007199254740995"));Reject("{}"); } [Test] public void OriginalColourUsesOnlyTheOriginalCachedOwnerAndNeverJournalOrPublicOwnership() { var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Colonisation}; var system=new GalacticSystem("recorded-colony-colour-fixture",new Coordinates(0,0,0)){Data=new(){OwnedColony=true, NativeFilterFacts=new("fixture",123,42,ColonisationStatus:1)}}; Check.That(filter.GetOriginalRgba(system) is null); var foreign=system with{Data=system.Data with{NativeFilterFacts=system.Data.NativeFilterFacts! with{ColonisationOwnership=new(100,101,2)}}}; var otherColour=filter.GetOriginalRgba(foreign)!.Value;var expectedOther=GalaxyOriginalAppearance.Colonisation[2]; Check.Equal(expectedOther.R,otherColour.X);Check.Equal(expectedOther.G,otherColour.Y);Check.Equal(expectedOther.B,otherColour.Z); var own=foreign with{Data=foreign.Data with{OwnedColony=false,NativeFilterFacts=foreign.Data.NativeFilterFacts! with{ColonisationOwnership=new(100,100,2)}}}; var ownColour=filter.GetOriginalRgba(own)!.Value;Check.Equal(GalaxyOriginalAppearance.Colonisation[1].R,ownColour.X); var pending=own with{Data=own.Data with{NativeFilterFacts=own.Data.NativeFilterFacts! with{ColonisationStatus=14}}}; Check.That(filter.GetOriginalRgba(pending) is null); var rawZero=own with{Data=own.Data with{NativeFilterFacts=own.Data.NativeFilterFacts! with{ColonisationStatus=0}}}; Check.That(filter.GetOriginalRgba(rawZero) is null); } [Test] public void RequestedOriginalOwnershipSuppressesJournalAndQueryProofForBothStrictTruthPaths() { var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation, Values=new HashSet{"localplayerclaimed"},IncludeUnknown=false}; GalacticSystem Row(bool? own,bool requested=true)=>new("source-aware-owner-fixture",new(0,0,0)){Data=new(){OwnedColony=true, Colonisation="localplayerclaimed",ConfirmedQueries=new HashSet{filter.QueryKey},NativeFilterFacts=new("fixture",123,42,ColonisationStatus:1) {ColonisationOwnershipRequested=requested,ColonisationOwnership=own is{} known?new(100,known?100UL:101UL,2):null}}}; var foreign=Row(false);Check.That(!filter.Matches(foreign)&&!filter.IsUnknown(foreign));Check.That(!filter.Evaluate(foreign).Matches&&!filter.Evaluate(foreign).Unknown); var unknown=Row(null);Check.That(!filter.Matches(unknown)&&filter.IsUnknown(unknown));Check.That(!filter.Evaluate(unknown).Matches&&filter.Evaluate(unknown).Unknown); Check.That((filter with{IncludeUnknown=true}).Matches(unknown)); var required=filter with{RequireOriginalColonisationOwnershipFacts=true};Check.That(!required.Matches(Row(null,false))&&required.IsUnknown(Row(null,false))); var nativeOwn=Row(true) with{Data=Row(true).Data with{OwnedColony=false}};Check.That(filter.Matches(nativeOwn)&&!filter.IsUnknown(nativeOwn)); var publicOnly=Row(null,false);Check.That(filter.Matches(publicOnly)); var mixed=filter with{Values=new HashSet{"localplayerclaimed","beingcolonised"}};Check.That(mixed.Matches(foreign)); var pending=unknown with{Data=unknown.Data with{NativeFilterFacts=unknown.Data.NativeFilterFacts! with{ColonisationStatus=14}}}; Check.That(!filter.Matches(pending)&&filter.IsUnknown(pending)); Check.That(filter.RequestsOriginalColonisationOwnershipFacts&&!(filter with{Mode=GalaxyMapMode.Realistic}).RequestsOriginalColonisationOwnershipFacts); } }