using XFEEDToolBox.Core.Galaxy; using XFEEDToolBox.Core.Models; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public class GalaxyCatalogueProfileSelectionTests { private static GalaxyCatalogueProfile Profile(GalaxyCamera camera,int mode,bool small=false) { var origin=new Coordinates(49985,40985,24105); var point=GalaxyOriginalCatalogueLod.ClampCentre(GalaxyOriginalCatalogueLod.QueryCentre(camera,mode),origin); return new(origin,point,.7,1500,1,4,small,mode,false,"camera-eye"); } [Test] public void OriginalEyeAndFocusModesUseTheRequestingCameraAndItsActualDistanceFade() { var camera=GalaxyCamera.Create(new(1000,0,2000),1600,900,.3,.2,1); Check.That(Profile(camera,0).TrySelection(camera,out var eye)&&eye is not null&&eye.Descriptor.Dd4Modifier==1); var distance=camera.Distance;var expected=Math.Clamp((distance-1000)/-500,0,1); Check.That(Profile(camera,1).TrySelection(camera,out var focus)&&focus is not null); Check.That(Math.Abs(focus!.Descriptor.Dd4Modifier-expected)<.00002); Check.That(Profile(camera,1,true).TrySelection(camera,out var small)&&small!.Descriptor.Dd4Modifier==1); } [Test] public void DensityFromAnotherPoseUnknownQualityAndDebugCallbacksNeverBecomeOriginalCoverage() { var camera=GalaxyCamera.Create(new(0,0,0),1600,900,0,0,4);var actual=Profile(camera,0); Check.That(!(actual with{QualityStarCount=null}).TrySelection(camera,out _)); Check.That(!(actual with{QueryCentre=new(1,2,3)}).TrySelection(camera,out _)); Check.That(!(Profile(camera,2) with{DebugEnabled=true}).TrySelection(camera,out _)); Check.That(!(actual with{ReferenceKind="game-camera-eye"}).TrySelection(camera,out _)); var moved=GalaxyCamera.Create(new(30,0,0),1600,900,0,0,4); Check.That(!actual.TrySelection(moved,out _)); } [Test] public void SelectionCarriesTheCurrentIndependentAppearanceInputs() { var camera=GalaxyCamera.Create(new(0,0,0),1600,900,0,0,4); Check.That((Profile(camera,1,true) with{ColourBlend=.375}).TrySelection(camera,out var selection)); Check.Equal(1,selection!.OriginalViewMode!.Value);Check.That(selection.SmallMode==true);Check.Equal(.375,selection.ColourBlend!.Value); Check.That(Profile(camera,0).TrySelection(camera,out var unknownBlend));Check.That(unknownBlend!.ColourBlend is null); } [Test] public async Task CachedRawAppearanceChangesSizeWithTheCurrentSelectionWithoutRequeryingTheCell() { var origin=new Coordinates(0,0,0);var centre=new Coordinates(5,5,5); var descriptor=GalaxyOriginalCatalogueLod.Create(centre,0,500,0,1,.001); var camera=GalaxyCamera.Create(centre,1600,900,0,0,4);var plan=new GalaxyCellQueryPlan(camera,descriptor,origin); Check.Equal(1,plan.Cells.Count);Check.Equal(7UL,plan.Cells[0].Address); var appearance=new GalaxyOriginalStellarAppearance(0xFFFFFFFF,0xAA998877,.25f,100,4,1.25f,.075f,false); var star=new GalacticSystem("Cached raw appearance fixture",new(6,6,6),(1L<<23)|7){OriginalAppearance=appearance}; using var session=new GalaxyCellStreamingSession();var calls=0; await foreach(var _ in session.StreamAsync(plan,(_,_,cells,_)=> { calls++;return Task.FromResult(new GalaxyRegionResult(new[]{star},7,1,1,false,true) {Scope="requested-cells",RequestedCells=1,Origin=origin}); })){} GalacticSystem? cached=null; await foreach(var update in session.StreamAsync(plan,(_,_,_,_)=>throw new Exception("Changing size mode must not reload immutable cell geometry"))) if(update.Systems.Count>0)cached=update.Systems.Single(); Check.That(ReferenceEquals(star,cached));Check.Equal(1,calls); var normal=new GalaxyCatalogueSelection(descriptor,origin){SmallMode=false};var small=normal with{SmallMode=true}; Check.Equal(1.25f,normal.OriginalSize(cached!)!.Value);Check.Equal(.075f,small.OriginalSize(cached!)!.Value); Check.Equal(1.25f,cached!.OriginalAppearance!.ActiveSize!.Value);Check.That(cached.OriginalAppearance.SmallSizeActive==false); Check.That((normal with{SmallMode=null}).OriginalSize(cached) is null); Check.That(normal.OriginalSize(cached with{OriginalAppearance=null}) is null); Check.Equal(0f,small.OriginalSize(cached with{OriginalAppearance=appearance with{SmallSize=0}})!.Value); } }