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(()=>GameRouteStarClassFilter.FromOriginalMask(1u<<16)); } [Test] public void UnknownOrDuplicateGroupsAreRejectedBeforeAnOriginalSetterCanBeRequested() { Check.Throws(()=>new GameRouteStarClassFilter{SelectedGroups=[(GameRouteStarClassGroup)99]}.Validate()); Check.Throws(()=>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{"n"},true,out _,out var reason)&&reason is not null); Check.That(!GameRouteStarClassFilter.TryFromStarClasses(new HashSet{"da"},true,out _,out _)); Check.That(!GameRouteStarClassFilter.TryFromStarClasses(new HashSet{"g"},true,out _,out _)); Check.That(!GameRouteStarClassFilter.TryFromStarClasses(new HashSet{"future"},true,out _,out _)); Check.That(GameRouteStarClassFilter.TryFromStarClasses(new HashSet{"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(),true,out var empty,out _)); Check.Equal(0x8000u,empty!.OriginalMask); } }