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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

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

namespace XFEEDToolBox.Test;

[TestFixture]
public sealed class GameRouteStarClassFilterTests
{
    [Test] public void ScoopableClassesUseTheOriginalSevenGroupsAndIndependentRouteBit()
    {
        Check.Equal(0x807Fu,GameRouteStarClassFilter.Scoopable.OriginalMask);
        Check.Equal(0x7Fu,(GameRouteStarClassFilter.Scoopable with{AffectsRoutePlotting=false}).OriginalMask);
        Check.Equal(0xFFFFu,new GameRouteStarClassFilter().OriginalMask);
        Check.Equal(0x8000u,new GameRouteStarClassFilter{SelectedGroups=[]}.OriginalMask);
        Check.Equal(0u,new GameRouteStarClassFilter{SelectedGroups=[],AffectsRoutePlotting=false}.OriginalMask);
    }
    [Test] public void SpecialGroupsAreDisplayGroupIndicesAndMasksRoundTripWithoutInventingTypeBits()
    {
        var selected=new GameRouteStarClassFilter{SelectedGroups=[GameRouteStarClassGroup.Y,GameRouteStarClassGroup.WolfRayet,GameRouteStarClassGroup.NonSequence]};
        Check.Equal(0xD200u,selected.OriginalMask);
        var restored=GameRouteStarClassFilter.FromOriginalMask(selected.OriginalMask);
        Check.That(restored.AffectsRoutePlotting&&restored.SelectedGroups.SequenceEqual(selected.SelectedGroups));
        Check.Throws<ArgumentOutOfRangeException>(()=>GameRouteStarClassFilter.FromOriginalMask(1u<<16));
    }
    [Test] public void UnknownOrDuplicateGroupsAreRejectedBeforeAnOriginalSetterCanBeRequested()
    {
        Check.Throws<ArgumentException>(()=>new GameRouteStarClassFilter{SelectedGroups=[(GameRouteStarClassGroup)99]}.Validate());
        Check.Throws<ArgumentException>(()=>new GameRouteStarClassFilter{SelectedGroups=[GameRouteStarClassGroup.G,GameRouteStarClassGroup.G]}.Validate());
    }
    [Test] public void ToolScoopableSelectionMapsExactlyButPartialOriginalGroupsNeverBroadenRoutes()
    {
        Check.That(GameRouteStarClassFilter.TryFromStarClasses(GalaxyFilterDefinitions.ScoopableStarClasses,true,out var scoopable,out _));
        Check.Equal(0x807Fu,scoopable!.OriginalMask);
        Check.That(!GameRouteStarClassFilter.TryFromStarClasses(new HashSet<string>{"n"},true,out _,out var reason)&&reason is not null);
        Check.That(!GameRouteStarClassFilter.TryFromStarClasses(new HashSet<string>{"da"},true,out _,out _));
        Check.That(!GameRouteStarClassFilter.TryFromStarClasses(new HashSet<string>{"g"},true,out _,out _));
        Check.That(!GameRouteStarClassFilter.TryFromStarClasses(new HashSet<string>{"future"},true,out _,out _));
        Check.That(GameRouteStarClassFilter.TryFromStarClasses(new HashSet<string>{"n","h","supermassiveblackhole","x"},true,out var nonSequence,out _));
        Check.Equal(0xC000u,nonSequence!.OriginalMask);
    }
    [Test] public void AllKnownToolLeavesAndExplicitEmptySelectionPreserveOriginalGroupScope()
    {
        var all=GalaxyFilterDefinitions.All.Single(category=>category.Category==GalaxyFilterCategory.StarClass).Choices.Select(choice=>choice.Key).ToHashSet();
        Check.That(GameRouteStarClassFilter.TryFromStarClasses(all,false,out var every,out _));
        Check.Equal(0x7FFFu,every!.OriginalMask);
        Check.That(GameRouteStarClassFilter.TryFromStarClasses(new HashSet<string>(),true,out var empty,out _));
        Check.Equal(0x8000u,empty!.OriginalMask);
    }
}