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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Text.Json;
using XFEEDToolBox.Core.Galaxy;
using XFEExtension.NetCore.XUnit.Attributes;

namespace XFEEDToolBox.Test;

[TestFixture]
public sealed class GalaxyOriginalCivilizationFactsTests
{
    private static GalaxyMapFilter Filter(string key)=>new(){Mode=GalaxyMapMode.Map,Category=GalaxyFilterCategory.Civilization,Values=new HashSet<string>{key},RequireOriginalCivilizationFacts=true};
    private static GalacticSystem Sample(GalaxyNativeCivilizationFacts? fact,bool requested=true)=>new("Actual",new(0,0,0),300)
    {Data=new(){Civilizations=["human","guardian","thargoid"],Civilization="human",Population=1000000000,
        NativeFilterFacts=new("F1",42,100){Civilization=fact,CivilizationRequested=requested}}};

    [Test] public void OriginalUnknownCannotUsePublicLandmarksPopulationOrMatchingProof()
    {
        var filter=Filter("human");
        foreach(var requested in new[]{false,true})
        {
            var system=Sample(null,requested);system=system with{Data=system.Data with{ConfirmedQueries=new HashSet<string>{filter.QueryKey}}};
            Check.That(!filter.Matches(system)&&filter.IsUnknown(system)&&!filter.Evaluate(system).Matches);
            Check.That(filter.GetOriginalRgba(system) is null&&(filter with{IncludeUnknown=true}).Matches(system));
        }
        Check.That(!JsonSerializer.Serialize(filter).Contains("RequireOriginalCivilizationFacts"));
    }

    [Test] public void ACoherentSingleClassificationOverridesContradictoryPublicMultivalues()
    {
        foreach(var key in new[]{"none","human","guardian","thargoid"})
        {
            var system=Sample(new(9007199254740995UL,key));var filter=Filter(key);
            Check.That(filter.Matches(system)&&!filter.IsUnknown(system));
            Check.Equal(key,GalaxyMapFilter.Keys(system,GalaxyFilterCategory.Civilization)!.Single());
            Check.That(!(filter with{Values=new HashSet<string>{key=="human"?"guardian":"human"}}).Matches(system));
            Check.Equal(filter.ColourForValue(key),filter.GetColour(system));
            Check.That(filter.GetOriginalRgba(system) is not null);
        }
        var fallback=Sample(new(ulong.MaxValue,"none",true));
        Check.That(Filter("none").Matches(fallback)&&!Filter("none").IsUnknown(fallback));
        Check.That(!Filter("none").Matches(Sample(null)));
    }

    [Test] public void ExactWireIdsAndUnknownFutureClassificationStayDistinctFromNone()
    {
        var known=GalaxyNativeCivilizationFacts.FromWire(Check.Json("{\"definitionId\":\"9007199254740995\",\"key\":\"guardian\",\"defaulted\":false}"))!;
        Check.Equal(9007199254740995UL,known.DefinitionId);Check.Equal("guardian",known.Key);
        var future=GalaxyNativeCivilizationFacts.FromWire(Check.Json("{\"definitionId\":\"9007199254740995\",\"key\":\"future\"}"))!;
        var system=Sample(future);Check.That(future.Key is null&&Filter("none").IsUnknown(system)&&!Filter("none").Matches(system));
        Check.That(GalaxyNativeCivilizationFacts.FromWire(Check.Json("null")) is null);
        foreach(var json in new[]{"{\"definitionId\":9007199254740995,\"key\":\"human\"}","{\"definitionId\":\"18446744073709551616\",\"key\":\"none\"}","{\"definitionId\":\"1\",\"key\":\"none\",\"defaulted\":true}","{\"definitionId\":\"18446744073709551615\",\"key\":\"human\",\"defaulted\":true}"})
            Check.Throws<InvalidDataException>(()=>GalaxyNativeCivilizationFacts.FromWire(Check.Json(json)));
    }

    [Test] public void UnrelatedReceiptsPreserveClassificationButExplicitUnknownAndContextLossClearIt()
    {
        var old=Sample(new(9007199254740995UL,"guardian"));var filter=Filter("guardian");
        var unrelated=old with{Data=old.Data.Merge(new(){NativeFilterFacts=new("F1",42,100,Visited:true)})};
        Check.That(unrelated.Data.NativeFilterFacts is{CivilizationRequested:true,Civilization:not null}&&filter.Matches(unrelated));
        var unknown=old with{Data=old.Data.Merge(new(){NativeFilterFacts=new("F1",42,100){CivilizationRequested=true}})};
        Check.That(filter.IsUnknown(unknown)&&!filter.Matches(unknown));
        var otherProcess=old with{Data=old.Data.ForNativeContext("F1",43,100)};
        Check.That(otherProcess.Data.NativeFilterFacts is null&&!filter.Matches(otherProcess));
        Check.That(!JsonSerializer.Serialize(old.Data).Contains("CivilizationRequested"));
        Check.That(filter.RequestsOriginalCivilizationFacts&&!(filter with{Category=GalaxyFilterCategory.Services}).RequestsOriginalCivilizationFacts);
    }
}