using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyOriginalAppearanceTests
{
private static GalacticSystem Star(string type="G")=>new("Measured",new(0,0,0),StarClass:type);
[Test] public void EconomyUsesTheAuthoredDefinitionColourForTheSelectedPrimaryOrSecondaryEconomy()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Economy};
var system=Star() with{Data=new(){Economy="Extraction",SecondaryEconomy="High Tech"}};
Check.Equal(new System.Numerics.Vector4(1,0,0,1),filter.GetOriginalRgba(system)!.Value);
var secondary=filter with{Values=new HashSet<string>{"hightech"}};
Check.That(secondary.Matches(system));
Check.Equal(new System.Numerics.Vector4(0,1,1,1),secondary.GetOriginalRgba(system)!.Value);
Check.Equal(new StarColour(0,255,255),secondary.GetColour(system));
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Economy,"Agri",out var agriculture));
Check.Equal(new GalaxyRawColour(.5f,1,0),agriculture);
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Economy,"Terraforming",out var terraforming));
Check.Equal(.6f,terraforming.G);
}
[Test] public void EconomyEnumsWithoutAnAuthoredRowDoNotBorrowOrCycleAnOriginalColour()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Economy};
foreach(var economy in new[]{"Repair","Rescue","Carrier","Corporate","Research","Future economy"})
{
Check.That(!GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Economy,economy,out _));
Check.That(filter.GetOriginalRgba(Star() with{Data=new(){Economy=economy}}) is null);
}
}
[Test] public void SourceFloatsPreserveHdrValuesWhileTheSdrConversionClampsOnlyAtDisplay()
{
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.State,"SystemState_ThargoidStronghold",out var stronghold));
Check.Equal(100f,stronghold.R);Check.Equal(new StarColour(255,0,0),stronghold.DisplayColour());
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.State,"Frontline",out var frontline));Check.Equal(2f,frontline.G);
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Government,"Carrier",out var carrier));Check.Equal(new StarColour(255,0,81),carrier.DisplayColour());
Check.That(!GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Government,"Megaconstruction",out _));
}
[Test] public void MapGroupsUseTheOriginalGroupedPaletteRatherThanThePhysicalSpectralPalette()
{
var map=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.StarClass};
Check.Equal(new StarColour(0,0,255),map.GetColour(Star("O")));
Check.Equal(new StarColour(93,103,239),map.GetColour(Star("DAB")));
Check.Equal(map.GetColour(Star("W")),map.GetColour(Star("WO")));
Check.Equal(map.GetColour(Star("C")),map.GetColour(Star("CHd")));
Check.Equal(new StarColour(100,100,100),map.GetColour(Star("N")));
Check.Equal(map.GetColour(Star("N")),map.GetColour(Star("SupermassiveBlackHole")));
Check.Equal(map.GetColour(Star("A")),map.GetColour(Star("A_BlueWhiteSuperGiant")));
Check.That(map.GetColour(Star("O"))!=(map with{Mode=GalaxyMapMode.Realistic}).GetColour(Star("O")));
}
[Test] public void OriginalPopulationEndpointsAreLinearInAbsolutePeopleAndSizeIsIndependent()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Population,SizeCategory=GalaxyFilterCategory.Population,PopulationMinimum=100,PopulationMaximum=1100};
var star=Star() with{Data=new(){Population=100}};
Check.Equal(new StarColour(18,43,66),filter.GetColour(star));Check.Equal(.3f,filter.RelativeSize(star));
Check.Equal(new StarColour(135,237,66),filter.GetColour(star with{Data=new(){Population=1100}}));Check.Equal(2f,filter.RelativeSize(star with{Data=new(){Population=1100}}));
Check.Equal(.5,filter.PopulationFraction(600));Check.That(Math.Abs(filter.RelativeSize(star with{Data=new(){Population=600}})-1.15f)<.00001f);
Check.That(!filter.Matches(star with{Data=new(){Population=99}}));Check.Equal(0f,filter.RelativeSize(star with{Data=new(){Population=99}}));
Check.Equal(.7f,(filter with{SizeCategory=GalaxyFilterCategory.None}).RelativeSize(star));
Check.Equal(1f,(filter with{Mode=GalaxyMapMode.Realistic}).RelativeSize(star));
Check.Equal(0d,(filter with{PopulationMinimum=100,PopulationMaximum=100}).PopulationFraction(100));
}
[Test] public void ColonyColoursRequireActualOwnershipAndDoNotTreatGroupNumbersAsPaletteIndices()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation};
GalacticSystem Colony(int code,bool? owned)=>Star() with{Data=new(){OwnedColony=owned,NativeFilterFacts=new("F1",123,42,ColonisationStatus:code)
{ColonisationOwnership=owned is{} known?new(100,known?100UL:101UL,2):null}}};
Check.Equal(new StarColour(255,242,38),filter.GetColour(Colony(1,true)));
Check.Equal(new StarColour(255,26,230),filter.GetColour(Colony(1,false)));
Check.Equal(new StarColour(204,204,204),filter.GetColour(Colony(1,null)));
Check.Equal(new StarColour(255,26,26),filter.GetColour(Colony(5,null)));
Check.Equal(.35f,filter.GetOpacity(Colony(5,null)));Check.Equal(1f,filter.GetOpacity(Colony(7,null)));
Check.Equal(new StarColour(204,204,204),filter.GetColour(Colony(7,null)));
Check.Equal(filter.GetColour(Colony(1,true)),filter.GetColour(Colony(3,true)));
var ownOnly=filter with{Values=new HashSet<string>{"localplayerclaimed"},IncludeUnknown=true};
Check.That(ownOnly.Matches(Colony(1,true))&&!ownOnly.Matches(Colony(1,false))&&!ownOnly.IsUnknown(Colony(1,false)));
Check.That(!ownOnly.Evaluate(Colony(1,false)).Matches&&!ownOnly.Evaluate(Colony(1,false)).Unknown);
// Eligible raw status alone is not proof that the original special green branch ran.
Check.Equal(new StarColour(204,204,204),filter.GetColour(Colony(0,null)));
foreach(var owner in new[]{true,false})
{
var source=Colony(1,owner).Data;var json=System.Text.Json.JsonSerializer.Serialize(source);var restored=System.Text.Json.JsonSerializer.Deserialize<GalaxySystemData>(json)!;
Check.That(restored.OwnedColony is null&&restored.NativeFilterFacts is null);
}
Check.That(System.Text.Json.JsonSerializer.Deserialize<GalaxySystemData>("""{"AccountFid":"F1","OwnedColony":true}""")!.OwnedColony is null);
}
[Test] public void MarkerLookupPreservesTheTargetStarsSourceColourInsteadOfTintingEveryEngineerPink()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Markers,Values=new HashSet<string>{"engineer"}};
var actual=Star() with{OriginalAppearance=new(0xff112233,0xff445566,null,0,0,1,1,false)};
Check.Equal(new StarColour(102,85,68),filter.GetColour(actual));
Check.Equal(filter.GetColour(actual),(filter with{Values=new HashSet<string>{"bookmark"}}).GetColour(actual));
Check.Equal(StellarAppearance.Palette[StellarAppearance.ColourIndex("G")],filter.GetColour(Star()));
}
[Test] public void OriginalServicePaletteFollowsTheActualSelectionRatherThanTheFirstUnrelatedStationService()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Services,Values=new HashSet<string>{"materialtradermanufactured"}};
var system=Star() with{Data=new(){Services=["Repair","MaterialTraderManufactured"]}};
Check.That(filter.Matches(system));Check.Equal(new StarColour(0,64,255),filter.GetColour(system));
Check.Equal(new StarColour(255,0,255),(filter with{Values=new HashSet<string>{"materialtraderxeno"}}).ColourForValue("materialtraderxeno"));
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Services,"modulepacks",out var administration));Check.Equal(1f,administration.A);Check.Equal(new StarColour(201,235,69),administration.DisplayColour());
Check.That(!GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Services,"Repair",out _));
}
}
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyOriginalAppearanceTests
{
private static GalacticSystem Star(string type="G")=>new("Measured",new(0,0,0),StarClass:type);
[Test] public void EconomyUsesTheAuthoredDefinitionColourForTheSelectedPrimaryOrSecondaryEconomy()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Economy};
var system=Star() with{Data=new(){Economy="Extraction",SecondaryEconomy="High Tech"}};
Check.Equal(new System.Numerics.Vector4(1,0,0,1),filter.GetOriginalRgba(system)!.Value);
var secondary=filter with{Values=new HashSet<string>{"hightech"}};
Check.That(secondary.Matches(system));
Check.Equal(new System.Numerics.Vector4(0,1,1,1),secondary.GetOriginalRgba(system)!.Value);
Check.Equal(new StarColour(0,255,255),secondary.GetColour(system));
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Economy,"Agri",out var agriculture));
Check.Equal(new GalaxyRawColour(.5f,1,0),agriculture);
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Economy,"Terraforming",out var terraforming));
Check.Equal(.6f,terraforming.G);
}
[Test] public void EconomyEnumsWithoutAnAuthoredRowDoNotBorrowOrCycleAnOriginalColour()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Economy};
foreach(var economy in new[]{"Repair","Rescue","Carrier","Corporate","Research","Future economy"})
{
Check.That(!GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Economy,economy,out _));
Check.That(filter.GetOriginalRgba(Star() with{Data=new(){Economy=economy}}) is null);
}
}
[Test] public void SourceFloatsPreserveHdrValuesWhileTheSdrConversionClampsOnlyAtDisplay()
{
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.State,"SystemState_ThargoidStronghold",out var stronghold));
Check.Equal(100f,stronghold.R);Check.Equal(new StarColour(255,0,0),stronghold.DisplayColour());
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.State,"Frontline",out var frontline));Check.Equal(2f,frontline.G);
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Government,"Carrier",out var carrier));Check.Equal(new StarColour(255,0,81),carrier.DisplayColour());
Check.That(!GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Government,"Megaconstruction",out _));
}
[Test] public void MapGroupsUseTheOriginalGroupedPaletteRatherThanThePhysicalSpectralPalette()
{
var map=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.StarClass};
Check.Equal(new StarColour(0,0,255),map.GetColour(Star("O")));
Check.Equal(new StarColour(93,103,239),map.GetColour(Star("DAB")));
Check.Equal(map.GetColour(Star("W")),map.GetColour(Star("WO")));
Check.Equal(map.GetColour(Star("C")),map.GetColour(Star("CHd")));
Check.Equal(new StarColour(100,100,100),map.GetColour(Star("N")));
Check.Equal(map.GetColour(Star("N")),map.GetColour(Star("SupermassiveBlackHole")));
Check.Equal(map.GetColour(Star("A")),map.GetColour(Star("A_BlueWhiteSuperGiant")));
Check.That(map.GetColour(Star("O"))!=(map with{Mode=GalaxyMapMode.Realistic}).GetColour(Star("O")));
}
[Test] public void OriginalPopulationEndpointsAreLinearInAbsolutePeopleAndSizeIsIndependent()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Population,SizeCategory=GalaxyFilterCategory.Population,PopulationMinimum=100,PopulationMaximum=1100};
var star=Star() with{Data=new(){Population=100}};
Check.Equal(new StarColour(18,43,66),filter.GetColour(star));Check.Equal(.3f,filter.RelativeSize(star));
Check.Equal(new StarColour(135,237,66),filter.GetColour(star with{Data=new(){Population=1100}}));Check.Equal(2f,filter.RelativeSize(star with{Data=new(){Population=1100}}));
Check.Equal(.5,filter.PopulationFraction(600));Check.That(Math.Abs(filter.RelativeSize(star with{Data=new(){Population=600}})-1.15f)<.00001f);
Check.That(!filter.Matches(star with{Data=new(){Population=99}}));Check.Equal(0f,filter.RelativeSize(star with{Data=new(){Population=99}}));
Check.Equal(.7f,(filter with{SizeCategory=GalaxyFilterCategory.None}).RelativeSize(star));
Check.Equal(1f,(filter with{Mode=GalaxyMapMode.Realistic}).RelativeSize(star));
Check.Equal(0d,(filter with{PopulationMinimum=100,PopulationMaximum=100}).PopulationFraction(100));
}
[Test] public void ColonyColoursRequireActualOwnershipAndDoNotTreatGroupNumbersAsPaletteIndices()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Colonisation,Category=GalaxyFilterCategory.Colonisation};
GalacticSystem Colony(int code,bool? owned)=>Star() with{Data=new(){OwnedColony=owned,NativeFilterFacts=new("F1",123,42,ColonisationStatus:code)
{ColonisationOwnership=owned is{} known?new(100,known?100UL:101UL,2):null}}};
Check.Equal(new StarColour(255,242,38),filter.GetColour(Colony(1,true)));
Check.Equal(new StarColour(255,26,230),filter.GetColour(Colony(1,false)));
Check.Equal(new StarColour(204,204,204),filter.GetColour(Colony(1,null)));
Check.Equal(new StarColour(255,26,26),filter.GetColour(Colony(5,null)));
Check.Equal(.35f,filter.GetOpacity(Colony(5,null)));Check.Equal(1f,filter.GetOpacity(Colony(7,null)));
Check.Equal(new StarColour(204,204,204),filter.GetColour(Colony(7,null)));
Check.Equal(filter.GetColour(Colony(1,true)),filter.GetColour(Colony(3,true)));
var ownOnly=filter with{Values=new HashSet<string>{"localplayerclaimed"},IncludeUnknown=true};
Check.That(ownOnly.Matches(Colony(1,true))&&!ownOnly.Matches(Colony(1,false))&&!ownOnly.IsUnknown(Colony(1,false)));
Check.That(!ownOnly.Evaluate(Colony(1,false)).Matches&&!ownOnly.Evaluate(Colony(1,false)).Unknown);
// Eligible raw status alone is not proof that the original special green branch ran.
Check.Equal(new StarColour(204,204,204),filter.GetColour(Colony(0,null)));
foreach(var owner in new[]{true,false})
{
var source=Colony(1,owner).Data;var json=System.Text.Json.JsonSerializer.Serialize(source);var restored=System.Text.Json.JsonSerializer.Deserialize<GalaxySystemData>(json)!;
Check.That(restored.OwnedColony is null&&restored.NativeFilterFacts is null);
}
Check.That(System.Text.Json.JsonSerializer.Deserialize<GalaxySystemData>("""{"AccountFid":"F1","OwnedColony":true}""")!.OwnedColony is null);
}
[Test] public void MarkerLookupPreservesTheTargetStarsSourceColourInsteadOfTintingEveryEngineerPink()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Markers,Values=new HashSet<string>{"engineer"}};
var actual=Star() with{OriginalAppearance=new(0xff112233,0xff445566,null,0,0,1,1,false)};
Check.Equal(new StarColour(102,85,68),filter.GetColour(actual));
Check.Equal(filter.GetColour(actual),(filter with{Values=new HashSet<string>{"bookmark"}}).GetColour(actual));
Check.Equal(StellarAppearance.Palette[StellarAppearance.ColourIndex("G")],filter.GetColour(Star()));
}
[Test] public void OriginalServicePaletteFollowsTheActualSelectionRatherThanTheFirstUnrelatedStationService()
{
var filter=new GalaxyMapFilter{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Services,Values=new HashSet<string>{"materialtradermanufactured"}};
var system=Star() with{Data=new(){Services=["Repair","MaterialTraderManufactured"]}};
Check.That(filter.Matches(system));Check.Equal(new StarColour(0,64,255),filter.GetColour(system));
Check.Equal(new StarColour(255,0,255),(filter with{Values=new HashSet<string>{"materialtraderxeno"}}).ColourForValue("materialtraderxeno"));
Check.That(GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Services,"modulepacks",out var administration));Check.Equal(1f,administration.A);Check.Equal(new StarColour(201,235,69),administration.DisplayColour());
Check.That(!GalaxyOriginalAppearance.TryColour(GalaxyFilterCategory.Services,"Repair",out _));
}
}