using System.Xml;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyOriginalSettingsTests
{
private static string Fixture=>File.ReadAllText(Path.Combine(AppContext.BaseDirectory,"Fixtures","galaxy-player-options.misc.xml"));
[Test] public void OriginalEnumsRestoreColourSizeAndPhysicalModeIndependently()
{
var original=GalaxyOriginalSettings.Parse(Fixture,new(){Category=GalaxyFilterCategory.Economy,ShowMarkers=false,JumpRange=42});
var f=original.Filter;Check.Equal(GalaxyMapMode.Realistic,f.Mode);Check.Equal(GalaxyFilterCategory.Commodity,f.Category);Check.Equal(GalaxyFilterCategory.None,f.SizeCategory);
Check.That(!f.ShowGrid&&f.ShowLabels&&f.ShowLinks&&!f.ShowRoute&&!f.ShowMarkers);Check.Equal(42d,f.JumpRange);
Check.That(f.WithCategory(GalaxyFilterCategory.Economy).Values!.SetEquals(["hightech"]));Check.That(!f.WithCategory(GalaxyFilterCategory.Economy).Values!.Contains("agriculture"));
var government=f.WithCategory(GalaxyFilterCategory.Government);Check.That(government.Values!.SetEquals(["anarchy"]));Check.That(government.OriginalRouteFilters[GalaxyFilterCategory.Government]);
Check.That(f.WithCategory(GalaxyFilterCategory.StarClass).Values!.SetEquals(["a_bluewhitesupergiant"]));
Check.Equal(9,original.ColourVisIndex);Check.Equal(0,original.SizeVisIndex);
Check.Equal("64",original.OriginalOptions["PoliticsTerritoryModePowersFilter"]);Check.That(!original.OriginalOptions.Keys.Any(x=>x.Contains("LocationPanelFilters")));
var edited=government with{Values=new HashSet<string>{"democracy"}};
Check.That(edited.WithCategory(GalaxyFilterCategory.Economy).WithCategory(GalaxyFilterCategory.Government).Values!.SetEquals(["democracy"]));
}
[Test] public void OriginalVisibilityIdsAndModeIdsAgreeWithTheVerifiedNativeDispatch()
{
var expected=new[]{GalaxyFilterCategory.None,GalaxyFilterCategory.Population,GalaxyFilterCategory.Allegiance,GalaxyFilterCategory.Government,GalaxyFilterCategory.Economy,GalaxyFilterCategory.StarClass,GalaxyFilterCategory.State,GalaxyFilterCategory.Security,GalaxyFilterCategory.Visited,GalaxyFilterCategory.Commodity,GalaxyFilterCategory.Civilization,GalaxyFilterCategory.Services,GalaxyFilterCategory.FleetCarrier,GalaxyFilterCategory.Colonisation,GalaxyFilterCategory.Exploration,GalaxyFilterCategory.TradeData};
for(var i=0;i<expected.Length;i++)Check.Equal(expected[i],GalaxyOriginalSettings.CategoryForIndex(i));Check.That(GalaxyOriginalSettings.CategoryForIndex(16) is null);
var imported=GalaxyOriginalSettings.Parse("<Root><RealisticView Value='1'/><ColourVisIndex Value='2'/><SizeVisIndex Value='1'/></Root>",new());
Check.Equal(GalaxyMapMode.Map,imported.Filter.Mode);Check.Equal(GalaxyFilterCategory.Allegiance,imported.Filter.Category);Check.Equal(GalaxyFilterCategory.Population,imported.Filter.SizeCategory);
var populous=new GalacticSystem("Measured",new(0,0,0)){Data=new(){Population=1000000000,Allegiance="Federation"}};
Check.That(imported.Filter.RelativeSize(populous)!=1);Check.Equal(GalaxyOriginalAppearance.DefaultSize,(imported.Filter with{SizeCategory=GalaxyFilterCategory.None}).RelativeSize(populous));
Check.Equal(GalaxyMapMode.Powerplay,GalaxyOriginalSettings.Parse("<Root><RealisticView Value='2'/></Root>",new()).Filter.Mode);
Check.Equal(GalaxyMapMode.Colonisation,GalaxyOriginalSettings.Parse("<Root><RealisticView Value='4'/></Root>",new()).Filter.Mode);
var population=GalaxyOriginalSettings.Parse("<Root><RealisticView Value='1'/><ColourVisIndex Value='2'/><SizeVisIndex Value='1'/><VisibilityValues><population><min Value='1000000'/><max Value='10000000'/></population></VisibilityValues></Root>",new()).Filter;
Check.Equal(1_000_000d,population.PopulationMinimum);Check.Equal(10_000_000d,population.PopulationMaximum);
var below=populous with{Data=populous.Data with{Population=999999}};Check.That(!population.Matches(below));Check.Equal(0f,population.RelativeSize(below));
Check.Equal(2f,population.RelativeSize(populous));Check.Equal(.5,population.PopulationFraction(5500000));
}
[Test] public void ReadingSavedOptionsNeverRewritesTheSourceAndMissingFlagsPreserveCurrentDisplay()
{
using var directory=new TemporaryDirectory();var path=directory.File("Custom.4.4.misc");File.WriteAllText(path,Fixture);var before=File.ReadAllBytes(path);
var imported=GalaxyOriginalSettings.Read(path,new(){ShowBackground=false});Check.That(before.SequenceEqual(File.ReadAllBytes(path)));Check.That(!imported.Filter.ShowBackground);
var minimal=GalaxyOriginalSettings.Parse("<Root><ShowGrid Value=\"1\"/></Root>",new(){Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Security,ShowLinks=true});
Check.Equal(GalaxyFilterCategory.Security,minimal.Filter.Category);Check.That(minimal.Filter.ShowGrid&&minimal.Filter.ShowLinks);Check.That(minimal.ColourVisIndex is null);
}
[Test] public void InvalidXmlExternalEntitiesAndNonBooleanFilterValuesAreRejected()
{
Check.Throws<XmlException>(()=>GalaxyOriginalSettings.Parse("<!DOCTYPE Root [<!ENTITY x SYSTEM 'file:///C:/Windows/win.ini'>]><Root><StarNames Value='1'/><x>&x;</x></Root>",new()));
Check.Throws<InvalidDataException>(()=>GalaxyOriginalSettings.Parse("<Root><VisibilityFlags><economy><HighTech Value='2'/></economy></VisibilityFlags></Root>",new()));
Check.Throws<InvalidDataException>(()=>GalaxyOriginalSettings.Parse("<Root><ShowGrid Value='true'/></Root>",new()));
Check.Throws<InvalidDataException>(()=>GalaxyOriginalSettings.Parse("<Other/>",new()));
}
[Test] public void JournalControllingPowerWinsOverTheMultiplePowersInfluencingASystem()
{
var data=GalaxySystemData.FromJournal(Check.Json("""{"ControllingPower":"Actual controller","Powers":["Other influence","Actual controller"],"PowerplayState":"Stronghold"}"""));
Check.Equal("Actual controller",data.Power);Check.Equal("Stronghold",data.PowerState);
var influences=GalaxySystemData.FromJournal(Check.Json("""{"Powers":["Other influence","Another influence"],"PowerplayState":"Exploited"}"""));Check.That(influences.Power is null);Check.Equal("Exploited",influences.PowerState);
var single=GalaxySystemData.FromJournal(Check.Json("""{"Powers":["Only influence"]}"""));Check.That(single.Power is null);
}
[Test] public void ActivityViewRestoresProvenActionAndIndependentMinimumWithoutGuessingPowerIds()
{
var imported=GalaxyOriginalSettings.Parse("""<Root><RealisticView Value="2"/><PoliticsMode Value="1"/><PoliticsTerritoryActivityFilterPower Value="3"/><PoliticsTerritoryActivityFilterAction Value="2"/><PoliticsTerritoryActivityFilterFilterMinActivity Value="1"/><PoliticsTerritoryActivityFilterMinActivity Value="0.35"/></Root>""",new(){ActivityPowerName="Previously selected"});
Check.Equal(GalaxyFilterCategory.Power,imported.Filter.Category);Check.Equal(GalaxyPowerplayView.Activities,imported.Filter.PowerplayView);Check.That(imported.Filter.UseMinimumActivity);Check.Equal(.35,imported.Filter.MinimumActivity);Check.That(imported.Filter.ActivityPowerName is null&&!imported.Filter.ActivityNativeQueryReady);Check.That(imported.Filter.UsesPowerOuter&&!imported.Filter.UsesPowerActivityCounter);
Check.Equal(GalaxyPowerActivity.Reinforcing,imported.Filter.Activity);
Check.Equal("3",imported.OriginalOptions["PoliticsTerritoryActivityFilterPower"]);Check.Equal("2",imported.OriginalOptions["PoliticsTerritoryActivityFilterAction"]);Check.Equal(3,imported.Filter.OriginalActivityPowerIndex);Check.That(imported.Limitations.Any(l=>l.Contains("等待")));
}
[Test] public void OriginalNameAndPlaneLayersAreIndependentOfStellarQueries()
{
var imported=GalaxyOriginalSettings.Parse("""<Root><RealisticView Value="0"/><RegionNames Value="0"/><NebulaNames Value="1"/><Constellations Value="1"/><GalacticZonesPlane Value="0"/><GalacticZoneNames Value="1"/></Root>""",new());
var f=imported.Filter;Check.Equal(GalaxyMapMode.Realistic,f.Mode);Check.That(!f.IsQueryActive);
Check.That(!f.ShowRegionNames&&f.ShowNebulaNames&&f.ShowConstellations&&!f.ShowGalacticZonesPlane&&f.ShowGalacticZoneNames);
var labels=GalaxyFilterDefinitions.All.Single(d=>d.Category==GalaxyFilterCategory.Markers).Choices.Select(c=>c.Key).ToHashSet();
Check.That(labels.Contains("galacticregion")&&!labels.Overlaps(["region","nebula","constellation","galacticzones","galacticzonenames"]));
var map=f with{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Markers,Values=new HashSet<string>{"galacticregion"}};
var publicRegion=new GalacticSystem("Measured",new(0,0,0)){Data=new(){Region="Inner Orion Spur",Markers=["region"]}};
Check.That(map.Matches(publicRegion));Check.Equal("Inner Orion Spur",map.LabelFor(publicRegion));
Check.That(!map.Matches(publicRegion with{Data=new(){Markers=["region"]}}));
}
[Test] public void SavedActivityPowerDoesNotGuessBetweenTableIndexInternalIdAndUiId()
{
var current=new GalaxyMapFilter{OriginalPowerOptions=[new(0,1,4,"Actual Power",1,.25f,0)]};
var prefix="<Root><RealisticView Value='2'/><PoliticsMode Value='1'/><PoliticsTerritoryActivityFilterAction Value='3'/>";
var actual=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='4'/></Root>",current).Filter;
Check.That(actual.ActivityPowerName is null&&actual.ActivityInternalPowerId is null&&!actual.ActivityNativeQueryReady);Check.Equal(GalaxyPowerActivity.Acquiring,actual.Activity);
var uiId=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='1'/></Root>",current).Filter;
Check.That(uiId.ActivityPowerName is null&&uiId.ActivityInternalPowerId is null&&!uiId.ActivityNativeQueryReady);
var index=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='0'/></Root>",current).Filter;
Check.Equal("Actual Power",index.ActivityPowerName);Check.Equal(4,index.ActivityInternalPowerId);Check.That(index.OriginalActivityPowerIndex is null&&index.ActivityNativeQueryReady);
var colour=(actual with{Category=GalaxyFilterCategory.Power}).ColourForValue("actualpower");Check.Equal(new StarColour(255,64,0),colour);
var chosen=actual with{ActivityPowerName="Actual Power",ActivityInternalPowerId=4};Check.That(chosen.ActivityNativeQueryReady);
var any=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='-2'/></Root>",current).Filter;
Check.That(any.ActivityAllPowers&&any.ActivityNativeQueryReady&&any.ActivityInternalPowerId is null&&any.ActivityPowerName is null);
var disabled=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='-1'/></Root>",current).Filter;Check.That(!disabled.ActivityAllPowers&&!disabled.ActivityNativeQueryReady);
}
[Test] public void OriginalServiceIndexRestoresTheActualSingleServiceEvenWhenAnotherColourCategoryIsActive()
{
var imported=GalaxyOriginalSettings.Parse("<Root><RealisticView Value='1'/><ColourVisIndex Value='9'/><ServicesOption Value='1'/></Root>",new()).Filter;
Check.Equal(GalaxyFilterCategory.Commodity,imported.Category);
var service=imported.WithCategory(GalaxyFilterCategory.Services);Check.That(service.Values!.SetEquals(["materialtradermanufactured"]));
var manufactured=new GalacticSystem("Actual service",new(0,0,0)){Data=new(){Services=["MaterialTraderManufactured"]}};
Check.That(service.Matches(manufactured));Check.That(!service.Matches(manufactured with{Data=new(){Services=["MaterialTraderRaw"]}}));
Check.Equal("materialtraderxeno",GalaxyOriginalServiceOptions.KeyForIndex(3));Check.Equal("modulepacks",GalaxyOriginalServiceOptions.KeyForIndex(9));
var invalid=GalaxyOriginalSettings.Parse("<Root><ServicesOption Value='10'/></Root>",service);
Check.That(invalid.Filter.Values!.SetEquals(service.Values));Check.Equal("10",invalid.OriginalOptions["ServicesOption"]);Check.That(invalid.Limitations.Any(l=>l.Contains("服务选项编号")));
Check.That(GalaxyOriginalServiceOptions.KeyForIndex(-1) is null&&GalaxyOriginalServiceOptions.KeyForIndex(10) is null);
var factors=GalaxyOriginalSettings.Parse("<Root><ColourVisIndex Value='11'/><RealisticView Value='1'/><ServicesOption Value='6'/></Root>",new()).Filter;
var journal=GalaxySystemData.FromJournal(Check.Json("""{"StationServices":["Facilitator"]}"""));
Check.That(factors.Matches(manufactured with{Data=journal}));
}
}
using System.Xml;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public class GalaxyOriginalSettingsTests
{
private static string Fixture=>File.ReadAllText(Path.Combine(AppContext.BaseDirectory,"Fixtures","galaxy-player-options.misc.xml"));
[Test] public void OriginalEnumsRestoreColourSizeAndPhysicalModeIndependently()
{
var original=GalaxyOriginalSettings.Parse(Fixture,new(){Category=GalaxyFilterCategory.Economy,ShowMarkers=false,JumpRange=42});
var f=original.Filter;Check.Equal(GalaxyMapMode.Realistic,f.Mode);Check.Equal(GalaxyFilterCategory.Commodity,f.Category);Check.Equal(GalaxyFilterCategory.None,f.SizeCategory);
Check.That(!f.ShowGrid&&f.ShowLabels&&f.ShowLinks&&!f.ShowRoute&&!f.ShowMarkers);Check.Equal(42d,f.JumpRange);
Check.That(f.WithCategory(GalaxyFilterCategory.Economy).Values!.SetEquals(["hightech"]));Check.That(!f.WithCategory(GalaxyFilterCategory.Economy).Values!.Contains("agriculture"));
var government=f.WithCategory(GalaxyFilterCategory.Government);Check.That(government.Values!.SetEquals(["anarchy"]));Check.That(government.OriginalRouteFilters[GalaxyFilterCategory.Government]);
Check.That(f.WithCategory(GalaxyFilterCategory.StarClass).Values!.SetEquals(["a_bluewhitesupergiant"]));
Check.Equal(9,original.ColourVisIndex);Check.Equal(0,original.SizeVisIndex);
Check.Equal("64",original.OriginalOptions["PoliticsTerritoryModePowersFilter"]);Check.That(!original.OriginalOptions.Keys.Any(x=>x.Contains("LocationPanelFilters")));
var edited=government with{Values=new HashSet<string>{"democracy"}};
Check.That(edited.WithCategory(GalaxyFilterCategory.Economy).WithCategory(GalaxyFilterCategory.Government).Values!.SetEquals(["democracy"]));
}
[Test] public void OriginalVisibilityIdsAndModeIdsAgreeWithTheVerifiedNativeDispatch()
{
var expected=new[]{GalaxyFilterCategory.None,GalaxyFilterCategory.Population,GalaxyFilterCategory.Allegiance,GalaxyFilterCategory.Government,GalaxyFilterCategory.Economy,GalaxyFilterCategory.StarClass,GalaxyFilterCategory.State,GalaxyFilterCategory.Security,GalaxyFilterCategory.Visited,GalaxyFilterCategory.Commodity,GalaxyFilterCategory.Civilization,GalaxyFilterCategory.Services,GalaxyFilterCategory.FleetCarrier,GalaxyFilterCategory.Colonisation,GalaxyFilterCategory.Exploration,GalaxyFilterCategory.TradeData};
for(var i=0;i<expected.Length;i++)Check.Equal(expected[i],GalaxyOriginalSettings.CategoryForIndex(i));Check.That(GalaxyOriginalSettings.CategoryForIndex(16) is null);
var imported=GalaxyOriginalSettings.Parse("<Root><RealisticView Value='1'/><ColourVisIndex Value='2'/><SizeVisIndex Value='1'/></Root>",new());
Check.Equal(GalaxyMapMode.Map,imported.Filter.Mode);Check.Equal(GalaxyFilterCategory.Allegiance,imported.Filter.Category);Check.Equal(GalaxyFilterCategory.Population,imported.Filter.SizeCategory);
var populous=new GalacticSystem("Measured",new(0,0,0)){Data=new(){Population=1000000000,Allegiance="Federation"}};
Check.That(imported.Filter.RelativeSize(populous)!=1);Check.Equal(GalaxyOriginalAppearance.DefaultSize,(imported.Filter with{SizeCategory=GalaxyFilterCategory.None}).RelativeSize(populous));
Check.Equal(GalaxyMapMode.Powerplay,GalaxyOriginalSettings.Parse("<Root><RealisticView Value='2'/></Root>",new()).Filter.Mode);
Check.Equal(GalaxyMapMode.Colonisation,GalaxyOriginalSettings.Parse("<Root><RealisticView Value='4'/></Root>",new()).Filter.Mode);
var population=GalaxyOriginalSettings.Parse("<Root><RealisticView Value='1'/><ColourVisIndex Value='2'/><SizeVisIndex Value='1'/><VisibilityValues><population><min Value='1000000'/><max Value='10000000'/></population></VisibilityValues></Root>",new()).Filter;
Check.Equal(1_000_000d,population.PopulationMinimum);Check.Equal(10_000_000d,population.PopulationMaximum);
var below=populous with{Data=populous.Data with{Population=999999}};Check.That(!population.Matches(below));Check.Equal(0f,population.RelativeSize(below));
Check.Equal(2f,population.RelativeSize(populous));Check.Equal(.5,population.PopulationFraction(5500000));
}
[Test] public void ReadingSavedOptionsNeverRewritesTheSourceAndMissingFlagsPreserveCurrentDisplay()
{
using var directory=new TemporaryDirectory();var path=directory.File("Custom.4.4.misc");File.WriteAllText(path,Fixture);var before=File.ReadAllBytes(path);
var imported=GalaxyOriginalSettings.Read(path,new(){ShowBackground=false});Check.That(before.SequenceEqual(File.ReadAllBytes(path)));Check.That(!imported.Filter.ShowBackground);
var minimal=GalaxyOriginalSettings.Parse("<Root><ShowGrid Value=\"1\"/></Root>",new(){Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Security,ShowLinks=true});
Check.Equal(GalaxyFilterCategory.Security,minimal.Filter.Category);Check.That(minimal.Filter.ShowGrid&&minimal.Filter.ShowLinks);Check.That(minimal.ColourVisIndex is null);
}
[Test] public void InvalidXmlExternalEntitiesAndNonBooleanFilterValuesAreRejected()
{
Check.Throws<XmlException>(()=>GalaxyOriginalSettings.Parse("<!DOCTYPE Root [<!ENTITY x SYSTEM 'file:///C:/Windows/win.ini'>]><Root><StarNames Value='1'/><x>&x;</x></Root>",new()));
Check.Throws<InvalidDataException>(()=>GalaxyOriginalSettings.Parse("<Root><VisibilityFlags><economy><HighTech Value='2'/></economy></VisibilityFlags></Root>",new()));
Check.Throws<InvalidDataException>(()=>GalaxyOriginalSettings.Parse("<Root><ShowGrid Value='true'/></Root>",new()));
Check.Throws<InvalidDataException>(()=>GalaxyOriginalSettings.Parse("<Other/>",new()));
}
[Test] public void JournalControllingPowerWinsOverTheMultiplePowersInfluencingASystem()
{
var data=GalaxySystemData.FromJournal(Check.Json("""{"ControllingPower":"Actual controller","Powers":["Other influence","Actual controller"],"PowerplayState":"Stronghold"}"""));
Check.Equal("Actual controller",data.Power);Check.Equal("Stronghold",data.PowerState);
var influences=GalaxySystemData.FromJournal(Check.Json("""{"Powers":["Other influence","Another influence"],"PowerplayState":"Exploited"}"""));Check.That(influences.Power is null);Check.Equal("Exploited",influences.PowerState);
var single=GalaxySystemData.FromJournal(Check.Json("""{"Powers":["Only influence"]}"""));Check.That(single.Power is null);
}
[Test] public void ActivityViewRestoresProvenActionAndIndependentMinimumWithoutGuessingPowerIds()
{
var imported=GalaxyOriginalSettings.Parse("""<Root><RealisticView Value="2"/><PoliticsMode Value="1"/><PoliticsTerritoryActivityFilterPower Value="3"/><PoliticsTerritoryActivityFilterAction Value="2"/><PoliticsTerritoryActivityFilterFilterMinActivity Value="1"/><PoliticsTerritoryActivityFilterMinActivity Value="0.35"/></Root>""",new(){ActivityPowerName="Previously selected"});
Check.Equal(GalaxyFilterCategory.Power,imported.Filter.Category);Check.Equal(GalaxyPowerplayView.Activities,imported.Filter.PowerplayView);Check.That(imported.Filter.UseMinimumActivity);Check.Equal(.35,imported.Filter.MinimumActivity);Check.That(imported.Filter.ActivityPowerName is null&&!imported.Filter.ActivityNativeQueryReady);Check.That(imported.Filter.UsesPowerOuter&&!imported.Filter.UsesPowerActivityCounter);
Check.Equal(GalaxyPowerActivity.Reinforcing,imported.Filter.Activity);
Check.Equal("3",imported.OriginalOptions["PoliticsTerritoryActivityFilterPower"]);Check.Equal("2",imported.OriginalOptions["PoliticsTerritoryActivityFilterAction"]);Check.Equal(3,imported.Filter.OriginalActivityPowerIndex);Check.That(imported.Limitations.Any(l=>l.Contains("等待")));
}
[Test] public void OriginalNameAndPlaneLayersAreIndependentOfStellarQueries()
{
var imported=GalaxyOriginalSettings.Parse("""<Root><RealisticView Value="0"/><RegionNames Value="0"/><NebulaNames Value="1"/><Constellations Value="1"/><GalacticZonesPlane Value="0"/><GalacticZoneNames Value="1"/></Root>""",new());
var f=imported.Filter;Check.Equal(GalaxyMapMode.Realistic,f.Mode);Check.That(!f.IsQueryActive);
Check.That(!f.ShowRegionNames&&f.ShowNebulaNames&&f.ShowConstellations&&!f.ShowGalacticZonesPlane&&f.ShowGalacticZoneNames);
var labels=GalaxyFilterDefinitions.All.Single(d=>d.Category==GalaxyFilterCategory.Markers).Choices.Select(c=>c.Key).ToHashSet();
Check.That(labels.Contains("galacticregion")&&!labels.Overlaps(["region","nebula","constellation","galacticzones","galacticzonenames"]));
var map=f with{Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Markers,Values=new HashSet<string>{"galacticregion"}};
var publicRegion=new GalacticSystem("Measured",new(0,0,0)){Data=new(){Region="Inner Orion Spur",Markers=["region"]}};
Check.That(map.Matches(publicRegion));Check.Equal("Inner Orion Spur",map.LabelFor(publicRegion));
Check.That(!map.Matches(publicRegion with{Data=new(){Markers=["region"]}}));
}
[Test] public void SavedActivityPowerDoesNotGuessBetweenTableIndexInternalIdAndUiId()
{
var current=new GalaxyMapFilter{OriginalPowerOptions=[new(0,1,4,"Actual Power",1,.25f,0)]};
var prefix="<Root><RealisticView Value='2'/><PoliticsMode Value='1'/><PoliticsTerritoryActivityFilterAction Value='3'/>";
var actual=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='4'/></Root>",current).Filter;
Check.That(actual.ActivityPowerName is null&&actual.ActivityInternalPowerId is null&&!actual.ActivityNativeQueryReady);Check.Equal(GalaxyPowerActivity.Acquiring,actual.Activity);
var uiId=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='1'/></Root>",current).Filter;
Check.That(uiId.ActivityPowerName is null&&uiId.ActivityInternalPowerId is null&&!uiId.ActivityNativeQueryReady);
var index=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='0'/></Root>",current).Filter;
Check.Equal("Actual Power",index.ActivityPowerName);Check.Equal(4,index.ActivityInternalPowerId);Check.That(index.OriginalActivityPowerIndex is null&&index.ActivityNativeQueryReady);
var colour=(actual with{Category=GalaxyFilterCategory.Power}).ColourForValue("actualpower");Check.Equal(new StarColour(255,64,0),colour);
var chosen=actual with{ActivityPowerName="Actual Power",ActivityInternalPowerId=4};Check.That(chosen.ActivityNativeQueryReady);
var any=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='-2'/></Root>",current).Filter;
Check.That(any.ActivityAllPowers&&any.ActivityNativeQueryReady&&any.ActivityInternalPowerId is null&&any.ActivityPowerName is null);
var disabled=GalaxyOriginalSettings.Parse(prefix+"<PoliticsTerritoryActivityFilterPower Value='-1'/></Root>",current).Filter;Check.That(!disabled.ActivityAllPowers&&!disabled.ActivityNativeQueryReady);
}
[Test] public void OriginalServiceIndexRestoresTheActualSingleServiceEvenWhenAnotherColourCategoryIsActive()
{
var imported=GalaxyOriginalSettings.Parse("<Root><RealisticView Value='1'/><ColourVisIndex Value='9'/><ServicesOption Value='1'/></Root>",new()).Filter;
Check.Equal(GalaxyFilterCategory.Commodity,imported.Category);
var service=imported.WithCategory(GalaxyFilterCategory.Services);Check.That(service.Values!.SetEquals(["materialtradermanufactured"]));
var manufactured=new GalacticSystem("Actual service",new(0,0,0)){Data=new(){Services=["MaterialTraderManufactured"]}};
Check.That(service.Matches(manufactured));Check.That(!service.Matches(manufactured with{Data=new(){Services=["MaterialTraderRaw"]}}));
Check.Equal("materialtraderxeno",GalaxyOriginalServiceOptions.KeyForIndex(3));Check.Equal("modulepacks",GalaxyOriginalServiceOptions.KeyForIndex(9));
var invalid=GalaxyOriginalSettings.Parse("<Root><ServicesOption Value='10'/></Root>",service);
Check.That(invalid.Filter.Values!.SetEquals(service.Values));Check.Equal("10",invalid.OriginalOptions["ServicesOption"]);Check.That(invalid.Limitations.Any(l=>l.Contains("服务选项编号")));
Check.That(GalaxyOriginalServiceOptions.KeyForIndex(-1) is null&&GalaxyOriginalServiceOptions.KeyForIndex(10) is null);
var factors=GalaxyOriginalSettings.Parse("<Root><ColourVisIndex Value='11'/><RealisticView Value='1'/><ServicesOption Value='6'/></Root>",new()).Filter;
var journal=GalaxySystemData.FromJournal(Check.Json("""{"StationServices":["Facilitator"]}"""));
Check.That(factors.Matches(manufactured with{Data=journal}));
}
}