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);
}
}
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);
}
}