using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Models;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyColonisationHighlightTests
{
static GalaxyNativeColonisationHighlight? Read(string json){using var doc=JsonDocument.Parse(json);return GalaxyNativeColonisationHighlight.FromWire(doc.RootElement);}
static string Wire(int status=0,float distance=4,float radius=4)=>JsonSerializer.Serialize(new{source=GalaxyNativeColonisationHighlight.Source,
centreSystemAddress="9007199254740995",eligibilityStatus=status,distanceSquared=distance,radiusSquared=radius,rawRgb=new[]{.3f,1f,.2f}});
static GalacticSystem System(GalaxyNativeColonisationHighlight? highlight,int status=0)=>new("colonisation-source-fixture",new Coordinates(0,0,0))
{Data=new(){NativeFilterFacts=new("fixture",123,42,ColonisationStatus:status){ColonisationHighlight=highlight,ColonisationHighlightRequested=true}}};
[Test]
public void OriginalRadiusUsesInclusiveSquaredBoundaryAndIndependentEligibility()
{
var edge=Read(Wire())!;Check.Equal(9007199254740995L,edge.CentreSystemAddress);Check.That(edge.Highlighted);
Check.That(!Read(Wire(distance:4.01f))!.Highlighted&&!Read(Wire(status:5))!.Highlighted);
Check.That(Read(Wire(distance:0,radius:0))!.Highlighted&&Read("null") is null);
}
[Test]
public void MissingWrongSourceInexactAddressPendingStatusAndMalformedColourAreRejected()
{
void Reject(string json){var rejected=false;try{Read(json);}catch(InvalidDataException){rejected=true;}Check.That(rejected);}
Reject("{}");Reject(Wire(status:12));Reject(Wire(radius:-1));Reject(Wire(distance:-1));
Reject(Wire().Replace(GalaxyNativeColonisationHighlight.Source,"journal-colonisation"));
Reject(Wire().Replace("\"9007199254740995\"","9007199254740995"));
Reject(Wire().Replace("[0.3,1,0.2]","[0.3,1]"));Reject(Wire().Replace("[0.3,1,0.2]","[0.3,-1,0.2]"));
}
[Test]
public void OnlyColonisationViewWithBoundRadiusAndMatchingStatusUsesOriginalGreen()
{
var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation};
var system=System(Read(Wire()));var rgba=filter.GetOriginalRgba(system)!.Value;
Check.Equal(.3f,rgba.X);Check.Equal(1f,rgba.Y);Check.Equal(.2f,rgba.Z);Check.Equal(1f,rgba.W);
Check.Equal(new GalaxyRawColour(.3f,1f,.2f).DisplayColour(),filter.GetColour(system));
Check.That((filter with{Mode=GalaxyMapMode.Map}).GetOriginalRgba(system) is null);
Check.That(filter.GetOriginalRgba(System(null)) is null&&filter.GetOriginalRgba(System(Read(Wire(distance:5)))) is null);
var excluded=filter.GetOriginalRgba(System(Read(Wire()),5))!.Value;
Check.Equal(GalaxyOriginalAppearance.Colonisation[3].R,excluded.X);Check.Equal(.35f,excluded.W);
}
[Test]
public void HighlightDoesNotBypassStrictQueryOrRestoreUnknownAndForeignOwnedStars()
{
var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation,Values=new HashSet<string>()};
var system=System(Read(Wire()));Check.That(!filter.Matches(system)&&!filter.Evaluate(system).Matches);
var ownOnly=filter with{Values=new HashSet<string>{"localplayerclaimed"},RequireOriginalColonisationOwnershipFacts=true};
Check.That(!ownOnly.Matches(system)&&!ownOnly.Evaluate(system).Matches);
var unclaimed=filter with{Values=new HashSet<string>{"unclaimed"}};Check.That(unclaimed.Matches(system)&&unclaimed.Evaluate(system).Matches);
}
[Test]
public void UnrelatedReadsPreserveSameSourceButExplicitUnknownAndChangedSourceClearHighlight()
{
var original=System(Read(Wire())).Data;
var unrelated=original.Merge(new(){NativeFilterFacts=new("fixture",123,42)});
Check.That(unrelated.NativeFilterFacts!.ColonisationHighlight is not null&&unrelated.NativeFilterFacts.ColonisationStatus==0);
var missing=original.Merge(new(){NativeFilterFacts=new("fixture",123,42){ColonisationHighlightRequested=true}});
Check.That(missing.NativeFilterFacts!.ColonisationHighlight is null);
foreach(var changed in new[]{new GalaxyNativeSystemFacts("other",123,42),new("fixture",124,42),new("fixture",123,43)})
Check.That(original.Merge(new(){NativeFilterFacts=changed}).NativeFilterFacts!.ColonisationHighlight is null);
}
[Test]
public void NormalColourAndSizeUseModeZeroWhileVerifiedGreenKeepsItsSeparateAlphaOne()
{
var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation,SizeCategory=GalaxyFilterCategory.Colonisation};
GalacticSystem Normal(int? status,GalaxyNativeColonisationHighlight? highlight=null)=>System(highlight) with{Data=new(){
NativeFilterFacts=System(highlight).Data.NativeFilterFacts! with{ColonisationNormalStatus=status,ColonisationNormalStatusRequested=true}}};
var red=Normal(5);var rgba=filter.GetOriginalRgba(red)!.Value;
Check.Equal(GalaxyOriginalAppearance.Colonisation[3].R,rgba.X);Check.Equal(.35f,rgba.W);
Check.Equal(GalaxyOriginalAppearance.DefaultSize*GalaxyOriginalSizeOptions.ColonisationExcludedMultiplier,filter.SelectedOriginalSize(red)!.Value);
var grey=filter.GetOriginalRgba(Normal(0))!.Value;Check.Equal(GalaxyOriginalAppearance.Colonisation[0].R,grey.X);
Check.That(filter.GetOriginalRgba(Normal(null)) is null&&filter.SelectedOriginalSize(Normal(null)) is null);
var green=Normal(5,Read(Wire()));Check.Equal(.3f,filter.GetOriginalRgba(green)!.Value.X);Check.Equal(1f,filter.GetOriginalRgba(green)!.Value.W);
var original=red.Data;var unrelated=original.Merge(new(){NativeFilterFacts=new("fixture",123,42)});
Check.Equal(5,unrelated.NativeFilterFacts!.ColonisationNormalStatus!.Value);
Check.That(original.Merge(new(){NativeFilterFacts=new("other",123,42)}).NativeFilterFacts!.ColonisationNormalStatus is null);
}
[Test]
public void OrdinaryMapQueriesUseNormalClassifierAndCannotBorrowOwnershipOrPublicProof()
{
var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Colonisation,Values=new HashSet<string>{"unclaimed"}};
GalacticSystem Row(int? normal)=>System(null) with{Data=new(){OwnedColony=true,Colonisation="unclaimed",
ConfirmedQueries=new HashSet<string>{filter.QueryKey},NativeFilterFacts=System(null).Data.NativeFilterFacts! with{
ColonisationNormalStatus=normal,ColonisationNormalStatusRequested=true,ColonisationOwnershipRequested=false}}};
var excluded=Row(5);Check.That(!filter.Matches(excluded)&&!filter.Evaluate(excluded).Matches&&!filter.IsUnknown(excluded));
Check.That(filter.Matches(Row(0))&&filter.Evaluate(Row(0)).Matches);
var missing=Row(null);Check.That(!filter.Matches(missing)&&filter.Evaluate(missing).Unknown);
var ownOnly=filter with{Values=new HashSet<string>{"localplayerclaimed"}};
Check.That(!ownOnly.Matches(Row(0))&&ownOnly.IsUnknown(Row(0)));
Check.That((filter with{Mode=GalaxyMapMode.Colonisation}).Matches(excluded));
}
}
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Models;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyColonisationHighlightTests
{
static GalaxyNativeColonisationHighlight? Read(string json){using var doc=JsonDocument.Parse(json);return GalaxyNativeColonisationHighlight.FromWire(doc.RootElement);}
static string Wire(int status=0,float distance=4,float radius=4)=>JsonSerializer.Serialize(new{source=GalaxyNativeColonisationHighlight.Source,
centreSystemAddress="9007199254740995",eligibilityStatus=status,distanceSquared=distance,radiusSquared=radius,rawRgb=new[]{.3f,1f,.2f}});
static GalacticSystem System(GalaxyNativeColonisationHighlight? highlight,int status=0)=>new("colonisation-source-fixture",new Coordinates(0,0,0))
{Data=new(){NativeFilterFacts=new("fixture",123,42,ColonisationStatus:status){ColonisationHighlight=highlight,ColonisationHighlightRequested=true}}};
[Test]
public void OriginalRadiusUsesInclusiveSquaredBoundaryAndIndependentEligibility()
{
var edge=Read(Wire())!;Check.Equal(9007199254740995L,edge.CentreSystemAddress);Check.That(edge.Highlighted);
Check.That(!Read(Wire(distance:4.01f))!.Highlighted&&!Read(Wire(status:5))!.Highlighted);
Check.That(Read(Wire(distance:0,radius:0))!.Highlighted&&Read("null") is null);
}
[Test]
public void MissingWrongSourceInexactAddressPendingStatusAndMalformedColourAreRejected()
{
void Reject(string json){var rejected=false;try{Read(json);}catch(InvalidDataException){rejected=true;}Check.That(rejected);}
Reject("{}");Reject(Wire(status:12));Reject(Wire(radius:-1));Reject(Wire(distance:-1));
Reject(Wire().Replace(GalaxyNativeColonisationHighlight.Source,"journal-colonisation"));
Reject(Wire().Replace("\"9007199254740995\"","9007199254740995"));
Reject(Wire().Replace("[0.3,1,0.2]","[0.3,1]"));Reject(Wire().Replace("[0.3,1,0.2]","[0.3,-1,0.2]"));
}
[Test]
public void OnlyColonisationViewWithBoundRadiusAndMatchingStatusUsesOriginalGreen()
{
var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation};
var system=System(Read(Wire()));var rgba=filter.GetOriginalRgba(system)!.Value;
Check.Equal(.3f,rgba.X);Check.Equal(1f,rgba.Y);Check.Equal(.2f,rgba.Z);Check.Equal(1f,rgba.W);
Check.Equal(new GalaxyRawColour(.3f,1f,.2f).DisplayColour(),filter.GetColour(system));
Check.That((filter with{Mode=GalaxyMapMode.Map}).GetOriginalRgba(system) is null);
Check.That(filter.GetOriginalRgba(System(null)) is null&&filter.GetOriginalRgba(System(Read(Wire(distance:5)))) is null);
var excluded=filter.GetOriginalRgba(System(Read(Wire()),5))!.Value;
Check.Equal(GalaxyOriginalAppearance.Colonisation[3].R,excluded.X);Check.Equal(.35f,excluded.W);
}
[Test]
public void HighlightDoesNotBypassStrictQueryOrRestoreUnknownAndForeignOwnedStars()
{
var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation,Values=new HashSet<string>()};
var system=System(Read(Wire()));Check.That(!filter.Matches(system)&&!filter.Evaluate(system).Matches);
var ownOnly=filter with{Values=new HashSet<string>{"localplayerclaimed"},RequireOriginalColonisationOwnershipFacts=true};
Check.That(!ownOnly.Matches(system)&&!ownOnly.Evaluate(system).Matches);
var unclaimed=filter with{Values=new HashSet<string>{"unclaimed"}};Check.That(unclaimed.Matches(system)&&unclaimed.Evaluate(system).Matches);
}
[Test]
public void UnrelatedReadsPreserveSameSourceButExplicitUnknownAndChangedSourceClearHighlight()
{
var original=System(Read(Wire())).Data;
var unrelated=original.Merge(new(){NativeFilterFacts=new("fixture",123,42)});
Check.That(unrelated.NativeFilterFacts!.ColonisationHighlight is not null&&unrelated.NativeFilterFacts.ColonisationStatus==0);
var missing=original.Merge(new(){NativeFilterFacts=new("fixture",123,42){ColonisationHighlightRequested=true}});
Check.That(missing.NativeFilterFacts!.ColonisationHighlight is null);
foreach(var changed in new[]{new GalaxyNativeSystemFacts("other",123,42),new("fixture",124,42),new("fixture",123,43)})
Check.That(original.Merge(new(){NativeFilterFacts=changed}).NativeFilterFacts!.ColonisationHighlight is null);
}
[Test]
public void NormalColourAndSizeUseModeZeroWhileVerifiedGreenKeepsItsSeparateAlphaOne()
{
var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation,SizeCategory=GalaxyFilterCategory.Colonisation};
GalacticSystem Normal(int? status,GalaxyNativeColonisationHighlight? highlight=null)=>System(highlight) with{Data=new(){
NativeFilterFacts=System(highlight).Data.NativeFilterFacts! with{ColonisationNormalStatus=status,ColonisationNormalStatusRequested=true}}};
var red=Normal(5);var rgba=filter.GetOriginalRgba(red)!.Value;
Check.Equal(GalaxyOriginalAppearance.Colonisation[3].R,rgba.X);Check.Equal(.35f,rgba.W);
Check.Equal(GalaxyOriginalAppearance.DefaultSize*GalaxyOriginalSizeOptions.ColonisationExcludedMultiplier,filter.SelectedOriginalSize(red)!.Value);
var grey=filter.GetOriginalRgba(Normal(0))!.Value;Check.Equal(GalaxyOriginalAppearance.Colonisation[0].R,grey.X);
Check.That(filter.GetOriginalRgba(Normal(null)) is null&&filter.SelectedOriginalSize(Normal(null)) is null);
var green=Normal(5,Read(Wire()));Check.Equal(.3f,filter.GetOriginalRgba(green)!.Value.X);Check.Equal(1f,filter.GetOriginalRgba(green)!.Value.W);
var original=red.Data;var unrelated=original.Merge(new(){NativeFilterFacts=new("fixture",123,42)});
Check.Equal(5,unrelated.NativeFilterFacts!.ColonisationNormalStatus!.Value);
Check.That(original.Merge(new(){NativeFilterFacts=new("other",123,42)}).NativeFilterFacts!.ColonisationNormalStatus is null);
}
[Test]
public void OrdinaryMapQueriesUseNormalClassifierAndCannotBorrowOwnershipOrPublicProof()
{
var filter=GalaxyMapFilter.Default with{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Colonisation,Values=new HashSet<string>{"unclaimed"}};
GalacticSystem Row(int? normal)=>System(null) with{Data=new(){OwnedColony=true,Colonisation="unclaimed",
ConfirmedQueries=new HashSet<string>{filter.QueryKey},NativeFilterFacts=System(null).Data.NativeFilterFacts! with{
ColonisationNormalStatus=normal,ColonisationNormalStatusRequested=true,ColonisationOwnershipRequested=false}}};
var excluded=Row(5);Check.That(!filter.Matches(excluded)&&!filter.Evaluate(excluded).Matches&&!filter.IsUnknown(excluded));
Check.That(filter.Matches(Row(0))&&filter.Evaluate(Row(0)).Matches);
var missing=Row(null);Check.That(!filter.Matches(missing)&&filter.Evaluate(missing).Unknown);
var ownOnly=filter with{Values=new HashSet<string>{"localplayerclaimed"}};
Check.That(!ownOnly.Matches(Row(0))&&ownOnly.IsUnknown(Row(0)));
Check.That((filter with{Mode=GalaxyMapMode.Colonisation}).Matches(excluded));
}
}