using XFEEDToolBox.Core.Rendering; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public sealed class GalaxyOriginalDustFrameTests { private static GalaxyOriginalDustInputs Inputs=>new(1066,1280,[new(2.659f,103.566f),new(9.826f,13.726f),new(4.848f,16.692f)],.5f,32,100,200); private static GalaxyOriginalDustPublication[] Published=>[new(0,10,10,2147483648,140),new(1,20,21,12500,30),new(2,30,30,6250,12)]; [Test] public void ActualThreeLayerRecordRangesUsePublishedRadiiAndOrdinalOneException() { var source=Inputs;var layers=Published; Check.That(GalaxyOriginalDustFrame.TryCreate(source,layers,0,out var coarse)); Check.Equal(106600f,coarse.TransitionWidth);Check.Equal(-40800f,coarse.LowerDistance);Check.Equal(300000f,coarse.UpperDistance);Check.That(coarse.HeightMultiplierEnabled); Check.That(GalaxyOriginalDustFrame.TryCreate(source,layers,1,out var middle)); Check.Equal(53300f,middle.TransitionWidth);Check.Equal(200f,middle.LowerDistance);Check.Equal(65800f,middle.UpperDistance);Check.That(!middle.HeightMultiplierEnabled); Check.That(GalaxyOriginalDustFrame.TryCreate(source,layers,2,out var fine)); Check.Equal(26650f,fine.TransitionWidth);Check.Equal(200f,fine.LowerDistance);Check.Equal(32900f,fine.UpperDistance); Check.Equal(source.Layers[1].Alpha*.5f,middle.AlphaMultiplier);Check.Equal(source.Layers[2].Size*32,fine.SizeMultiplier); } [Test] public void PendingOwnPublicationStaysUnknownAndMissingNextUsesActualMinimum() { var layers=Published;layers[1]=new(1,0,21,float.NaN,0); Check.That(GalaxyOriginalDustFrame.TryCreate(Inputs,layers,0,out var frame));Check.Equal(200f,frame.LowerDistance); Check.That(!GalaxyOriginalDustFrame.TryCreate(Inputs,layers,1,out _)); // A newer requested revision does not discard the previous completed // publication: the original consumer uses publishedRevision directly. layers=Published;Check.That(layers[1].RequestedRevision!=layers[1].PublishedRevision&&GalaxyOriginalDustFrame.TryCreate(Inputs,layers,1,out _)); } [Test] public void CurrentRuntimeSettingsAreExplicitAndNeverReplacedByDefaults() { var source=Inputs with{Step=1000,AlphaMultiplier=.25f,SizeMultiplier=4,TransitionPerStep=2,MinimumDistance=123, Layers=new[]{new GalaxyOriginalDustLayerFactors(8,9),new(10,11),new(12,13)}}; Check.That(GalaxyOriginalDustFrame.TryCreate(source,Published,1,out var frame)); Check.Equal(1000f,frame.TransitionWidth);Check.Equal(123f,frame.LowerDistance);Check.Equal(13500f,frame.UpperDistance); Check.Equal(2.5f,frame.AlphaMultiplier);Check.Equal(44f,frame.SizeMultiplier); Check.That(!GalaxyOriginalDustFrame.TryCreate(null,Published,0,out _)&&!GalaxyOriginalDustFrame.TryCreate(Inputs,null,0,out _)); Check.That(!GalaxyOriginalDustFrame.TryCreate(Inputs with{Step=0},Published,0,out _)&&!GalaxyOriginalDustFrame.TryCreate(Inputs with{TransitionPerStep=float.NaN},Published,0,out _)); } [Test] public void OriginalShaderUsesLinearDistanceFadesAndWidthPlusPointZeroZeroOne() { var frame=new GalaxyOriginalDustLayerFrame(100,500,200,1,1,false); Check.Equal(0f,GalaxyOriginalDustFrame.DistanceFade(100,frame)!.Value);Check.Equal(0f,GalaxyOriginalDustFrame.DistanceFade(500,frame)!.Value); Check.Equal(Math.Clamp(100f/200.001f,0,1),GalaxyOriginalDustFrame.DistanceFade(200,frame)!.Value); Check.That(GalaxyOriginalDustFrame.DistanceFade(float.NaN,frame) is null); Check.Equal(1f,GalaxyOriginalDustFrame.DistanceFade(200,frame with{TransitionWidth=0})!.Value); var inconsistent=Published;inconsistent[2]=new(1,30,30,6250,12); Check.That(!GalaxyOriginalDustFrame.TryCreate(Inputs,inconsistent,0,out _)); } }