XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
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}));
    }
}