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<string>{"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<string>{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<string>{"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);
}
}
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<string>{"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<string>{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<string>{"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);
}
}